Fix cycle detection for test dependencies

This commit is contained in:
Zach Mullen 2010-06-30 10:39:17 -04:00
parent b65cd9b70b
commit 3e52000a07
10 changed files with 128 additions and 18 deletions

View File

@ -611,7 +611,7 @@ int cmCTestMultiProcessHandler::FindMaxIndex()
//Returns true if no cycles exist in the dependency graph //Returns true if no cycles exist in the dependency graph
bool cmCTestMultiProcessHandler::CheckCycles() bool cmCTestMultiProcessHandler::CheckCycles()
{ {
cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT, cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT,
"Checking test dependency graph..." << std::endl); "Checking test dependency graph..." << std::endl);
for(TestMap::iterator it = this->Tests.begin(); for(TestMap::iterator it = this->Tests.begin();
it != this->Tests.end(); ++it) it != this->Tests.end(); ++it)
@ -619,34 +619,29 @@ bool cmCTestMultiProcessHandler::CheckCycles()
//DFS from each element to itself //DFS from each element to itself
std::stack<int> s; std::stack<int> s;
std::vector<int> visited; std::vector<int> visited;
s.push(it->first); s.push(it->first);
visited.push_back(it->first);
while(!s.empty()) while(!s.empty())
{ {
int test = s.top(); int test = s.top();
s.pop(); s.pop();
for(TestSet::iterator d = this->Tests[test].begin(); for(TestSet::iterator d = this->Tests[test].begin();
d != this->Tests[test].end(); ++d) d != this->Tests[test].end(); ++d)
{ {
s.push(*d); if(std::find(visited.begin(), visited.end(), *d) != visited.end())
for(std::vector<int>::iterator v = visited.begin();
v != visited.end(); ++v)
{ {
if(*v == *d) //cycle exists
{ cmCTestLog(this->CTest, ERROR_MESSAGE, "Error: a cycle exists in "
//cycle exists "the test dependency graph for the test \""
cmCTestLog(this->CTest, ERROR_MESSAGE, "Error: a cycle exists in " << this->Properties[it->first]->Name << "\"." << std::endl
"the test dependency graph for the test \"" << "Please fix the cycle and run ctest again." << std::endl);
<< this->Properties[*d]->Name << "\"." << std::endl return false;
<< "Please fix the cycle and run ctest again." << std::endl);
return false;
}
} }
visited.push_back(*d); s.push(*d);
} }
visited.pop_back(); visited.push_back(test);
} }
} }
return true; return true;

View File

