Browse Source

Merge topic 'ctest-depend-cycle'

1f7133c CTest: Fix line-too-long style in DEPEND cycle error
f48d3bc CTest: Fix test DEPEND cycle detection
Brad King 15 years ago
parent
commit
7a7a2cbd31

+ 21 - 16
Source/CTest/cmCTestMultiProcessHandler.cxx

@@ -653,32 +653,37 @@ bool cmCTestMultiProcessHandler::CheckCycles()
       it != this->Tests.end(); ++it)
     {
     //DFS from each element to itself
+    int root = it->first;
+    std::set<int> visited;
     std::stack<int> s;
-    std::vector<int> visited;
-
-    s.push(it->first);
-
+    s.push(root);
     while(!s.empty())
       {
       int test = s.top();
       s.pop();
-
-      for(TestSet::iterator d = this->Tests[test].begin();
-          d != this->Tests[test].end(); ++d)
+      if(visited.insert(test).second)
         {
-        if(std::find(visited.begin(), visited.end(), *d) != visited.end())
+        for(TestSet::iterator d = this->Tests[test].begin();
+            d != this->Tests[test].end(); ++d)
           {
-          //cycle exists
-          cmCTestLog(this->CTest, ERROR_MESSAGE, "Error: a cycle exists in "
-            "the test dependency graph for the test \""
-            << this->Properties[it->first]->Name << "\"." << std::endl
-            << "Please fix the cycle and run ctest again." << std::endl);
-          return false;
+          if(*d == root)
+            {
+            //cycle exists
+            cmCTestLog(this->CTest, ERROR_MESSAGE,
+                       "Error: a cycle exists in the test dependency graph "
+                       "for the test \"" << this->Properties[root]->Name <<
+                       "\".\nPlease fix the cycle and run ctest again.\n");
+            return false;
+            }
+          else
+            {
+            s.push(*d);
+            }
           }
-        s.push(*d);
         }
-      visited.push_back(test);
       }
     }
+  cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
+             "Checking test dependency graph end" << std::endl);
   return true;
 }

+ 1 - 0
Tests/CMakeLists.txt

@@ -808,6 +808,7 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/
     --build-makeprogram ${CMAKE_TEST_MAKEPROGRAM}
     --test-command ${CMAKE_CTEST_COMMAND} -C \${CTEST_CONFIGURATION_TYPE}
     )
+  SET_TESTS_PROPERTIES(testing PROPERTIES PASS_REGULAR_EXPRESSION "Passed")
   LIST(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/Testing")
 
   ADD_TEST(wrapping  ${CMAKE_CTEST_COMMAND}

+ 12 - 0
Tests/Testing/Sub/Sub2/CMakeLists.txt

@@ -3,3 +3,15 @@
 #
 ADD_EXECUTABLE(testing2 testing2.cxx)
 ADD_TEST(testing.2 ${Testing_BINARY_DIR}/bin/testing2)
+
+add_test(NotCycle.a ${CMAKE_COMMAND} -E echo a)
+add_test(NotCycle.test1 ${CMAKE_COMMAND} -E echo test1)
+set_property(TEST NotCycle.test1 PROPERTY DEPENDS NotCycle.a)
+
+add_test(NotCycle.b ${CMAKE_COMMAND} -E echo b)
+add_test(NotCycle.test2 ${CMAKE_COMMAND} -E echo test2)
+set_property(TEST NotCycle.test2 PROPERTY DEPENDS NotCycle.b NotCycle.test1)
+
+add_test(NotCycle.c ${CMAKE_COMMAND} -E echo c)
+add_test(NotCycle.test3 ${CMAKE_COMMAND} -E echo test3)
+set_property(TEST NotCycle.test3 PROPERTY DEPENDS NotCycle.c NotCycle.test1 NotCycle.test2)