|
|
|
|
|
|
|
|
return true;
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool testChildStdInClose() {
|
|
|
|
|
|
|
|
|
|
|
|
std::string errorDescription;
|
|
|
|
|
|
|
|
|
|
|
|
// Test with no child process.
|
|
|
|
|
|
try {
|
|
|
|
|
|
CodeDweller::Child child;
|
|
|
|
|
|
|
|
|
|
|
|
child.closeStdIn();
|
|
|
|
|
|
|
|
|
|
|
|
NO_EXCEPTION_TERM("closeStdIn() with no child process");
|
|
|
|
|
|
return false;
|
|
|
|
|
|
} catch (std::exception &e) {
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test with no waiting.
|
|
|
|
|
|
try {
|
|
|
|
|
|
CodeDweller::Child child(childName);
|
|
|
|
|
|
|
|
|
|
|
|
child.closeStdIn();
|
|
|
|
|
|
|
|
|
|
|
|
child.close();
|
|
|
|
|
|
|
|
|
|
|
|
} catch (std::exception &e) {
|
|
|
|
|
|
EXCEPTION_TERM("closeStdIn() with no waiting");
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Run child that waits for stdin to close.
|
|
|
|
|
|
std::vector<std::string> cmd;
|
|
|
|
|
|
|
|
|
|
|
|
cmd.push_back(childName);
|
|
|
|
|
|
cmd.push_back("checkStdinEOF");
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
|
|
CodeDweller::Child child(cmd);
|
|
|
|
|
|
|
|
|
|
|
|
child.closeStdIn();
|
|
|
|
|
|
|
|
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
|
|
|
|
|
|
|
|
|
|
int32_t result = child.result();
|
|
|
|
|
|
|
|
|
|
|
|
if (15 != result) {
|
|
|
|
|
|
std::cout << "closeStdIn() failure; returned " << result
|
|
|
|
|
|
<< " instead of 15." << std::endl;
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
child.close();
|
|
|
|
|
|
|
|
|
|
|
|
if (child.errorOccurred(errorDescription)) {
|
|
|
|
|
|
std::ostringstream temp;
|
|
|
|
|
|
|
|
|
|
|
|
temp << " Failure in: testChildStdInClose: " << errorDescription;
|
|
|
|
|
|
RETURN_FALSE(temp.str());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} catch (std::exception &e) {
|
|
|
|
|
|
EXCEPTION_TERM("closeStdIn() or close()");
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test after the child exits.
|
|
|
|
|
|
cmd.clear();
|
|
|
|
|
|
cmd.push_back(childName);
|
|
|
|
|
|
cmd.push_back("quit");
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
CodeDweller::Child child(cmd);
|
|
|
|
|
|
|
|
|
|
|
|
if (!child.write("q")) {
|
|
|
|
|
|
RETURN_FALSE(" write() failure");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
|
|
|
|
|
|
|
|
|
|
child.closeStdIn();
|
|
|
|
|
|
|
|
|
|
|
|
} catch (std::exception &e) {
|
|
|
|
|
|
EXCEPTION_TERM("closeStdIn() after child exits");
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Test exception thrown for out-of-order calling.
|
|
|
|
|
|
try {
|
|
|
|
|
|
CodeDweller::Child child;
|
|
|
|
|
|
|
|
|
|
|
|
child.closeStdIn();
|
|
|
|
|
|
|
|
|
|
|
|
NO_EXCEPTION_TERM("closeStdIn() called without open()");
|
|
|
|
|
|
return false;
|
|
|
|
|
|
} catch (std::exception &e) {
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
bool testChildOpen() {
|
|
|
bool testChildOpen() {
|
|
|
|
|
|
|
|
|
// Test with no waiting.
|
|
|
// Test with no waiting.
|
|
|
|
|
|
|
|
|
RUN_TEST(testChildIsRunning);
|
|
|
RUN_TEST(testChildIsRunning);
|
|
|
RUN_TEST(testChildResult);
|
|
|
RUN_TEST(testChildResult);
|
|
|
RUN_TEST(testChildClose);
|
|
|
RUN_TEST(testChildClose);
|
|
|
|
|
|
RUN_TEST(testChildStdInClose);
|
|
|
RUN_TEST(testChildOpen);
|
|
|
RUN_TEST(testChildOpen);
|
|
|
RUN_TEST(testChildIsFinishedWriting);
|
|
|
RUN_TEST(testChildIsFinishedWriting);
|
|
|
RUN_TEST(testChildRead);
|
|
|
RUN_TEST(testChildRead);
|