summaryrefslogtreecommitdiff
path: root/plugins/New_GPG/src/include/libs/process/test/posix_specific.cpp
blob: 6c4ce6378cc9080fc512d5e58f70661680f7beb0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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);
    }
}