Browse Source

Merge branch 'gtest-discovery-timeout' into release-3.10

Merge-request: !1534
Brad King 8 years ago
parent
commit
afae027d63

+ 13 - 1
Modules/GoogleTest.cmake

@@ -217,6 +217,14 @@ same as the Google Test name (i.e. ``suite.testcase``); see also
     executable is being used in multiple calls to ``gtest_discover_tests()``.
     Note that this variable is only available in CTest.
 
+  ``TIMEOUT num``
+    Specifies how long (in seconds) CMake will wait for the test to enumerate
+    available tests.  If the test takes longer than this, discovery (and your
+    build) will fail.  Most test executables will enumerate their tests very
+    quickly, but under some exceptional circumstances, a test may require a
+    longer timeout.  The default is 5.  See also the ``TIMEOUT`` option of
+    :command:`execute_process`.
+
 #]=======================================================================]
 
 #------------------------------------------------------------------------------
@@ -349,7 +357,7 @@ function(gtest_discover_tests TARGET)
   cmake_parse_arguments(
     ""
     "NO_PRETTY_TYPES;NO_PRETTY_VALUES"
-    "TEST_PREFIX;TEST_SUFFIX;WORKING_DIRECTORY;TEST_LIST"
+    "TEST_PREFIX;TEST_SUFFIX;WORKING_DIRECTORY;TEST_LIST;TIMEOUT"
     "EXTRA_ARGS;PROPERTIES"
     ${ARGN}
   )
@@ -360,6 +368,9 @@ function(gtest_discover_tests TARGET)
   if(NOT _TEST_LIST)
     set(_TEST_LIST ${TARGET}_TESTS)
   endif()
+  if(NOT _TIMEOUT)
+    set(_TIMEOUT 5)
+  endif()
 
   get_property(
     has_counter
@@ -407,6 +418,7 @@ function(gtest_discover_tests TARGET)
             -D "NO_PRETTY_VALUES=${_NO_PRETTY_VALUES}"
             -D "TEST_LIST=${_TEST_LIST}"
             -D "CTEST_FILE=${ctest_tests_file}"
+            -D "TEST_DISCOVERY_TIMEOUT=${_TIMEOUT}"
             -P "${_GOOGLETEST_DISCOVER_TESTS_SCRIPT}"
     VERBATIM
   )

+ 8 - 3
Modules/GoogleTestAddTests.cmake

@@ -24,19 +24,24 @@ endfunction()
 # Run test executable to get list of available tests
 if(NOT EXISTS "${TEST_EXECUTABLE}")
   message(FATAL_ERROR
-    "Specified test executable '${TEST_EXECUTABLE}' does not exist"
+    "Specified test executable does not exist.\n"
+    "  Path: '${TEST_EXECUTABLE}'"
   )
 endif()
 execute_process(
   COMMAND ${TEST_EXECUTOR} "${TEST_EXECUTABLE}" --gtest_list_tests
+  TIMEOUT ${TEST_DISCOVERY_TIMEOUT}
   OUTPUT_VARIABLE output
   RESULT_VARIABLE result
 )
 if(NOT ${result} EQUAL 0)
+  string(REPLACE "\n" "\n    " output "${output}")
   message(FATAL_ERROR
-    "Error running test executable '${TEST_EXECUTABLE}':\n"
+    "Error running test executable.\n"
+    "  Path: '${TEST_EXECUTABLE}'\n"
     "  Result: ${result}\n"
-    "  Output: ${output}\n"
+    "  Output:\n"
+    "    ${output}\n"
   )
 endif()
 

+ 1 - 0
Tests/RunCMake/GoogleTest/GoogleTest-test-missing-result.txt

@@ -0,0 +1 @@
+[^0]

+ 2 - 0
Tests/RunCMake/GoogleTest/GoogleTest-test-missing-stderr.txt

@@ -0,0 +1,2 @@
+Unable to find executable: timeout_test_NOT_BUILT
+Errors while running CTest

+ 1 - 0
Tests/RunCMake/GoogleTest/GoogleTest-timeout-result.txt

@@ -0,0 +1 @@
+[^0]

+ 7 - 0
Tests/RunCMake/GoogleTest/GoogleTest-timeout-stdout.txt

@@ -0,0 +1,7 @@
+( *|[0-9]+>)CMake Error at .*GoogleTestAddTests.cmake:[0-9]+ \(message\):
+( *|[0-9]+>)  Error running test executable.
+?( *|[0-9]+>)
+( *|[0-9]+>)    Path: '.*timeout_test(\.exe)?'
+( *|[0-9]+>)    Result: Process terminated due to timeout
+( *|[0-9]+>)    Output:
+( *|[0-9]+>)     +

+ 6 - 0
Tests/RunCMake/GoogleTest/GoogleTest.cmake

@@ -21,3 +21,9 @@ gtest_discover_tests(
   EXTRA_ARGS how now "\"brown\" cow"
   PROPERTIES LABELS TEST2
 )
+
+add_executable(timeout_test timeout_test.cpp)
+
+gtest_discover_tests(
+  timeout_test
+)

+ 21 - 0
Tests/RunCMake/GoogleTest/RunCMakeTest.cmake

@@ -9,24 +9,45 @@ function(run_GoogleTest)
   endif()
   file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}")
   file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}")
+
   run_cmake(GoogleTest)
+
   run_cmake_command(GoogleTest-build
     ${CMAKE_COMMAND}
     --build .
     --config Debug
+    --target fake_gtest
+  )
+
+  set(RunCMake_TEST_OUTPUT_MERGE 1)
+  run_cmake_command(GoogleTest-timeout
+    ${CMAKE_COMMAND}
+    --build .
+    --config Debug
+    --target timeout_test
   )
+  set(RunCMake_TEST_OUTPUT_MERGE 0)
+
   run_cmake_command(GoogleTest-test1
     ${CMAKE_CTEST_COMMAND}
     -C Debug
     -L TEST1
     --no-label-summary
   )
+
   run_cmake_command(GoogleTest-test2
     ${CMAKE_CTEST_COMMAND}
     -C Debug
     -L TEST2
     --no-label-summary
   )
+
+  run_cmake_command(GoogleTest-test-missing
+    ${CMAKE_CTEST_COMMAND}
+    -C Debug
+    -R timeout
+    --no-label-summary
+  )
 endfunction()
 
 run_GoogleTest()

+ 15 - 0
Tests/RunCMake/GoogleTest/timeout_test.cpp

@@ -0,0 +1,15 @@
+#if defined(_WIN32)
+#include <windows.h>
+#else
+#include <unistd.h>
+#endif
+
+int main()
+{
+#if defined(_WIN32)
+  Sleep(10000);
+#else
+  sleep(10);
+#endif
+  return 0;
+}