From 062e03325cf9bb7fecfb9ea254ceb5c0cf427a7a Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Fri, 16 Jun 2017 23:43:24 +0300 Subject: Add support for exit testscript builtin --- tests/test/script/runner/buildfile | 2 +- tests/test/script/runner/exit.test | 400 +++++++++++++++++++++++++++++++++++++ 2 files changed, 401 insertions(+), 1 deletion(-) create mode 100644 tests/test/script/runner/exit.test (limited to 'tests') diff --git a/tests/test/script/runner/buildfile b/tests/test/script/runner/buildfile index a990405..3970cfd 100644 --- a/tests/test/script/runner/buildfile +++ b/tests/test/script/runner/buildfile @@ -2,7 +2,7 @@ # copyright : Copyright (c) 2014-2017 Code Synthesis Ltd # license : MIT; see accompanying LICENSE file -./: test{cleanup expr if output pipe redirect regex set status} exe{driver} $b +./: test{*} exe{driver} $b test{*}: target = exe{driver} diff --git a/tests/test/script/runner/exit.test b/tests/test/script/runner/exit.test new file mode 100644 index 0000000..ae8f21a --- /dev/null +++ b/tests/test/script/runner/exit.test @@ -0,0 +1,400 @@ +# file : tests/test/script/runner/exit.test +# copyright : Copyright (c) 2014-2017 Code Synthesis Ltd +# license : MIT; see accompanying LICENSE file + +.include ../common.test + +: special +: +{ + : pipelining + : + { + : to + : + $c <'exit | cat' && $b 2>>EOE != 0 + testscript:1:1: error: exit builtin must be the only pipe command + EOE + + : from + : + $c <'echo "foo" | exit' && $b 2>>EOE != 0 + testscript:1:1: error: exit builtin must be the only pipe command + EOE + } + + : redirecting + : + { + : stdin + : + $c <'exit >EOE != 0 + testscript:1:1: error: exit builtin stdin cannot be redirected + EOE + + : stdout + : + $c <'exit >foo' && $b 2>>EOE != 0 + testscript:1:1: error: exit builtin stdout cannot be redirected + EOE + + : stderr + : + $c <'exit 2>foo' && $b 2>>EOE != 0 + testscript:1:1: error: exit builtin stderr cannot be redirected + EOE + } + + : exit-code + : + $c <'exit != 0' && $b 2>>EOE != 0 + testscript:1:1: error: exit builtin exit code cannot be non-zero + EOE +} + +: arguments +: +{ + : none + : + $c <'exit' && $b + + : diagnostics + : + $c <'exit "foo"' && $b 2>>EOE != 0 + testscript:1:1: error: foo + EOE + + : unexpected + : + $c <'exit "foo" "bar"' && $b 2>>EOE != 0 + testscript:1:1: error: unexpected argument + EOE +} + +: execution +: +: Test that only expected commands are executed. Note that we rely on the fact +: that their execution is performed serially (see ../common.test for details). +: +{ + : test-scope + : + { + : success + : + : Note that we also test that cleanups are executed. + : + $c <>EOO + touch -f a; + echo foo >| && exit && echo bar >|; + echo baz >| + echo box >| + EOI + foo + box + EOO + + : failure + : + : Note that we also register fake cleanup, and test that cleanups are + : not executed. If they were, there would be a diagnostics printed to + : stderr regarding non-existent file. + : + $c <>EOO 2>'testscript:1:1: error: message' != 0 + echo foo >| &b && exit 'message' && echo bar >| + echo baz >|; + echo boz >| + EOI + foo + EOO + } + + : command-if + : + { + : if-clause + : + { + : success + : + $c <| + else + echo bar >| + end; + echo baz >| + EOI + + : failure + : + $c <'testscript:2:3: error: message' != 0 + if true + exit 'message' + echo foo >| + else + echo bar >| + end + echo baz >| + EOI + } + + : else-clause + : + { + : success + : + $c <| + else + exit + echo bar >| + end; + echo baz >| + EOI + + : failure + : + $c <'testscript:4:3: error: message' != 0 + if false + echo foo >| + else + exit 'message' + echo bar >| + end + echo baz >| + EOI + } + } + + : command-if-condition + : + { + : if + : + { + : success + : + $c <| + else + echo bar >| + end; + echo baz >| + EOI + + : failure + : + $c <'testscript:1:1: error: message' != 0 + if exit 'message' + echo foo >| + else + echo bar >| + end; + echo baz >| + EOI + } + + : elif + : + { + : success + : + $c <| + else + echo bar >| + end; + echo baz >| + EOI + + : failure + : + $c <'testscript:2:1: error: message' != 0 + if false + elif exit 'message' + echo foo >| + else + echo bar >| + end; + echo baz >| + EOI + } + } + + : scope-if-condition + : + { + : if + : + { + : success + : + $c <| + } + else + { + echo bar >| + } + EOI + + : failure + : + $c <'testscript:1:1: error: message' != 0 + if exit 'message' + { + echo foo >| + } + else + { + echo bar >| + } + EOI + } + + : elif + : + { + : success + : + $c <| + } + else + { + echo bar >| + } + EOI + + : failure + : + $c <'testscript:4:1: error: message' != 0 + if false + { + } + elif exit 'message' + { + echo foo >| + } + else + { + echo bar >| + } + EOI + } + } + + : group-scope + : + { + : setup + : + { + : success + : + : Test that teardown commands are executed (the 'a' file is removed), and + : cleanups are executed as well (the 'b' file is removed). + : + $c <| + + -rm a + EOI + + : failure + : + : Test that teardown commands are not executed (the touch would fail), + : and cleanups are also not executed (they would fail due to non-existent + : file 'a'). + : + $c <'testscript:2:2: error: message' != 0 + +true &a + +exit 'message' + + echo foo >| + + -touch b/c + EOI + } + + : inner-scope + : + { + : success + : + : Test that teardown commands and cleanups are executed (see above), and + : also that the independent inner scope is still executed. + : + $c <>EOO + +touch --no-cleanup a + +touch b + + exit + + echo foo >| + + -rm a + EOI + foo + EOO + + : failure + : + : Test that teardown commands and cleanups are not executed (see above), + : as well as the independent inner scope (remember the sequential + : execution). + : + $c <'testscript:3:1: error: message' != 0 + +true &a + + exit 'message' + + echo foo >| + + -touch b/c + EOI + } + + : teardown + : + { + : success + : + : Test that cleanups are executed. + : + $c <| + EOI + + : failure + : + : Test that cleanups are not executed. + : + $c <'testscript:2:2: error: message' != 0 + -true &a + -exit 'message' + -echo foo >| + EOI + } + } +} -- cgit v1.1