ソースを参照

Added the test property EXPENSIVE, which denotes that the given test(s) should be started prior to tests that are not marked as such. Also fixed test dependencies, and a few uninitialized variables in cmProcess.

Zach Mullen 16 年 前
コミット
c6e5dd21fd

+ 26 - 11
Source/CTest/cmCTestMultiProcessHandler.cxx

@@ -29,6 +29,7 @@ cmCTestMultiProcessHandler::cmCTestMultiProcessHandler()
   // Set the tests
 void 
 cmCTestMultiProcessHandler::SetTests(TestMap& tests,
+                                     TestMap& expensiveTests,
                                      PropertiesMap& properties)
 {
   // set test run map to false for all
@@ -37,10 +38,16 @@ cmCTestMultiProcessHandler::SetTests(TestMap& tests,
     {
     this->TestRunningMap[i->first] = false;
     this->TestFinishMap[i->first] = false;
+
+    if(this->Properties[i->first]->Expensive)
+      {
+      this->ExpensiveTests[i->first] = i->second;
+      }
     }
   this->Tests = tests;
-  this->Total = this->Tests.size();
+  this->ExpensiveTests = expensiveTests;
   this->Properties = properties;
+  this->Total = this->Tests.size();
 }
 
   // Set the max number of tests that can be run at the same time.
@@ -59,7 +66,7 @@ void cmCTestMultiProcessHandler::RunTests()
   this->CheckResume();
   this->TestHandler->SetMaxIndex(this->FindMaxIndex());
   this->StartNextTests();
-  while(this->Tests.size() != 0)
+  while(this->Tests.size() != 0 || this->ExpensiveTests.size() != 0)
     {
     this->CheckOutput();
     this->StartNextTests();
@@ -88,6 +95,10 @@ void cmCTestMultiProcessHandler::StartTestProcess(int test)
             << " test " << test << "\n");
   this->TestRunningMap[test] = true; // mark the test as running
   // now remove the test itself
+  if(this->ExpensiveTests.size() > 0)
+    {
+    this->ExpensiveTests.erase(test);
+    }
   this->Tests.erase(test);
   cmCTestRunTest* testRun = new cmCTestRunTest;
   testRun->SetCTest(this->CTest);
@@ -139,7 +150,6 @@ bool cmCTestMultiProcessHandler::StartTest(int test)
   // if there are no depends left then run this test
   if(totalDepends == 0)
     {
-    // Start this test it has no depends 
     this->StartTestProcess(test);
     return true;
     }
@@ -150,15 +160,14 @@ bool cmCTestMultiProcessHandler::StartTest(int test)
 
 void cmCTestMultiProcessHandler::StartNextTests()
 {
-  //cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT, std::endl
-  //           << "Number of running tests : " << this->RunningTests.size()
-  //           << "\n");
   size_t numToStart = this->ParallelLevel - this->RunningTests.size();
   if(numToStart == 0)
     {
     return;
     }
-  TestMap tests = this->Tests;
+  TestMap tests = this->ExpensiveTests.size() > 0 ? 
+    this->ExpensiveTests : this->Tests;
+
   for(TestMap::iterator i = tests.begin();
       i !=  tests.end(); ++i)
     {
@@ -218,11 +227,16 @@ bool cmCTestMultiProcessHandler::CheckOutput()
       {
       this->Failed->push_back(p->GetTestProperties()->Name);
       }
+    for(TestMap::iterator j = this->ExpensiveTests.begin();
+        j != this->ExpensiveTests.end(); ++j)
+      {
+      j->second.erase(test);
+      }
     for(TestMap::iterator j = this->Tests.begin();
-       j!=  this->Tests.end(); ++j)
-    {
-    j->second.erase(test);
-    }
+        j != this->Tests.end(); ++j)
+      {
+      j->second.erase(test);
+      }
     this->TestFinishMap[test] = true;
     this->TestRunningMap[test] = false;
     this->RunningTests.erase(p);
@@ -323,6 +337,7 @@ void cmCTestMultiProcessHandler::RemoveTest(int index)
 {
   this->Tests.erase(index);
   this->Properties.erase(index);
+  this->ExpensiveTests.erase(index);
   this->TestRunningMap[index] = false;
   this->TestFinishMap[index] = true;
   this->Completed++;

+ 3 - 1
Source/CTest/cmCTestMultiProcessHandler.h

@@ -36,7 +36,8 @@ public:
 
   cmCTestMultiProcessHandler();
   // Set the tests
-  void SetTests(TestMap& tests, PropertiesMap& properties);
+  void SetTests(TestMap& tests, TestMap& expensiveTests,
+                PropertiesMap& properties);
   // Set the max number of tests that can be run at the same time.
   void SetParallelLevel(size_t);
   void RunTests();
@@ -81,6 +82,7 @@ protected:
   int FindMaxIndex();
   // map from test number to set of depend tests
   TestMap Tests;
+  TestMap ExpensiveTests;
   //Total number of tests we'll be running
   size_t Total;
   //Number of tests that are complete

+ 9 - 3
Source/CTest/cmCTestTestHandler.cxx

@@ -1009,14 +1009,16 @@ void cmCTestTestHandler::ProcessDirectory(std::vector<cmStdString> &passed,
     << "----------------------------------------------------------"
     << std::endl;
 
-  cmCTestMultiProcessHandler::TestSet depends;
   cmCTestMultiProcessHandler::TestMap tests;
+  cmCTestMultiProcessHandler::TestMap expensiveTests;
   cmCTestMultiProcessHandler::PropertiesMap properties;
+  
   for (ListOfTests::iterator it = this->TestList.begin();
        it != this->TestList.end(); it ++ )
     { 
     cmCTestTestProperties& p = *it;
-    
+    cmCTestMultiProcessHandler::TestSet depends;
+
     if(p.Depends.size())
       {
       for(std::vector<std::string>::iterator i = p.Depends.begin();
@@ -1035,8 +1037,12 @@ void cmCTestTestHandler::ProcessDirectory(std::vector<cmStdString> &passed,
       }
     tests[it->Index] = depends;
     properties[it->Index] = &*it;
+    if(it->Expensive)
+      {
+      expensiveTests[it->Index] = depends;
+      }
     }
-  parallel.SetTests(tests, properties);
+  parallel.SetTests(tests, expensiveTests, properties);
   parallel.SetPassFailVectors(&passed, &failed);
   this->TestResults.clear();
   parallel.SetTestResults(&this->TestResults);

+ 5 - 0
Source/CTest/cmProcess.cxx

@@ -22,6 +22,11 @@ cmProcess::cmProcess()
 {
   this->Process = 0;
   this->Timeout = 0;
+  this->TotalTime = 0;
+  this->LastOutputPipe = cmsysProcess_Pipe_None;
+  this->ExitValue = 0;
+  this->Id = 0;
+  this->StartTime = 0;
 }
 
 cmProcess::~cmProcess()