[PATCH 2 of 2] tests: fix run-tests when there's a bad #if in a test
Augie Fackler
raf at durin42.com
Tue May 30 21:15:10 EDT 2017
> On May 30, 2017, at 9:12 PM, Augie Fackler <raf at durin42.com> wrote:
>
> # HG changeset patch
> # User Augie Fackler <augie at google.com>
> # Date 1496191723 14400
> # Tue May 30 20:48:43 2017 -0400
> # Node ID 48ea485539377729a711959c15ac4262550234fc
> # Parent 361bf17d190dbd3410be4b7fd8ff4d27ddb48739
> tests: fix run-tests when there's a bad #if in a test
>
> That has (and still does) caused the test to be skipped, but without
> this fix it was possible to exit this block of code without clearing
> the output channel, which poisoned the channel list for later test
> method runs. Fix this by always clearing the channel in a finally.
>
> The test for this is somewhat unfortunate. Sadly, I couldn't get a way
> to reproduce this with less than 2n+1 test cases, nor could I get it
> to reproduce reliably without the sleep statements. It's also crucial
> that the test with the broken #if be smaller (in terms of byte count)
> than the sleeping tests, so that it runs first and would poison the
> channel list prior to another test needing that entry from the list.
A word of warning to anyone brave enough to try and reduce the test case further: the failure mode is that run-tests hangs, so you end up waiting for test-run-tests.t to time out if you lack the fixed run-tests.py.
>
> diff --git a/tests/run-tests.py b/tests/run-tests.py
> --- a/tests/run-tests.py
> +++ b/tests/run-tests.py
> @@ -1778,10 +1778,11 @@ class TestSuite(unittest.TestSuite):
> except: # re-raises
> done.put(('!', test, 'run-test raised an error, see traceback'))
> raise
> - try:
> - channels[channel] = ''
> - except IndexError:
> - pass
> + finally:
> + try:
> + channels[channel] = ''
> + except IndexError:
> + pass
>
> def stat():
> count = 0
> diff --git a/tests/test-run-tests.t b/tests/test-run-tests.t
> --- a/tests/test-run-tests.t
> +++ b/tests/test-run-tests.t
> @@ -903,6 +903,30 @@ support for bisecting failed tests autom
>
> $ cd ..
>
> +Test a broken #if statement doesn't break run-tests threading.
> +==============================================================
> + $ mkdir broken
> + $ cd broken
> + $ cat > test-broken.t <<EOF
> + > true
> + > #if notarealhghavefeature
> + > $ false
> + > #endif
> + > EOF
> + $ for f in 1 2 3 4 ; do
> + > cat > test-works-$f.t <<EOF
> + > This is test case $f
> + > $ sleep 1
> + > EOF
> + > done
> + $ rt -j 2
> + ....
> + # Ran 5 tests, 0 skipped, 0 warned, 0 failed.
> + skipped: unknown feature: notarealhghavefeature
> +
> + $ cd ..
> + $ rm -rf broken
> +
> Test cases in .t files
> ======================
> $ mkdir cases
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
More information about the Mercurial-devel
mailing list