$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r64257 - in sandbox/SOC/2010/process: boost/process boost/process/detail libs/process/example libs/process/test libs/process/test/util
From: boris_at_[hidden]
Date: 2010-07-22 07:41:15
Author: bschaeling
Date: 2010-07-22 07:41:12 EDT (Thu, 22 Jul 2010)
New Revision: 64257
URL: http://svn.boost.org/trac/boost/changeset/64257
Log:
Added first test case
Added:
   sandbox/SOC/2010/process/libs/process/test/
   sandbox/SOC/2010/process/libs/process/test/Jamfile.jam   (contents, props changed)
   sandbox/SOC/2010/process/libs/process/test/arguments.cpp   (contents, props changed)
   sandbox/SOC/2010/process/libs/process/test/util/
   sandbox/SOC/2010/process/libs/process/test/util/boost.hpp   (contents, props changed)
   sandbox/SOC/2010/process/libs/process/test/util/helpers.cpp   (contents, props changed)
   sandbox/SOC/2010/process/libs/process/test/util/use_helpers.hpp   (contents, props changed)
Text files modified: 
   sandbox/SOC/2010/process/boost/process/detail/posix_helpers.hpp   |    24 +++++++++---------                      
   sandbox/SOC/2010/process/boost/process/detail/status_impl.hpp     |    17 ++++++++----                            
   sandbox/SOC/2010/process/boost/process/detail/systembuf.hpp       |     8 +++---                                  
   sandbox/SOC/2010/process/boost/process/detail/win32_helpers.hpp   |    13 ++++-----                               
   sandbox/SOC/2010/process/boost/process/operations.hpp             |    52 ++++++++++++++++++++--------------------
   sandbox/SOC/2010/process/libs/process/example/read_from_child.cpp |     2                                         
   6 files changed, 60 insertions(+), 56 deletions(-)
Modified: sandbox/SOC/2010/process/boost/process/detail/posix_helpers.hpp
==============================================================================
--- sandbox/SOC/2010/process/boost/process/detail/posix_helpers.hpp	(original)
+++ sandbox/SOC/2010/process/boost/process/detail/posix_helpers.hpp	2010-07-22 07:41:12 EDT (Thu, 22 Jul 2010)
@@ -41,14 +41,18 @@
  * NULL-terminated string of the form var=value; these must also be
  * released by the caller.
  *
- * \return A dynamically allocated char** array that represents
- *         the environment's content. Each array entry is a
- *         NULL-terminated string of the form var=value.
+ * \return The first argument of the pair is an integer that indicates
+ *         how many strings are stored in the second argument. The
+ *         second argument is a NULL-terminated, dynamically allocated
+ *         array of dynamically allocated strings representing the
+ *         enviroment's content. Each array entry is a NULL-terminated
+ *         string of the form var=value. The caller is responsible of 
+ *         freeing them.
  */
-inline char **environment_to_envp(const environment_t &env)
+inline std::pair<std::size_t, char**> environment_to_envp(const environment_t &env)
 {
-    char **envp = new char*[env.size() + 1]; 
-
+    std::size_t nargs = env.size();
+    char **envp = new char*[nargs + 1]; 
     environment_t::size_type i = 0; 
     for (environment_t::const_iterator it = env.begin(); it != env.end(); ++it) 
     { 
@@ -58,8 +62,7 @@
         ++i; 
     } 
     envp[i] = 0; 
-
-    return envp; 
+    return std::pair<std::size_t, char**>(nargs, envp);
 }
 
 /**
@@ -77,11 +80,9 @@
  *         to the executable. The caller is responsible of freeing them.
  */
 template <class Arguments>
-inline std::pair<std::size_t, char**> collection_to_posix_argv(const Arguments &args)
+inline std::pair<std::size_t, char**> collection_to_argv(const Arguments &args)
 {
     std::size_t nargs = args.size();
-    BOOST_ASSERT(nargs >= 0);
-
     char **argv = new char*[nargs + 1];
     typename Arguments::size_type i = 0;
     for (typename Arguments::const_iterator it = args.begin(); it != args.end(); ++it)
@@ -91,7 +92,6 @@
         ++i;
     }
     argv[nargs] = 0;
-
     return std::pair<std::size_t, char**>(nargs, argv);
 }
 
