summaryrefslogtreecommitdiff
path: root/Tests/RunCMake/CTestTimeout
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2020-01-13 16:17:19 -0500
committerBrad King <brad.king@kitware.com>2020-01-14 10:29:05 -0500
commitd1976cd1f226a6da00dbab1b851202f0c69341db (patch)
tree355a7627df350bb5f3612c84d6e537d4d0a3c104 /Tests/RunCMake/CTestTimeout
parent2f5eb1800b76288ad3fbd6404b6b08ab26fb9158 (diff)
downloadcmake-d1976cd1f226a6da00dbab1b851202f0c69341db.tar.gz
CTest: Fix timeout when grandchild keeps pipes open
When a test's process creates its own child and exits, the grandchild may keep pipes open. Fix CTest logic to correctly timeout if the grandchild does not exit and close the pipes before the timeout expires. This was broken by commit b5e21d7d2e (CTest: Re-implement test process handling using libuv, 2017-12-10, v3.11.0-rc1~117^2) which added an unnecessary condition to the timeout handling. Fixes: #20116
Diffstat (limited to 'Tests/RunCMake/CTestTimeout')
-rw-r--r--Tests/RunCMake/CTestTimeout/Fork-stdout.txt6
-rw-r--r--Tests/RunCMake/CTestTimeout/RunCMakeTest.cmake8
-rw-r--r--Tests/RunCMake/CTestTimeout/TestTimeout.c7
3 files changed, 21 insertions, 0 deletions
diff --git a/Tests/RunCMake/CTestTimeout/Fork-stdout.txt b/Tests/RunCMake/CTestTimeout/Fork-stdout.txt
new file mode 100644
index 0000000000..284e4b1083
--- /dev/null
+++ b/Tests/RunCMake/CTestTimeout/Fork-stdout.txt
@@ -0,0 +1,6 @@
+Test project [^
+]*/Tests/RunCMake/CTestTimeout/Fork-build
+ Start 1: TestTimeout
+1/1 Test #1: TestTimeout ......................\*\*\*Timeout +[0-9.]+ sec
++
+0% tests passed, 1 tests failed out of 1
diff --git a/Tests/RunCMake/CTestTimeout/RunCMakeTest.cmake b/Tests/RunCMake/CTestTimeout/RunCMakeTest.cmake
index 428d0b77d7..7e96b6da57 100644
--- a/Tests/RunCMake/CTestTimeout/RunCMakeTest.cmake
+++ b/Tests/RunCMake/CTestTimeout/RunCMakeTest.cmake
@@ -12,3 +12,11 @@ function(run_ctest_timeout CASE_NAME)
endfunction()
run_ctest_timeout(Basic)
+
+if(UNIX)
+ string(CONCAT CASE_CMAKELISTS_SUFFIX_CODE [[
+ target_compile_definitions(TestTimeout PRIVATE FORK)
+]])
+ run_ctest_timeout(Fork)
+ unset(CASE_CMAKELISTS_SUFFIX_CODE)
+endif()
diff --git a/Tests/RunCMake/CTestTimeout/TestTimeout.c b/Tests/RunCMake/CTestTimeout/TestTimeout.c
index 52a56482cc..5a008a746c 100644
--- a/Tests/RunCMake/CTestTimeout/TestTimeout.c
+++ b/Tests/RunCMake/CTestTimeout/TestTimeout.c
@@ -8,6 +8,13 @@
int main(void)
{
+#ifdef FORK
+ pid_t pid = fork();
+ if (pid != 0) {
+ return 0;
+ }
+#endif
+
#if defined(_WIN32)
Sleep((TIMEOUT + 4) * 1000);
#else