[Cmake-commits] CMake branch, next, updated. v2.8.12.1-6352-gc527e15
Nils Gladitz
nilsgladitz at gmail.com
Mon Dec 23 09:30:43 EST 2013
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "CMake".
The branch, next has been updated
via c527e151e35cfbd9dbb4817e973873b6592f9cb3 (commit)
via 727c02b68b7e707714544931ba9148d59ee71ef9 (commit)
via 49996fb62a31287b1411cab035f29a4ca332be45 (commit)
from 1c380af0e991aebc60dcf496f9ff34c9783bcace (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=c527e151e35cfbd9dbb4817e973873b6592f9cb3
commit c527e151e35cfbd9dbb4817e973873b6592f9cb3
Merge: 1c380af 727c02b
Author: Nils Gladitz <nilsgladitz at gmail.com>
AuthorDate: Mon Dec 23 09:30:37 2013 -0500
Commit: CMake Topic Stage <kwrobot at kitware.com>
CommitDate: Mon Dec 23 09:30:37 2013 -0500
Merge topic 'fix-ctest-regressions' into next
727c02b CTest: reproduce old test order in serial test runs
49996fb Tests: added new test that detects regressions in serial test run order
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=727c02b68b7e707714544931ba9148d59ee71ef9
commit 727c02b68b7e707714544931ba9148d59ee71ef9
Author: Nils Gladitz <nilsgladitz at gmail.com>
AuthorDate: Mon Dec 23 15:30:12 2013 +0100
Commit: Nils Gladitz <nilsgladitz at gmail.com>
CommitDate: Mon Dec 23 15:30:12 2013 +0100
CTest: reproduce old test order in serial test runs
diff --git a/Source/CTest/cmCTestMultiProcessHandler.cxx b/Source/CTest/cmCTestMultiProcessHandler.cxx
index 2d77abd..729f14a 100644
--- a/Source/CTest/cmCTestMultiProcessHandler.cxx
+++ b/Source/CTest/cmCTestMultiProcessHandler.cxx
@@ -448,6 +448,19 @@ int cmCTestMultiProcessHandler::SearchByName(std::string name)
//---------------------------------------------------------
void cmCTestMultiProcessHandler::CreateTestCostList()
{
+ if(this->ParallelLevel > 1)
+ {
+ CreateParallelTestCostList();
+ }
+ else
+ {
+ CreateSerialTestCostList();
+ }
+}
+
+//---------------------------------------------------------
+void cmCTestMultiProcessHandler::CreateParallelTestCostList()
+{
TestSet alreadySortedTests;
std::list<TestSet> priorityStack;
@@ -459,8 +472,7 @@ void cmCTestMultiProcessHandler::CreateTestCostList()
for(TestMap::const_iterator i = this->Tests.begin();
i != this->Tests.end(); ++i)
{
- if(this->ParallelLevel > 1 &&
- std::find(this->LastTestsFailed.begin(), this->LastTestsFailed.end(),
+ if(std::find(this->LastTestsFailed.begin(), this->LastTestsFailed.end(),
this->Properties[i->first]->Name) != this->LastTestsFailed.end())
{
//If the test failed last time, it should be run first.
@@ -476,36 +488,33 @@ void cmCTestMultiProcessHandler::CreateTestCostList()
// In parallel test runs repeatedly move dependencies of the tests on
// the current dependency level to the next level until no
// further dependencies exist.
- if(this->ParallelLevel > 1)
+ while(priorityStack.back().size())
{
- while(priorityStack.back().size())
- {
- TestSet &previousSet = priorityStack.back();
- priorityStack.push_back(TestSet());
- TestSet ¤tSet = priorityStack.back();
+ TestSet &previousSet = priorityStack.back();
+ priorityStack.push_back(TestSet());
+ TestSet ¤tSet = priorityStack.back();
- for(TestSet::const_iterator i = previousSet.begin();
- i != previousSet.end(); ++i)
- {
- TestSet const& dependencies = this->Tests[*i];
- for(TestSet::const_iterator j = dependencies.begin();
- j != dependencies.end(); ++j)
- {
- currentSet.insert(*j);
- }
- }
-
- for(TestSet::const_iterator i = currentSet.begin();
- i != currentSet.end(); ++i)
+ for(TestSet::const_iterator i = previousSet.begin();
+ i != previousSet.end(); ++i)
+ {
+ TestSet const& dependencies = this->Tests[*i];
+ for(TestSet::const_iterator j = dependencies.begin();
+ j != dependencies.end(); ++j)
{
- previousSet.erase(*i);
+ currentSet.insert(*j);
}
}
- // Remove the empty dependency level
- priorityStack.pop_back();
+ for(TestSet::const_iterator i = currentSet.begin();
+ i != currentSet.end(); ++i)
+ {
+ previousSet.erase(*i);
+ }
}
+ // Remove the empty dependency level
+ priorityStack.pop_back();
+
// Reverse iterate over the different dependency levels (deepest first).
// Sort tests within each level by COST and append them to the cost list.
for(std::list<TestSet>::reverse_iterator i = priorityStack.rbegin();
@@ -537,6 +546,65 @@ void cmCTestMultiProcessHandler::CreateTestCostList()
}
//---------------------------------------------------------
+void cmCTestMultiProcessHandler::GetAllTestDependencies(
+ int test, TestList& dependencies)
+{
+ TestSet const& dependencySet = this->Tests[test];
+ for(TestSet::const_iterator i = dependencySet.begin();
+ i != dependencySet.end(); ++i)
+ {
+ GetAllTestDependencies(*i, dependencies);
+ dependencies.push_back(*i);
+ }
+}
+
+//---------------------------------------------------------
+void cmCTestMultiProcessHandler::CreateSerialTestCostList()
+{
+ TestList presortedList;
+
+ for(TestMap::iterator i = this->Tests.begin();
+ i != this->Tests.end(); ++i)
+ {
+ presortedList.push_back(i->first);
+ }
+
+ TestComparator comp(this);
+ std::stable_sort(presortedList.begin(), presortedList.end(), comp);
+
+ TestSet alreadySortedTests;
+
+ for(TestList::const_iterator i = presortedList.begin();
+ i != presortedList.end(); ++i)
+ {
+ int test = *i;
+
+ if(alreadySortedTests.find(test) != alreadySortedTests.end())
+ {
+ continue;
+ }
+
+ TestList dependencies;
+ GetAllTestDependencies(test, dependencies);
+
+ for(TestList::const_iterator j = dependencies.begin();
+ j != dependencies.end(); ++j)
+ {
+ int testDependency = *j;
+
+ if(alreadySortedTests.find(testDependency) == alreadySortedTests.end())
+ {
+ alreadySortedTests.insert(testDependency);
+ this->SortedTests.push_back(testDependency);
+ }
+ }
+
+ alreadySortedTests.insert(test);
+ this->SortedTests.push_back(test);
+ }
+}
+
+//---------------------------------------------------------
void cmCTestMultiProcessHandler::WriteCheckpoint(int index)
{
std::string fname = this->CTest->GetBinaryDir()
diff --git a/Source/CTest/cmCTestMultiProcessHandler.h b/Source/CTest/cmCTestMultiProcessHandler.h
index 439a8f3..1b53ec7 100644
--- a/Source/CTest/cmCTestMultiProcessHandler.h
+++ b/Source/CTest/cmCTestMultiProcessHandler.h
@@ -72,6 +72,12 @@ protected:
int SearchByName(std::string name);
void CreateTestCostList();
+
+ void GetAllTestDependencies(int test, TestList& dependencies);
+ void CreateSerialTestCostList();
+
+ void CreateParallelTestCostList();
+
// Removes the checkpoint file
void MarkFinished();
void EraseTest(int index);
diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt
index b6c9510..063bd2d 100644
--- a/Tests/CMakeLists.txt
+++ b/Tests/CMakeLists.txt
@@ -2219,13 +2219,13 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/
ADD_TEST_MACRO(CTestTestSerialInDepends ${CMAKE_CTEST_COMMAND} -j 4
--output-on-failure -C "\${CTestTest_CONFIG}")
- ADD_TEST_MACRO(CTestTestMissingDependsExe ${CMAKE_CTEST_COMMAND} -j 4
+ ADD_TEST_MACRO(CTestTestMissingDependsExe ${CMAKE_CTEST_COMMAND}
--output-on-failure -C "\${CTestTest_CONFIG}")
set_tests_properties(CTestTestMissingDependsExe PROPERTIES
PASS_REGULAR_EXPRESSION "\\*\\*\\*Not Run"
)
- ADD_TEST_MACRO(CTestTestSerialOrder ${CMAKE_CTEST_COMMAND} -j 4
+ ADD_TEST_MACRO(CTestTestSerialOrder ${CMAKE_CTEST_COMMAND}
--output-on-failure -C "\${CTestTest_CONFIG}")
if(NOT BORLAND)
http://cmake.org/gitweb?p=cmake.git;a=commitdiff;h=49996fb62a31287b1411cab035f29a4ca332be45
commit 49996fb62a31287b1411cab035f29a4ca332be45
Author: Nils Gladitz <nilsgladitz at gmail.com>
AuthorDate: Mon Dec 23 13:37:35 2013 +0100
Commit: Nils Gladitz <nilsgladitz at gmail.com>
CommitDate: Mon Dec 23 13:37:35 2013 +0100
Tests: added new test that detects regressions in serial test run order
diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt
index 105300c..b6c9510 100644
--- a/Tests/CMakeLists.txt
+++ b/Tests/CMakeLists.txt
@@ -2225,6 +2225,9 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/
PASS_REGULAR_EXPRESSION "\\*\\*\\*Not Run"
)
+ ADD_TEST_MACRO(CTestTestSerialOrder ${CMAKE_CTEST_COMMAND} -j 4
+ --output-on-failure -C "\${CTestTest_CONFIG}")
+
if(NOT BORLAND)
set(CTestLimitDashJ_CTEST_OPTIONS --force-new-ctest-process)
add_test_macro(CTestLimitDashJ ${CMAKE_CTEST_COMMAND} -j 4
diff --git a/Tests/CTestTestSerialOrder/CMakeLists.txt b/Tests/CTestTestSerialOrder/CMakeLists.txt
new file mode 100644
index 0000000..69c11fc
--- /dev/null
+++ b/Tests/CTestTestSerialOrder/CMakeLists.txt
@@ -0,0 +1,40 @@
+cmake_minimum_required(VERSION 2.8.12)
+
+project(CTestTestSerialOrder)
+
+set(TEST_OUTPUT_FILE "${CMAKE_CURRENT_BINARY_DIR}/test_output.txt")
+
+enable_testing()
+
+function(add_serial_order_test TEST_NAME)
+ add_test(NAME ${TEST_NAME}
+ COMMAND ${CMAKE_COMMAND}
+ "-DTEST_OUTPUT_FILE=${TEST_OUTPUT_FILE}"
+ "-DTEST_NAME=${TEST_NAME}"
+ -P "${CMAKE_CURRENT_SOURCE_DIR}/test.cmake"
+ )
+
+ if(ARGC GREATER 1)
+ set_tests_properties(${TEST_NAME} PROPERTIES ${ARGN})
+ endif()
+endfunction()
+
+add_serial_order_test(initialization COST 1000)
+add_serial_order_test(test1)
+add_serial_order_test(test2)
+add_serial_order_test(test3)
+add_serial_order_test(test4 DEPENDS test5)
+
+add_serial_order_test(test5)
+set_tests_properties(test5 PROPERTIES DEPENDS "test6;test7b;test7a")
+
+add_serial_order_test(test6 COST -2)
+add_serial_order_test(test7a COST -1)
+add_serial_order_test(test7b COST -1)
+add_serial_order_test(test8 COST 10)
+add_serial_order_test(test9 COST 20)
+add_serial_order_test(test10 COST 0)
+add_serial_order_test(test11)
+add_serial_order_test(test12 COST 0)
+
+add_serial_order_test(verification COST -1000)
diff --git a/Tests/CTestTestSerialOrder/test.cmake b/Tests/CTestTestSerialOrder/test.cmake
new file mode 100644
index 0000000..8479cae
--- /dev/null
+++ b/Tests/CTestTestSerialOrder/test.cmake
@@ -0,0 +1,31 @@
+list(APPEND EXPECTED_OUTPUT
+ initialization
+ test9
+ test8
+ test1
+ test2
+ test3
+ test6
+ test7a
+ test7b
+ test5
+ test4
+ test10
+ test11
+ test12
+)
+
+
+if("${TEST_NAME}" STREQUAL "initialization")
+ file(WRITE ${TEST_OUTPUT_FILE} "${TEST_NAME}")
+
+elseif("${TEST_NAME}" STREQUAL "verification")
+ file(READ ${TEST_OUTPUT_FILE} ACTUAL_OUTPUT)
+ if(NOT "${ACTUAL_OUTPUT}" STREQUAL "${EXPECTED_OUTPUT}")
+ message(FATAL_ERROR "Actual test order [${ACTUAL_OUTPUT}] differs from expected test order [${EXPECTED_OUTPUT}]")
+ endif()
+
+else()
+ file(APPEND ${TEST_OUTPUT_FILE} ";${TEST_NAME}")
+
+endif()
-----------------------------------------------------------------------
Summary of changes:
Source/CTest/cmCTestMultiProcessHandler.cxx | 116 +++++++++++++++++++++------
Source/CTest/cmCTestMultiProcessHandler.h | 6 ++
Tests/CMakeLists.txt | 5 +-
Tests/CTestTestSerialOrder/CMakeLists.txt | 40 +++++++++
Tests/CTestTestSerialOrder/test.cmake | 31 +++++++
5 files changed, 173 insertions(+), 25 deletions(-)
create mode 100644 Tests/CTestTestSerialOrder/CMakeLists.txt
create mode 100644 Tests/CTestTestSerialOrder/test.cmake
hooks/post-receive
--
CMake
More information about the Cmake-commits
mailing list