소스 검색

Merge topic 'ctest-timeout-on-pipe'

d1976cd1f2 CTest: Fix timeout when grandchild keeps pipes open
2f5eb1800b Tests: Add RunCMake.CTestTimeout test

Acked-by: Kitware Robot <[email protected]>
Merge-request: !4217
Brad King 6 년 전
부모
커밋
2272d256fb

+ 0 - 3
Source/CTest/cmProcess.cxx

@@ -278,9 +278,6 @@ void cmProcess::OnTimeoutCB(uv_timer_t* timer)
 
 void cmProcess::OnTimeout()
 {
-  if (this->ProcessState != cmProcess::State::Executing) {
-    return;
-  }
   this->ProcessState = cmProcess::State::Expired;
   bool const was_still_reading = !this->ReadHandleClosed;
   if (!this->ReadHandleClosed) {

+ 1 - 0
Tests/RunCMake/CMakeLists.txt

@@ -352,6 +352,7 @@ add_RunCMake_test(alias_targets)
 add_RunCMake_test(interface_library)
 add_RunCMake_test(no_install_prefix)
 add_RunCMake_test(configure_file)
+add_RunCMake_test(CTestTimeout -DTIMEOUT=${CTestTestTimeout_TIME})
 add_RunCMake_test(CTestTimeoutAfterMatch)
 
 # ctresalloc links against CMakeLib and CTestLib, which means it can't be built

+ 6 - 0
Tests/RunCMake/CTestTimeout/Basic-stdout.txt

@@ -0,0 +1,6 @@
+Test project [^
+]*/Tests/RunCMake/CTestTimeout/Basic-build
+    Start 1: TestTimeout
+1/1 Test #1: TestTimeout ......................\*\*\*Timeout +[0-9.]+ sec
++
+0% tests passed, 1 tests failed out of 1

+ 15 - 0
Tests/RunCMake/CTestTimeout/CMakeLists.txt.in

@@ -0,0 +1,15 @@
+cmake_minimum_required(VERSION 3.16)
+project(CTestTest@CASE_NAME@ C)
+include(CTest)
+
+add_executable(TestTimeout TestTimeout.c)
+
+if(NOT TIMEOUT)
+  set(TIMEOUT 4)
+endif()
+target_compile_definitions(TestTimeout PRIVATE TIMEOUT=${TIMEOUT})
+
+add_test(NAME TestTimeout COMMAND TestTimeout)
+set_property(TEST TestTimeout PROPERTY TIMEOUT ${TIMEOUT})
+
+@CASE_CMAKELISTS_SUFFIX_CODE@

+ 6 - 0
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

+ 22 - 0
Tests/RunCMake/CTestTimeout/RunCMakeTest.cmake

@@ -0,0 +1,22 @@
+include(RunCTest)
+
+if(NOT TIMEOUT)
+  # Give the process time to load and start running.
+  set(TIMEOUT 4)
+endif()
+
+function(run_ctest_timeout CASE_NAME)
+  configure_file(${RunCMake_SOURCE_DIR}/TestTimeout.c
+                 ${RunCMake_BINARY_DIR}/${CASE_NAME}/TestTimeout.c COPYONLY)
+  run_ctest(${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()

+ 24 - 0
Tests/RunCMake/CTestTimeout/TestTimeout.c

@@ -0,0 +1,24 @@
+#if defined(_WIN32)
+#  include <windows.h>
+#else
+#  include <unistd.h>
+#endif
+
+#include <stdio.h>
+
+int main(void)
+{
+#ifdef FORK
+  pid_t pid = fork();
+  if (pid != 0) {
+    return 0;
+  }
+#endif
+
+#if defined(_WIN32)
+  Sleep((TIMEOUT + 4) * 1000);
+#else
+  sleep((TIMEOUT + 4));
+#endif
+  return 0;
+}

+ 16 - 0
Tests/RunCMake/CTestTimeout/test.cmake.in

@@ -0,0 +1,16 @@
+cmake_minimum_required(VERSION 3.16)
+@CASE_TEST_PREFIX_CODE@
+
+set(CTEST_SITE                          "test-site")
+set(CTEST_BUILD_NAME                    "test-build-name")
+set(CTEST_SOURCE_DIRECTORY              "@RunCMake_BINARY_DIR@/@CASE_NAME@")
+set(CTEST_BINARY_DIRECTORY              "@RunCMake_BINARY_DIR@/@CASE_NAME@-build")
+set(CTEST_CMAKE_GENERATOR               "@RunCMake_GENERATOR@")
+set(CTEST_CMAKE_GENERATOR_PLATFORM      "@RunCMake_GENERATOR_PLATFORM@")
+set(CTEST_CMAKE_GENERATOR_TOOLSET       "@RunCMake_GENERATOR_TOOLSET@")
+set(CTEST_BUILD_CONFIGURATION           "$ENV{CMAKE_CONFIG_TYPE}")
+
+ctest_start(Experimental)
+ctest_configure(OPTIONS "-DTIMEOUT=@TIMEOUT@")
+ctest_build()
+ctest_test()