Преглед на файлове

BUG: Fixed segfault and bad reporting if a ctest executable could not be found. Also added some batch testing code that is not yet complete.

Zach Mullen преди 16 години
родител
ревизия
4b4e801eba

+ 1 - 0
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

+ 5 - 17
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)
 {

+ 2 - 2
Source/CTest/cmCTestMultiProcessHandler.h

@@ -36,13 +36,13 @@ public:
      std::map<int, cmCTestTestHandler::cmCTestTestProperties*> {};
 
   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<cmStdString>* passed,
                           std::vector<cmStdString>* failed)

+ 14 - 17
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<std::pair<cmsys::RegularExpression,
     std::string> >::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<size_t>
@@ -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();
 

+ 15 - 12
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<cmStdString> &passed,
   this->StartTestTime = static_cast<unsigned int>(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<cmStdString> &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<cmStdString> &passed,
     if(p.Depends.size())
       {
       for(std::vector<std::string>::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<cmStdString> &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<unsigned int>(cmSystemTools::GetTime());
   this->ElapsedTestingTime = cmSystemTools::GetTime() - elapsed_time_start;

+ 1 - 0
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);