run-tests: drop required (feature !) style lines when the output is missing

Essentially, these were acting as a verbose (?) flag, since they weren't being
dropped when required.  Foozy has a nice description [1].  Basically, a couple
more places needed to check the features before treating it as optional.

I don't like how test-run-tests.py had to be hacked, but _hghave() can't be made
a static method.  The test change was a change while developing `debugssl`,
prior to tightening up the cases where the message is printed, that this fix
would have caught.

[1] https://www.mercurial-scm.org/pipermail/mercurial-devel/2017-July/101941.html
This commit is contained in:
Matt Harbison 2017-07-18 00:12:44 -04:00
parent 71dc81544b
commit 72e29cff86
4 changed files with 70 additions and 12 deletions

View File

@ -1359,7 +1359,7 @@ class TTest(Test):
while i < len(els): while i < len(els):
el = els[i] el = els[i]
r = TTest.linematch(el, lout) r = self.linematch(el, lout)
if isinstance(r, str): if isinstance(r, str):
if r == '+glob': if r == '+glob':
lout = el[:-1] + ' (glob)\n' lout = el[:-1] + ' (glob)\n'
@ -1385,9 +1385,7 @@ class TTest(Test):
if m: if m:
conditions = [c for c in m.group(2).split(' ')] conditions = [c for c in m.group(2).split(' ')]
if self._hghave(conditions)[0]: if not self._hghave(conditions)[0]:
lout = el
else:
optional.append(i) optional.append(i)
i += 1 i += 1
@ -1416,9 +1414,16 @@ class TTest(Test):
while expected.get(pos, None): while expected.get(pos, None):
el = expected[pos].pop(0) el = expected[pos].pop(0)
if el: if el:
if (not optline.match(el) if not el.endswith(b" (?)\n"):
and not el.endswith(b" (?)\n")): m = optline.match(el)
break if m:
conditions = [c for c in m.group(2).split(' ')]
if self._hghave(conditions)[0]:
# Don't append as optional line
continue
else:
break
postout.append(b' ' + el) postout.append(b' ' + el)
if lcmd: if lcmd:
@ -1481,8 +1486,7 @@ class TTest(Test):
res += re.escape(c) res += re.escape(c)
return TTest.rematch(res, l) return TTest.rematch(res, l)
@staticmethod def linematch(self, el, l):
def linematch(el, l):
retry = False retry = False
if el == l: # perfect match (fast) if el == l: # perfect match (fast)
return True return True
@ -1493,8 +1497,11 @@ class TTest(Test):
else: else:
m = optline.match(el) m = optline.match(el)
if m: if m:
conditions = [c for c in m.group(2).split(' ')]
el = m.group(1) + b"\n" el = m.group(1) + b"\n"
retry = "retry" if not self._hghave(conditions)[0]:
retry = "retry" # Not required by listed features
if el.endswith(b" (esc)\n"): if el.endswith(b" (esc)\n"):
if PYTHON3: if PYTHON3:

View File

@ -624,7 +624,6 @@ without client certificate:
$ P="$CERTSDIR" hg id https://localhost:$HGPORT/ $ P="$CERTSDIR" hg id https://localhost:$HGPORT/
warning: connecting to localhost using legacy security technology (TLS 1.0); see https://mercurial-scm.org/wiki/SecureConnections for more info (?) warning: connecting to localhost using legacy security technology (TLS 1.0); see https://mercurial-scm.org/wiki/SecureConnections for more info (?)
(the full certificate chain may not be available locally; see "hg help debugssl") (windows !)
abort: error: *handshake failure* (glob) abort: error: *handshake failure* (glob)
[255] [255]

View File

@ -39,7 +39,8 @@ def lm(expected, output):
and output.endswith(b'\n')), 'missing newline' and output.endswith(b'\n')), 'missing newline'
assert not re.search(br'[^ \w\\/\r\n()*?]', expected + output), \ assert not re.search(br'[^ \w\\/\r\n()*?]', expected + output), \
b'single backslash or unknown char' b'single backslash or unknown char'
match = run_tests.TTest.linematch(expected, output) test = run_tests.TTest('test-run-test.t', '.', '.')
match = test.linematch(expected, output)
if isinstance(match, str): if isinstance(match, str):
return 'special: ' + match return 'special: ' + match
elif isinstance(match, bytes): elif isinstance(match, bytes):

View File

@ -158,6 +158,57 @@ test diff colorisation
python hash seed: * (glob) python hash seed: * (glob)
#endif #endif
$ cat > test-failure.t << EOF
> $ true
> should go away (true !)
> $ true
> should stay (false !)
>
> Should remove first line, not second or third
> $ echo 'testing'
> baz*foo (glob) (true !)
> foobar*foo (glob) (false !)
> te*ting (glob) (true !)
>
> Should keep first two lines, remove third and last
> $ echo 'testing'
> test.ng (re) (true !)
> foo.ar (re) (false !)
> b.r (re) (true !)
> missing (?)
> awol (true !)
> EOF
$ rt test-failure.t
--- $TESTTMP/test-failure.t
+++ $TESTTMP/test-failure.t.err
@@ -1,11 +1,9 @@
$ true
- should go away (true !)
$ true
should stay (false !)
Should remove first line, not second or third
$ echo 'testing'
- baz*foo (glob) (true !)
foobar*foo (glob) (false !)
te*ting (glob) (true !)
@@ -13,6 +11,4 @@
$ echo 'testing'
test.ng (re) (true !)
foo.ar (re) (false !)
- b.r (re) (true !)
missing (?)
- awol (true !)
ERROR: test-failure.t output changed
!
Failed test-failure.t: output changed
# Ran 1 tests, 0 skipped, 1 failed.
python hash seed: * (glob)
[1]
basic failing test basic failing test
$ cat > test-failure.t << EOF $ cat > test-failure.t << EOF
> $ echo babar > $ echo babar