Modified: sandbox/SOC/2010/process/boost/process/detail/status_impl.hpp
==============================================================================
--- sandbox/SOC/2010/process/boost/process/detail/status_impl.hpp	(original)
+++ sandbox/SOC/2010/process/boost/process/detail/status_impl.hpp	2010-07-22 07:41:12 EDT (Thu, 22 Jul 2010)
@@ -37,7 +37,7 @@
 namespace process {
 namespace detail {
 
-#elif defined(BOOST_POSIX_API)
+#if defined(BOOST_POSIX_API)
 typedef pid_t phandle;
 #elif defined(BOOST_WINDOWS_API)
 typedef HANDLE phandle;
@@ -82,7 +82,8 @@
         } while (p == -1 && errno == EINTR);
         if (p == -1)
         {
-            ec = boost::system::system_error(boost::system::error_code(errno, boost::system::get_system_category()), BOOST_PROCESS_SOURCE_LOCATION "waitpid(2) failed");
+            ec = boost::system::error_code(errno,
+                    boost::system::get_system_category());
             return -1;
         }
         return status;
@@ -90,14 +91,16 @@
         HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION | SYNCHRONIZE, FALSE, pid);
         if (h == NULL)
         {
-            ec = boost::system::system_error(boost::system::error_code(errno, boost::system::get_system_category()), BOOST_PROCESS_SOURCE_LOCATION "OpenProcess() failed");
+            ec = boost::system::error_code(GetLastError(),
+                    boost::system::get_system_category());
             return -1;
         }
 
         if (WaitForSingleObject(h, INFINITE) == WAIT_FAILED)
         {
             CloseHandle(h);
-            ec = boost::system::system_error(boost::system::error_code(errno, boost::system::get_system_category()), BOOST_PROCESS_SOURCE_LOCATION "WaitForSingleObject() failed");
+            ec = boost::system::error_code(GetLastError(),
+                    boost::system::get_system_category());
             return -1;
         }
 
@@ -105,12 +108,14 @@
         if (!GetExitCodeProcess(h, &exit_code))
         {
             CloseHandle(h);
-            ec = boost::system::system_error(boost::system::error_code(errno, boost::system::get_system_category()), BOOST_PROCESS_SOURCE_LOCATION "GetExitCodeProcess() failed");
+            ec = boost::system::error_code(GetLastError(),
+                    boost::system::get_system_category());
             return -1;
         }
         if (!CloseHandle(h))
         {
-            ec = boost::system::system_error(boost::system::error_code(errno, boost::system::get_system_category()), BOOST_PROCESS_SOURCE_LOCATION "CloseHandle() failed");
+            ec = boost::system::error_code(GetLastError(),
+                    boost::system::get_system_category());
             return -1;
         }
         return exit_code;
Modified: sandbox/SOC/2010/process/boost/process/detail/systembuf.hpp
==============================================================================
--- sandbox/SOC/2010/process/boost/process/detail/systembuf.hpp	(original)
+++ sandbox/SOC/2010/process/boost/process/detail/systembuf.hpp	2010-07-22 07:41:12 EDT (Thu, 22 Jul 2010)
@@ -121,11 +121,11 @@
 
         bool ok;
 #if defined(BOOST_POSIX_API)
-        ssize_t cnt = ::read(handle_, read_buf_.get(), bufsize_);
+        ssize_t cnt = read(handle_, read_buf_.get(), bufsize_);
         ok = (cnt != -1 && cnt != 0);
 #elif defined(BOOST_WINDOWS_API)
         DWORD cnt;
-        BOOL res = ::ReadFile(handle_, read_buf_.get(), bufsize_, &cnt, NULL);
+        BOOL res = ReadFile(handle_, read_buf_.get(), bufsize_, &cnt, NULL);
         ok = (res && cnt > 0);
 #endif
 
@@ -186,7 +186,7 @@
         ssize_t cnt = pptr() - pbase();
         bool ok;
 
-        ok = (::write(handle_, pbase(), cnt) == cnt);
+        ok = (write(handle_, pbase(), cnt) == cnt);
         if (ok)
             pbump(-cnt);
         return ok ? 0 : -1;
@@ -197,7 +197,7 @@
         long cnt = pptr() - pbase();
         bool ok;
         DWORD rcnt;
-        BOOL res = ::WriteFile(handle_, pbase(), cnt, &rcnt, NULL);
+        BOOL res = WriteFile(handle_, pbase(), cnt, &rcnt, NULL);
 
         ok = (res && static_cast<long>(rcnt) == cnt);
         if (ok)
