add pipestream unit tests for execution failure
authorPhilipp Gesang <philipp.gesang@intra2net.com>
Wed, 3 Jan 2018 13:50:50 +0000 (14:50 +0100)
committerPhilipp Gesang <philipp.gesang@intra2net.com>
Tue, 14 Aug 2018 14:53:34 +0000 (16:53 +0200)
Note that on the Intranator as of 6.4.13, the argument
--catch_system_errors=no must be passed to the unit test
executable on account of ancient Boost being oversensitive to
child process termination.

test/test_pipestream.cpp

index 181fe23..b361906 100644 (file)
@@ -24,6 +24,7 @@
  * Copyright 2018 by Intra2net AG
  */
 
+#define BOOST_TEST_IGNORE_NON_ZERO_CHILD_CODE
 
 #define BOOST_TEST_DYN_LINK
 #include <boost/test/unit_test.hpp>
@@ -98,7 +99,7 @@ BOOST_AUTO_TEST_SUITE(pipestream)
 
         const char *const bad_command [] = { "/does_not_exist", NULL };
 
-        BOOST_AUTO_TEST_CASE(abspath_zeros_shell_fail)
+        BOOST_AUTO_TEST_CASE(abspath_bad_shell_fail)
         {
             assert (access(bad_command [0], X_OK) != 0);
 
@@ -109,19 +110,18 @@ BOOST_AUTO_TEST_SUITE(pipestream)
             BOOST_CHECK_EQUAL(result.size (), 0);
         }
 
-        BOOST_AUTO_TEST_CASE(abspath_zeros_noshell_fail)
+        BOOST_AUTO_TEST_CASE(abspath_bad_noshell_fail)
         {
             assert (access(bad_command [0], X_OK) != 0);
 
             ExecResult exres;
             const std::string result = capture_exec (bad_command, exres);
 
-            BOOST_CHECK(!exres.normal_exit);
             BOOST_CHECK(!exres.terminated_by_signal);
             BOOST_CHECK_EQUAL(result.size (), 0);
         }
 
-        BOOST_AUTO_TEST_CASE(abspath_zeros_noshell_stderr)
+        BOOST_AUTO_TEST_CASE(abspath_bad_noshell_stderr)
         {
             assert (access(bad_command [0], X_OK) != 0);
 
@@ -131,6 +131,29 @@ BOOST_AUTO_TEST_SUITE(pipestream)
             BOOST_CHECK_NE(result.size (), 0);
         }
 
+        const char *const false_argv [] = { "/bin/false", NULL };
+
+        BOOST_AUTO_TEST_CASE(abspath_false_noshell_fail_exit)
+        {
+            ExecResult exres;
+            const std::string result = capture_exec (false_argv, exres, true, false);
+
+            BOOST_CHECK(exres.normal_exit);
+            BOOST_CHECK_EQUAL(exres.return_code, EXIT_FAILURE);
+            BOOST_CHECK_EQUAL(result.size (), 0);
+        }
+
+        BOOST_AUTO_TEST_CASE(abspath_false_shell_fail_exit)
+        {
+            ExecResult exres;
+            const std::string result =
+                    capture_exec (std::string (false_argv [0]), exres);
+
+            BOOST_CHECK(exres.normal_exit);
+            BOOST_CHECK_EQUAL(exres.return_code, EXIT_FAILURE);
+            BOOST_CHECK_EQUAL(result.size (), 0);
+        }
+
     BOOST_AUTO_TEST_SUITE_END() /* [pipestream->read] */
 
 BOOST_AUTO_TEST_SUITE_END() /* [pipestream] */