diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index 7bfb3851c..eb1caaf1e 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -342,6 +342,7 @@ INCLUDE_DIRECTORIES( # SET(CTEST_SRCS cmCTest.cxx CTest/cmProcess.cxx + CTest/cmCTestBatchTestHandler.cxx CTest/cmCTestBuildAndTestHandler.cxx CTest/cmCTestBuildCommand.cxx CTest/cmCTestBuildHandler.cxx diff --git a/Source/CTest/cmCTestMultiProcessHandler.cxx b/Source/CTest/cmCTestMultiProcessHandler.cxx index 637c2d53d..bebaf1e02 100644 --- a/Source/CTest/cmCTestMultiProcessHandler.cxx +++ b/Source/CTest/cmCTestMultiProcessHandler.cxx @@ -27,6 +27,11 @@ cmCTestMultiProcessHandler::cmCTestMultiProcessHandler() this->Completed = 0; this->RunningCount = 0; } + +cmCTestMultiProcessHandler::~cmCTestMultiProcessHandler() +{ +} + // Set the tests void cmCTestMultiProcessHandler::SetTests(TestMap& tests, @@ -55,11 +60,6 @@ void cmCTestMultiProcessHandler::SetParallelLevel(size_t level) //--------------------------------------------------------- void cmCTestMultiProcessHandler::RunTests() { - if(this->CTest->GetBatchJobs()) - { - this->SubmitBatchTests(); - return; - } this->CheckResume(); this->TestHandler->SetMaxIndex(this->FindMaxIndex()); this->StartNextTests(); @@ -75,18 +75,6 @@ void cmCTestMultiProcessHandler::RunTests() this->MarkFinished(); } -//--------------------------------------------------------- -void cmCTestMultiProcessHandler::SubmitBatchTests() -{ - for(cmCTest::CTestConfigurationMap::iterator i = - this->CTest->CTestConfiguration.begin(); - i != this->CTest->CTestConfiguration.end(); ++i) - { - cmCTestLog(this->CTest, HANDLER_OUTPUT, i->first - << " = " << i->second << std::endl); - } -} - //--------------------------------------------------------- void cmCTestMultiProcessHandler::StartTestProcess(int test) { diff --git a/Source/CTest/cmCTestMultiProcessHandler.h b/Source/CTest/cmCTestMultiProcessHandler.h index ff1141c89..2ecea22f1 100644 --- a/Source/CTest/cmCTestMultiProcessHandler.h +++ b/Source/CTest/cmCTestMultiProcessHandler.h @@ -36,13 +36,13 @@ public: std::map {}; cmCTestMultiProcessHandler(); + virtual ~cmCTestMultiProcessHandler(); // Set the tests void SetTests(TestMap& tests, PropertiesMap& properties); // Set the max number of tests that can be run at the same time. void SetParallelLevel(size_t); - void RunTests(); + virtual void RunTests(); void PrintTestList(); - void SubmitBatchTests(); void SetPassFailVectors(std::vector* passed, std::vector* failed) diff --git a/Source/CTest/cmCTestRunTest.cxx b/Source/CTest/cmCTestRunTest.cxx index 2f20adfb1..92df585f0 100644 --- a/Source/CTest/cmCTestRunTest.cxx +++ b/Source/CTest/cmCTestRunTest.cxx @@ -92,9 +92,9 @@ bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started) this->WriteLogOutputTop(completed, total); std::string reason; bool passed = true; - int res = this->TestProcess->GetProcessStatus(); + int res = started ? this->TestProcess->GetProcessStatus() + : cmsysProcess_State_Error; int retVal = this->TestProcess->GetExitValue(); - std::vector >::iterator passIt; bool forceFail = false; @@ -197,7 +197,6 @@ bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started) } passed = this->TestResult.Status == cmCTestTestHandler::COMPLETED; - char buf[1024]; sprintf(buf, "%6.2f sec", this->TestProcess->GetTotalTime()); cmCTestLog(this->CTest, HANDLER_OUTPUT, buf << "\n" ); @@ -208,9 +207,9 @@ bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started) this->DartProcessing(); // if this is doing MemCheck then all the output needs to be put into // Output since that is what is parsed by cmCTestMemCheckHandler - if(!this->TestHandler->MemCheck) + if(!this->TestHandler->MemCheck && started) { - if ( this->TestResult.Status == cmCTestTestHandler::COMPLETED ) + if (this->TestResult.Status == cmCTestTestHandler::COMPLETED) { this->TestHandler->CleanTestOutput(this->ProcessOutput, static_cast @@ -224,7 +223,7 @@ bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started) } } this->TestResult.Reason = reason; - if ( this->TestHandler->LogFile ) + if (this->TestHandler->LogFile) { bool pass = true; const char* reasonType = "Test Pass Reason"; @@ -272,10 +271,10 @@ bool cmCTestRunTest::EndTest(size_t completed, size_t total, bool started) this->TestResult.ReturnValue = this->TestProcess->GetExitValue(); this->TestResult.CompletionStatus = "Completed"; this->TestResult.ExecutionTime = this->TestProcess->GetTotalTime(); - this->TestHandler->TestResults.push_back( this->TestResult ); - } - this->MemCheckPostProcess(); + this->TestHandler->TestResults.push_back(this->TestResult); + this->MemCheckPostProcess(); + } delete this->TestProcess; return passed; } @@ -324,20 +323,18 @@ bool cmCTestRunTest::StartTest() this->TestResult.Name = this->TestProperties->Name; this->TestResult.Path = this->TestProperties->Directory.c_str(); - // continue if we did not find the executable - if (this->TestCommand == "") + // log and return if we did not find the executable + if (this->ActualCommand == "") { + this->TestProcess = new cmProcess; *this->TestHandler->LogFile << "Unable to find executable: " << args[1].c_str() << std::endl; cmCTestLog(this->CTest, ERROR_MESSAGE, "Unable to find executable: " << args[1].c_str() << std::endl); this->TestResult.Output = "Unable to find executable: " + args[1]; - if ( !this->CTest->GetShowOnly() ) - { - this->TestResult.FullCommandLine = this->ActualCommand; - this->TestHandler->TestResults.push_back( this->TestResult ); - return false; - } + this->TestResult.FullCommandLine = ""; + this->TestHandler->TestResults.push_back(this->TestResult); + return false; } this->StartTime = this->CTest->CurrentTime(); diff --git a/Source/CTest/cmCTestTestHandler.cxx b/Source/CTest/cmCTestTestHandler.cxx index 229f92a5f..c6af20d76 100644 --- a/Source/CTest/cmCTestTestHandler.cxx +++ b/Source/CTest/cmCTestTestHandler.cxx @@ -17,6 +17,7 @@ #include "cmCTestTestHandler.h" #include "cmCTestMultiProcessHandler.h" +#include "cmCTestBatchTestHandler.h" #include "cmCTest.h" #include "cmCTestRunTest.h" #include "cmake.h" @@ -999,10 +1000,11 @@ void cmCTestTestHandler::ProcessDirectory(std::vector &passed, this->StartTestTime = static_cast(cmSystemTools::GetTime()); double elapsed_time_start = cmSystemTools::GetTime(); - cmCTestMultiProcessHandler parallel; - parallel.SetCTest(this->CTest); - parallel.SetParallelLevel(this->CTest->GetParallelLevel()); - parallel.SetTestHandler(this); + cmCTestMultiProcessHandler* parallel = this->CTest->GetBatchJobs() ? + new cmCTestBatchTestHandler : new cmCTestMultiProcessHandler; + parallel->SetCTest(this->CTest); + parallel->SetParallelLevel(this->CTest->GetParallelLevel()); + parallel->SetTestHandler(this); *this->LogFile << "Start testing: " << this->CTest->CurrentTime() << std::endl @@ -1013,7 +1015,7 @@ void cmCTestTestHandler::ProcessDirectory(std::vector &passed, cmCTestMultiProcessHandler::PropertiesMap properties; for (ListOfTests::iterator it = this->TestList.begin(); - it != this->TestList.end(); it ++ ) + it != this->TestList.end(); ++it) { cmCTestTestProperties& p = *it; cmCTestMultiProcessHandler::TestSet depends; @@ -1021,10 +1023,10 @@ void cmCTestTestHandler::ProcessDirectory(std::vector &passed, if(p.Depends.size()) { for(std::vector::iterator i = p.Depends.begin(); - i != p.Depends.end(); ++i) + i != p.Depends.end(); ++i) { for(ListOfTests::iterator it2 = this->TestList.begin(); - it2 != this->TestList.end(); it2 ++ ) + it2 != this->TestList.end(); ++it2) { if(it2->Name == *i) { @@ -1037,18 +1039,19 @@ void cmCTestTestHandler::ProcessDirectory(std::vector &passed, tests[it->Index] = depends; properties[it->Index] = &*it; } - parallel.SetTests(tests, properties); - parallel.SetPassFailVectors(&passed, &failed); + parallel->SetTests(tests, properties); + parallel->SetPassFailVectors(&passed, &failed); this->TestResults.clear(); - parallel.SetTestResults(&this->TestResults); + parallel->SetTestResults(&this->TestResults); if(this->CTest->GetShowOnly()) { - parallel.PrintTestList(); + parallel->PrintTestList(); } else { - parallel.RunTests(); + parallel->RunTests(); } + delete parallel; this->EndTest = this->CTest->CurrentTime(); this->EndTestTime = static_cast(cmSystemTools::GetTime()); this->ElapsedTestingTime = cmSystemTools::GetTime() - elapsed_time_start; diff --git a/Source/CTest/cmCTestTestHandler.h b/Source/CTest/cmCTestTestHandler.h index ac46e57cb..0580f1032 100644 --- a/Source/CTest/cmCTestTestHandler.h +++ b/Source/CTest/cmCTestTestHandler.h @@ -32,6 +32,7 @@ class cmCTestTestHandler : public cmCTestGenericHandler { friend class cmCTestRunTest; friend class cmCTestMultiProcessHandler; + friend class cmCTestBatchTestHandler; public: cmTypeMacro(cmCTestTestHandler, cmCTestGenericHandler);