aboutsummaryrefslogtreecommitdiff
path: root/tests/test/script/runner/exit.test
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test/script/runner/exit.test')
-rw-r--r--tests/test/script/runner/exit.test400
1 files changed, 400 insertions, 0 deletions
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 <foo' && $b 2>>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 <<EOI && $b >>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 <<EOI && $b >>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 <<EOI && $b
+ if true
+ exit
+ echo foo >|
+ else
+ echo bar >|
+ end;
+ echo baz >|
+ EOI
+
+ : failure
+ :
+ $c <<EOI && $b 2>'testscript:2:3: error: message' != 0
+ if true
+ exit 'message'
+ echo foo >|
+ else
+ echo bar >|
+ end
+ echo baz >|
+ EOI
+ }
+
+ : else-clause
+ :
+ {
+ : success
+ :
+ $c <<EOI && $b
+ if false
+ echo foo >|
+ else
+ exit
+ echo bar >|
+ end;
+ echo baz >|
+ EOI
+
+ : failure
+ :
+ $c <<EOI && $b 2>'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 <<EOI && $b
+ if exit
+ echo foo >|
+ else
+ echo bar >|
+ end;
+ echo baz >|
+ EOI
+
+ : failure
+ :
+ $c <<EOI && $b 2>'testscript:1:1: error: message' != 0
+ if exit 'message'
+ echo foo >|
+ else
+ echo bar >|
+ end;
+ echo baz >|
+ EOI
+ }
+
+ : elif
+ :
+ {
+ : success
+ :
+ $c <<EOI && $b
+ if false
+ elif exit
+ echo foo >|
+ else
+ echo bar >|
+ end;
+ echo baz >|
+ EOI
+
+ : failure
+ :
+ $c <<EOI && $b 2>'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 <<EOI && $b
+ if exit
+ {
+ echo foo >|
+ }
+ else
+ {
+ echo bar >|
+ }
+ EOI
+
+ : failure
+ :
+ $c <<EOI && $b 2>'testscript:1:1: error: message' != 0
+ if exit 'message'
+ {
+ echo foo >|
+ }
+ else
+ {
+ echo bar >|
+ }
+ EOI
+ }
+
+ : elif
+ :
+ {
+ : success
+ :
+ $c <<EOI && $b
+ if false
+ {
+ }
+ elif exit
+ {
+ echo foo >|
+ }
+ else
+ {
+ echo bar >|
+ }
+ EOI
+
+ : failure
+ :
+ $c <<EOI && $b 2>'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 <<EOI && $b
+ +touch --no-cleanup a
+ +touch b
+ +exit
+
+ echo foo >|
+
+ -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 <<EOI && $b 2>'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 <<EOI && $b >>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 <<EOI && $b 2>'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 && $b
+ -touch a
+ -exit
+ -echo foo >|
+ EOI
+
+ : failure
+ :
+ : Test that cleanups are not executed.
+ :
+ $c <<EOI && $b 2>'testscript:2:2: error: message' != 0
+ -true &a
+ -exit 'message'
+ -echo foo >|
+ EOI
+ }
+ }
+}