diff options
| author | Alexander Gluzsky <sss123next@list.ru> | 2013-02-03 12:54:02 +0000 |
|---|---|---|
| committer | Alexander Gluzsky <sss123next@list.ru> | 2013-02-03 12:54:02 +0000 |
| commit | 2637b7479c3e531f891346dbe84c73805a8b5e36 (patch) | |
| tree | bdfe96ed34c5f08b856fa760c2cdc70ba6763352 /plugins/New_GPG/src/include/libs/process/test | |
| parent | 32e17cfa965980f07e8321fb29d38d62a2e1ad27 (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')
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); +} |
