Boost :: Технологические конвейерные потоки и модульное тестирование - PullRequest
1 голос
/ 11 апреля 2020

У меня есть источник с двумя такими потоками:

bp::ipstream StdOut;
bp::opstream StdIn;
bp::child MyProcess = bp::child(processPath, bp::std_out > StdOut, bp::std_in < StdIn);
// Doing some stuff with StdOut and StdIn

Я хотел бы узнать, есть ли способ записи вручную в этот StdOut и чтения из StdIn для выполнения модульных тестов? Большое спасибо!

1 Ответ

0 голосов
/ 22 апреля 2020

Вы можете записать их в виде обычного потока:

Live On Coliru

#include <boost/process.hpp>
#include <iostream>

namespace bp = boost::process;

int main() {
    bp::ipstream StdOut;
    bp::opstream StdIn;
    bp::child MyProcess = bp::child("/usr/bin/rev", bp::std_out > StdOut, bp::std_in < StdIn);

    for (int i = 0; i<100; ++i) {
        StdIn << "Sure no problem, " << i << std::endl;
    }
    StdIn.flush();
    StdIn.pipe().close();

    std::string il;
    while (getline(StdOut, il)) {
        std::cout << il << std::endl;
    }

    std::cout << "Bye\n";
}

Печать

0 ,melborp on eruS
1 ,melborp on eruS
2 ,melborp on eruS
...
99 ,melborp on eruS
Bye

Обратите внимание, как и в документации, предупреждающей, что если вашему процессу требуется асинхронный c IO, вы можете в конечном итоге заблокировать блокировку (например, ожидать вывода, пока дочерний процесс ожидает ввода).

Для достижения для этого используйте асинхронные операции Asio:

Live On Coliru

#include <boost/process.hpp>
#include <boost/asio.hpp>
#include <boost/process/async.hpp>
#include <iostream>

namespace ba = boost::asio;
namespace bp = boost::process;

int main() {
    ba::io_context io;
    bp::async_pipe ip(io), op(io);
    //bp::async_pipe StdIn(io);

    bp::child MyProcess = bp::child("/usr/bin/tac", bp::std_out > op, bp::std_in < ip, io);

    std::function<void()> send_loop, recv_loop;

    ba::streambuf sb;
    send_loop = [&, i=0]() mutable {
        if (++i<100) {
            std::ostream(&sb) << "Sure no problem, " << i << std::endl;
            ba::async_write(ip, sb, [&send_loop](auto ec, auto /*tx*/) {
                //std::cout << "Sent " << tx << " bytes (" << ec.message() << ")\n";
                if (!ec) send_loop();
            });
        } else ip.close();
    };

    ba::streambuf rb;
    recv_loop = [&]() {
        ba::async_read_until(op, rb, "\n", [&](auto ec, auto /*tx*/) {
            //std::cout << "Received " << tx << " bytes (" << ec.message() << ")\n";
            std::cout << &rb << std::flush;
            if (!ec) recv_loop();
        });
    };

    io.post(send_loop);
    io.post(recv_loop);
    io.run();

    std::cout << "Bye\n";
}

Печать ожидаемого значения:

Sure no problem, 99
Sure no problem, 98
Sure no problem, 97
Sure no problem, 96
Sure no problem, 95
Sure no problem, 94
Sure no problem, 93
Sure no problem, 92
Sure no problem, 91
Sure no problem, 90
Sure no problem, 89
Sure no problem, 88
Sure no problem, 87
Sure no problem, 86
Sure no problem, 85
Sure no problem, 84
Sure no problem, 83
Sure no problem, 82
Sure no problem, 81
Sure no problem, 80
Sure no problem, 79
Sure no problem, 78
Sure no problem, 77
Sure no problem, 76
Sure no problem, 75
Sure no problem, 74
Sure no problem, 73
Sure no problem, 72
Sure no problem, 71
Sure no problem, 70
Sure no problem, 69
Sure no problem, 68
Sure no problem, 67
Sure no problem, 66
Sure no problem, 65
Sure no problem, 64
Sure no problem, 63
Sure no problem, 62
Sure no problem, 61
Sure no problem, 60
Sure no problem, 59
Sure no problem, 58
Sure no problem, 57
Sure no problem, 56
Sure no problem, 55
Sure no problem, 54
Sure no problem, 53
Sure no problem, 52
Sure no problem, 51
Sure no problem, 50
Sure no problem, 49
Sure no problem, 48
Sure no problem, 47
Sure no problem, 46
Sure no problem, 45
Sure no problem, 44
Sure no problem, 43
Sure no problem, 42
Sure no problem, 41
Sure no problem, 40
Sure no problem, 39
Sure no problem, 38
Sure no problem, 37
Sure no problem, 36
Sure no problem, 35
Sure no problem, 34
Sure no problem, 33
Sure no problem, 32
Sure no problem, 31
Sure no problem, 30
Sure no problem, 29
Sure no problem, 28
Sure no problem, 27
Sure no problem, 26
Sure no problem, 25
Sure no problem, 24
Sure no problem, 23
Sure no problem, 22
Sure no problem, 21
Sure no problem, 20
Sure no problem, 19
Sure no problem, 18
Sure no problem, 17
Sure no problem, 16
Sure no problem, 15
Sure no problem, 14
Sure no problem, 13
Sure no problem, 12
Sure no problem, 11
Sure no problem, 10
Sure no problem, 9
Sure no problem, 8
Sure no problem, 7
Sure no problem, 6
Sure no problem, 5
Sure no problem, 4
Sure no problem, 3
Sure no problem, 2
Sure no problem, 1
Sure no problem, 1
...