1 #include "TestInstance.hpp"
3 #include <cppunit/extensions/HelperMacros.h>
13 Process::Arguments combine_args(const TempDir &dir, const Process::Arguments &in, bool cmd) {
14 Process::Arguments out;
15 out.reserve(in.size() + (cmd ? 5 : 3));
16 out.emplace_back("blank");
17 out.insert(out.end(), in.begin(), in.end());
18 out.emplace_back("--save-path");
19 out.emplace_back(dir.Path());
21 out.emplace_back("--cmd-port");
22 out.emplace_back("12354");
29 TestInstance::TestInstance(const Process::Arguments &args, bool cmd)
32 "./blank" BLANK_SUFFIX,
33 combine_args(dir, args, cmd),
40 // wait for command service startup
41 // TODO: timeouts for reading from process
42 WaitOutputLine("listening on TCP port 12354");
43 // connect to command service
44 conn = tcp::Socket("localhost", 12354);
48 TestInstance::~TestInstance() {
53 void TestInstance::WriteInput(const string &data) {
54 const char *i = data.c_str();
55 const char *end = i + data.length();
57 size_t len = proc.WriteIn(i, end - i);
62 void TestInstance::ReadOutputLine(string &line) {
63 while (!out_buf.Extract(line)) {
64 // buffer exhausted, fetch more data
65 out_buf.Update(proc.ReadOut(out_buf.WriteHead(), out_buf.Remain()));
69 void TestInstance::AssertOutputLine(const string &expected) {
72 CPPUNIT_ASSERT_EQUAL_MESSAGE(
73 "unexpected line in stdout",
77 void TestInstance::WaitOutputLine(const string &expected) {
81 if (line == expected) {
87 void TestInstance::ReadErrorLine(string &line) {
88 while (!err_buf.Extract(line)) {
89 // buffer exhausted, fetch more data
90 err_buf.Update(proc.ReadErr(err_buf.WriteHead(), err_buf.Remain()));
94 void TestInstance::AssertErrorLine(const string &expected) {
97 CPPUNIT_ASSERT_EQUAL_MESSAGE(
98 "unexpected line in stderr",
102 void TestInstance::WaitErrorLine(const string &expected) {
106 if (line == expected) {
113 void TestInstance::AssertExitStatus(int expected) {
114 CPPUNIT_ASSERT_EQUAL_MESSAGE(
115 "unexpected line in stderr",
116 expected, proc.Join());
120 void TestInstance::WaitCommandMessage(const string &line) {
121 WaitCommandLine(" > " + line);
124 void TestInstance::WaitCommandError(const string &line) {
125 WaitCommandLine(" ! " + line);
128 void TestInstance::WaitCommandBroadcast(const string &line) {
129 WaitCommandLine(" @ " + line);
132 void TestInstance::WaitCommandLine(const string &expected) {
135 if (!cmd_buf.Extract(line)) {
136 // buffer exhausted, fetch more data
137 cmd_buf.Update(conn.Recv(cmd_buf.WriteHead(), cmd_buf.Remain()));
140 if (line == expected) {