CTest: Test process tree kill on timeout

We extend the CTestTestTimeout test to check that when a test times out
its children (grandchildren of ctest) are killed.  Instead of running
the timeout executable directly, we run it through a cmake script that
redirects the timeout executable output to a file.  A second test later
runs and verifies that the timeout executable was unable to complete and
write data to the log file.  Only if the first inner test times out and
the second inner test passes (log is empty) does the CTestTestTimeout
test pass.
This commit is contained in:
Brad King 2009-11-30 16:31:28 -05:00
parent 2aaa967715
commit 88eefaced1
5 changed files with 34 additions and 3 deletions

View File

@ -1231,11 +1231,12 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=CVS -P ${CMake_SOURCE_DIR}/Utilities/Rel
"${CMake_BINARY_DIR}/Tests/CTestTestTimeout/test.cmake"
@ONLY ESCAPE_QUOTES)
ADD_TEST(CTestTestTimeout ${CMAKE_CTEST_COMMAND}
-C "\${CTEST_CONFIGURATION_TYPE}"
-S "${CMake_BINARY_DIR}/Tests/CTestTestTimeout/test.cmake" -V
--output-log "${CMake_BINARY_DIR}/Tests/CTestTestTimeout/testOutput.log"
)
SET_TESTS_PROPERTIES(CTestTestTimeout PROPERTIES
PASS_REGULAR_EXPRESSION "\\*\\*\\*Timeout")
PASS_REGULAR_EXPRESSION "TestTimeout *\\.+ *\\*\\*\\*Timeout.*CheckChild *\\.+ *Passed")
CONFIGURE_FILE(
"${CMake_SOURCE_DIR}/Tests/CTestTestRunScript/test.cmake.in"

View File

@ -1,4 +1,4 @@
cmake_minimum_required (VERSION 2.6)
cmake_minimum_required (VERSION 2.8)
PROJECT(CTestTestTimeout)
SET(DART_ROOT "" CACHE STRING "" FORCE)
@ -12,7 +12,19 @@ ADD_EXECUTABLE (Timeout timeout.c)
ENABLE_TESTING ()
ADD_TEST (TestTimeout Timeout)
ADD_TEST(NAME TestTimeout
COMMAND ${CMAKE_COMMAND} -D Timeout=$<TARGET_FILE:Timeout>
-D Log=${CMAKE_CURRENT_BINARY_DIR}/timeout.log
-P ${CMAKE_CURRENT_SOURCE_DIR}/timeout.cmake
)
SET_TESTS_PROPERTIES(TestTimeout PROPERTIES TIMEOUT 1)
ADD_TEST(NAME CheckChild
COMMAND ${CMAKE_COMMAND} -D Timeout=$<TARGET_FILE:Timeout>
-D Log=${CMAKE_CURRENT_BINARY_DIR}/timeout.log
-P ${CMAKE_CURRENT_SOURCE_DIR}/check.cmake
)
SET_TESTS_PROPERTIES(CheckChild PROPERTIES DEPENDS TestTimeout)
INCLUDE (CTest)

View File

@ -0,0 +1,9 @@
# Block just as long as timeout.cmake would if it were not killed.
execute_process(COMMAND ${Timeout})
# Verify that the log is empty, which indicates that the grandchild
# was killed before it finished sleeping.
file(READ "${Log}" LOG)
if(NOT "${LOG}" STREQUAL "")
message(FATAL_ERROR "${LOG}")
endif()

View File

@ -4,6 +4,8 @@
# include <unistd.h>
#endif
#include <stdio.h>
int main(void)
{
#if defined(_WIN32)
@ -11,5 +13,6 @@ int main(void)
#else
sleep(5);
#endif
printf("timeout process finished sleeping!\n");
return -1;
}

View File

@ -0,0 +1,6 @@
# Remove the log file.
file(REMOVE ${Log})
# Run a child that sleeps longer than the timout of this test.
# Log its output so check.cmake can verify it dies.
execute_process(COMMAND ${Timeout} OUTPUT_FILE ${Log})