summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2024-02-02 15:57:40 (GMT)
committerKitware Robot <kwrobot@kitware.com>2024-02-02 15:57:55 (GMT)
commitcc0c31e79f5c477c7016d5fc831152e58f7abd07 (patch)
treebc7b4c3fa648e415ce8e84086cfb3236ff23b213
parent1bbec7927d8770312edc1564b592b0056d845b44 (diff)
parentf875c479f5b00198d813a56212b6410ee2a33b14 (diff)
downloadCMake-cc0c31e79f5c477c7016d5fc831152e58f7abd07.zip
CMake-cc0c31e79f5c477c7016d5fc831152e58f7abd07.tar.gz
CMake-cc0c31e79f5c477c7016d5fc831152e58f7abd07.tar.bz2
Merge topic 'GoogleTest-test-launcher'
f875c479f5 GoogleTest: Honor TEST_LAUNCHER in gtest_discover_tests Acked-by: Kitware Robot <kwrobot@kitware.com> Merge-request: !9174
-rw-r--r--Modules/GoogleTest.cmake27
-rw-r--r--Tests/RunCMake/CMakeLists.txt6
-rw-r--r--Tests/RunCMake/GoogleTest/GoogleTestLauncher-test-stdout.txt17
-rw-r--r--Tests/RunCMake/GoogleTest/GoogleTestLauncher.cmake29
-rw-r--r--Tests/RunCMake/GoogleTest/RunCMakeTest.cmake38
-rw-r--r--Tests/RunCMake/GoogleTest/launcher_test.c24
-rw-r--r--Tests/RunCMake/GoogleTest/test_launcher.c71
7 files changed, 207 insertions, 5 deletions
diff --git a/Modules/GoogleTest.cmake b/Modules/GoogleTest.cmake
index 3c12e14..b62f839 100644
--- a/Modules/GoogleTest.cmake
+++ b/Modules/GoogleTest.cmake
@@ -475,10 +475,29 @@ function(gtest_discover_tests TARGET)
set(ctest_file_base "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}[${counter}]")
set(ctest_include_file "${ctest_file_base}_include.cmake")
set(ctest_tests_file "${ctest_file_base}_tests.cmake")
- get_property(crosscompiling_emulator
+ get_property(test_launcher
TARGET ${TARGET}
- PROPERTY CROSSCOMPILING_EMULATOR
+ PROPERTY TEST_LAUNCHER
)
+ cmake_policy(GET CMP0158 _CMP0158
+ PARENT_SCOPE # undocumented, do not use outside of CMake
+ )
+ if(NOT _CMP0158 OR _CMP0158 STREQUAL "OLD" OR _CMP0158 STREQUAL "NEW" AND CMAKE_CROSSCOMPILING)
+ get_property(crosscompiling_emulator
+ TARGET ${TARGET}
+ PROPERTY CROSSCOMPILING_EMULATOR
+ )
+ endif()
+
+ if(test_launcher AND crosscompiling_emulator)
+ set(test_executor "${test_launcher}" "${crosscompiling_emulator}")
+ elseif(test_launcher)
+ set(test_executor "${test_launcher}")
+ elseif(crosscompiling_emulator)
+ set(test_executor "${crosscompiling_emulator}")
+ else()
+ set(test_executor "")
+ endif()
if(_DISCOVERY_MODE STREQUAL "POST_BUILD")
add_custom_command(
@@ -487,7 +506,7 @@ function(gtest_discover_tests TARGET)
COMMAND "${CMAKE_COMMAND}"
-D "TEST_TARGET=${TARGET}"
-D "TEST_EXECUTABLE=$<TARGET_FILE:${TARGET}>"
- -D "TEST_EXECUTOR=${crosscompiling_emulator}"
+ -D "TEST_EXECUTOR=${test_executor}"
-D "TEST_WORKING_DIR=${_WORKING_DIRECTORY}"
-D "TEST_EXTRA_ARGS=${_EXTRA_ARGS}"
-D "TEST_PROPERTIES=${_PROPERTIES}"
@@ -529,7 +548,7 @@ function(gtest_discover_tests TARGET)
" include(\"${CMAKE_ROOT}/Modules/GoogleTestAddTests.cmake\")" "\n"
" gtest_discover_tests_impl(" "\n"
" TEST_EXECUTABLE" " [==[" "$<TARGET_FILE:${TARGET}>" "]==]" "\n"
- " TEST_EXECUTOR" " [==[" "${crosscompiling_emulator}" "]==]" "\n"
+ " TEST_EXECUTOR" " [==[" "${test_executor}" "]==]" "\n"
" TEST_WORKING_DIR" " [==[" "${_WORKING_DIRECTORY}" "]==]" "\n"
" TEST_EXTRA_ARGS" " [==[" "${_EXTRA_ARGS}" "]==]" "\n"
" TEST_PROPERTIES" " [==[" "${_PROPERTIES}" "]==]" "\n"
diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt
index 4d3efd3..245d550 100644
--- a/Tests/RunCMake/CMakeLists.txt
+++ b/Tests/RunCMake/CMakeLists.txt
@@ -428,7 +428,11 @@ endif()
add_RunCMake_test(GeneratorToolset)
add_RunCMake_test(GetPrerequisites -DSAMPLE_EXE=$<TARGET_FILE:exit_code>)
add_RunCMake_test(GNUInstallDirs -DSYSTEM_NAME=${CMAKE_SYSTEM_NAME})
-add_RunCMake_test(GoogleTest) # Note: does not actually depend on Google Test
+add_RunCMake_test(GoogleTest # Note: does not actually depend on Google Test
+ -DCMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID}
+ -DCMAKE_C_COMPILER_VERSION=${CMAKE_C_COMPILER_VERSION}
+ -DCMAKE_VS_PLATFORM_NAME=${CMAKE_VS_PLATFORM_NAME}
+ )
add_RunCMake_test(Graphviz)
add_RunCMake_test(Languages)
add_RunCMake_test(LinkItemValidation)
diff --git a/Tests/RunCMake/GoogleTest/GoogleTestLauncher-test-stdout.txt b/Tests/RunCMake/GoogleTest/GoogleTestLauncher-test-stdout.txt
new file mode 100644
index 0000000..6313151
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/GoogleTestLauncher-test-stdout.txt
@@ -0,0 +1,17 @@
+1: Test command: "?[^
+]*[/\]Tests[/\]RunCMake[/\]GoogleTest[/\]GoogleTestLauncher-build([/\]Debug)?[/\]test_launcher(\.exe)?"? "launcherparam" "--" "[^"]*/Tests/RunCMake/GoogleTest/GoogleTestLauncher-build(/Debug)?/test_launcher(\.exe)?" "emulatorparam" "--" "[^"]*/Tests/RunCMake/GoogleTest/GoogleTestLauncher-build(/Debug)?/launcher_test(\.exe)?" "--gtest_filter=launcher_test\.test1" "--gtest_also_run_disabled_tests"
+1: Working Directory: [^
+]*/Tests/RunCMake/GoogleTest/GoogleTestLauncher-build
+1: Test timeout computed to be: [0-9]+
+1: test_launcher: got arg 0 '[^']*[/\]Tests[/\]RunCMake[/\]GoogleTest[/\]GoogleTestLauncher-build([/\]Debug)?[/\]test_launcher(\.exe)?'
+1: test_launcher: got arg 1 'launcherparam'
+1: test_launcher: got arg 2 '--'
+1: test_launcher: got arg 3 '[^']*/Tests/RunCMake/GoogleTest/GoogleTestLauncher-build(/Debug)?/test_launcher(\.exe)?'
+1: launching: "[^"]*/Tests/RunCMake/GoogleTest/GoogleTestLauncher-build(/Debug)?/test_launcher(\.exe)?" "emulatorparam" "--" "[^"]*/Tests/RunCMake/GoogleTest/GoogleTestLauncher-build(/Debug)?/launcher_test(\.exe)?" "--gtest_filter=launcher_test\.test1" "--gtest_also_run_disabled_tests"
+1: test_launcher: got arg 0 '[^']*[/\]Tests[/\]RunCMake[/\]GoogleTest[/\]GoogleTestLauncher-build([/\]Debug)?[/\]test_launcher(\.exe)?'
+1: test_launcher: got arg 1 'emulatorparam'
+1: test_launcher: got arg 2 '--'
+1: test_launcher: got arg 3 '[^']*/Tests/RunCMake/GoogleTest/GoogleTestLauncher-build(/Debug)?/launcher_test(\.exe)?'
+1: launching: "[^"]*/Tests/RunCMake/GoogleTest/GoogleTestLauncher-build(/Debug)?/launcher_test(\.exe)?" "--gtest_filter=launcher_test\.test1" "--gtest_also_run_disabled_tests"
+1: launcher_test\.test1
+1/1 Test #1: launcher_test\.test1 [.]+ +Passed +[0-9.]+ sec
diff --git a/Tests/RunCMake/GoogleTest/GoogleTestLauncher.cmake b/Tests/RunCMake/GoogleTest/GoogleTestLauncher.cmake
new file mode 100644
index 0000000..5f4e6eb
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/GoogleTestLauncher.cmake
@@ -0,0 +1,29 @@
+enable_language(C)
+include(GoogleTest)
+
+enable_testing()
+
+include(xcode_sign_adhoc.cmake)
+
+add_executable(test_launcher test_launcher.c)
+
+add_executable(launcher_test launcher_test.c)
+xcode_sign_adhoc(launcher_test)
+set(launcher
+ "$<TARGET_FILE:test_launcher>"
+ "" # Verify that an empty list item will be preserved
+ "launcherparam"
+ "--"
+)
+set_property(TARGET launcher_test PROPERTY TEST_LAUNCHER "${launcher}")
+set(emulator
+ "$<TARGET_FILE:test_launcher>"
+ "" # Verify that an empty list item will be preserved
+ "emulatorparam"
+ "--"
+)
+set_property(TARGET launcher_test PROPERTY CROSSCOMPILING_EMULATOR "${emulator}")
+
+gtest_discover_tests(
+ launcher_test
+)
diff --git a/Tests/RunCMake/GoogleTest/RunCMakeTest.cmake b/Tests/RunCMake/GoogleTest/RunCMakeTest.cmake
index 56bbfc9..6e064a7 100644
--- a/Tests/RunCMake/GoogleTest/RunCMakeTest.cmake
+++ b/Tests/RunCMake/GoogleTest/RunCMakeTest.cmake
@@ -101,6 +101,43 @@ function(run_GoogleTest DISCOVERY_MODE)
)
endfunction()
+function(run_GoogleTestLauncher DISCOVERY_MODE)
+ if(CMAKE_C_COMPILER_ID STREQUAL "MSVC" AND CMAKE_C_COMPILER_VERSION VERSION_LESS "14.0")
+ return()
+ endif()
+ if(CMAKE_VS_PLATFORM_NAME STREQUAL "ARM64" AND CMAKE_C_COMPILER_ID STREQUAL "MSVC" AND CMAKE_C_COMPILER_VERSION VERSION_LESS "19.36")
+ return()
+ endif()
+
+ # Use a single build tree for a few tests without cleaning.
+ set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/GoogleTestLauncher-build)
+ if(NOT RunCMake_GENERATOR_IS_MULTI_CONFIG)
+ set(RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Debug)
+ endif()
+
+ run_cmake_with_options(GoogleTestLauncher
+ -DCMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE=${DISCOVERY_MODE}
+ )
+
+ set(RunCMake_TEST_NO_CLEAN 1)
+
+ # do not issue any warnings on stderr that would cause the build to fail
+ set(RunCMake_TEST_OUTPUT_MERGE 1)
+ run_cmake_command(GoogleTestLauncher-build
+ ${CMAKE_COMMAND}
+ --build .
+ --config Debug
+ )
+ unset(RunCMake_TEST_OUTPUT_MERGE)
+
+ run_cmake_command(GoogleTestLauncher-test
+ ${CMAKE_CTEST_COMMAND}
+ -C Debug
+ -V
+ --no-label-sumary
+ )
+endfunction()
+
function(run_GoogleTestXML DISCOVERY_MODE)
# Use a single build tree for a few tests without cleaning.
set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/GoogleTestXML-build)
@@ -321,6 +358,7 @@ endfunction()
foreach(DISCOVERY_MODE POST_BUILD PRE_TEST)
message("Testing ${DISCOVERY_MODE} discovery mode via CMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE global override...")
run_GoogleTest(${DISCOVERY_MODE})
+ run_GoogleTestLauncher(${DISCOVERY_MODE})
run_GoogleTestXML(${DISCOVERY_MODE})
message("Testing ${DISCOVERY_MODE} discovery mode via DISCOVERY_MODE option...")
run_GoogleTest_discovery_timeout(${DISCOVERY_MODE})
diff --git a/Tests/RunCMake/GoogleTest/launcher_test.c b/Tests/RunCMake/GoogleTest/launcher_test.c
new file mode 100644
index 0000000..ce91565
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/launcher_test.c
@@ -0,0 +1,24 @@
+#include <stdio.h>
+#include <string.h>
+
+/* Having this as comment lets gtest_add_tests recognizes the test we fake
+ here without requiring googletest
+TEST_F( launcher_test, test1 )
+{
+}
+*/
+
+int main(int argc, char** argv)
+{
+ /* Note: GoogleTest.cmake doesn't actually depend on Google Test as such;
+ * it only requires that we produces output in the expected format when
+ * invoked with --gtest_list_tests. Thus, we fake that here. This allows us
+ * to test the module without actually needing Google Test. */
+ if (argc > 1 && strcmp(argv[1], "--gtest_list_tests") == 0) {
+ printf("launcher_test.\n");
+ printf(" test1\n");
+ }
+
+ printf("launcher_test.test1\n");
+ return 0;
+}
diff --git a/Tests/RunCMake/GoogleTest/test_launcher.c b/Tests/RunCMake/GoogleTest/test_launcher.c
new file mode 100644
index 0000000..be5e00d
--- /dev/null
+++ b/Tests/RunCMake/GoogleTest/test_launcher.c
@@ -0,0 +1,71 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if defined(_MSC_VER) && _MSC_VER < 1900
+# include <stdarg.h>
+static int snprintf(char* buffer, size_t count, const char* format, ...)
+{
+ int n;
+ va_list argptr;
+ va_start(argptr, format);
+ n = _vscprintf(format, argptr);
+ vsnprintf_s(buffer, count, _TRUNCATE, format, argptr);
+ va_end(argptr);
+ return n;
+}
+#endif
+
+static int launch(int argc, const char* argv[])
+{
+ char cmd[4096];
+ size_t len = 0;
+ const char* sep = "";
+ int i;
+ int n;
+#ifdef _WIN32
+ n = snprintf(cmd + len, sizeof(cmd) - len, "cmd /C \"");
+ if (n < 0) {
+ return 1;
+ }
+ len += n;
+#endif
+ for (i = 0; i < argc; ++i) {
+ n = snprintf(cmd + len, sizeof(cmd) - len, "%s\"%s\"", sep, argv[i]);
+ if (n < 0) {
+ return 1;
+ }
+ len += n;
+ if (len >= sizeof(cmd)) {
+ fprintf(stderr, "error: command too long\n");
+ return 1;
+ }
+ sep = " ";
+ }
+#ifdef _WIN32
+ printf("launching: %s\n", cmd + 8);
+ n = snprintf(cmd + len, sizeof(cmd) - len, "\"");
+ if (n < 1) {
+ return 1;
+ }
+#else
+ printf("launching: %s\n", cmd);
+#endif
+ fflush(stdout);
+ return system(cmd);
+}
+
+int main(int argc, const char* argv[])
+{
+ int ownArgs = 1;
+ int i;
+ for (i = 0; i < argc; ++i) {
+ printf("test_launcher: got arg %d '%s'\n", i, argv[i]);
+ if (ownArgs && strcmp(argv[i], "--") == 0) {
+ ownArgs = 0;
+ } else if (!ownArgs) {
+ return launch(argc - i, argv + i);
+ }
+ }
+ return 1;
+}