void test_input() 
{ 
    std::vector<std::string> args; 
    args.push_back("helpers"); 
    args.push_back("stdin-to-stdout"); 

    bp::posix_context ctx; 
    ctx.input_behavior.insert(bp::behavior_map::value_type(STDIN_FILENO, bp::capture_stream())); 
    ctx.output_behavior.insert(bp::behavior_map::value_type(STDOUT_FILENO, bp::capture_stream())); 
    ctx.environment = bp::self::get_environment(); 

    bp::posix_child c = bp::posix_launch(get_helpers_path(), args, ctx); 

    bp::postream &os = c.get_input(STDIN_FILENO); 
    bp::pistream &is = c.get_output(STDOUT_FILENO); 

    os << "message-to-process" << std::endl; 
    os.close(); 

    std::string word; 
    is >> word; 
    BOOST_CHECK_EQUAL(word, "message-to-process"); 

    const bp::status s = c.wait(); 
    BOOST_REQUIRE(s.exited()); 
    BOOST_CHECK_EQUAL(s.exit_status(), EXIT_SUCCESS); 
} 
void check_redirect(int desc1, int desc2, const std::string &msg) 
{ 
    std::vector<std::string> args; 
    args.push_back("helpers"); 
    args.push_back("posix-echo-two"); 
    args.push_back(boost::str(boost::format("%1%") % desc1)); 
    args.push_back(boost::str(boost::format("%1%") % desc2)); 
    args.push_back(msg); 

    bp::posix_context ctx; 
    ctx.output_behavior.insert(bp::behavior_map::value_type(desc1, bp::capture_stream())); 
    ctx.output_behavior.insert(bp::behavior_map::value_type(desc2, bp::posix_redirect_stream(desc1))); 
    ctx.environment = bp::self::get_environment(); 

    bp::posix_child c = posix_launch(get_helpers_path(), args, ctx); 

    bp::pistream &is = c.get_output(desc1); 
    int dtmp; 
    std::string word; 
    is >> dtmp; 
    BOOST_CHECK_EQUAL(dtmp, desc1); 
    is >> word; 
    BOOST_CHECK_EQUAL(word, msg); 
    is >> dtmp; 
    BOOST_CHECK_EQUAL(dtmp, desc2); 
    is >> word; 
    BOOST_CHECK_EQUAL(word, msg); 

    const bp::status s = c.wait(); 
    BOOST_REQUIRE(s.exited()); 
    BOOST_CHECK_EQUAL(s.exit_status(), EXIT_SUCCESS); 
} 
static void test_shell_execution() 
{ 
    std::string command; 
    if (bp_api_type == posix_api) 
        command = "echo test | sed 's,^,LINE-,'"; 
    else if (bp_api_type == win32_api) 
        command = "if foo==foo echo LINE-test"; 
    else 
        BOOST_REQUIRE(false); 

    bp::context ctx; 
    ctx.stdout_behavior = bp::capture_stream(); 
    // Julio: Without the following line, bash returns an exit status of 4, 
    // which makes the test fail...  Why?  I don't know. 
    ctx.stderr_behavior = bp::redirect_stream_to_stdout(); 
    bp::child c = bp::launch_shell(command, ctx); 

    bp::pistream &is = c.get_stdout(); 
    std::string word; 
    is >> word; 
    BOOST_CHECK_EQUAL(word, "LINE-test"); 

    const bp::status s = c.wait(); 
    BOOST_REQUIRE(s.exited()); 
    BOOST_CHECK_EQUAL(s.exit_status(), EXIT_SUCCESS); 
} 
static std::string get_argument(const std::string &word) 
{ 
    std::vector<std::string> args; 
    args.push_back("helpers"); 
    args.push_back("echo-quoted"); 
    args.push_back(word); 

    bp::context ctx; 
    ctx.stdout_behavior = bp::capture_stream(); 
    ctx.environment = bp::self::get_environment(); 

    bp::child c = bp::launch(get_helpers_path(), args, ctx); 
    bp::pistream &is = c.get_stdout(); 

    std::string result; 
    portable_getline(is, result); 

    const bp::status s = c.wait(); 
    BOOST_REQUIRE(s.exited()); 
    BOOST_CHECK_EQUAL(s.exit_status(), EXIT_SUCCESS); 

    return result; 
}