Zsh Mailing List Archive
Messages sorted by:
Reverse Date,
Date,
Thread,
Author
Re: Bug with traps and exit
I'm attaching an expected-to-fail regression test for 44007.
Cheers,
Daniel
From b49f856b21eba759e503164a97b61343b9cbbf34 Mon Sep 17 00:00:00 2001
From: Daniel Shahaf <danielsh@xxxxxxxxxx>
Date: Tue, 31 Dec 2019 01:52:03 +0000
Subject: [PATCH 1/2] In the test suite, allow test cases to be marked as
expected to fail.
See next commit for a use-case.
---
Test/B01cd.ztst | 4 +++-
Test/ztst.zsh | 30 ++++++++++++++++++++++++++++--
Util/ztst-syntax.vim | 2 +-
3 files changed, 32 insertions(+), 4 deletions(-)
diff --git a/Test/B01cd.ztst b/Test/B01cd.ztst
index f79e18f..977cbdf 100644
--- a/Test/B01cd.ztst
+++ b/Test/B01cd.ztst
@@ -70,11 +70,13 @@
# the expected status returned by the code when run, or - if it is
# irrelevant. An optional set of single-letter flags follows the status
# or -. The following are understood:
-# . d Don't diff stdout against the expected stdout.
+# . d Don't diff stdout against the expected stdout.
# D Don't diff stderr against the expected stderr.
# q All redirection lines given in the test script (not the lines
# actually produced by the test) are subject to ordinary quoted shell
# expansion (i.e. not globbing).
+# f Test is expected to fail. If the test's exit code, stdout, and stderr
+# match, report a problem; otherwise, carry on to the next test case.
# This can be followed by a `:' and a message describing the
# test, which will be printed if the test fails, along with a
# description of the failure that occurred. The `:' and message are
diff --git a/Test/ztst.zsh b/Test/ztst.zsh
index a4c6252..0c71f9d 100755
--- a/Test/ztst.zsh
+++ b/Test/ztst.zsh
@@ -366,6 +366,7 @@ ZTST_test() {
local last match mbegin mend found substlines
local diff_out diff_err
local ZTST_skip
+ integer expected_to_fail
while true; do
rm -f $ZTST_in $ZTST_out $ZTST_err
@@ -460,8 +461,21 @@ $ZTST_curline"
fi
fi
+ if [[ $ZTST_flags = *f* ]]; then
+ expected_to_fail=1
+ ZTST_xfail_diff() { ZTST_diff "$@" > /dev/null }
+ ZTST_diff=ZTST_xfail_diff
+ else
+ expected_to_fail=0
+ ZTST_diff=ZTST_diff
+ fi
+
# First check we got the right status, if specified.
if [[ $ZTST_xstatus != - && $ZTST_xstatus != $ZTST_status ]]; then
+ if (( expected_to_fail )); then
+ ZTST_verbose 1 "Test failed, as expected."
+ continue
+ fi
ZTST_testfailed "bad status $ZTST_status, expected $ZTST_xstatus from:
$ZTST_code${$(<$ZTST_terr):+
Error output:
@@ -480,7 +494,11 @@ $(<$ZTST_terr)"
rm -rf $ZTST_out
print -r -- "${(e)substlines}" >$ZTST_out
fi
- if [[ $ZTST_flags != *d* ]] && ! ZTST_diff $diff_out -u $ZTST_out $ZTST_tout; then
+ if [[ $ZTST_flags != *d* ]] && ! $ZTST_diff $diff_out -u $ZTST_out $ZTST_tout; then
+ if (( expected_to_fail )); then
+ ZTST_verbose 1 "Test failed, as expected."
+ continue
+ fi
ZTST_testfailed "output differs from expected as shown above for:
$ZTST_code${$(<$ZTST_terr):+
Error output:
@@ -488,15 +506,23 @@ $(<$ZTST_terr)}"
return 1
fi
if [[ $ZTST_flags = *q* && -s $ZTST_err ]]; then
+ if (( expected_to_fail )); then
+ ZTST_verbose 1 "Test failed, as expected."
+ continue
+ fi
substlines="$(<$ZTST_err)"
rm -rf $ZTST_err
print -r -- "${(e)substlines}" >$ZTST_err
fi
- if [[ $ZTST_flags != *D* ]] && ! ZTST_diff $diff_err -u $ZTST_err $ZTST_terr; then
+ if [[ $ZTST_flags != *D* ]] && ! $ZTST_diff $diff_err -u $ZTST_err $ZTST_terr; then
ZTST_testfailed "error output differs from expected as shown above for:
$ZTST_code"
return 1
fi
+ if (( expected_to_fail )); then
+ ZTST_testfailed "test was expected to fail, but passed."
+ return 1
+ fi
fi
ZTST_verbose 1 "Test successful."
[[ -n $last ]] && break
diff --git a/Util/ztst-syntax.vim b/Util/ztst-syntax.vim
index 8d8becf..f0c82d7 100644
--- a/Util/ztst-syntax.vim
+++ b/Util/ztst-syntax.vim
@@ -28,7 +28,7 @@ syn include @zsh syntax/zsh.vim
syn match ztstPayload /^\s\+\zs.*/ contains=@zsh
syn match ztstExitCode /^\d\+\|^-/ nextgroup=ztstFlags
-syn match ztstFlags /[.dDq]*:/ contained nextgroup=ztstTestName contains=ztstColon
+syn match ztstFlags /[.dDqf]*:/ contained nextgroup=ztstTestName contains=ztstColon
syn match ztstColon /:/ contained
syn region ztstTestName start=// end=/$/ contained
--
2.20.1
From 87b1f05911e3369897307f81c04b8ed4db240d6e Mon Sep 17 00:00:00 2001
From: Daniel Shahaf <danielsh@xxxxxxxxxx>
Date: Tue, 31 Dec 2019 01:52:32 +0000
Subject: [PATCH 2/2] Add an expected-to-fail test for workers/44007.
---
Etc/BUGS | 14 ++------------
Test/C03traps.ztst | 15 +++++++++++++++
2 files changed, 17 insertions(+), 12 deletions(-)
diff --git a/Etc/BUGS b/Etc/BUGS
index 3fbe818..8112299 100644
--- a/Etc/BUGS
+++ b/Etc/BUGS
@@ -26,16 +26,6 @@ skipped when STTY=... is set for that command
41203 and others: Make it easier to maintain C modules out of tree.
(May require defining a stable API for modules, see 41254)
------------------------------------------------------------------------
-44007 - Martijn - exit in trap executes rest of function (prints "fn2")
-[[[
-trap 'echo $1; exit; echo $2' USR1
-fn() {
- echo fn1
- kill -USR1 $$
- echo fn2
-}
-echo out1
-fn trap1 trap2
-echo out2
-]]]
+44007 - Martijn - exit in trap executes rest of function
+See test case in Test/C03traps.ztst.
------------------------------------------------------------------------
diff --git a/Test/C03traps.ztst b/Test/C03traps.ztst
index 4aebd92..8fdd780 100644
--- a/Test/C03traps.ztst
+++ b/Test/C03traps.ztst
@@ -881,6 +881,21 @@ F:Must be tested with a top-level script rather than source or function
$ZTST_testdir/../Src/zsh -f <<<'fn() { exit 0; }; trap fn EXIT; false'
0:Explicit exit status overrides implicit: script-like code path
+ $ZTST_testdir/../Src/zsh -f <<<$'
+ trap \'printf $1; exit; printf $2\' USR1
+ fn() {
+ printf fn1
+ kill -s USR1 $$
+ printf fn2
+ }
+ printf out1
+ fn trap1 trap2
+ printf out2
+ '
+0f:(workers/44007) function execution continues after 'exit' in trap
+>out1fn1trap1
+# As of 5.7.1-test-2, the output was "out1fn1trap1fn2".
+
%clean
rm -f TRAPEXIT
--
2.20.1
Messages sorted by:
Reverse Date,
Date,
Thread,
Author