summaryrefslogtreecommitdiff
path: root/Source/CTest/cmCTestRunTest.cxx
diff options
context:
space:
mode:
authorDavid Cole <david.cole@kitware.com>2010-03-30 14:08:31 -0400
committerDavid Cole <david.cole@kitware.com>2010-03-30 14:08:31 -0400
commit003ffe5908f1fac152383fc82af70996182926a3 (patch)
tree5134a801243e3c7e95c7368489bb19c1a707cfad /Source/CTest/cmCTestRunTest.cxx
parentd0b510900d43e0ca8ba056ea81d4ed97ffeadb67 (diff)
downloadcmake-003ffe5908f1fac152383fc82af70996182926a3.tar.gz
Fix intermingling of test environments when tests run in parallel.
The SaveRestoreEnvironment helper object makes sure that the original environment is restored immediately after the StartProcess call returns rather than waiting for the end of the test. When tests are executed in parallel, there is no guarantee about the ordering of EndTest calls relative to StartTest calls. In fact, it would be odd for them to be nested nicely. Therefore, to avoid the corruption of the calling ctest's environment, the original environment must be restored before ForkProcess returns.
Diffstat (limited to 'Source/CTest/cmCTestRunTest.cxx')
-rw-r--r--Source/CTest/cmCTestRunTest.cxx17
1 files changed, 6 insertions, 11 deletions
diff --git a/Source/CTest/cmCTestRunTest.cxx b/Source/CTest/cmCTestRunTest.cxx
index fe2437d38b..4c9675b08e 100644
--- a/Source/CTest/cmCTestRunTest.cxx
+++ b/Source/CTest/cmCTestRunTest.cxx
@@ -23,7 +23,6 @@ cmCTestRunTest::cmCTestRunTest(cmCTestTestHandler* handler)
{
this->CTest = handler->CTest;
this->TestHandler = handler;
- this->ModifyEnv = false;
this->TestProcess = 0;
this->TestResult.ExecutionTime =0;
this->TestResult.ReturnValue = 0;
@@ -139,11 +138,6 @@ bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started)
this->CompressOutput();
}
- //restore the old environment
- if (this->ModifyEnv)
- {
- cmSystemTools::RestoreEnv(this->OrigEnv);
- }
this->WriteLogOutputTop(completed, total);
std::string reason;
bool passed = true;
@@ -593,9 +587,6 @@ bool cmCTestRunTest::ForkProcess(double testTimeOut,
this->TestProcess->SetCommand(this->ActualCommand.c_str());
this->TestProcess->SetCommandArguments(this->Arguments);
- std::vector<std::string> origEnv;
- this->ModifyEnv = (environment && environment->size()>0);
-
// determine how much time we have
double timeout = this->CTest->GetRemainingTimeAllowed() - 120;
if (this->CTest->GetTimeOut() > 0 && this->CTest->GetTimeOut() < timeout)
@@ -618,9 +609,13 @@ bool cmCTestRunTest::ForkProcess(double testTimeOut,
this->TestProcess->SetTimeout(timeout);
- if (this->ModifyEnv)
+#ifdef CMAKE_BUILD_WITH_CMAKE
+ cmSystemTools::SaveRestoreEnvironment sre;
+#endif
+
+ if (environment && environment->size()>0)
{
- this->OrigEnv = cmSystemTools::AppendEnv(environment);
+ cmSystemTools::AppendEnv(environment);
}
return this->TestProcess->StartProcess();