Modified: sandbox/SOC/2010/process/boost/process/detail/win32_helpers.hpp
==============================================================================
--- sandbox/SOC/2010/process/boost/process/detail/win32_helpers.hpp	(original)
+++ sandbox/SOC/2010/process/boost/process/detail/win32_helpers.hpp	2010-07-22 07:41:12 EDT (Thu, 22 Jul 2010)
@@ -53,22 +53,21 @@
     if (env.empty())
     {
         envp.reset(new char[2]);
-        ::ZeroMemory(envp.get(), 2);
+        ZeroMemory(envp.get(), 2);
     }
     else
     {
         std::string s;
         for (environment_t::const_iterator it = env.begin(); it != env.end(); ++it)
         {
-            s += (*it).first + "=" + (*it).second;
+            s += it->first + "=" + it->second;
             s.push_back(0);
         }
-
         envp.reset(new char[s.size() + 1]);
 #if defined(__CYGWIN__) || defined(_SCL_SECURE_NO_DEPRECATE)
-        ::memcpy(envp.get(), s.c_str(), s.size() + 1);
+        memcpy(envp.get(), s.c_str(), s.size() + 1);
 #else
-        ::memcpy_s(envp.get(), s.size() + 1, s.c_str(), s.size() + 1);
+        memcpy_s(envp.get(), s.size() + 1, s.c_str(), s.size() + 1);
 #endif
     }
 
@@ -118,9 +117,9 @@
     cmdline.get()[0] = '\0';
     for (arguments_t::size_type i = 0; i < args.size(); ++i)
 #if defined(__CYGWIN__) || defined(_SCL_SECURE_NO_DEPRECATE)
-        ::strncat(cmdline.get(), args2[i].c_str(), args2[i].size());
+        strncat(cmdline.get(), args2[i].c_str(), args2[i].size());
 #else
-        ::strcat_s(cmdline.get(), size, args2[i].c_str());
+        strcat_s(cmdline.get(), size, args2[i].c_str());
 #endif
 
     return cmdline;
Modified: sandbox/SOC/2010/process/boost/process/operations.hpp
==============================================================================
--- sandbox/SOC/2010/process/boost/process/operations.hpp	(original)
+++ sandbox/SOC/2010/process/boost/process/operations.hpp	2010-07-22 07:41:12 EDT (Thu, 22 Jul 2010)
@@ -178,17 +178,17 @@
     args.insert(args.begin(), p_name);
 
 #if defined(BOOST_POSIX_API)
-    pid_t pid = ::fork();
+    pid_t pid = fork();
     if (pid == -1)
         BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("fork(2) failed");
     else if (pid == 0)
     {
 #if defined(F_MAXFD)
-        int maxdescs = ::fcntl(-1, F_MAXFD, 0);
+        int maxdescs = fcntl(-1, F_MAXFD, 0);
         if (maxdescs == -1)
-            maxdescs = ::sysconf(_SC_OPEN_MAX);
+            maxdescs = sysconf(_SC_OPEN_MAX);
 #else
-        int maxdescs = ::sysconf(_SC_OPEN_MAX);
+        int maxdescs = sysconf(_SC_OPEN_MAX);
 #endif
         if (maxdescs == -1)
             maxdescs = 1024;
@@ -201,7 +201,7 @@
             int stdin_fd = ctx.stdin_behavior->get_child_end();
             if (stdin_fd != -1 && stdin_fd < maxdescs)
             {
-                if (::dup2(stdin_fd, STDIN_FILENO) == -1)
+                if (dup2(stdin_fd, STDIN_FILENO) == -1)
                     BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("dup2() failed");
                 closeflags[STDIN_FILENO] = false;
             }
@@ -209,7 +209,7 @@
             int stdout_fd = ctx.stdout_behavior->get_child_end();
             if (stdout_fd != -1 && stdout_fd < maxdescs)
             {
-                if (::dup2(stdout_fd, STDOUT_FILENO) == -1)
+                if (dup2(stdout_fd, STDOUT_FILENO) == -1)
                     BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("dup2() failed");
                 closeflags[STDOUT_FILENO] = false;
             }
@@ -217,7 +217,7 @@
             int stderr_fd = ctx.stderr_behavior->get_child_end();
             if (stderr_fd != -1 && stderr_fd < maxdescs)
             {
-                if (::dup2(stderr_fd, STDERR_FILENO) == -1)
+                if (dup2(stderr_fd, STDERR_FILENO) == -1)
                     BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("dup2() failed");
                 closeflags[STDERR_FILENO] = false;
             }
@@ -225,32 +225,32 @@
             for (int i = 0; i < maxdescs; ++i)
             {
                 if (closeflags[i])
-                    ::close(i);
+                    close(i);
             }
         }
         catch (const boost::system::system_error &e)
         {
-            ::write(STDERR_FILENO, e.what(), std::strlen(e.what()));
-            ::write(STDERR_FILENO, "\n", 1);
+            write(STDERR_FILENO, e.what(), std::strlen(e.what()));
+            write(STDERR_FILENO, "\n", 1);
             std::exit(127);
         }
 