@ -1373,7 +1373,29 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/
) )
SET_TESTS_PROPERTIES(CTestTestTimeout PROPERTIES SET_TESTS_PROPERTIES(CTestTestTimeout PROPERTIES
PASS_REGULAR_EXPRESSION "TestTimeout *\\.+ *\\*\\*\\*Timeout.*CheckChild *\\.+ *Passed") PASS_REGULAR_EXPRESSION "TestTimeout *\\.+ *\\*\\*\\*Timeout.*CheckChild *\\.+ *Passed")
CONFIGURE_FILE(
"${CMake_SOURCE_DIR}/Tests/CTestTestDepends/test.cmake.in"
"${CMake_BINARY_DIR}/Tests/CTestTestDepends/test.cmake"
@ONLY ESCAPE_QUOTES)
ADD_TEST(CTestTestDepends ${CMAKE_CTEST_COMMAND}
-C "\${CTestTest_CONFIG}"
-S "${CMake_BINARY_DIR}/Tests/CTestTestDepends/test.cmake" -V
--output-log "${CMake_BINARY_DIR}/Tests/CTestTestDepends/testOutput.log"
)
CONFIGURE_FILE(
"${CMake_SOURCE_DIR}/Tests/CTestTestCycle/test.cmake.in"
"${CMake_BINARY_DIR}/Tests/CTestTestCycle/test.cmake"
@ONLY ESCAPE_QUOTES)
ADD_TEST(CTestTestCycle ${CMAKE_CTEST_COMMAND}
-C "\${CTestTest_CONFIG}"
-S "${CMake_BINARY_DIR}/Tests/CTestTestCycle/test.cmake" -V
--output-log "${CMake_BINARY_DIR}/Tests/CTestTestCycle/testOutput.log"
)
SET_TESTS_PROPERTIES(CTestTestCycle PROPERTIES
PASS_REGULAR_EXPRESSION "a cycle exists in the test dependency graph")
CONFIGURE_FILE( CONFIGURE_FILE(
"${CMake_SOURCE_DIR}/Tests/CTestTestRunScript/test.cmake.in" "${CMake_SOURCE_DIR}/Tests/CTestTestRunScript/test.cmake.in"
"${CMake_BINARY_DIR}/Tests/CTestTestRunScript/test.cmake" "${CMake_BINARY_DIR}/Tests/CTestTestRunScript/test.cmake"

View File

@ -0,0 +1,13 @@
cmake_minimum_required (VERSION 2.6)
project(CTestTestCycle)
include(CTest)
add_executable (simple simple.cxx)
add_test (one simple)
add_test (two simple)
add_test (three simple)
# Add cyclical test dependency
set_tests_properties(one PROPERTIES DEPENDS "two")
set_tests_properties(two PROPERTIES DEPENDS "three")
set_tests_properties(three PROPERTIES DEPENDS "one")

View File

@ -0,0 +1,7 @@
set (CTEST_PROJECT_NAME "CTestTestCycle")
set (CTEST_NIGHTLY_START_TIME "21:00:00 EDT")
set (CTEST_DART_SERVER_VERSION "2")
set(CTEST_DROP_METHOD "http")
set(CTEST_DROP_SITE "www.cdash.org")
set(CTEST_DROP_LOCATION "/CDash/submit.php?project=PublicDashboard")
set(CTEST_DROP_SITE_CDASH TRUE)

View File

@ -0,0 +1,5 @@
int main()
{
return 0;
}

View File

@ -0,0 +1,22 @@
CMAKE_MINIMUM_REQUIRED(VERSION 2.1)
# Settings:
SET(CTEST_DASHBOARD_ROOT "@CMake_BINARY_DIR@/Tests/CTestTest")
SET(CTEST_SITE "@SITE@")
SET(CTEST_BUILD_NAME "CTestTest-@BUILDNAME@-Cycle")
SET(CTEST_SOURCE_DIRECTORY "@CMake_SOURCE_DIR@/Tests/CTestTestCycle")
SET(CTEST_BINARY_DIRECTORY "@CMake_BINARY_DIR@/Tests/CTestTestCycle")
SET(CTEST_CVS_COMMAND "@CVSCOMMAND@")
SET(CTEST_CMAKE_GENERATOR "@CMAKE_TEST_GENERATOR@")
SET(CTEST_BUILD_CONFIGURATION "$ENV{CMAKE_CONFIG_TYPE}")
SET(CTEST_MEMORYCHECK_COMMAND "@MEMORYCHECK_COMMAND@")
SET(CTEST_MEMORYCHECK_SUPPRESSIONS_FILE "@MEMORYCHECK_SUPPRESSIONS_FILE@")
SET(CTEST_MEMORYCHECK_COMMAND_OPTIONS "@MEMORYCHECK_COMMAND_OPTIONS@")
SET(CTEST_COVERAGE_COMMAND "@COVERAGE_COMMAND@")
SET(CTEST_NOTES_FILES "${CTEST_SCRIPT_DIRECTORY}/${CTEST_SCRIPT_NAME}")
CTEST_START(Experimental)
CTEST_CONFIGURE(BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res)
CTEST_BUILD(BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res)
CTEST_TEST(BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res)

View File

@ -0,0 +1,12 @@
cmake_minimum_required (VERSION 2.6)
project(CTestTestDepends)
include(CTest)
add_executable (simple simple.cxx)
add_test (one simple)
add_test (two simple)
add_test (three simple)
# Add redundant (but not cyclical) dependencies
set_tests_properties(two PROPERTIES DEPENDS "one")
set_tests_properties(three PROPERTIES DEPENDS "one;two")

View File

@ -0,0 +1,7 @@
set (CTEST_PROJECT_NAME "CTestTestDepends")
set (CTEST_NIGHTLY_START_TIME "21:00:00 EDT")
set (CTEST_DART_SERVER_VERSION "2")
set(CTEST_DROP_METHOD "http")
set(CTEST_DROP_SITE "www.cdash.org")
set(CTEST_DROP_LOCATION "/CDash/submit.php?project=PublicDashboard")
set(CTEST_DROP_SITE_CDASH TRUE)

View File

@ -0,0 +1,5 @@
int main()
{
return 0;
}

View File

@ -0,0 +1,22 @@
CMAKE_MINIMUM_REQUIRED(VERSION 2.1)
# Settings:
SET(CTEST_DASHBOARD_ROOT "@CMake_BINARY_DIR@/Tests/CTestTest")
SET(CTEST_SITE "@SITE@")
SET(CTEST_BUILD_NAME "CTestTest-@BUILDNAME@-Depends")
SET(CTEST_SOURCE_DIRECTORY "@CMake_SOURCE_DIR@/Tests/CTestTestDepends")
SET(CTEST_BINARY_DIRECTORY "@CMake_BINARY_DIR@/Tests/CTestTestDepends")
SET(CTEST_CVS_COMMAND "@CVSCOMMAND@")
SET(CTEST_CMAKE_GENERATOR "@CMAKE_TEST_GENERATOR@")
SET(CTEST_BUILD_CONFIGURATION "$ENV{CMAKE_CONFIG_TYPE}")
SET(CTEST_MEMORYCHECK_COMMAND "@MEMORYCHECK_COMMAND@")
SET(CTEST_MEMORYCHECK_SUPPRESSIONS_FILE "@MEMORYCHECK_SUPPRESSIONS_FILE@")
SET(CTEST_MEMORYCHECK_COMMAND_OPTIONS "@MEMORYCHECK_COMMAND_OPTIONS@")
SET(CTEST_COVERAGE_COMMAND "@COVERAGE_COMMAND@")
SET(CTEST_NOTES_FILES "${CTEST_SCRIPT_DIRECTORY}/${CTEST_SCRIPT_NAME}")
CTEST_START(Experimental)
CTEST_CONFIGURE(BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res)
CTEST_BUILD(BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res)
CTEST_TEST(BUILD "${CTEST_BINARY_DIRECTORY}" RETURN_VALUE res)