summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/process/test/pipe.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/process/test/pipe.cpp')
-rw-r--r--src/boost/libs/process/test/pipe.cpp271
1 files changed, 271 insertions, 0 deletions
diff --git a/src/boost/libs/process/test/pipe.cpp b/src/boost/libs/process/test/pipe.cpp
new file mode 100644
index 00000000..809ebb94
--- /dev/null
+++ b/src/boost/libs/process/test/pipe.cpp
@@ -0,0 +1,271 @@
+// Copyright (c) 2016 Klemens D. Morgenstern
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+#define BOOST_TEST_MAIN
+
+#include <boost/test/included/unit_test.hpp>
+#include <iostream>
+#include <thread>
+
+#include <boost/process/pipe.hpp>
+#include <boost/process/environment.hpp>
+
+using namespace std;
+namespace bp = boost::process;
+
+BOOST_AUTO_TEST_SUITE( pipe_tests );
+
+
+BOOST_AUTO_TEST_CASE(plain, *boost::unit_test::timeout(2))
+{
+ bp::pipe pipe;
+
+ std::string in = "test";
+ pipe.write(in.c_str(), in.size());
+
+ std::string out;
+ out.resize(4);
+ pipe.read(&out.front(), out.size());
+
+ BOOST_CHECK_EQUAL(out, in);
+}
+
+BOOST_AUTO_TEST_CASE(named, *boost::unit_test::timeout(2))
+{
+
+#if defined( BOOST_WINDOWS_API )
+ bp::pipe pipe("\\\\.\\pipe\\pipe_name");
+#elif defined( BOOST_POSIX_API )
+ const auto home_path = boost::this_process::environment()["HOME"].to_string();
+ bp::pipe pipe(home_path + "/.boost_process_test_pipe");
+#endif
+
+ std::string in = "xyz";
+ pipe.write(in.c_str(), in.size());
+
+
+ std::string out;
+ out.resize(3);
+ pipe.read(&out.front(), out.size());
+
+
+ BOOST_CHECK_EQUAL(out, in);
+}
+
+BOOST_AUTO_TEST_CASE(copy_pipe, *boost::unit_test::timeout(2))
+{
+ bp::pipe pipe;
+
+ std::string in = "test";
+ pipe.write(in.c_str(), in.size());
+
+ std::string out;
+ out.resize(4);
+ auto p2 = pipe;
+ p2.read(&out.front(), out.size());
+
+ BOOST_CHECK_EQUAL(out, in);
+}
+
+BOOST_AUTO_TEST_CASE(move_pipe, *boost::unit_test::timeout(2))
+{
+ bp::pipe pipe;
+
+ std::string in = "test";
+ pipe.write(in.c_str(), in.size());
+
+ std::string out;
+ out.resize(4);
+ auto p2 = std::move(pipe);
+ p2.read(&out.front(), out.size());
+
+ BOOST_CHECK_EQUAL(out, in);
+}
+
+BOOST_AUTO_TEST_CASE(stream, *boost::unit_test::timeout(2))
+{
+
+ bp::pipe pipe;
+
+ bp::pstream os(pipe);
+ bp::ipstream is(pipe);
+
+ int i = 42, j = 0;
+
+ os << i << std::endl;
+ os << std::endl;
+ is >> j;
+
+ BOOST_CHECK_EQUAL(i, j);
+}
+
+BOOST_AUTO_TEST_CASE(stream_line, *boost::unit_test::timeout(2))
+{
+
+ bp::pstream os;
+
+ std::string s = "My Test String";
+
+ std::string out;
+
+ os << s << std::endl;
+
+ std::getline(os, out);
+
+ auto size = (out.size() < s.size()) ? out.size() : s.size();
+
+
+ BOOST_CHECK_EQUAL_COLLECTIONS(
+ s.begin(), s. begin() + size,
+ out.begin(), out.begin() + size
+ );
+}
+
+
+BOOST_AUTO_TEST_CASE(large_data, *boost::unit_test::timeout(20))
+{
+ bp::pipe pipe;
+
+ bp::pipebuf is_buf(pipe);
+ bp::pipebuf os_buf(std::move(pipe));
+
+ std::istream is(&is_buf);
+ std::ostream os(&os_buf);
+
+ std::string in(1000000, '0');
+ std::string out;
+
+ int cnt = 0;
+ for (auto & c: in)
+ c = (cnt++ % 26) + 'A';
+
+ std::thread th([&]{os << in << std::endl;});
+
+ is >> out;
+ BOOST_REQUIRE_EQUAL_COLLECTIONS(out.begin(), out.end(), in.begin(), in.end());
+ th.join();
+}
+
+BOOST_AUTO_TEST_CASE(closed, *boost::unit_test::timeout(2))
+{
+ bp::opstream os;
+ bp::ipstream is;
+
+ os.pipe().close();
+ is.pipe().close();
+
+ int i;
+
+ BOOST_CHECK(!(os << 42 << endl));
+ BOOST_CHECK(!(is >> i));
+}
+
+
+BOOST_AUTO_TEST_CASE(coverage, *boost::unit_test::timeout(5))
+{
+ //more of a syntax check, since template.
+ {
+ bp::pipe p1;
+ bp::ipstream is1(p1);
+ bp::ipstream is2(std::move(p1));
+
+ is2.pipe(is1.pipe());
+
+ bp::pipe p2_;
+ bp::pipe p2 = p2_;
+ BOOST_REQUIRE_NO_THROW(p2_ == p2);
+ BOOST_CHECK(p2_ == p2);
+
+ bp::opstream os1(p2);
+ bp::opstream os2(std::move(p2));
+
+ os2.pipe(os1.pipe());
+
+ bp::pipe p3;
+ is1 = p3;
+ is2 = std::move(p3);
+
+ bp::pipe p4_;
+ bp::pipe p4 = std::move(p4_);
+
+ bp::pipe p5;
+ BOOST_REQUIRE_NO_THROW(p4_ != p4);
+ BOOST_CHECK(p4_ != p4);
+
+ BOOST_REQUIRE_NO_THROW(p5 != p4);
+ BOOST_CHECK(p4 != p5);
+
+ is1 = p4;
+ is2 = std::move(p4);
+ }
+ {
+ bp::wpipe p;
+ bp::wpstream ws1(p);
+ bp::wpstream ws2(std::move(p));
+
+ ws2.pipe(std::move(ws1.pipe()));
+
+ bp::wpipe p2;
+
+ ws1 = p2;
+ ws2 = std::move(p2);
+
+ const bp::wpstream & ws2c = ws2;
+ ws1.pipe(ws2c.pipe());
+ }
+
+ {
+ bp::wpipe p;
+ bp::wpipebuf ws1(p);
+ bp::wpipebuf ws2(std::move(p));
+
+ ws2.pipe(std::move(ws1.pipe()));
+
+ bp::wpipe p2;
+
+ ws1 = p2;
+ ws2 = std::move(p2);
+
+ const bp::wpipebuf & ws2c = ws2;
+ ws1.pipe(ws2c.pipe());
+
+ }
+}
+
+
+BOOST_AUTO_TEST_CASE(stream_close, *boost::unit_test::timeout(5))
+{
+ bp::pipe p;
+ int i = 1234, j = 0;
+ bp::opstream op{p};
+ bp::ipstream ip{p};
+ p.close();
+
+ op << i << " ";
+ op.close();
+
+ ip >> j;
+
+ BOOST_CHECK_EQUAL(i, j);
+}
+
+BOOST_AUTO_TEST_CASE(stream_close_scope, *boost::unit_test::timeout(5))
+{
+ bp::pipe p;
+ int i = 1234, j = 0;
+ bp::ipstream ip;
+
+ {
+ bp::opstream op{ip.pipe()};
+ op << i << " ";
+ }
+ ip >> j;
+
+ BOOST_CHECK_EQUAL(i, j);
+}
+
+
+BOOST_AUTO_TEST_SUITE_END(); \ No newline at end of file