-        std::pair<std::size_t, char**> argcv = detail::collection_to_posix_argv(args);
-        char **envp = detail::environment_to_envp(ctx.environment);
+        std::pair<std::size_t, char**> argv = detail::collection_to_argv(args);
+        std::pair<std::size_t, char**> envp = detail::environment_to_envp(ctx.environment);
 
-        ::execve(executable.c_str(), argcv.second, envp);
+        execve(executable.c_str(), argv.second, envp.second);
 
-        for (std::size_t i = 0; i < argcv.first; ++i) 
-            delete[] argcv.second[i]; 
-        delete[] argcv.second; 
-
-        for (std::size_t i = 0; i < ctx.environment.size(); ++i) 
-            delete[] envp[i]; 
-        delete[] envp; 
+        for (std::size_t i = 0; i < argv.first; ++i)
+            delete[] argv.second[i];
+        delete[] argv.second;
+
+        for (std::size_t i = 0; i < envp.first; ++i)
+            delete[] envp.second[i];
+        delete[] envp.second;
 
         boost::system::system_error e(boost::system::error_code(errno, boost::system::get_system_category()), BOOST_PROCESS_SOURCE_LOCATION "execve(2) failed");
-        ::write(STDERR_FILENO, e.what(), std::strlen(e.what()));
-        ::write(STDERR_FILENO, "\n", 1);
+        write(STDERR_FILENO, e.what(), std::strlen(e.what()));
+        write(STDERR_FILENO, "\n", 1);
         std::exit(127);
     }
     else
@@ -271,7 +271,7 @@
     }
 #elif defined(BOOST_WINDOWS_API)
     STARTUPINFOA startup_info;
-    ::ZeroMemory(&startup_info, sizeof(startup_info));
+    ZeroMemory(&startup_info, sizeof(startup_info));
     startup_info.cb = sizeof(startup_info);
     startup_info.dwFlags |= STARTF_USESTDHANDLES;
     startup_info.hStdInput = ctx.stdin_behavior->get_child_end();
@@ -279,7 +279,7 @@
     startup_info.hStdError = ctx.stderr_behavior->get_child_end();
 
     PROCESS_INFORMATION pi;
-    ::ZeroMemory(&pi, sizeof(pi));
+    ZeroMemory(&pi, sizeof(pi));
 
     boost::shared_array<char> cmdline = detail::collection_to_win32_cmdline(args);
 
@@ -291,10 +291,10 @@
 
     boost::shared_array<char> envstrs = detail::environment_to_win32_strings(ctx.environment);
 
-    if (::CreateProcessA(exe.get(), cmdline.get(), NULL, NULL, TRUE, 0, envstrs.get(), workdir.get(), &startup_info, &pi) == 0)
+    if (CreateProcessA(exe.get(), cmdline.get(), NULL, NULL, TRUE, 0, envstrs.get(), workdir.get(), &startup_info, &pi) == 0)
         BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("CreateProcess() failed"); 
 
