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)
31 , proc("./blank" BLANK_SUFFIX, combine_args(dir, args, cmd))
37 // wait for command service startup
38 WaitOutputLine("listening on TCP port 12354");
39 // connect to command service
40 conn = tcp::Socket("localhost", 12354);
44 TestInstance::~TestInstance() {
49 void TestInstance::WriteInput(const string &data) {
51 const char *i = data.c_str();
52 const char *end = i + data.length();
54 size_t len = proc.WriteIn(i, end - i);
56 throw runtime_error("failed write to child process' stdin");
62 void TestInstance::ReadOutputLine(string &line) {
63 while (!out_buf.Extract(line)) {
64 // buffer exhausted, fetch more data
65 int len = proc.ReadOut(out_buf.WriteHead(), out_buf.Remain(), 5000);
67 throw runtime_error("failed read from child process' stdout");
73 void TestInstance::AssertOutputLine(const string &expected) {
76 CPPUNIT_ASSERT_EQUAL_MESSAGE(
77 "unexpected line in stdout",
81 void TestInstance::WaitOutputLine(const string &expected) {
85 if (line == expected) {
91 void TestInstance::ExhaustOutput(string &output) {
92 while (!out_buf.Extract(output)) {
93 // buffer exhausted, fetch more data
94 int len = proc.ReadOut(out_buf.WriteHead(), out_buf.Remain(), 5000);
102 void TestInstance::AssertNoOutput() {
104 ExhaustOutput(output);
105 CPPUNIT_ASSERT_EQUAL_MESSAGE(
106 "test instance produced unexpected output",
111 void TestInstance::ReadErrorLine(string &line) {
112 while (!err_buf.Extract(line)) {
113 // buffer exhausted, fetch more data
114 int len = proc.ReadErr(err_buf.WriteHead(), err_buf.Remain(), 5000);
116 throw runtime_error("failed read from child process' stderr");
122 void TestInstance::AssertErrorLine(const string &expected) {
125 CPPUNIT_ASSERT_EQUAL_MESSAGE(
126 "unexpected line in stderr",
130 void TestInstance::WaitErrorLine(const string &expected) {
134 if (line == expected) {
140 void TestInstance::ExhaustError(string &error) {
141 while (!err_buf.Extract(error)) {
142 // buffer exhausted, fetch more data
143 int len = proc.ReadErr(err_buf.WriteHead(), err_buf.Remain(), 5000);
151 void TestInstance::AssertNoError() {
154 CPPUNIT_ASSERT_EQUAL_MESSAGE(
155 "test instance produced unexpected error output",
160 void TestInstance::Terminate() {
164 void TestInstance::AssertRunning() {
165 CPPUNIT_ASSERT_MESSAGE(
166 "test instance terminated unexpectedly",
170 void TestInstance::AssertTerminated() {
171 CPPUNIT_ASSERT_MESSAGE(
172 "test instance did not terminate as expected",
176 void TestInstance::AssertExitStatus(int expected) {
177 CPPUNIT_ASSERT_EQUAL_MESSAGE(
178 "unexpected exit status from child program",
179 expected, proc.Join());
183 void TestInstance::WaitCommandMessage(const string &line) {
184 WaitCommandLine(" > " + line);
187 void TestInstance::WaitCommandError(const string &line) {
188 WaitCommandLine(" ! " + line);
191 void TestInstance::WaitCommandBroadcast(const string &line) {
192 WaitCommandLine(" @ " + line);
195 void TestInstance::WaitCommandLine(const string &expected) {
198 if (!cmd_buf.Extract(line)) {
199 // buffer exhausted, fetch more data
200 cmd_buf.Update(conn.Recv(cmd_buf.WriteHead(), cmd_buf.Remain()));
203 if (line == expected) {