summaryrefslogtreecommitdiff
path: root/plugins/New_GPG/src/include/libs/process/test
diff options
context:
space:
mode:
authorAlexander Gluzsky <sss123next@list.ru>2013-02-03 12:54:02 +0000
committerAlexander Gluzsky <sss123next@list.ru>2013-02-03 12:54:02 +0000
commit2637b7479c3e531f891346dbe84c73805a8b5e36 (patch)
treebdfe96ed34c5f08b856fa760c2cdc70ba6763352 /plugins/New_GPG/src/include/libs/process/test
parent32e17cfa965980f07e8321fb29d38d62a2e1ad27 (diff)
ability to change key password (because of fucked gpg which does not want to give us his stdin/stdout only via ugly windows console)
git-svn-id: http://svn.miranda-ng.org/main/trunk@3406 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c
Diffstat (limited to 'plugins/New_GPG/src/include/libs/process/test')
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/Jamfile.jam57
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/bind_stderr.cpp144
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/bind_stdin.cpp165
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/bind_stdin_stdout.cpp62
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/bind_stdout.cpp144
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/bind_stdout_stderr.cpp131
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/close_stderr.cpp42
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/close_stdin.cpp42
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/close_stdout.cpp42
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/exit_code.cpp106
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/extensions.cpp65
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/inherit_env.cpp58
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/posix_specific.cpp113
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/run_exe.cpp39
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/run_exe_path.cpp46
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/run_exe_wstring.cpp46
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/search_path.cpp34
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/search_path_wstring.cpp25
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/set_args.cpp83
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/set_args_wstring.cpp56
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/set_cmd_line.cpp50
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/set_cmd_line_wstring.cpp54
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/set_env.cpp57
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/set_env_wstring.cpp61
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/set_on_error.cpp27
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/shell_path.cpp29
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/shell_path_wstring.cpp31
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/show_window.cpp49
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/sparring_partner.cpp232
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/start_in_dir.cpp63
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/start_in_dir_wstring.cpp67
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/terminate.cpp48
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/throw_on_error.cpp28
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/wait.cpp71
-rw-r--r--plugins/New_GPG/src/include/libs/process/test/windows_specific.cpp53
35 files changed, 2420 insertions, 0 deletions
diff --git a/plugins/New_GPG/src/include/libs/process/test/Jamfile.jam b/plugins/New_GPG/src/include/libs/process/test/Jamfile.jam
new file mode 100644
index 0000000000..ff0829c1bd
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/Jamfile.jam
@@ -0,0 +1,57 @@
+# Copyright (c) 2006, 2007 Julio M. Merino Vidal
+# Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+# Copyright (c) 2009 Boris Schaeling
+# Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+# Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+#
+# 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)
+
+project : requirements
+ <include>../../..
+ <source>/boost//headers
+ <source>/boost//system
+ <toolset>msvc:<define>_SCL_SECURE_NO_WARNINGS
+ <target-os>windows:<define>WIN32_LEAN_AND_MEAN
+ <target-os>linux:<linkflags>-lpthread
+;
+
+searched-lib shell32 ;
+
+import testing ;
+
+exe sparring_partner : sparring_partner.cpp /boost//program_options /boost//filesystem /boost//iostreams ;
+
+run bind_stderr.cpp /boost//iostreams : : sparring_partner ;
+run bind_stdin.cpp /boost//iostreams : : sparring_partner ;
+run bind_stdin_stdout.cpp /boost//iostreams : : sparring_partner ;
+run bind_stdout.cpp /boost//iostreams : : sparring_partner ;
+run bind_stdout_stderr.cpp /boost//iostreams : : sparring_partner ;
+run close_stderr.cpp /boost//iostreams : : sparring_partner ;
+run close_stdin.cpp /boost//iostreams : : sparring_partner ;
+run close_stdout.cpp /boost//iostreams : : sparring_partner ;
+run exit_code.cpp /boost//iostreams /boost//program_options : : sparring_partner ;
+run extensions.cpp : : sparring_partner ;
+run inherit_env.cpp /boost//iostreams /boost//program_options : : sparring_partner ;
+run posix_specific.cpp /boost//iostreams : : sparring_partner : <build>no <target-os>linux:<build>yes ;
+run run_exe.cpp : : sparring_partner ;
+run run_exe_path.cpp /boost//filesystem : : sparring_partner ;
+run run_exe_wstring.cpp /boost//filesystem : : sparring_partner : <build>no <target-os>windows:<build>yes ;
+run search_path.cpp /boost//filesystem : : : <target-os>windows:<source>shell32 ;
+run search_path_wstring.cpp /boost//filesystem shell32 : : : <build>no <target-os>windows:<build>yes ;
+run set_args.cpp /boost//iostreams : : sparring_partner ;
+run set_args_wstring.cpp /boost//iostreams /boost//filesystem : : sparring_partner : <build>no <target-os>windows:<build>yes ;
+run set_cmd_line.cpp /boost//iostreams : : sparring_partner ;
+run set_cmd_line_wstring.cpp /boost//iostreams /boost//filesystem : : sparring_partner : <build>no <target-os>windows:<build>yes ;
+run set_env.cpp /boost//iostreams : : sparring_partner ;
+run set_env_wstring.cpp /boost//iostreams /boost//filesystem : : sparring_partner : <build>no <target-os>windows:<build>yes ;
+run set_on_error.cpp : : sparring_partner ;
+run shell_path.cpp /boost//filesystem ;
+run shell_path_wstring.cpp /boost//filesystem : : : <build>no <target-os>windows:<build>yes ;
+run show_window.cpp /boost//iostreams : : sparring_partner : <build>no <target-os>windows:<build>yes ;
+run start_in_dir.cpp /boost//iostreams /boost//filesystem : : sparring_partner ;
+run start_in_dir_wstring.cpp /boost//iostreams /boost//filesystem : : sparring_partner : <build>no <target-os>windows:<build>yes ;
+run terminate.cpp : : sparring_partner ;
+run throw_on_error.cpp : : sparring_partner ;
+run wait.cpp : : sparring_partner ;
+run windows_specific.cpp /boost//iostreams : : sparring_partner : <build>no <target-os>windows:<build>yes ;
diff --git a/plugins/New_GPG/src/include/libs/process/test/bind_stderr.cpp b/plugins/New_GPG/src/include/libs/process/test/bind_stderr.cpp
new file mode 100644
index 0000000000..2a60a47171
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/bind_stderr.cpp
@@ -0,0 +1,144 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/iostreams/device/file_descriptor.hpp>
+#include <boost/iostreams/stream.hpp>
+#include <boost/asio.hpp>
+#include <boost/algorithm/string/predicate.hpp>
+#include <string>
+#include <istream>
+#include <cstdlib>
+#if defined(BOOST_WINDOWS_API)
+# include <Windows.h>
+typedef boost::asio::windows::stream_handle pipe_end;
+#elif defined(BOOST_POSIX_API)
+# include <sys/wait.h>
+# include <unistd.h>
+typedef boost::asio::posix::stream_descriptor pipe_end;
+#endif
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+namespace bio = boost::iostreams;
+
+BOOST_AUTO_TEST_CASE(sync_io)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ bp::pipe p = bp::create_pipe();
+
+ {
+ bio::file_descriptor_sink sink(p.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --echo-stderr hello"),
+ bpi::bind_stderr(sink),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+ }
+
+ bio::file_descriptor_source source(p.source, bio::close_handle);
+ bio::stream<bio::file_descriptor_source> is(source);
+
+ std::string s;
+ is >> s;
+ BOOST_CHECK_EQUAL(s, "hello");
+}
+
+bp::pipe create_async_pipe()
+{
+#if defined(BOOST_WINDOWS_API)
+ std::string name = "\\\\.\\pipe\\boost_process_test_bind_stderr";
+ HANDLE handle1 = CreateNamedPipeA(name.c_str(), PIPE_ACCESS_INBOUND |
+ FILE_FLAG_OVERLAPPED, 0, 1, 8192, 8192, 0, NULL);
+ HANDLE handle2 = CreateFileA(name.c_str(), GENERIC_WRITE, 0, NULL,
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ return bp::make_pipe(handle1, handle2);
+#elif defined(BOOST_POSIX_API)
+ return bp::create_pipe();
+#endif
+}
+
+struct read_handler
+{
+ boost::asio::streambuf &buffer_;
+
+ read_handler(boost::asio::streambuf &buffer) : buffer_(buffer) {}
+
+ void operator()(const boost::system::error_code &ec, std::size_t size)
+ {
+ BOOST_REQUIRE(!ec);
+ std::istream is(&buffer_);
+ std::string line;
+ std::getline(is, line);
+ BOOST_CHECK(boost::algorithm::starts_with(line, "abc"));
+ }
+};
+
+BOOST_AUTO_TEST_CASE(async_io)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ bp::pipe p = create_async_pipe();
+
+ {
+ bio::file_descriptor_sink sink(p.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --echo-stderr abc"),
+ bpi::bind_stderr(sink),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+ }
+
+ boost::asio::io_service io_service;
+ pipe_end pend(io_service, p.source);
+
+ boost::asio::streambuf buffer;
+ boost::asio::async_read_until(pend, buffer, '\n',
+ read_handler(buffer));
+
+ io_service.run();
+}
+
+BOOST_AUTO_TEST_CASE(nul)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+#if defined(BOOST_WINDOWS_API)
+ bio::file_descriptor_sink sink("NUL");
+#elif defined(BOOST_POSIX_API)
+ bio::file_descriptor_sink sink("/dev/null");
+#endif
+
+ boost::system::error_code ec;
+ bp::child c = bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --is-nul-stderr"),
+ bpi::bind_stderr(sink),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+
+ int exit_code = bp::wait_for_exit(c);
+#if defined(BOOST_WINDOWS_API)
+ BOOST_CHECK_EQUAL(EXIT_SUCCESS, exit_code);
+#elif defined(BOOST_POSIX_API)
+ BOOST_CHECK_EQUAL(EXIT_SUCCESS, WEXITSTATUS(exit_code));
+#endif
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/bind_stdin.cpp b/plugins/New_GPG/src/include/libs/process/test/bind_stdin.cpp
new file mode 100644
index 0000000000..83f547dda9
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/bind_stdin.cpp
@@ -0,0 +1,165 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/iostreams/device/file_descriptor.hpp>
+#include <boost/iostreams/stream.hpp>
+#include <boost/asio.hpp>
+#include <string>
+#include <cstdlib>
+#if defined(BOOST_WINDOWS_API)
+# include <Windows.h>
+typedef boost::asio::windows::stream_handle pipe_end;
+#elif defined(BOOST_POSIX_API)
+# include <sys/wait.h>
+# include <unistd.h>
+typedef boost::asio::posix::stream_descriptor pipe_end;
+#endif
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+namespace bio = boost::iostreams;
+
+BOOST_AUTO_TEST_CASE(sync_io)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ bp::pipe p1 = bp::create_pipe();
+ bp::pipe p2 = bp::create_pipe();
+
+ {
+ bio::file_descriptor_source source1(p1.source, bio::close_handle);
+ bio::file_descriptor_sink sink2(p2.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --prefix abc"),
+ bpi::bind_stdin(source1),
+ bpi::bind_stdout(sink2),
+#if defined(BOOST_POSIX_API)
+ bpi::close_fd(p1.sink),
+#endif
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+ }
+
+ bio::file_descriptor_sink sink1(p1.sink, bio::close_handle);
+ bio::stream<bio::file_descriptor_sink> os(sink1);
+
+ os << "hello" << std::endl;
+
+ bio::file_descriptor_source source2(p2.source, bio::close_handle);
+ bio::stream<bio::file_descriptor_source> is(source2);
+
+ std::string s;
+ is >> s;
+ BOOST_CHECK_EQUAL(s, "abchello");
+ os << 123 << std::endl;
+ is >> s;
+ BOOST_CHECK_EQUAL(s, "abc123");
+ os << 3.1415 << std::endl;
+ is >> s;
+ BOOST_CHECK_EQUAL(s, "abc3.1415");
+}
+
+bp::pipe create_async_pipe()
+{
+#if defined(BOOST_WINDOWS_API)
+ std::string name = "\\\\.\\pipe\\boost_process_test_bind_stdin";
+ HANDLE handle1 = CreateNamedPipeA(name.c_str(), PIPE_ACCESS_INBOUND,
+ 0, 1, 8192, 8192, 0, NULL);
+ HANDLE handle2 = CreateFileA(name.c_str(), GENERIC_WRITE, 0, NULL,
+ OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
+ return bp::make_pipe(handle1, handle2);
+#elif defined(BOOST_POSIX_API)
+ return bp::create_pipe();
+#endif
+}
+
+struct write_handler
+{
+ bio::stream<bio::file_descriptor_source> &is_;
+
+ write_handler(bio::stream<bio::file_descriptor_source> &is) : is_(is) {}
+
+ void operator()(const boost::system::error_code &ec, std::size_t size)
+ {
+ BOOST_REQUIRE(!ec);
+ BOOST_REQUIRE_EQUAL(6u, size);
+ std::string s;
+ is_ >> s;
+ BOOST_CHECK_EQUAL(s, "abchello");
+ }
+};
+
+BOOST_AUTO_TEST_CASE(async_io)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ bp::pipe p1 = create_async_pipe();
+ bp::pipe p2 = bp::create_pipe();
+
+ {
+ bio::file_descriptor_source source1(p1.source, bio::close_handle);
+ bio::file_descriptor_sink sink2(p2.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --prefix-once abc"),
+ bpi::bind_stdin(source1),
+ bpi::bind_stdout(sink2),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+ }
+
+ bio::file_descriptor_source source2(p2.source, bio::close_handle);
+ bio::stream<bio::file_descriptor_source> is(source2);
+
+ boost::asio::io_service io_service;
+ pipe_end pend(io_service, p1.sink);
+
+ std::string s = "hello\n";
+ boost::asio::async_write(pend, boost::asio::buffer(s),
+ write_handler(is));
+
+ io_service.run();
+}
+
+BOOST_AUTO_TEST_CASE(nul)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+#if defined(BOOST_WINDOWS_API)
+ bio::file_descriptor_source source("NUL");
+#elif defined(BOOST_POSIX_API)
+ bio::file_descriptor_source source("/dev/null");
+#endif
+
+ boost::system::error_code ec;
+ bp::child c = bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --is-nul-stdin"),
+ bpi::bind_stdin(source),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+
+ int exit_code = bp::wait_for_exit(c);
+#if defined(BOOST_WINDOWS_API)
+ BOOST_CHECK_EQUAL(EXIT_SUCCESS, exit_code);
+#elif defined(BOOST_POSIX_API)
+ BOOST_CHECK_EQUAL(EXIT_SUCCESS, WEXITSTATUS(exit_code));
+#endif
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/bind_stdin_stdout.cpp b/plugins/New_GPG/src/include/libs/process/test/bind_stdin_stdout.cpp
new file mode 100644
index 0000000000..adb83eef22
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/bind_stdin_stdout.cpp
@@ -0,0 +1,62 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/iostreams/device/file_descriptor.hpp>
+#include <boost/iostreams/stream.hpp>
+#include <string>
+#include <iostream>
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+namespace bio = boost::iostreams;
+
+BOOST_AUTO_TEST_CASE(sync_io)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ bp::pipe p1 = bp::create_pipe();
+ bp::pipe p2 = bp::create_pipe();
+
+ {
+ bio::file_descriptor_source source(p1.source, bio::close_handle);
+ bio::file_descriptor_sink sink(p2.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --stdin-to-stdout"),
+ bpi::bind_stdin(source),
+ bpi::bind_stdout(sink),
+#if defined(BOOST_POSIX_API)
+ bpi::close_fd(p1.sink),
+#endif
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+ }
+
+ bio::file_descriptor_sink sink(p1.sink, bio::close_handle);
+ bio::stream<bio::file_descriptor_sink> os(sink);
+
+ bio::file_descriptor_source source(p2.source, bio::close_handle);
+ bio::stream<bio::file_descriptor_source> is(source);
+
+ std::string s = "abcdefghi j";
+ for (std::string::const_iterator it = s.begin(); it != s.end(); ++it)
+ {
+ os << *it << std::flush;
+ char c;
+ is >> std::noskipws >> c;
+ BOOST_CHECK_EQUAL(*it, c);
+ }
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/bind_stdout.cpp b/plugins/New_GPG/src/include/libs/process/test/bind_stdout.cpp
new file mode 100644
index 0000000000..9b06107ff9
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/bind_stdout.cpp
@@ -0,0 +1,144 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/iostreams/device/file_descriptor.hpp>
+#include <boost/iostreams/stream.hpp>
+#include <boost/asio.hpp>
+#include <boost/algorithm/string/predicate.hpp>
+#include <string>
+#include <istream>
+#include <cstdlib>
+#if defined(BOOST_WINDOWS_API)
+# include <Windows.h>
+typedef boost::asio::windows::stream_handle pipe_end;
+#elif defined(BOOST_POSIX_API)
+# include <sys/wait.h>
+# include <unistd.h>
+typedef boost::asio::posix::stream_descriptor pipe_end;
+#endif
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+namespace bio = boost::iostreams;
+
+BOOST_AUTO_TEST_CASE(sync_io)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ bp::pipe p = bp::create_pipe();
+
+ {
+ bio::file_descriptor_sink sink(p.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --echo-stdout hello"),
+ bpi::bind_stdout(sink),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+ }
+
+ bio::file_descriptor_source source(p.source, bio::close_handle);
+ bio::stream<bio::file_descriptor_source> is(source);
+
+ std::string s;
+ is >> s;
+ BOOST_CHECK_EQUAL(s, "hello");
+}
+
+bp::pipe create_async_pipe()
+{
+#if defined(BOOST_WINDOWS_API)
+ std::string name = "\\\\.\\pipe\\boost_process_test_bind_stdout";
+ HANDLE handle1 = CreateNamedPipeA(name.c_str(), PIPE_ACCESS_INBOUND |
+ FILE_FLAG_OVERLAPPED, 0, 1, 8192, 8192, 0, NULL);
+ HANDLE handle2 = CreateFileA(name.c_str(), GENERIC_WRITE, 0, NULL,
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ return bp::make_pipe(handle1, handle2);
+#elif defined(BOOST_POSIX_API)
+ return bp::create_pipe();
+#endif
+}
+
+struct read_handler
+{
+ boost::asio::streambuf &buffer_;
+
+ read_handler(boost::asio::streambuf &buffer) : buffer_(buffer) {}
+
+ void operator()(const boost::system::error_code &ec, std::size_t size)
+ {
+ BOOST_REQUIRE(!ec);
+ std::istream is(&buffer_);
+ std::string line;
+ std::getline(is, line);
+ BOOST_CHECK(boost::algorithm::starts_with(line, "abc"));
+ }
+};
+
+BOOST_AUTO_TEST_CASE(async_io)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ bp::pipe p = create_async_pipe();
+
+ {
+ bio::file_descriptor_sink sink(p.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --echo-stdout abc"),
+ bpi::bind_stdout(sink),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+ }
+
+ boost::asio::io_service io_service;
+ pipe_end pend(io_service, p.source);
+
+ boost::asio::streambuf buffer;
+ boost::asio::async_read_until(pend, buffer, '\n',
+ read_handler(buffer));
+
+ io_service.run();
+}
+
+BOOST_AUTO_TEST_CASE(nul)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+#if defined(BOOST_WINDOWS_API)
+ bio::file_descriptor_sink sink("NUL");
+#elif defined(BOOST_POSIX_API)
+ bio::file_descriptor_sink sink("/dev/null");
+#endif
+
+ boost::system::error_code ec;
+ bp::child c = bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --is-nul-stdout"),
+ bpi::bind_stdout(sink),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+
+ int exit_code = bp::wait_for_exit(c);
+#if defined(BOOST_WINDOWS_API)
+ BOOST_CHECK_EQUAL(EXIT_SUCCESS, exit_code);
+#elif defined(BOOST_POSIX_API)
+ BOOST_CHECK_EQUAL(EXIT_SUCCESS, WEXITSTATUS(exit_code));
+#endif
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/bind_stdout_stderr.cpp b/plugins/New_GPG/src/include/libs/process/test/bind_stdout_stderr.cpp
new file mode 100644
index 0000000000..90f90da858
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/bind_stdout_stderr.cpp
@@ -0,0 +1,131 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/iostreams/device/file_descriptor.hpp>
+#include <boost/iostreams/stream.hpp>
+#include <boost/asio.hpp>
+#include <boost/algorithm/string/predicate.hpp>
+#include <string>
+#include <istream>
+#if defined(BOOST_WINDOWS_API)
+# include <Windows.h>
+typedef boost::asio::windows::stream_handle pipe_end;
+#elif defined(BOOST_POSIX_API)
+typedef boost::asio::posix::stream_descriptor pipe_end;
+#endif
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+namespace bio = boost::iostreams;
+
+BOOST_AUTO_TEST_CASE(sync_io)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ bp::pipe p1 = bp::create_pipe();
+ bp::pipe p2 = bp::create_pipe();
+
+ {
+ bio::file_descriptor_sink sink1(p1.sink, bio::close_handle);
+ bio::file_descriptor_sink sink2(p2.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --echo-stdout-stderr hello"),
+ bpi::bind_stdout(sink1),
+ bpi::bind_stderr(sink2),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+ }
+
+ bio::file_descriptor_source source1(p1.source, bio::close_handle);
+ bio::stream<bio::file_descriptor_source> is1(source1);
+
+ std::string s;
+ is1 >> s;
+ BOOST_CHECK_EQUAL(s, "hello");
+
+ bio::file_descriptor_source source2(p2.source, bio::close_handle);
+ bio::stream<bio::file_descriptor_source> is2(source2);
+
+ is2 >> s;
+ BOOST_CHECK_EQUAL(s, "hello");
+}
+
+bp::pipe create_async_pipe(const std::string &s)
+{
+#if defined(BOOST_WINDOWS_API)
+ std::string name = "\\\\.\\pipe\\boost_process_test_bind_stdout_stderr" + s;
+ HANDLE handle1 = CreateNamedPipeA(name.c_str(), PIPE_ACCESS_INBOUND |
+ FILE_FLAG_OVERLAPPED, 0, 1, 8192, 8192, 0, NULL);
+ HANDLE handle2 = CreateFileA(name.c_str(), GENERIC_WRITE, 0, NULL,
+ OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
+ return bp::make_pipe(handle1, handle2);
+#elif defined(BOOST_POSIX_API)
+ return bp::create_pipe();
+#endif
+}
+
+struct read_handler
+{
+ boost::asio::streambuf &buffer_;
+
+ read_handler(boost::asio::streambuf &buffer) : buffer_(buffer) {}
+
+ void operator()(const boost::system::error_code &ec, std::size_t size)
+ {
+ BOOST_REQUIRE(!ec);
+ std::istream is(&buffer_);
+ std::string line;
+ std::getline(is, line);
+ BOOST_CHECK(boost::algorithm::starts_with(line, "abc"));
+ }
+};
+
+BOOST_AUTO_TEST_CASE(async_io)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ bp::pipe p1 = create_async_pipe("1");
+ bp::pipe p2 = create_async_pipe("2");
+
+ {
+ bio::file_descriptor_sink sink1(p1.sink, bio::close_handle);
+ bio::file_descriptor_sink sink2(p2.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --echo-stdout-stderr abc"),
+ bpi::bind_stdout(sink1),
+ bpi::bind_stderr(sink2),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+ }
+
+ boost::asio::io_service io_service;
+ pipe_end pend1(io_service, p1.source);
+ pipe_end pend2(io_service, p2.source);
+
+ boost::asio::streambuf buffer1;
+ boost::asio::async_read_until(pend1, buffer1, '\n',
+ read_handler(buffer1));
+
+ boost::asio::streambuf buffer2;
+ boost::asio::async_read_until(pend2, buffer2, '\n',
+ read_handler(buffer2));
+
+ io_service.run();
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/close_stderr.cpp b/plugins/New_GPG/src/include/libs/process/test/close_stderr.cpp
new file mode 100644
index 0000000000..e82f9df82c
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/close_stderr.cpp
@@ -0,0 +1,42 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <cstdlib>
+#if defined(BOOST_POSIX_API)
+# include <sys/wait.h>
+#endif
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+
+BOOST_AUTO_TEST_CASE(closed)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ boost::system::error_code ec;
+ bp::child c = bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --is-closed-stderr"),
+ bpi::close_stderr(),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+
+ int exit_code = bp::wait_for_exit(c);
+#if defined(BOOST_WINDOWS_API)
+ BOOST_CHECK_EQUAL(EXIT_SUCCESS, exit_code);
+#elif defined(BOOST_POSIX_API)
+ BOOST_CHECK_EQUAL(EXIT_SUCCESS, WEXITSTATUS(exit_code));
+#endif
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/close_stdin.cpp b/plugins/New_GPG/src/include/libs/process/test/close_stdin.cpp
new file mode 100644
index 0000000000..2290652ae8
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/close_stdin.cpp
@@ -0,0 +1,42 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <cstdlib>
+#if defined(BOOST_POSIX_API)
+# include <sys/wait.h>
+#endif
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+
+BOOST_AUTO_TEST_CASE(closed)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ boost::system::error_code ec;
+ bp::child c = bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --is-closed-stdin"),
+ bpi::close_stdin(),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+
+ int exit_code = bp::wait_for_exit(c);
+#if defined(BOOST_WINDOWS_API)
+ BOOST_CHECK_EQUAL(EXIT_SUCCESS, exit_code);
+#elif defined(BOOST_POSIX_API)
+ BOOST_CHECK_EQUAL(EXIT_SUCCESS, WEXITSTATUS(exit_code));
+#endif
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/close_stdout.cpp b/plugins/New_GPG/src/include/libs/process/test/close_stdout.cpp
new file mode 100644
index 0000000000..4338a8f1ed
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/close_stdout.cpp
@@ -0,0 +1,42 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <cstdlib>
+#if defined(BOOST_POSIX_API)
+# include <sys/wait.h>
+#endif
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+
+BOOST_AUTO_TEST_CASE(closed)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ boost::system::error_code ec;
+ bp::child c = bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --is-closed-stdout"),
+ bpi::close_stdout(),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+
+ int exit_code = bp::wait_for_exit(c);
+#if defined(BOOST_WINDOWS_API)
+ BOOST_CHECK_EQUAL(EXIT_SUCCESS, exit_code);
+#elif defined(BOOST_POSIX_API)
+ BOOST_CHECK_EQUAL(EXIT_SUCCESS, WEXITSTATUS(exit_code));
+#endif
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/exit_code.cpp b/plugins/New_GPG/src/include/libs/process/test/exit_code.cpp
new file mode 100644
index 0000000000..4fb946dcae
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/exit_code.cpp
@@ -0,0 +1,106 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/asio.hpp>
+#if defined(BOOST_WINDOWS_API)
+# include <Windows.h>
+typedef boost::asio::windows::stream_handle pipe_end;
+#elif defined(BOOST_POSIX_API)
+# include <sys/wait.h>
+# include <signal.h>
+typedef boost::asio::posix::stream_descriptor pipe_end;
+#endif
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+
+BOOST_AUTO_TEST_CASE(sync_wait)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ boost::system::error_code ec;
+ bp::child c = bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --exit-code 123"),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+
+ int exit_code = bp::wait_for_exit(c);
+#if defined(BOOST_WINDOWS_API)
+ BOOST_CHECK_EQUAL(123, exit_code);
+#elif defined(BOOST_POSIX_API)
+ BOOST_CHECK_EQUAL(123, WEXITSTATUS(exit_code));
+#endif
+}
+
+#if defined(BOOST_WINDOWS_API)
+struct wait_handler
+{
+ HANDLE handle_;
+
+ wait_handler(HANDLE handle) : handle_(handle) {}
+
+ void operator()(const boost::system::error_code &ec)
+ {
+ BOOST_REQUIRE(!ec);
+ DWORD exit_code;
+ BOOST_REQUIRE(GetExitCodeProcess(handle_, &exit_code));
+ BOOST_CHECK_EQUAL(123, exit_code);
+ }
+};
+#elif defined(BOOST_POSIX_API)
+struct wait_handler
+{
+ void operator()(const boost::system::error_code &ec, int signal)
+ {
+ BOOST_REQUIRE(!ec);
+ BOOST_REQUIRE_EQUAL(SIGCHLD, signal);
+ int status;
+ wait(&status);
+ BOOST_CHECK_EQUAL(123, WEXITSTATUS(status));
+ }
+};
+#endif
+
+BOOST_AUTO_TEST_CASE(async_wait)
+{
+ using boost::unit_test::framework::master_test_suite;
+ using namespace boost::asio;
+
+ boost::asio::io_service io_service;
+
+#if defined(BOOST_POSIX_API)
+ signal_set set(io_service, SIGCHLD);
+ set.async_wait(wait_handler());
+#endif
+
+ boost::system::error_code ec;
+ bp::child c = bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --exit-code 123"),
+ bpi::set_on_error(ec)
+#if defined(BOOST_POSIX_API)
+ , bpi::notify_io_service(io_service)
+#endif
+ );
+ BOOST_REQUIRE(!ec);
+
+#if defined(BOOST_WINDOWS_API)
+ windows::object_handle handle(io_service, c.process_handle());
+ handle.async_wait(wait_handler(handle.native()));
+#endif
+
+ io_service.run();
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/extensions.cpp b/plugins/New_GPG/src/include/libs/process/test/extensions.cpp
new file mode 100644
index 0000000000..6e53352eda
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/extensions.cpp
@@ -0,0 +1,65 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/bind.hpp>
+#include <boost/ref.hpp>
+#if defined(BOOST_WINDOWS_API)
+# include <Windows.h>
+#elif defined(BOOST_POSIX_API)
+# include <errno.h>
+#endif
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+namespace bio = boost::iostreams;
+
+void run_exe(const std::string &exe, bp::executor &e)
+{
+ e.exe = exe.c_str();
+}
+
+void set_on_error(boost::system::error_code &ec, bp::executor&)
+{
+ using namespace boost::system;
+#if defined(BOOST_WINDOWS_API)
+ ec = error_code(::GetLastError(), system_category());
+#elif defined(BOOST_POSIX_API)
+ ec = error_code(errno, system_category());
+#endif
+}
+
+BOOST_AUTO_TEST_CASE(extensions)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ std::string exe = master_test_suite().argv[1];
+
+ boost::system::error_code ec;
+ bp::execute(
+#if defined(BOOST_WINDOWS_API)
+ bpi::on_CreateProcess_setup(
+ boost::bind(run_exe, exe, _1)),
+ bpi::set_cmd_line("test"),
+ bpi::on_CreateProcess_error(
+ boost::bind(set_on_error, boost::ref(ec), _1))
+#elif defined(BOOST_POSIX_API)
+ bpi::on_exec_setup(
+ boost::bind(run_exe, exe, _1)),
+ bpi::set_cmd_line("test"),
+ bpi::on_exec_error(
+ boost::bind(set_on_error, boost::ref(ec), _1))
+#endif
+ );
+ BOOST_CHECK(!ec);
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/inherit_env.cpp b/plugins/New_GPG/src/include/libs/process/test/inherit_env.cpp
new file mode 100644
index 0000000000..591948d0e8
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/inherit_env.cpp
@@ -0,0 +1,58 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/iostreams/device/file_descriptor.hpp>
+#include <boost/iostreams/filtering_stream.hpp>
+#include <boost/iostreams/filter/newline.hpp>
+#include <boost/program_options/environment_iterator.hpp>
+#include <string>
+#include <stdlib.h>
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+
+BOOST_AUTO_TEST_CASE(inherit_env)
+{
+ using boost::unit_test::framework::master_test_suite;
+ namespace bio = boost::iostreams;
+
+ boost::environment_iterator it(environ);
+ BOOST_REQUIRE(it != boost::environment_iterator());
+
+ bp::pipe p = bp::create_pipe();
+
+ {
+ bio::file_descriptor_sink sink(p.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --query " + it->first),
+ bpi::inherit_env(),
+ bpi::bind_stdout(sink),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+ }
+
+ bio::file_descriptor_source source(p.source, bio::close_handle);
+ bio::filtering_istream is;
+ is.push(bio::newline_filter(bio::newline::posix));
+ is.push(source);
+
+ std::string s;
+ std::getline(is, s);
+ BOOST_CHECK_EQUAL(s, "defined");
+ std::getline(is, s);
+ BOOST_CHECK_EQUAL(s, it->second);
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/posix_specific.cpp b/plugins/New_GPG/src/include/libs/process/test/posix_specific.cpp
new file mode 100644
index 0000000000..6c4ce6378c
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/posix_specific.cpp
@@ -0,0 +1,113 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/system/system_error.hpp>
+#include <boost/iostreams/device/file_descriptor.hpp>
+#include <boost/iostreams/stream.hpp>
+#include <string>
+#include <sys/wait.h>
+#include <errno.h>
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+namespace bio = boost::iostreams;
+
+BOOST_AUTO_TEST_CASE(bind_fd)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ bp::pipe p = bp::create_pipe();
+
+ {
+ bio::file_descriptor_sink sink(p.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --posix-echo-one 3 hello"),
+ bpi::bind_fd(3, sink),
+ bpi::set_on_error(ec)
+ );
+ BOOST_CHECK(!ec);
+ }
+
+ bio::file_descriptor_source source(p.source, bio::close_handle);
+ bio::stream<bio::file_descriptor_source> is(source);
+
+ std::string s;
+ is >> s;
+ BOOST_CHECK_EQUAL(s, "hello");
+}
+
+BOOST_AUTO_TEST_CASE(bind_fds)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ bp::pipe p1 = bp::create_pipe();
+ bp::pipe p2 = bp::create_pipe();
+
+ {
+ bio::file_descriptor_sink sink1(p1.sink, bio::close_handle);
+ bio::file_descriptor_sink sink2(p2.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --posix-echo-two 3 hello 99 bye"),
+ bpi::bind_fd(3, sink1),
+ bpi::bind_fd(99, sink2),
+ bpi::set_on_error(ec)
+ );
+ BOOST_CHECK(!ec);
+ }
+
+ bio::file_descriptor_source source1(p1.source, bio::close_handle);
+ bio::stream<bio::file_descriptor_source> is1(source1);
+
+ std::string s1;
+ is1 >> s1;
+ BOOST_CHECK_EQUAL(s1, "hello");
+
+ bio::file_descriptor_source source2(p2.source, bio::close_handle);
+ bio::stream<bio::file_descriptor_source> is2(source2);
+
+ std::string s2;
+ is2 >> s2;
+ BOOST_CHECK_EQUAL(s2, "bye");
+}
+
+BOOST_AUTO_TEST_CASE(execve_set_on_error)
+{
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe("doesnt-exist"),
+ bpi::set_on_error(ec)
+ );
+ BOOST_CHECK(ec);
+ BOOST_CHECK_EQUAL(ec.value(), ENOENT);
+}
+
+BOOST_AUTO_TEST_CASE(execve_throw_on_error)
+{
+ try
+ {
+ bp::execute(
+ bpi::run_exe("doesnt-exist"),
+ bpi::throw_on_error()
+ );
+ }
+ catch (boost::system::system_error &e)
+ {
+ BOOST_CHECK(e.code());
+ BOOST_CHECK_EQUAL(e.code().value(), ENOENT);
+ }
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/run_exe.cpp b/plugins/New_GPG/src/include/libs/process/test/run_exe.cpp
new file mode 100644
index 0000000000..7c6e6b2511
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/run_exe.cpp
@@ -0,0 +1,39 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+
+BOOST_AUTO_TEST_CASE(run_exe_success)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_on_error(ec)
+ );
+ BOOST_CHECK(!ec);
+}
+
+BOOST_AUTO_TEST_CASE(run_exe_error)
+{
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe("doesnt-exist"),
+ bpi::set_on_error(ec)
+ );
+ BOOST_CHECK(ec);
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/run_exe_path.cpp b/plugins/New_GPG/src/include/libs/process/test/run_exe_path.cpp
new file mode 100644
index 0000000000..f514935259
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/run_exe_path.cpp
@@ -0,0 +1,46 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/filesystem.hpp>
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+
+BOOST_AUTO_TEST_CASE(run_exe_success)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ boost::filesystem::path exe = master_test_suite().argv[1];
+
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(exe),
+ bpi::set_on_error(ec)
+ );
+ BOOST_CHECK(!ec);
+}
+
+#if defined(BOOST_WINDOWS_API)
+BOOST_AUTO_TEST_CASE(run_exe_error)
+{
+ boost::filesystem::path exe = "doesnt-exist";
+
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(exe),
+ bpi::set_on_error(ec)
+ );
+ BOOST_CHECK(ec);
+}
+#endif
diff --git a/plugins/New_GPG/src/include/libs/process/test/run_exe_wstring.cpp b/plugins/New_GPG/src/include/libs/process/test/run_exe_wstring.cpp
new file mode 100644
index 0000000000..cc11bd00a5
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/run_exe_wstring.cpp
@@ -0,0 +1,46 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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 _UNICODE
+#define UNICODE
+#define BOOST_TEST_MAIN
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/filesystem.hpp>
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+
+BOOST_AUTO_TEST_CASE(run_exe_success)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ boost::filesystem::path p = master_test_suite().argv[1];
+
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(p.wstring()),
+ bpi::set_on_error(ec)
+ );
+ BOOST_CHECK(!ec);
+}
+
+#if defined(BOOST_WINDOWS_API)
+BOOST_AUTO_TEST_CASE(run_exe_error)
+{
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(L"doesnt-exist"),
+ bpi::set_on_error(ec)
+ );
+ BOOST_CHECK(ec);
+}
+#endif
diff --git a/plugins/New_GPG/src/include/libs/process/test/search_path.cpp b/plugins/New_GPG/src/include/libs/process/test/search_path.cpp
new file mode 100644
index 0000000000..2a155d8095
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/search_path.cpp
@@ -0,0 +1,34 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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 <boost/process.hpp>
+#include <string>
+
+namespace bp = boost::process;
+
+BOOST_AUTO_TEST_CASE(search)
+{
+#if defined(BOOST_WINDOWS_API)
+ std::string filename = "cmd";
+#elif defined(BOOST_POSIX_API)
+ std::string filename = "ls";
+#endif
+
+ BOOST_CHECK(!bp::search_path(filename).empty());
+
+#if defined(BOOST_WINDOWS_API)
+ std::string path = "C:\\Windows;C:\\Windows\\System32";
+#elif defined(BOOST_POSIX_API)
+ std::string path = "/usr/local/bin:/usr/bin:/bin";
+#endif
+
+ BOOST_CHECK(!bp::search_path(filename, path).empty());
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/search_path_wstring.cpp b/plugins/New_GPG/src/include/libs/process/test/search_path_wstring.cpp
new file mode 100644
index 0000000000..3ba9c33279
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/search_path_wstring.cpp
@@ -0,0 +1,25 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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 _UNICODE
+#define UNICODE
+#define BOOST_TEST_MAIN
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <string>
+
+namespace bp = boost::process;
+
+BOOST_AUTO_TEST_CASE(search)
+{
+ std::wstring filename = L"cmd";
+ BOOST_CHECK(!bp::search_path(filename).empty());
+ std::wstring path = L"C:\\Windows;C:\\Windows\\System32";
+ BOOST_CHECK(!bp::search_path(filename, path).empty());
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/set_args.cpp b/plugins/New_GPG/src/include/libs/process/test/set_args.cpp
new file mode 100644
index 0000000000..c3a453291d
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/set_args.cpp
@@ -0,0 +1,83 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/iostreams/device/file_descriptor.hpp>
+#include <boost/iostreams/filtering_stream.hpp>
+#include <boost/iostreams/filter/newline.hpp>
+#include <boost/assign/list_of.hpp>
+#include <string>
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+
+BOOST_AUTO_TEST_CASE(set_args)
+{
+ using boost::unit_test::framework::master_test_suite;
+ namespace bio = boost::iostreams;
+ namespace ba = boost::assign;
+
+ bp::pipe p = bp::create_pipe();
+
+ {
+ bio::file_descriptor_sink sink(p.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_args(ba::list_of<std::string>("test")
+ ("--echo-argv")("a b")),
+ bpi::bind_stdout(sink),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+ }
+
+ bio::file_descriptor_source source(p.source, bio::close_handle);
+ bio::filtering_istream is;
+ is.push(bio::newline_filter(bio::newline::posix));
+ is.push(source);
+
+ std::string s;
+ std::getline(is, s);
+ BOOST_CHECK_EQUAL(s, "\"test\" \"--echo-argv\" \"a b\"");
+}
+
+BOOST_AUTO_TEST_CASE(set_args_without_run_exe)
+{
+ using boost::unit_test::framework::master_test_suite;
+ namespace bio = boost::iostreams;
+ namespace ba = boost::assign;
+
+ std::string exe = master_test_suite().argv[1];
+ bp::pipe p = bp::create_pipe();
+
+ {
+ bio::file_descriptor_sink sink(p.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::set_args(ba::list_of<std::string>(exe)("--echo-argv")),
+ bpi::bind_stdout(sink),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+ }
+
+ bio::file_descriptor_source source(p.source, bio::close_handle);
+ bio::filtering_istream is;
+ is.push(bio::newline_filter(bio::newline::posix));
+ is.push(source);
+
+ std::string s;
+ std::getline(is, s);
+ BOOST_CHECK_EQUAL(s, "\"" + exe + "\" \"--echo-argv\"");
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/set_args_wstring.cpp b/plugins/New_GPG/src/include/libs/process/test/set_args_wstring.cpp
new file mode 100644
index 0000000000..685b57f440
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/set_args_wstring.cpp
@@ -0,0 +1,56 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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 _UNICODE
+#define UNICODE
+#define BOOST_TEST_MAIN
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/iostreams/device/file_descriptor.hpp>
+#include <boost/iostreams/filtering_stream.hpp>
+#include <boost/iostreams/filter/newline.hpp>
+#include <boost/assign/list_of.hpp>
+#include <string>
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+
+BOOST_AUTO_TEST_CASE(set_args)
+{
+ using boost::unit_test::framework::master_test_suite;
+ namespace bio = boost::iostreams;
+ namespace ba = boost::assign;
+
+ bp::pipe p = bp::create_pipe();
+
+ {
+ boost::filesystem::path exe = master_test_suite().argv[1];
+ bio::file_descriptor_sink sink(p.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(exe),
+ bpi::set_args(ba::list_of<std::wstring>(L"test")
+ (L"--echo-argv")(L"a b")),
+ bpi::bind_stdout(sink),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+ }
+
+ bio::file_descriptor_source source(p.source, bio::close_handle);
+ bio::filtering_istream is;
+ is.push(bio::newline_filter(bio::newline::posix));
+ is.push(source);
+
+ std::string s;
+ std::getline(is, s);
+ BOOST_CHECK_EQUAL(s, "\"test\" \"--echo-argv\" \"a b\"");
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/set_cmd_line.cpp b/plugins/New_GPG/src/include/libs/process/test/set_cmd_line.cpp
new file mode 100644
index 0000000000..128634a094
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/set_cmd_line.cpp
@@ -0,0 +1,50 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/iostreams/device/file_descriptor.hpp>
+#include <boost/iostreams/filtering_stream.hpp>
+#include <boost/iostreams/filter/newline.hpp>
+#include <string>
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+
+BOOST_AUTO_TEST_CASE(set_cmd_line)
+{
+ using boost::unit_test::framework::master_test_suite;
+ namespace bio = boost::iostreams;
+
+ bp::pipe p = bp::create_pipe();
+
+ {
+ bio::file_descriptor_sink sink(p.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --echo-argv \"a b\""),
+ bpi::bind_stdout(sink),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+ }
+
+ bio::file_descriptor_source source(p.source, bio::close_handle);
+ bio::filtering_istream is;
+ is.push(bio::newline_filter(bio::newline::posix));
+ is.push(source);
+
+ std::string s;
+ std::getline(is, s);
+ BOOST_CHECK_EQUAL(s, "\"test\" \"--echo-argv\" \"a b\"");
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/set_cmd_line_wstring.cpp b/plugins/New_GPG/src/include/libs/process/test/set_cmd_line_wstring.cpp
new file mode 100644
index 0000000000..629f7e3bb8
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/set_cmd_line_wstring.cpp
@@ -0,0 +1,54 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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 _UNICODE
+#define UNICODE
+#define BOOST_TEST_MAIN
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/filesystem.hpp>
+#include <boost/iostreams/device/file_descriptor.hpp>
+#include <boost/iostreams/filter/newline.hpp>
+#include <boost/iostreams/filtering_stream.hpp>
+#include <string>
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+
+BOOST_AUTO_TEST_CASE(set_cmd_line)
+{
+ using boost::unit_test::framework::master_test_suite;
+ namespace bio = boost::iostreams;
+
+ bp::pipe p = bp::create_pipe();
+
+ {
+ boost::filesystem::path exe = master_test_suite().argv[1];
+ bio::file_descriptor_sink sink(p.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(exe),
+ bpi::set_cmd_line(L"test --echo-argv \"a b\""),
+ bpi::bind_stdout(sink),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+ }
+
+ bio::file_descriptor_source source(p.source, bio::close_handle);
+ bio::filtering_istream is;
+ is.push(bio::newline_filter(bio::newline::posix));
+ is.push(source);
+
+ std::string s;
+ std::getline(is, s);
+ BOOST_CHECK_EQUAL(s, "\"test\" \"--echo-argv\" \"a b\"");
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/set_env.cpp b/plugins/New_GPG/src/include/libs/process/test/set_env.cpp
new file mode 100644
index 0000000000..d0eaf54e70
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/set_env.cpp
@@ -0,0 +1,57 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/iostreams/device/file_descriptor.hpp>
+#include <boost/iostreams/filtering_stream.hpp>
+#include <boost/iostreams/filter/newline.hpp>
+#include <set>
+#include <string>
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+
+BOOST_AUTO_TEST_CASE(set_env)
+{
+ using boost::unit_test::framework::master_test_suite;
+ namespace bio = boost::iostreams;
+
+ std::set<std::string> env;
+ env.insert("FOO=BAR");
+
+ bp::pipe p = bp::create_pipe();
+
+ {
+ bio::file_descriptor_sink sink(p.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --query FOO"),
+ bpi::set_env(env),
+ bpi::bind_stdout(sink),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+ }
+
+ bio::file_descriptor_source source(p.source, bio::close_handle);
+ bio::filtering_istream is;
+ is.push(bio::newline_filter(bio::newline::posix));
+ is.push(source);
+
+ std::string s;
+ std::getline(is, s);
+ BOOST_CHECK_EQUAL(s, "defined");
+ std::getline(is, s);
+ BOOST_CHECK_EQUAL(s, "BAR");
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/set_env_wstring.cpp b/plugins/New_GPG/src/include/libs/process/test/set_env_wstring.cpp
new file mode 100644
index 0000000000..bd884d33fe
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/set_env_wstring.cpp
@@ -0,0 +1,61 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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 _UNICODE
+#define UNICODE
+#define BOOST_TEST_MAIN
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/filesystem.hpp>
+#include <boost/iostreams/device/file_descriptor.hpp>
+#include <boost/iostreams/filtering_stream.hpp>
+#include <boost/iostreams/filter/newline.hpp>
+#include <set>
+#include <string>
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+
+BOOST_AUTO_TEST_CASE(set_env)
+{
+ using boost::unit_test::framework::master_test_suite;
+ namespace bio = boost::iostreams;
+
+ std::set<std::wstring> env;
+ env.insert(L"FOO=BAR");
+
+ bp::pipe p = bp::create_pipe();
+
+ {
+ boost::filesystem::path exe = master_test_suite().argv[1];
+ bio::file_descriptor_sink sink(p.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(exe),
+ bpi::set_cmd_line(L"test --query FOO"),
+ bpi::set_env(env),
+ bpi::bind_stdout(sink),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+ }
+
+ bio::file_descriptor_source source(p.source, bio::close_handle);
+ bio::filtering_istream is;
+ is.push(bio::newline_filter(bio::newline::posix));
+ is.push(source);
+
+ std::string s;
+ std::getline(is, s);
+ BOOST_CHECK_EQUAL(s, "defined");
+ std::getline(is, s);
+ BOOST_CHECK_EQUAL(s, "BAR");
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/set_on_error.cpp b/plugins/New_GPG/src/include/libs/process/test/set_on_error.cpp
new file mode 100644
index 0000000000..3680dee364
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/set_on_error.cpp
@@ -0,0 +1,27 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+
+BOOST_AUTO_TEST_CASE(set_on_error_test)
+{
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe("doesnt-exist"),
+ bpi::set_on_error(ec)
+ );
+ BOOST_CHECK(ec);
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/shell_path.cpp b/plugins/New_GPG/src/include/libs/process/test/shell_path.cpp
new file mode 100644
index 0000000000..31418b8116
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/shell_path.cpp
@@ -0,0 +1,29 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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 <boost/process.hpp>
+#include <boost/filesystem.hpp>
+
+namespace bp = boost::process;
+
+BOOST_AUTO_TEST_CASE(shell_set_on_error)
+{
+ boost::system::error_code ec;
+ boost::filesystem::path p = bp::shell_path(ec);
+ BOOST_CHECK(!ec);
+ BOOST_CHECK(boost::filesystem::exists(p));
+}
+
+BOOST_AUTO_TEST_CASE(shell_throw_on_error)
+{
+ BOOST_CHECK_NO_THROW(bp::shell_path());
+ BOOST_CHECK(boost::filesystem::exists(bp::shell_path()));
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/shell_path_wstring.cpp b/plugins/New_GPG/src/include/libs/process/test/shell_path_wstring.cpp
new file mode 100644
index 0000000000..72424b1404
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/shell_path_wstring.cpp
@@ -0,0 +1,31 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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 _UNICODE
+#define UNICODE
+#define BOOST_TEST_MAIN
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/filesystem.hpp>
+
+namespace bp = boost::process;
+
+BOOST_AUTO_TEST_CASE(shell_set_on_error)
+{
+ boost::system::error_code ec;
+ boost::filesystem::path p = bp::shell_path(ec);
+ BOOST_CHECK(!ec);
+ BOOST_CHECK(boost::filesystem::exists(p));
+}
+
+BOOST_AUTO_TEST_CASE(shell_throw_on_error)
+{
+ BOOST_CHECK_NO_THROW(bp::shell_path());
+ BOOST_CHECK(boost::filesystem::exists(bp::shell_path()));
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/show_window.cpp b/plugins/New_GPG/src/include/libs/process/test/show_window.cpp
new file mode 100644
index 0000000000..3bba69995e
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/show_window.cpp
@@ -0,0 +1,49 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/iostreams/device/file_descriptor.hpp>
+#include <boost/iostreams/stream.hpp>
+#include <string>
+#include <Windows.h>
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+
+BOOST_AUTO_TEST_CASE(show_window)
+{
+ using boost::unit_test::framework::master_test_suite;
+ namespace bio = boost::iostreams;
+
+ bp::pipe p = bp::create_pipe();
+
+ {
+ bio::file_descriptor_sink sink(p.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --windows-print-showwindow"),
+ bpi::show_window(SW_SHOWNORMAL),
+ bpi::bind_stdout(sink),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+ }
+
+ bio::file_descriptor_source source(p.source, bio::close_handle);
+ bio::stream<bio::file_descriptor_source> is(source);
+
+ int i;
+ is >> i;
+ BOOST_CHECK_EQUAL(i, SW_SHOWNORMAL);
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/sparring_partner.cpp b/plugins/New_GPG/src/include/libs/process/test/sparring_partner.cpp
new file mode 100644
index 0000000000..abfaf128f3
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/sparring_partner.cpp
@@ -0,0 +1,232 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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)
+
+#include <boost/program_options.hpp>
+#include <boost/filesystem.hpp>
+#include <boost/algorithm/string/join.hpp>
+#include <boost/range/iterator_range.hpp>
+#include <boost/range/algorithm/transform.hpp>
+#include <boost/range/algorithm_ext/push_back.hpp>
+#include <boost/lambda/lambda.hpp>
+#include <vector>
+#include <string>
+#include <iterator>
+#include <iostream>
+#include <cstdlib>
+#if defined(BOOST_POSIX_API)
+# include <boost/lexical_cast.hpp>
+# include <boost/iostreams/device/file_descriptor.hpp>
+# include <boost/iostreams/stream.hpp>
+# include <unistd.h>
+#elif defined(BOOST_WINDOWS_API)
+# include <Windows.h>
+#endif
+
+using namespace boost::program_options;
+
+int main(int argc, char *argv[])
+{
+ options_description desc;
+ desc.add_options()
+ ("echo-stdout", value<std::string>())
+ ("echo-stderr", value<std::string>())
+ ("echo-stdout-stderr", value<std::string>())
+ ("echo-argv", bool_switch())
+ ("exit-code", value<int>())
+ ("wait", value<int>())
+ ("is-closed-stdin", bool_switch())
+ ("is-closed-stdout", bool_switch())
+ ("is-closed-stderr", bool_switch())
+ ("is-nul-stdin", bool_switch())
+ ("is-nul-stdout", bool_switch())
+ ("is-nul-stderr", bool_switch())
+ ("loop", bool_switch())
+ ("prefix", value<std::string>())
+ ("prefix-once", value<std::string>())
+ ("pwd", bool_switch())
+ ("query-env", value<std::string>())
+ ("stdin-to-stdout", bool_switch())
+#if defined(BOOST_POSIX_API)
+ ("posix-echo-one", value<std::vector<std::string> >()->multitoken())
+ ("posix-echo-two", value<std::vector<std::string> >()->multitoken());
+#elif defined(BOOST_WINDOWS_API)
+ ("windows-print-showwindow", bool_switch())
+ ("windows-print-flags", bool_switch());
+#endif
+
+ variables_map vm;
+ command_line_parser parser(argc, argv);
+ store(parser.options(desc).allow_unregistered().run(), vm);
+ notify(vm);
+
+ if (vm.count("echo-stdout"))
+ {
+ std::cout << vm["echo-stdout"].as<std::string>() << std::endl;
+ }
+ else if (vm.count("echo-stderr"))
+ {
+ std::cerr << vm["echo-stderr"].as<std::string>() << std::endl;
+ }
+ else if (vm.count("echo-stdout-stderr"))
+ {
+ std::cout << vm["echo-stdout-stderr"].as<std::string>() << std::endl;
+ std::cerr << vm["echo-stdout-stderr"].as<std::string>() << std::endl;
+ }
+ else if (vm["echo-argv"].as<bool>())
+ {
+ std::vector<std::string> v, v2;
+ boost::push_back(v, boost::make_iterator_range(argv, argv + argc));
+ boost::transform(v, std::back_inserter(v2),
+ "\"" + boost::lambda::_1 + "\"");
+ std::cout << boost::algorithm::join(v2, " ") << std::endl;
+ }
+ else if (vm.count("exit-code"))
+ {
+ return vm["exit-code"].as<int>();
+ }
+ else if (vm.count("wait"))
+ {
+ int sec = vm["wait"].as<int>();
+#if defined(BOOST_POSIX_API)
+ sleep(sec);
+#elif defined(BOOST_WINDOWS_API)
+ Sleep(sec * 1000);
+#endif
+ }
+ else if (vm["is-closed-stdin"].as<bool>())
+ {
+ std::string s;
+ std::cin >> s;
+ return std::cin.eof() ? EXIT_SUCCESS : EXIT_FAILURE;
+ }
+ else if (vm["is-closed-stdout"].as<bool>())
+ {
+ std::cout << "foo" << std::endl;
+ return std::cout.bad() ? EXIT_SUCCESS : EXIT_FAILURE;
+ }
+ else if (vm["is-closed-stderr"].as<bool>())
+ {
+ std::cerr << "foo" << std::endl;
+ return std::cerr.bad() ? EXIT_SUCCESS : EXIT_FAILURE;
+ }
+ else if (vm["is-nul-stdin"].as<bool>())
+ {
+#if defined(BOOST_POSIX_API)
+ char buffer[1];
+ int res = read(STDIN_FILENO, buffer, 1);
+ return res != -1 ? EXIT_SUCCESS : EXIT_FAILURE;
+#elif defined(BOOST_WINDOWS_API)
+ HANDLE h = GetStdHandle(STD_INPUT_HANDLE);
+ if (h == INVALID_HANDLE_VALUE)
+ return EXIT_FAILURE;
+ char buffer[1];
+ DWORD read;
+ BOOL res = ReadFile(h, buffer, 1, &read, NULL);
+ CloseHandle(h);
+ return res ? EXIT_SUCCESS : EXIT_FAILURE;
+#endif
+ }
+ else if (vm["is-nul-stdout"].as<bool>())
+ {
+ std::cout << "foo" << std::endl;
+ return std::cout.bad() ? EXIT_FAILURE : EXIT_SUCCESS;
+ }
+ else if (vm["is-nul-stderr"].as<bool>())
+ {
+ std::cerr << "foo" << std::endl;
+ return std::cerr.bad() ? EXIT_FAILURE : EXIT_SUCCESS;
+ }
+ else if (vm["loop"].as<bool>())
+ {
+ for (;;);
+ }
+ else if (vm.count("prefix"))
+ {
+ std::string line;
+ while (std::getline(std::cin, line))
+ std::cout << vm["prefix"].as<std::string>() << line << std::endl;
+ }
+ else if (vm.count("prefix-once"))
+ {
+ std::string line;
+ std::getline(std::cin, line);
+ std::cout << vm["prefix-once"].as<std::string>() << line << std::endl;
+ }
+ else if (vm["pwd"].as<bool>())
+ {
+ std::cout << boost::filesystem::current_path().string() << std::endl;
+ }
+ else if (vm.count("query-env"))
+ {
+#if defined(BOOST_POSIX_API)
+ const char *value = getenv(vm["query-env"].as<std::string>().c_str());
+ if (value == NULL)
+ std::cout << "undefined" << std::endl;
+ else
+ {
+ std::cout << "defined" << std::endl;
+ std::cout << value << std::endl;
+ }
+#elif defined(BOOST_WINDOWS_API)
+ char buf[1024];
+ DWORD res = GetEnvironmentVariableA(vm["query-env"].as<std::string>().c_str(), buf, sizeof(buf));
+ if (res == 0)
+ std::cout << "undefined" << std::endl;
+ else
+ {
+ std::cout << "defined" << std::endl;
+ std::cout << buf << std::endl;
+ }
+#endif
+ }
+ else if (vm["stdin-to-stdout"].as<bool>())
+ {
+ char ch;
+ while (std::cin >> std::noskipws >> ch)
+ std::cout << ch << std::flush;
+ }
+#if defined(BOOST_POSIX_API)
+ else if (vm.count("posix-echo-one"))
+ {
+ using namespace boost::iostreams;
+ std::vector<std::string> v = vm["posix-echo-one"].as<std::vector<std::string> >();
+ int fd = boost::lexical_cast<int>(v[0]);
+ file_descriptor_sink sink(fd, close_handle);
+ stream<file_descriptor_sink> os(sink);
+ os << v[1] << std::endl;
+ }
+ else if (vm.count("posix-echo-two"))
+ {
+ using namespace boost::iostreams;
+ std::vector<std::string> v = vm["posix-echo-two"].as<std::vector<std::string> >();
+ int fd1 = boost::lexical_cast<int>(v[0]);
+ file_descriptor_sink sink1(fd1, close_handle);
+ stream<file_descriptor_sink> os1(sink1);
+ os1 << v[1] << std::endl;
+ int fd2 = boost::lexical_cast<int>(v[2]);
+ file_descriptor_sink sink2(fd2, close_handle);
+ stream<file_descriptor_sink> os2(sink2);
+ os2 << v[3] << std::endl;
+ }
+#elif defined(BOOST_WINDOWS_API)
+ else if (vm["windows-print-showwindow"].as<bool>())
+ {
+ STARTUPINFO si;
+ GetStartupInfo(&si);
+ std::cout << si.wShowWindow << std::endl;
+ }
+ else if (vm["windows-print-flags"].as<bool>())
+ {
+ STARTUPINFO si;
+ GetStartupInfo(&si);
+ std::cout << si.dwFlags << std::endl;
+ }
+#endif
+ return EXIT_SUCCESS;
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/start_in_dir.cpp b/plugins/New_GPG/src/include/libs/process/test/start_in_dir.cpp
new file mode 100644
index 0000000000..eb7c5737bb
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/start_in_dir.cpp
@@ -0,0 +1,63 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/iostreams/device/file_descriptor.hpp>
+#include <boost/iostreams/filter/newline.hpp>
+#include <boost/iostreams/filtering_stream.hpp>
+#include <boost/filesystem.hpp>
+#include <string>
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+
+struct test_dir
+{
+ std::string s_;
+ test_dir(const std::string &s) : s_(s)
+ { BOOST_REQUIRE_NO_THROW(boost::filesystem::create_directory(s)); }
+ ~test_dir() { boost::filesystem::remove(s_); }
+};
+
+BOOST_AUTO_TEST_CASE(start_in_dir)
+{
+ using boost::unit_test::framework::master_test_suite;
+ namespace bio = boost::iostreams;
+
+ test_dir dir("start_in_dir_test");
+
+ bp::pipe p = bp::create_pipe();
+
+ bio::file_descriptor_sink sink(p.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::child c = bp::execute(
+ bpi::run_exe(boost::filesystem::absolute(master_test_suite().argv[1])),
+ bpi::set_cmd_line("test --pwd"),
+ bpi::start_in_dir(dir.s_),
+ bpi::bind_stdout(sink),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+ bio::close(sink);
+
+ bio::file_descriptor_source source(p.source, bio::close_handle);
+ bio::filtering_istream is;
+ is.push(bio::newline_filter(bio::newline::posix));
+ is.push(source);
+
+ std::string s;
+ std::getline(is, s);
+ BOOST_CHECK_EQUAL(s, boost::filesystem::absolute(dir.s_));
+
+ BOOST_REQUIRE_NO_THROW(bp::wait_for_exit(c));
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/start_in_dir_wstring.cpp b/plugins/New_GPG/src/include/libs/process/test/start_in_dir_wstring.cpp
new file mode 100644
index 0000000000..245a567583
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/start_in_dir_wstring.cpp
@@ -0,0 +1,67 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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 _UNICODE
+#define UNICODE
+#define BOOST_TEST_MAIN
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/iostreams/device/file_descriptor.hpp>
+#include <boost/iostreams/filter/newline.hpp>
+#include <boost/iostreams/filtering_stream.hpp>
+#include <boost/filesystem.hpp>
+#include <string>
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+
+struct test_dir
+{
+ std::wstring ws_;
+ test_dir(const std::wstring &ws) : ws_(ws)
+ { BOOST_REQUIRE_NO_THROW(boost::filesystem::create_directory(ws)); }
+ ~test_dir() { boost::filesystem::remove(ws_); }
+};
+
+BOOST_AUTO_TEST_CASE(start_in_dir)
+{
+ using boost::unit_test::framework::master_test_suite;
+ namespace bio = boost::iostreams;
+
+ test_dir dir(L"start_in_dir_test");
+
+ boost::filesystem::path exe = master_test_suite().argv[1];
+
+ bp::pipe p = bp::create_pipe();
+
+ bio::file_descriptor_sink sink(p.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::child c = bp::execute(
+ bpi::run_exe(boost::filesystem::absolute(exe)),
+ bpi::set_cmd_line(L"test --pwd"),
+ bpi::start_in_dir(dir.ws_),
+ bpi::bind_stdout(sink),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+ bio::close(sink);
+
+ bio::file_descriptor_source source(p.source, bio::close_handle);
+ bio::filtering_istream is;
+ is.push(bio::newline_filter(bio::newline::posix));
+ is.push(source);
+
+ std::string s;
+ std::getline(is, s);
+ BOOST_CHECK_EQUAL(s, boost::filesystem::absolute(dir.ws_));
+
+ BOOST_REQUIRE_NO_THROW(bp::wait_for_exit(c));
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/terminate.cpp b/plugins/New_GPG/src/include/libs/process/test/terminate.cpp
new file mode 100644
index 0000000000..1306492436
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/terminate.cpp
@@ -0,0 +1,48 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+
+BOOST_AUTO_TEST_CASE(terminate_set_on_error)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ boost::system::error_code ec;
+ bp::child c = bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --loop"),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+
+ bp::terminate(c, ec);
+ BOOST_CHECK(!ec);
+}
+
+BOOST_AUTO_TEST_CASE(terminate_throw_on_error)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ boost::system::error_code ec;
+ bp::child c = bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --loop"),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+
+ BOOST_CHECK_NO_THROW(bp::terminate(c));
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/throw_on_error.cpp b/plugins/New_GPG/src/include/libs/process/test/throw_on_error.cpp
new file mode 100644
index 0000000000..47e5eafb41
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/throw_on_error.cpp
@@ -0,0 +1,28 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/system_error.hpp>
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+
+BOOST_AUTO_TEST_CASE(throw_on_error_test)
+{
+ BOOST_CHECK_THROW(
+ bp::execute(
+ bpi::run_exe("doesnt-exist"),
+ bpi::throw_on_error()
+ ),
+ boost::system::system_error
+ );
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/wait.cpp b/plugins/New_GPG/src/include/libs/process/test/wait.cpp
new file mode 100644
index 0000000000..7b60ce4e2e
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/wait.cpp
@@ -0,0 +1,71 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/asio.hpp>
+#if defined(BOOST_POSIX_API)
+# include <signal.h>
+#endif
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+
+BOOST_AUTO_TEST_CASE(sync_wait)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ boost::system::error_code ec;
+ bp::child c = bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --wait 1"),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+
+ bp::wait_for_exit(c);
+}
+
+struct wait_handler
+{
+#if defined(BOOST_WINDOWS_API)
+ void operator()(const boost::system::error_code&) {}
+#elif defined(BOOST_POSIX_API)
+ void operator()(const boost::system::error_code&, int) {}
+#endif
+};
+
+BOOST_AUTO_TEST_CASE(async_wait)
+{
+ using boost::unit_test::framework::master_test_suite;
+ using namespace boost::asio;
+
+ boost::system::error_code ec;
+ bp::child c = bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --wait 1"),
+ bpi::set_on_error(ec)
+ );
+ BOOST_REQUIRE(!ec);
+
+ boost::asio::io_service io_service;
+
+#if defined(BOOST_WINDOWS_API)
+ windows::object_handle handle(io_service, c.process_handle());
+ handle.async_wait(wait_handler());
+#elif defined(BOOST_POSIX_API)
+ signal_set set(io_service, SIGCHLD);
+ set.async_wait(wait_handler());
+#endif
+
+ io_service.run();
+}
diff --git a/plugins/New_GPG/src/include/libs/process/test/windows_specific.cpp b/plugins/New_GPG/src/include/libs/process/test/windows_specific.cpp
new file mode 100644
index 0000000000..c0c69e085a
--- /dev/null
+++ b/plugins/New_GPG/src/include/libs/process/test/windows_specific.cpp
@@ -0,0 +1,53 @@
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal
+// Copyright (c) 2008 Ilya Sokolov, Boris Schaeling
+// Copyright (c) 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, Boris Schaeling
+// Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling
+//
+// 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
+#define BOOST_TEST_IGNORE_SIGCHLD
+#include <boost/test/included/unit_test.hpp>
+#include <boost/process.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/iostreams/device/file_descriptor.hpp>
+#include <boost/iostreams/stream.hpp>
+#include <Windows.h>
+
+namespace bp = boost::process;
+namespace bpi = boost::process::initializers;
+namespace bio = boost::iostreams;
+
+void set_flags(bp::executor &e)
+{
+ e.startup_info.dwFlags |= STARTF_FORCEOFFFEEDBACK;
+}
+
+BOOST_AUTO_TEST_CASE(flags)
+{
+ using boost::unit_test::framework::master_test_suite;
+
+ bp::pipe p = bp::create_pipe();
+
+ {
+ bio::file_descriptor_sink sink(p.sink, bio::close_handle);
+ boost::system::error_code ec;
+ bp::execute(
+ bpi::run_exe(master_test_suite().argv[1]),
+ bpi::set_cmd_line("test --windows-print-flags"),
+ bpi::bind_stdout(sink),
+ bpi::on_CreateProcess_setup(set_flags),
+ bpi::set_on_error(ec)
+ );
+ BOOST_CHECK(!ec);
+ }
+
+ bio::file_descriptor_source source(p.source, bio::close_handle);
+ bio::stream<bio::file_descriptor_source> is(source);
+
+ int i;
+ is >> i;
+ BOOST_CHECK_EQUAL(i, STARTF_USESTDHANDLES | STARTF_FORCEOFFFEEDBACK);
+}