add option to forward environment to pipestream
[libi2ncommon] / test / test_pipestream.cpp
index e145ab7..8924861 100644 (file)
 #define TO_CHARP_TOK(x) #x
 #define TO_CHARP(x) TO_CHARP_TOK(x)
 
-BOOST_AUTO_TEST_SUITE(pipestream)
+#define I2N_EXTRA_ENV "I2N_EXTRA_ENV"
+
+struct Test_Pipestream_Fixture
+{
+    char **saved_environ;
+
+    Test_Pipestream_Fixture (void) : saved_environ (environ) { }
+
+    ~Test_Pipestream_Fixture (void) {
+        environ = this->saved_environ;
+        (void)unsetenv (I2N_EXTRA_ENV);
+    }
+};
+
+BOOST_FIXTURE_TEST_SUITE(pipestream, Test_Pipestream_Fixture)
 
     BOOST_AUTO_TEST_SUITE(read)
 
@@ -327,5 +341,43 @@ BOOST_AUTO_TEST_SUITE(pipestream)
 
     BOOST_AUTO_TEST_SUITE_END() /* [pipestream->read] */
 
+    BOOST_AUTO_TEST_SUITE(env)
+
+        static const char *const env_argv_abs [] = { "/usr/bin/env", NULL };
+
+        #define I2N_EXTRA_ENVIRON I2N_EXTRA_ENV "=Yet verily, the rose is within the thorn."
+        static char *i2n_extra_environ [] =
+            { const_cast<char*> (I2N_EXTRA_ENVIRON)
+            , NULL
+            };
+
+        BOOST_AUTO_TEST_CASE(env_passthrough)
+        {
+            ExecResult exres = ExecResult ();
+            environ = i2n_extra_environ;
+
+            const std::string result =
+                capture_exec (env_argv_abs, exres, true, true, false, true);
+
+            BOOST_CHECK(exres.normal_exit);
+            BOOST_CHECK_EQUAL(exres.return_code, EXIT_SUCCESS);
+            BOOST_CHECK_EQUAL(result, (std::string)(I2N_EXTRA_ENVIRON "\n"));
+        }
+
+        BOOST_AUTO_TEST_CASE(env_nil)
+        {
+            ExecResult exres = ExecResult ();
+            environ = i2n_extra_environ;
+
+            const std::string result =
+                capture_exec (env_argv_abs, exres, true, true, false, false);
+
+            BOOST_CHECK(exres.normal_exit);
+            BOOST_CHECK_EQUAL(exres.return_code, EXIT_SUCCESS);
+            BOOST_CHECK_EQUAL(result, std::string());
+        }
+
+    BOOST_AUTO_TEST_SUITE_END() /* [pipestream->env] */
+
 BOOST_AUTO_TEST_SUITE_END() /* [pipestream] */