X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=tst%2Fintegration%2FTestInstance.cpp;h=270c09ca88a2e1ab8920dc50661fc763c0bf8883;hb=3b617c12da216c2d1744c5fbb62a7ef381e1e0b3;hp=f9bc7273cc563ec9831bbdafb35a5b91bca0d5f7;hpb=307482574d3acac09e38263de521a1826ceec7ce;p=blank.git diff --git a/tst/integration/TestInstance.cpp b/tst/integration/TestInstance.cpp index f9bc727..270c09c 100644 --- a/tst/integration/TestInstance.cpp +++ b/tst/integration/TestInstance.cpp @@ -28,10 +28,7 @@ Process::Arguments combine_args(const TempDir &dir, const Process::Arguments &in TestInstance::TestInstance(const Process::Arguments &args, bool cmd) : dir() -, proc( - "./blank" BLANK_SUFFIX, - combine_args(dir, args, cmd), - { }) +, proc("./blank" BLANK_SUFFIX, combine_args(dir, args, cmd)) , conn() , out_buf() , err_buf() @@ -51,10 +48,14 @@ TestInstance::~TestInstance() { void TestInstance::WriteInput(const string &data) { + AssertRunning(); const char *i = data.c_str(); const char *end = i + data.length(); while (i != end) { size_t len = proc.WriteIn(i, end - i); + if (len == 0) { + throw runtime_error("failed write to child process' stdin"); + } i += len; } } @@ -62,7 +63,11 @@ void TestInstance::WriteInput(const string &data) { void TestInstance::ReadOutputLine(string &line) { while (!out_buf.Extract(line)) { // buffer exhausted, fetch more data - out_buf.Update(proc.ReadOut(out_buf.WriteHead(), out_buf.Remain())); + int len = proc.ReadOut(out_buf.WriteHead(), out_buf.Remain()); + if (len == 0) { + throw runtime_error("failed read from child process' stdout"); + } + out_buf.Update(len); } } @@ -84,10 +89,34 @@ void TestInstance::WaitOutputLine(const string &expected) { } } +void TestInstance::ExhaustOutput(string &output) { + while (!out_buf.Extract(output)) { + // buffer exhausted, fetch more data + int len = proc.ReadOut(out_buf.WriteHead(), out_buf.Remain()); + if (len == 0) { + return; + } + out_buf.Update(len); + } +} + +void TestInstance::AssertNoOutput() { + string output; + ExhaustOutput(output); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "test instanced produced unexpected output", + string(""), output); +} + + void TestInstance::ReadErrorLine(string &line) { while (!err_buf.Extract(line)) { // buffer exhausted, fetch more data - err_buf.Update(proc.ReadErr(err_buf.WriteHead(), err_buf.Remain())); + int len = proc.ReadErr(err_buf.WriteHead(), err_buf.Remain()); + if (len == 0) { + throw runtime_error("failed read from child process' stderr"); + } + err_buf.Update(len); } } @@ -109,10 +138,45 @@ void TestInstance::WaitErrorLine(const string &expected) { } } +void TestInstance::ExhaustError(string &error) { + while (!err_buf.Extract(error)) { + // buffer exhausted, fetch more data + int len = proc.ReadErr(err_buf.WriteHead(), err_buf.Remain()); + if (len == 0) { + return; + } + err_buf.Update(len); + } +} + +void TestInstance::AssertNoError() { + string error; + ExhaustError(error); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "test instanced produced unexpected error output", + string(""), error); +} + + +void TestInstance::Terminate() { + proc.Terminate(); +} + +void TestInstance::AssertRunning() { + CPPUNIT_ASSERT_MESSAGE( + "test instance terminated unexpectedly", + !proc.Terminated()); +} + +void TestInstance::AssertTerminated() { + CPPUNIT_ASSERT_MESSAGE( + "test instance did not terminate as expected", + proc.Terminated()); +} void TestInstance::AssertExitStatus(int expected) { CPPUNIT_ASSERT_EQUAL_MESSAGE( - "unexpected line in stderr", + "unexpected exit status from child program", expected, proc.Join()); }