Fix cycle detection for test dependencies
This commit is contained in:
parent
b65cd9b70b
commit
3e52000a07
|
@ -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;
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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")
|
|
@ -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)
|
|
@ -0,0 +1,5 @@
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -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)
|
|
@ -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")
|
|
@ -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)
|
|
@ -0,0 +1,5 @@
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -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)
|
Loading…
Reference in New Issue