supports a protocol for catching tests that prematurely exit
This commit is contained in:
60
src/gtest.cc
60
src/gtest.cc
@@ -3523,6 +3523,35 @@ const char* const
|
||||
OsStackTraceGetter::kElidedFramesMarker =
|
||||
"... " GTEST_NAME_ " internal frames ...";
|
||||
|
||||
// A helper class that creates the premature-exit file in its
|
||||
// constructor and deletes the file in its destructor.
|
||||
class ScopedPrematureExitFile {
|
||||
public:
|
||||
explicit ScopedPrematureExitFile(const char* premature_exit_filepath)
|
||||
: premature_exit_filepath_(premature_exit_filepath) {
|
||||
// If a path to the premature-exit file is specified...
|
||||
if (premature_exit_filepath != NULL && *premature_exit_filepath != '\0') {
|
||||
// create the file with a single "0" character in it. I/O
|
||||
// errors are ignored as there's nothing better we can do and we
|
||||
// don't want to fail the test because of this.
|
||||
FILE* pfile = posix::FOpen(premature_exit_filepath, "w");
|
||||
fwrite("0", 1, 1, pfile);
|
||||
fclose(pfile);
|
||||
}
|
||||
}
|
||||
|
||||
~ScopedPrematureExitFile() {
|
||||
if (premature_exit_filepath_ != NULL && *premature_exit_filepath_ != '\0') {
|
||||
remove(premature_exit_filepath_);
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
const char* const premature_exit_filepath_;
|
||||
|
||||
GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedPrematureExitFile);
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
|
||||
// class TestEventListeners
|
||||
@@ -3823,14 +3852,39 @@ void UnitTest::RecordProperty(const std::string& key,
|
||||
// We don't protect this under mutex_, as we only support calling it
|
||||
// from the main thread.
|
||||
int UnitTest::Run() {
|
||||
const bool in_death_test_child_process =
|
||||
internal::GTEST_FLAG(internal_run_death_test).length() > 0;
|
||||
|
||||
// Google Test implements this protocol for catching that a test
|
||||
// program exits before returning control to Google Test:
|
||||
//
|
||||
// 1. Upon start, Google Test creates a file whose absolute path
|
||||
// is specified by the environment variable
|
||||
// TEST_PREMATURE_EXIT_FILE.
|
||||
// 2. When Google Test has finished its work, it deletes the file.
|
||||
//
|
||||
// This allows a test runner to set TEST_PREMATURE_EXIT_FILE before
|
||||
// running a Google-Test-based test program and check the existence
|
||||
// of the file at the end of the test execution to see if it has
|
||||
// exited prematurely.
|
||||
|
||||
// If we are in the child process of a death test, don't
|
||||
// create/delete the premature exit file, as doing so is unnecessary
|
||||
// and will confuse the parent process. Otherwise, create/delete
|
||||
// the file upon entering/leaving this function. If the program
|
||||
// somehow exits before this function has a chance to return, the
|
||||
// premature-exit file will be left undeleted, causing a test runner
|
||||
// that understands the premature-exit-file protocol to report the
|
||||
// test as having failed.
|
||||
const internal::ScopedPrematureExitFile premature_exit_file(
|
||||
in_death_test_child_process ?
|
||||
NULL : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE"));
|
||||
|
||||
// Captures the value of GTEST_FLAG(catch_exceptions). This value will be
|
||||
// used for the duration of the program.
|
||||
impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions));
|
||||
|
||||
#if GTEST_HAS_SEH
|
||||
const bool in_death_test_child_process =
|
||||
internal::GTEST_FLAG(internal_run_death_test).length() > 0;
|
||||
|
||||
// Either the user wants Google Test to catch exceptions thrown by the
|
||||
// tests or this is executing in the context of death test child
|
||||
// process. In either case the user does not want to see pop-up dialogs
|
||||
|
||||
Reference in New Issue
Block a user