aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build2/test/script/runner.cxx64
-rw-r--r--tests/test/script/runner/buildfile2
-rw-r--r--tests/test/script/runner/redirect.test (renamed from tests/test/script/runner/testscript)33
-rw-r--r--tests/test/script/runner/status.test9
4 files changed, 77 insertions, 31 deletions
diff --git a/build2/test/script/runner.cxx b/build2/test/script/runner.cxx
index eb6531d..79cbfc4 100644
--- a/build2/test/script/runner.cxx
+++ b/build2/test/script/runner.cxx
@@ -43,7 +43,8 @@ namespace build2
}
// Check if the test command output matches the expected result (redirect
- // value).
+ // value). Noop for redirect types other than none, here_string,
+ // here_document.
//
static void
check_output (const process_path& pr,
@@ -55,6 +56,8 @@ namespace build2
{
if (rd.type == redirect_type::none)
{
+ assert (!op.empty ());
+
// Check that there is no output produced.
//
if (non_empty (op, cl))
@@ -64,6 +67,8 @@ namespace build2
else if (rd.type == redirect_type::here_string ||
rd.type == redirect_type::here_document)
{
+ assert (!op.empty ());
+
path orp (op + ".orig");
try
@@ -291,6 +296,8 @@ namespace build2
in = si.fd ();
break;
}
+
+ case redirect_type::merge: assert (false); break;
}
// Dealing with stdout and stderr redirect types other than 'null'
@@ -311,37 +318,50 @@ namespace build2
// Open a file for command output redirect if requested explicitly
// (file redirect) or for the purpose of the output validation (none,
// here_string, here_document), register the file for cleanup, return
- // the file descriptor. Return the default and -2 file descriptors
- // for pass and null redirects respectively not opening a file.
+ // the file descriptor. Return the specified, default and -2 file
+ // descriptors for merge, pass and null redirects respectively not
+ // opening a file.
//
auto open = [&sp, &ci, &cl, &normalize] (const redirect& r,
- int fd,
+ int dfd,
path& p,
ofdstream& os) -> int
{
- assert (fd == 1 || fd == 2);
-
- if (r.type == redirect_type::pass || r.type == redirect_type::null)
- return r.type == redirect_type::pass ? fd : -2;
+ assert (dfd == 1 || dfd == 2);
ofdstream::openmode m (ofdstream::out);
- if (r.type == redirect_type::file)
- {
- p = normalize (r.file.path);
- if (r.file.append)
- m |= ofdstream::app;
- }
- else
+
+ switch (r.type)
{
- path op (fd == 1 ? "stdout" : "stderr");
+ case redirect_type::pass: return dfd;
+ case redirect_type::null: return -2;
+ case redirect_type::merge: return r.fd;
- // 0 if a single-command test, otherwise is the command number
- // (start from one) in the test.
- //
- if (ci > 0)
- op += "-" + to_string (ci);
+ case redirect_type::file:
+ {
+ p = normalize (r.file.path);
+
+ if (r.file.append)
+ m |= ofdstream::app;
+
+ break;
+ }
- p = normalize (move (op));
+ case redirect_type::none:
+ case redirect_type::here_string:
+ case redirect_type::here_document:
+ {
+ path op (dfd == 1 ? "stdout" : "stderr");
+
+ // 0 if belongs to a single-command test scope, otherwise is
+ // the command number (start from one) in the test scope.
+ //
+ if (ci > 0)
+ op += "-" + to_string (ci);
+
+ p = normalize (move (op));
+ break;
+ }
}
try
diff --git a/tests/test/script/runner/buildfile b/tests/test/script/runner/buildfile
index c91f940..ddab8a5 100644
--- a/tests/test/script/runner/buildfile
+++ b/tests/test/script/runner/buildfile
@@ -2,6 +2,6 @@
# copyright : Copyright (c) 2014-2016 Code Synthesis Ltd
# license : MIT; see accompanying LICENSE file
-exe{driver}: cxx{driver} test{testscript}
+exe{driver}: cxx{driver} test{redirect status}
include ../../../../../build2/
diff --git a/tests/test/script/runner/testscript b/tests/test/script/runner/redirect.test
index c95ed07..a49cd3c 100644
--- a/tests/test/script/runner/testscript
+++ b/tests/test/script/runner/redirect.test
@@ -1,13 +1,7 @@
-# file : tests/test/script/runner/testscript
+# file : tests/test/script/runner/redirect.test
# copyright : Copyright (c) 2014-2016 Code Synthesis Ltd
# license : MIT; see accompanying LICENSE file
-$* # status-def
-$* == 0 # status-eq-0
-$* -s 1 != 0 # status-ne-0
-$* -s 1 == 1 # status-eq-1
-$* != 1 # status-ne-1
-
$* -o foo >- # out-null
$* -e foo 2>- # err-null
$* -i 0 <foo # in-str
@@ -109,9 +103,32 @@ EOI
EOO
-$* -o foo >>>out; # file-redirect
+$* -o foo >>>out; # file
$* -e bar 2>>>&out;
$* -i 1 <<<out >>EOO
foo
bar
EOO
+
+$* -o foo -e bar 2>>EOE 1>&2 # merge-str
+foo
+bar
+EOE
+
+$* -i 1 <<EOI -e baz >>EOO 2>&1 # merge-doc
+foo
+bar
+EOI
+foo
+bar
+baz
+EOO
+
+$* -o foo -e bar 2>&1 >>>out; # merge-file
+$* -e baz -o biz 1>&2 2>>>&out;
+$* -i 1 <<<out >>EOO
+foo
+bar
+baz
+biz
+EOO
diff --git a/tests/test/script/runner/status.test b/tests/test/script/runner/status.test
new file mode 100644
index 0000000..5d4d116
--- /dev/null
+++ b/tests/test/script/runner/status.test
@@ -0,0 +1,9 @@
+# file : tests/test/script/runner/status.tests
+# copyright : Copyright (c) 2014-2016 Code Synthesis Ltd
+# license : MIT; see accompanying LICENSE file
+
+$* # status-def
+$* == 0 # status-eq-0
+$* -s 1 != 0 # status-ne-0
+$* -s 1 == 1 # status-eq-1
+$* != 1 # status-ne-1