-    if (!::CloseHandle(pi.hThread))
+    if (!CloseHandle(pi.hThread))
         BOOST_PROCESS_THROW_LAST_SYSTEM_ERROR("CloseHandle() failed"); 
 
     return child(pi.dwProcessId, 
Modified: sandbox/SOC/2010/process/libs/process/example/read_from_child.cpp
==============================================================================
--- sandbox/SOC/2010/process/libs/process/example/read_from_child.cpp	(original)
+++ sandbox/SOC/2010/process/libs/process/example/read_from_child.cpp	2010-07-22 07:41:12 EDT (Thu, 22 Jul 2010)
@@ -21,7 +21,7 @@
     std::string exe = find_executable_in_path("hostname"); 
     context ctx; 
     ctx.stdout_behavior = behavior::pipe::def(behavior::pipe::stream_type::output_stream); 
-    child c = create_child(exe,ctx); 
+    child c = create_child(exe, ctx); 
     pistream &is = c.get_stdout(); 
     std::cout << is.rdbuf(); 
     c.wait();
Added: sandbox/SOC/2010/process/libs/process/test/Jamfile.jam
==============================================================================
--- (empty file)
+++ sandbox/SOC/2010/process/libs/process/test/Jamfile.jam	2010-07-22 07:41:12 EDT (Thu, 22 Jul 2010)
@@ -0,0 +1,26 @@
+# 
+# Boost.Process 
+# ~~~~~~~~~~~~~ 
+# 
+# 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 
+# 
+# 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) 
+# 
+
+alias butf : /boost//unit_test_framework ; 
+explicit butf ; 
+
+alias bfs : /boost//filesystem : : : <link>shared:<source>/boost//system ; 
+explicit bfs ; 
+
+project : requirements <target-os>windows:<define>WIN32_LEAN_AND_MEAN ; 
+
+exe helpers : util/helpers.cpp bfs ; 
+explicit helpers ; 
+
+using testing ; 
+run arguments.cpp butf bfs : : helpers : <dependency>helpers ; 
Added: sandbox/SOC/2010/process/libs/process/test/arguments.cpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2010/process/libs/process/test/arguments.cpp	2010-07-22 07:41:12 EDT (Thu, 22 Jul 2010)
@@ -0,0 +1,121 @@
+// 
+// Boost.Process 
+// ~~~~~~~~~~~~~ 
+// 
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal 
+// Copyright (c) 2008, 2009 Boris Schaeling
+// Copyright (c) 2010 Felipe Tanus, 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/process/config.hpp> 
+
+#if defined(BOOST_POSIX_API) 
+#   include <utility> 
+#   include <cstddef> 
+#   include <sys/wait.h> 
+#elif defined(BOOST_WINDOWS_API) 
+#else 
+#   error "Unsupported platform." 
+#endif 
+
+#define BOOST_TEST_MAIN 
+#include "util/boost.hpp" 
+#include "util/use_helpers.hpp" 
+#include <string> 
+#include <vector> 
+#include <cstring> 
+#include <cstdlib> 
+
+std::string get_argument(const std::string &word) 
+{ 
+    std::vector<std::string> args; 
+    args.push_back("echo-quoted"); 
+    args.push_back(word); 
+
+    bp::context ctx; 
+    ctx.stdout_behavior = bpb::pipe::def(bpb::pipe::output_stream); 
+
+    bp::child c = bp::create_child(get_helpers_path(), args, ctx); 
+    bp::pistream &is = c.get_stdout(); 
+
+    std::string result; 
+    std::getline(is, result); 
+    std::string::size_type pos = result.rfind('\r'); 
+    if (pos != std::string::npos) 
+        result.erase(pos); 
+
+    int status = c.wait(); 
+#if defined(BOOST_POSIX_API) 
+    BOOST_REQUIRE(WIFEXITED(status)); 
+    BOOST_CHECK_EQUAL(WEXITSTATUS(status), EXIT_SUCCESS); 
+#elif defined(BOOST_WINDOWS_API) 
+    BOOST_CHECK_EQUAL(status, EXIT_SUCCESS); 
+#endif 
+
+    return result; 
+} 
+
+BOOST_AUTO_TEST_CASE(test_quoting) 
+{ 
+    check_helpers(); 
+
+    BOOST_CHECK_EQUAL(get_argument("foo"), ">>>foo<<<"); 
+    BOOST_CHECK_EQUAL(get_argument("foo "), ">>>foo <<<"); 
+    BOOST_CHECK_EQUAL(get_argument(" foo"), ">>> foo<<<"); 
+    BOOST_CHECK_EQUAL(get_argument("foo bar"), ">>>foo bar<<<"); 
+
+    BOOST_CHECK_EQUAL(get_argument("foo\"bar"), ">>>foo\"bar<<<"); 
+    BOOST_CHECK_EQUAL(get_argument("foo\"bar\""), ">>>foo\"bar\"<<<"); 
+    BOOST_CHECK_EQUAL(get_argument("\"foo\"bar"), ">>>\"foo\"bar<<<"); 
+    BOOST_CHECK_EQUAL(get_argument("\"foo bar\""), ">>>\"foo bar\"<<<"); 
+
+    BOOST_CHECK_EQUAL(get_argument("*"), ">>>*<<<"); 
+    BOOST_CHECK_EQUAL(get_argument("?*"), ">>>?*<<<"); 
+    BOOST_CHECK_EQUAL(get_argument("[a-z]*"), ">>>[a-z]*<<<"); 
+} 
+
+#if defined(BOOST_POSIX_API) 
+BOOST_AUTO_TEST_CASE(test_collection_to_posix_argv) 
+{ 
+    std::vector<std::string> args; 
+    args.push_back("program"); 
+    args.push_back("arg1"); 
+    args.push_back("arg2"); 
+    args.push_back("arg3"); 
+
+    std::pair<std::size_t, char**> p = bpd::collection_to_argv(args); 
+    std::size_t argc = p.first; 
+    char **argv = p.second; 
+
+    BOOST_REQUIRE_EQUAL(argc, static_cast<std::size_t>(4)); 
+
+    BOOST_REQUIRE(std::strcmp(argv[0], "program") == 0); 
+    BOOST_REQUIRE(std::strcmp(argv[1], "arg1") == 0); 
+    BOOST_REQUIRE(std::strcmp(argv[2], "arg2") == 0); 
+    BOOST_REQUIRE(std::strcmp(argv[3], "arg3") == 0); 
+    BOOST_REQUIRE(argv[4] == 0); 
+
+    delete[] argv[0]; 
+    delete[] argv[1]; 
+    delete[] argv[2]; 
+    delete[] argv[3]; 
+    delete[] argv; 
+} 
+#endif 
+
+#if defined(BOOST_WINDOWS_API) 
+BOOST_AUTO_TEST_CASE(test_collection_to_win32_cmdline) 
+{ 
+    std::vector<std::string> args; 
+    args.push_back("program"); 
+    args.push_back("arg1"); 
+    args.push_back("arg2"); 
+    args.push_back("arg3"); 
+
+    boost::shared_array<char> cmdline = bpd::collection_to_win32_cmdline(args); 
+    BOOST_REQUIRE(std::strcmp(cmdline.get(), "program arg1 arg2 arg3") == 0); 
+} 
+#endif 
Added: sandbox/SOC/2010/process/libs/process/test/util/boost.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2010/process/libs/process/test/util/boost.hpp	2010-07-22 07:41:12 EDT (Thu, 22 Jul 2010)
@@ -0,0 +1,27 @@
+// 
+// Boost.Process 
+// ~~~~~~~~~~~~~ 
+// 
+// Copyright (c) 2006, 2007 Julio M. Merino Vidal 
+// Copyright (c) 2008, 2009 Boris Schaeling 
+// Copyright (c) 2010 Felipe Tanus, 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) 
+// 
+
+#ifndef BOOST_PROCESS_TEST_UTIL_BOOST_HPP 
+#define BOOST_PROCESS_TEST_UTIL_BOOST_HPP 
+
+#include <boost/process/all.hpp> 
+#include <boost/test/unit_test.hpp> 
+#include <boost/filesystem.hpp> 
+
+namespace bp = boost::process; 
+namespace bpb = boost::process::behavior; 
+namespace bpd = boost::process::detail; 
+namespace but = boost::unit_test; 
+namespace butf = boost::unit_test::framework; 
+namespace bfs = boost::filesystem; 
+
+#endif 
Added: sandbox/SOC/2010/process/libs/process/test/util/helpers.cpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2010/process/libs/process/test/util/helpers.cpp	2010-07-22 07:41:12 EDT (Thu, 22 Jul 2010)
@@ -0,0 +1,247 @@
+// 
+// Boost.Process 
+// ~~~~~~~~~~~~~ 
+// 
+// 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 
+// 
+// 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/process/config.hpp> 
+
+#if defined(BOOST_POSIX_API) 
+#   include <stdlib.h> 
+#elif defined(BOOST_WINDOWS_API) 
+#   include <windows.h> 
+#else 
+#   error "Unsupported platform." 
+#endif 
+
+#include <boost/process/detail/systembuf.hpp> 
+#include <boost/filesystem.hpp> 
+#include <iostream> 
+#include <string> 
+#include <cstdlib> 
+
+namespace bpd = boost::process::detail; 
+namespace bfs = boost::filesystem; 
+
+namespace { 
+
+int h_echo_quoted(int argc, char *argv[]) 
+{ 
+    std::cout << ">>>" << argv[1] << "<<<" << std::endl; 
+    return EXIT_SUCCESS; 
+} 
+
+int h_echo_stdout(int argc, char *argv[]) 
+{ 
+    std::cout << argv[1] << std::endl; 
+    return EXIT_SUCCESS; 
+} 
+
+int h_echo_stderr(int argc, char *argv[]) 
+{ 
+    std::cerr << argv[1] << std::endl; 
+    return EXIT_SUCCESS; 
+} 
+
+int h_echo_stdout_stderr(int argc, char *argv[]) 
+{ 
+    std::cout << "stdout " << argv[1] << std::endl; 
+    std::cout.flush(); 
+    std::cerr << "stderr " << argv[1] << std::endl; 
+    std::cerr.flush(); 
+    return EXIT_SUCCESS; 
+} 
+
+int h_exit_failure(int argc, char *argv[]) 
+{ 
+    return EXIT_FAILURE; 
+} 
+
+int h_exit_success(int argc, char *argv[]) 
+{ 
+    return EXIT_SUCCESS; 
+} 
+
+int h_is_closed_stdin(int argc, char *argv[]) 
+{ 
+    std::string word; 
+    std::cin >> word; 
+    return std::cin.eof() ? EXIT_SUCCESS : EXIT_FAILURE; 
+} 
+
+int h_is_closed_stdout(int argc, char *argv[]) 
+{ 
+    std::cout << "foo" << std::endl; 
+    return std::cout.bad() ? EXIT_SUCCESS : EXIT_FAILURE; 
+} 
+
+int h_is_closed_stderr(int argc, char *argv[]) 
+{ 
+    std::cerr << "foo" << std::endl; 
+    return std::cerr.bad() ? EXIT_SUCCESS : EXIT_FAILURE; 
+} 
+
+int h_loop(int argc, char *argv[]) 
+{ 
+    for (;;) 
+        ; 
+
+    return EXIT_SUCCESS; 
+} 
+
+int h_prefix(int argc, char *argv[]) 
+{ 
+    std::string line; 
+    while (std::getline(std::cin, line)) 
+        std::cout << argv[1] << line << std::endl; 
+
+    return EXIT_SUCCESS; 
+} 
+
+int h_pwd(int argc, char *argv[]) 
+{ 
+    std::cout << bfs::current_path().string() << std::endl; 
+    return EXIT_SUCCESS; 
+} 
+
+int h_query_env(int argc, char *argv[]) 
+{ 
+#if defined(BOOST_WINDOWS_API) 
+    char buf[1024]; 
+    DWORD res = GetEnvironmentVariableA(argv[1], buf, sizeof(buf)); 
+    std::cout << (res ? buf : "undefined") << std::endl; 
+#else 
+    const char *value = getenv(argv[1]); 
+    std::cout << (value ? value : "undefined") << std::endl; 
+#endif 
+
+    return EXIT_SUCCESS; 
+} 
+
+int h_stdin_to_stdout(int argc, char *argv[]) 
+{ 
+    char ch; 
+    while (std::cin >> ch) 
+        std::cout << ch; 
+
+    return EXIT_SUCCESS; 
+} 
+
+#if defined(BOOST_POSIX_API) 
+int h_posix_echo_one(int argc, char *argv[]) 
+{ 
+    int desc = std::atoi(argv[1]); 
+
+    bpd::systembuf buf(desc); 
+    std::ostream os(&buf); 
+    os << argv[2] << std::endl; 
+
+    return EXIT_SUCCESS; 
+} 
+
+int h_posix_echo_two(int argc, char *argv[]) 
+{ 
+    int desc1 = std::atoi(argv[1]); 
+    int desc2 = std::atoi(argv[2]); 
+
+    bpd::systembuf buf1(desc1); 
+    std::ostream os1(&buf1); 
+    os1 << argv[1] << " " << argv[3] << std::endl; 
+
+    bpd::systembuf buf2(desc2); 
+    std::ostream os2(&buf2); 
+    os2 << argv[2] << " " << argv[3] << std::endl; 
+
+    return EXIT_SUCCESS; 
+} 
+#endif 
+
+#if defined(BOOST_WINDOWS_API) 
+int h_win32_print_startupinfo(int argc, char *argv[]) 
+{ 
+    STARTUPINFO si; 
+    GetStartupInfo(&si); 
+    std::cout << "dwFlags = " << si.dwFlags << std::endl; 
+    std::cout << "dwX = " << si.dwX << std::endl; 
+    std::cout << "dwY = " << si.dwY << std::endl; 
+    std::cout << "dwXSize = " << si.dwXSize << std::endl; 
+    std::cout << "dwYSize = " << si.dwYSize << std::endl; 
+
+    return EXIT_SUCCESS; 
+} 
+#endif 
+
+} 
+
+struct helper 
+{ 
+    const char *name; 
+    int (*entry)(int, char*[]); 
+    int min_argc; 
+    const char *syntax; 
+} helpers[] = { 
+    { "echo-quoted", h_echo_quoted, 2, "word" }, 
+    { "echo-stdout", h_echo_stdout, 2, "message" }, 
+    { "echo-stderr", h_echo_stderr, 2, "message" }, 
+    { "echo-stdout-stderr", h_echo_stdout_stderr, 2, "message" }, 
+    { "exit-failure", h_exit_failure, 1, "" }, 
+    { "exit-success", h_exit_success, 1, "" }, 
+    { "is-closed-stdin", h_is_closed_stdin, 1, "" }, 
+    { "is-closed-stdout", h_is_closed_stdout, 1, "" }, 
+    { "is-closed-stderr", h_is_closed_stderr, 1, "" }, 
+    { "loop", h_loop, 1, "" }, 
+    { "prefix", h_prefix, 2, "string" }, 
+    { "pwd", h_pwd, 1, "" }, 
+    { "query-env", h_query_env, 2, "variable" }, 
+    { "stdin-to-stdout", h_stdin_to_stdout, 1, "" }, 
+#if defined(BOOST_POSIX_API) 
+    { "posix-echo-one", h_posix_echo_one, 3, "desc message" }, 
+    { "posix-echo-two", h_posix_echo_two, 4, "desc1 desc2 message" }, 
+#elif defined(BOOST_WINDOWS_API) 
+    { "win32-print-startupinfo", h_win32_print_startupinfo, 1, "" }, 
+#endif 
+    { 0 } 
+}; 
+
+int main(int argc, char *argv[]) 
+{ 
+    if (argc < 2) 
+    { 
+        std::cerr << "helpers: Missing command" << std::endl; 
+        return 128; 
+    } 
+
+    std::string command(argv[1]); 
+    --argc; 
+    ++argv; 
+
+    struct helper *h = helpers; 
+    while (h->name != 0) 
+    { 
+        if (command == h->name) 
+        { 
+            int res; 
+            if (argc < h->min_argc) 
+            { 
+                std::cerr << "helpers: Command syntax: `" << command << " " 
+                    << h->syntax << "'" << std::endl; 
+                res = 128; 
+            } 
+            else 
+                res = (*h->entry)(argc, argv); 
+            return res; 
+        } 
+        ++h; 
+    } 
+
+    std::cerr << "helpers: Invalid command `" << command << "'" 
+        << std::endl; 
+    return 128; 
+} 
Added: sandbox/SOC/2010/process/libs/process/test/util/use_helpers.hpp
==============================================================================
--- (empty file)
+++ sandbox/SOC/2010/process/libs/process/test/util/use_helpers.hpp	2010-07-22 07:41:12 EDT (Thu, 22 Jul 2010)
@@ -0,0 +1,36 @@
+// 
+// Boost.Process 
+// ~~~~~~~~~~~~~ 
+// 
+// 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 
+// 
+// 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) 
+// 
+
+#ifndef BOOST_PROCESS_TEST_UTIL_USE_HELPERS_HPP 
+#define BOOST_PROCESS_TEST_UTIL_USE_HELPERS_HPP 
+
+#include "boost.hpp" 
+#include <string> 
+
+const std::string &get_helpers_path() 
+{ 
+    static const std::string hp = 
+        (bfs::initial_path() / butf::master_test_suite().argv[1]).string(); 
+    return hp; 
+} 
+
+void check_helpers() 
+{ 
+    if (butf::master_test_suite().argc < 2) 
+        throw butf::setup_error("path to helper expected"); 
+    if (!bfs::exists(get_helpers_path())) 
+        throw butf::setup_error( 
+            "helper's path '" + get_helpers_path() + "' does not exists"); 
+} 
+
+#endif