From 969999fa9f5baaebb11049732a611015f5c8516a Mon Sep 17 00:00:00 2001 From: Daniel Pfeifer Date: Wed, 4 Mar 2026 10:50:29 +0100 Subject: [PATCH] discover_tests: Add tests --- Tests/RunCMake/CMakeLists.txt | 1 + Tests/RunCMake/discover_tests/CMakeLists.txt | 3 + .../COMMAND_EXPAND_LISTS-stdout.txt | 7 ++ .../discover_tests/ENVIRONMENT-stdout.txt | 7 ++ .../discover_tests/PROPERTY-stdout.txt | 4 + .../discover_tests/RunCMakeTest.cmake | 37 ++++++ .../bad-command-test-result.txt | 1 + .../bad-command-test-stderr.txt | 4 + .../RunCMake/discover_tests/bad-command.cmake | 11 ++ .../discover_tests/bad-regex-test-result.txt | 1 + .../discover_tests/bad-regex-test-stderr.txt | 2 + Tests/RunCMake/discover_tests/bad-regex.cmake | 11 ++ Tests/RunCMake/discover_tests/basic.cmake | 39 ++++++ .../discovery-failure-test-result.txt | 1 + .../discovery-failure-test-stderr.txt | 4 + .../discover_tests/discovery-failure.cmake | 13 ++ .../discovery-timeout-test-result.txt | 1 + .../discovery-timeout-test-stderr.txt | 4 + .../discover_tests/discovery-timeout.cmake | 15 +++ .../RunCMake/discover_tests/fake_discovery.c | 111 ++++++++++++++++++ 20 files changed, 277 insertions(+) create mode 100644 Tests/RunCMake/discover_tests/CMakeLists.txt create mode 100644 Tests/RunCMake/discover_tests/COMMAND_EXPAND_LISTS-stdout.txt create mode 100644 Tests/RunCMake/discover_tests/ENVIRONMENT-stdout.txt create mode 100644 Tests/RunCMake/discover_tests/PROPERTY-stdout.txt create mode 100644 Tests/RunCMake/discover_tests/RunCMakeTest.cmake create mode 100644 Tests/RunCMake/discover_tests/bad-command-test-result.txt create mode 100644 Tests/RunCMake/discover_tests/bad-command-test-stderr.txt create mode 100644 Tests/RunCMake/discover_tests/bad-command.cmake create mode 100644 Tests/RunCMake/discover_tests/bad-regex-test-result.txt create mode 100644 Tests/RunCMake/discover_tests/bad-regex-test-stderr.txt create mode 100644 Tests/RunCMake/discover_tests/bad-regex.cmake create mode 100644 Tests/RunCMake/discover_tests/basic.cmake create mode 100644 Tests/RunCMake/discover_tests/discovery-failure-test-result.txt create mode 100644 Tests/RunCMake/discover_tests/discovery-failure-test-stderr.txt create mode 100644 Tests/RunCMake/discover_tests/discovery-failure.cmake create mode 100644 Tests/RunCMake/discover_tests/discovery-timeout-test-result.txt create mode 100644 Tests/RunCMake/discover_tests/discovery-timeout-test-stderr.txt create mode 100644 Tests/RunCMake/discover_tests/discovery-timeout.cmake create mode 100644 Tests/RunCMake/discover_tests/fake_discovery.c diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index 149e04cbc8..5ff07de2f5 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -413,6 +413,7 @@ add_RunCMake_test(CpsExportImportBuild) add_RunCMake_test(CpsExportImportInstall) add_RunCMake_test(CpsMapConfig) add_RunCMake_test(DisallowedCommands) +add_RunCMake_test(discover_tests) if("${CMAKE_GENERATOR}" MATCHES "Unix Makefiles|Ninja|FASTBuild") add_RunCMake_test(ExportCompileCommands) endif() diff --git a/Tests/RunCMake/discover_tests/CMakeLists.txt b/Tests/RunCMake/discover_tests/CMakeLists.txt new file mode 100644 index 0000000000..902f0bb359 --- /dev/null +++ b/Tests/RunCMake/discover_tests/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 3.10) +project(${RunCMake_TEST} LANGUAGES NONE) +include(${RunCMake_TEST}.cmake) diff --git a/Tests/RunCMake/discover_tests/COMMAND_EXPAND_LISTS-stdout.txt b/Tests/RunCMake/discover_tests/COMMAND_EXPAND_LISTS-stdout.txt new file mode 100644 index 0000000000..6995e16e76 --- /dev/null +++ b/Tests/RunCMake/discover_tests/COMMAND_EXPAND_LISTS-stdout.txt @@ -0,0 +1,7 @@ + Test #[0-9]*: ExpandLists.OFF.case_one;two + Test #[0-9]*: ExpandLists.OFF.case_three + Test #[0-9]*: ExpandLists.ON.case_one + Test #[0-9]*: ExpandLists.ON.case_two + Test #[0-9]*: ExpandLists.ON.case_three + +Total Tests: 5 diff --git a/Tests/RunCMake/discover_tests/ENVIRONMENT-stdout.txt b/Tests/RunCMake/discover_tests/ENVIRONMENT-stdout.txt new file mode 100644 index 0000000000..78dab22cdd --- /dev/null +++ b/Tests/RunCMake/discover_tests/ENVIRONMENT-stdout.txt @@ -0,0 +1,7 @@ + Start [0-9]*: Env.case_two +.* + +100% tests passed, 0 tests failed out of 1 + +Label Time Summary: +FOOBAR diff --git a/Tests/RunCMake/discover_tests/PROPERTY-stdout.txt b/Tests/RunCMake/discover_tests/PROPERTY-stdout.txt new file mode 100644 index 0000000000..0b05156c8e --- /dev/null +++ b/Tests/RunCMake/discover_tests/PROPERTY-stdout.txt @@ -0,0 +1,4 @@ + Test #[0-9]*: DT.case_one + Test #[0-9]*: DT.case_three + +Total Tests: 2 diff --git a/Tests/RunCMake/discover_tests/RunCMakeTest.cmake b/Tests/RunCMake/discover_tests/RunCMakeTest.cmake new file mode 100644 index 0000000000..68c80be103 --- /dev/null +++ b/Tests/RunCMake/discover_tests/RunCMakeTest.cmake @@ -0,0 +1,37 @@ +include(RunCMake) + +# Isolate our ctest runs from external environment. +unset(ENV{CTEST_PARALLEL_LEVEL}) +unset(ENV{CTEST_OUTPUT_ON_FAILURE}) + +if(NOT RunCMake_GENERATOR_IS_MULTI_CONFIG) + set(RunCMake_TEST_OPTIONS -DCMAKE_BUILD_TYPE=Debug) +endif() + +block() + set(RunCMake_TEST_BINARY_DIR "${RunCMake_BINARY_DIR}/basic-build") + run_cmake(basic) + set(RunCMake_TEST_NO_CLEAN 1) + run_cmake_command(basic-build ${CMAKE_COMMAND} --build . --config Debug) + + run_cmake_command(PROPERTY ${CMAKE_CTEST_COMMAND} -C Debug -N -L LBL1) + + set(ENV{TEST_LABEL} "FOO") + run_cmake_command(ENVIRONMENT ${CMAKE_CTEST_COMMAND} -C Debug -R "Env.") + + run_cmake_command(COMMAND_EXPAND_LISTS + ${CMAKE_CTEST_COMMAND} -C Debug -N -R "ExpandLists.") +endblock() + +function(run_case CASE) + set(RunCMake_TEST_BINARY_DIR ${RunCMake_BINARY_DIR}/${CASE}-build) + run_cmake(${CASE}) + set(RunCMake_TEST_NO_CLEAN 1) + run_cmake_command(${CASE}-build ${CMAKE_COMMAND} --build . --config Debug) + run_cmake_command(${CASE}-test ${CMAKE_CTEST_COMMAND} -C Debug) +endfunction() + +run_case(bad-command) +run_case(bad-regex) +run_case(discovery-failure) +run_case(discovery-timeout) diff --git a/Tests/RunCMake/discover_tests/bad-command-test-result.txt b/Tests/RunCMake/discover_tests/bad-command-test-result.txt new file mode 100644 index 0000000000..45a4fb75db --- /dev/null +++ b/Tests/RunCMake/discover_tests/bad-command-test-result.txt @@ -0,0 +1 @@ +8 diff --git a/Tests/RunCMake/discover_tests/bad-command-test-stderr.txt b/Tests/RunCMake/discover_tests/bad-command-test-stderr.txt new file mode 100644 index 0000000000..231b307573 --- /dev/null +++ b/Tests/RunCMake/discover_tests/bad-command-test-stderr.txt @@ -0,0 +1,4 @@ +CMake Error at .* \(discover_tests\): + discover_tests failed to run command:.* + + no such file or directory diff --git a/Tests/RunCMake/discover_tests/bad-command.cmake b/Tests/RunCMake/discover_tests/bad-command.cmake new file mode 100644 index 0000000000..0718468530 --- /dev/null +++ b/Tests/RunCMake/discover_tests/bad-command.cmake @@ -0,0 +1,11 @@ +enable_language(C) +enable_testing() + +add_executable(fake_discovery fake_discovery.c) + +discover_tests(COMMAND fake_discovery_notfound + DISCOVERY_ARGS --list + DISCOVERY_MATCH "^([^,]+),([^,]+)$" + TEST_NAME "DT.\\1" + TEST_ARGS --run "\\1" +) diff --git a/Tests/RunCMake/discover_tests/bad-regex-test-result.txt b/Tests/RunCMake/discover_tests/bad-regex-test-result.txt new file mode 100644 index 0000000000..45a4fb75db --- /dev/null +++ b/Tests/RunCMake/discover_tests/bad-regex-test-result.txt @@ -0,0 +1 @@ +8 diff --git a/Tests/RunCMake/discover_tests/bad-regex-test-stderr.txt b/Tests/RunCMake/discover_tests/bad-regex-test-stderr.txt new file mode 100644 index 0000000000..2380d40729 --- /dev/null +++ b/Tests/RunCMake/discover_tests/bad-regex-test-stderr.txt @@ -0,0 +1,2 @@ +CMake Error at .* \(discover_tests\): + discover_tests DISCOVERY_MATCH failed to compile regex "\(". diff --git a/Tests/RunCMake/discover_tests/bad-regex.cmake b/Tests/RunCMake/discover_tests/bad-regex.cmake new file mode 100644 index 0000000000..6acc44ae09 --- /dev/null +++ b/Tests/RunCMake/discover_tests/bad-regex.cmake @@ -0,0 +1,11 @@ +enable_language(C) +enable_testing() + +add_executable(fake_discovery fake_discovery.c) + +discover_tests(COMMAND fake_discovery + DISCOVERY_ARGS --list + DISCOVERY_MATCH "(" + TEST_NAME "DT.\\1" + TEST_ARGS --run "\\1" +) diff --git a/Tests/RunCMake/discover_tests/basic.cmake b/Tests/RunCMake/discover_tests/basic.cmake new file mode 100644 index 0000000000..88e00c380d --- /dev/null +++ b/Tests/RunCMake/discover_tests/basic.cmake @@ -0,0 +1,39 @@ +enable_language(C) +enable_testing() + +add_executable(fake_discovery fake_discovery.c) + +discover_tests(COMMAND fake_discovery + DISCOVERY_ARGS --list_tests + DISCOVERY_MATCH "^([^,]+),([^,]+)$" + TEST_NAME "DT.\\1" + TEST_ARGS "\\1" + TEST_PROPERTIES + LABELS "\\2" +) + +discover_tests(COMMAND fake_discovery + DISCOVERY_ARGS --list_env + DISCOVERY_MATCH "^([^,]+),([^,]+)$" + DISCOVERY_PROPERTIES + ENVIRONMENT "TEST_NAME=two" + ENVIRONMENT_MODIFICATION "TEST_LABEL=string_append:BAR" + TEST_NAME "Env.\\1" + TEST_ARGS "\\1" + TEST_PROPERTIES + LABELS "\\2" +) + +discover_tests(COMMAND fake_discovery --list_args "one;two" + DISCOVERY_ARGS "three" + DISCOVERY_MATCH ".*" + TEST_NAME "ExpandLists.OFF.\\0" + TEST_ARGS "" +) + +discover_tests(COMMAND fake_discovery --list_args "one;two" COMMAND_EXPAND_LISTS + DISCOVERY_ARGS "three" + DISCOVERY_MATCH ".*" + TEST_NAME "ExpandLists.ON.\\0" + TEST_ARGS "" +) diff --git a/Tests/RunCMake/discover_tests/discovery-failure-test-result.txt b/Tests/RunCMake/discover_tests/discovery-failure-test-result.txt new file mode 100644 index 0000000000..45a4fb75db --- /dev/null +++ b/Tests/RunCMake/discover_tests/discovery-failure-test-result.txt @@ -0,0 +1 @@ +8 diff --git a/Tests/RunCMake/discover_tests/discovery-failure-test-stderr.txt b/Tests/RunCMake/discover_tests/discovery-failure-test-stderr.txt new file mode 100644 index 0000000000..7f46757cfd --- /dev/null +++ b/Tests/RunCMake/discover_tests/discovery-failure-test-stderr.txt @@ -0,0 +1,4 @@ +CMake Error at .* \(discover_tests\): + discover_tests failed to run command:.* + + discovery failure diff --git a/Tests/RunCMake/discover_tests/discovery-failure.cmake b/Tests/RunCMake/discover_tests/discovery-failure.cmake new file mode 100644 index 0000000000..57eb9d2fae --- /dev/null +++ b/Tests/RunCMake/discover_tests/discovery-failure.cmake @@ -0,0 +1,13 @@ +enable_language(C) +enable_testing() + +add_executable(fake_discovery fake_discovery.c) + +discover_tests(COMMAND fake_discovery + DISCOVERY_ARGS --list_fail + DISCOVERY_MATCH "^([^,]+),([^,]+)$" + TEST_NAME "DT.\\1" + TEST_ARGS "\\1" + TEST_PROPERTIES + LABELS "\\2" +) diff --git a/Tests/RunCMake/discover_tests/discovery-timeout-test-result.txt b/Tests/RunCMake/discover_tests/discovery-timeout-test-result.txt new file mode 100644 index 0000000000..45a4fb75db --- /dev/null +++ b/Tests/RunCMake/discover_tests/discovery-timeout-test-result.txt @@ -0,0 +1 @@ +8 diff --git a/Tests/RunCMake/discover_tests/discovery-timeout-test-stderr.txt b/Tests/RunCMake/discover_tests/discovery-timeout-test-stderr.txt new file mode 100644 index 0000000000..ceb29f2876 --- /dev/null +++ b/Tests/RunCMake/discover_tests/discovery-timeout-test-stderr.txt @@ -0,0 +1,4 @@ +CMake Error at .* \(discover_tests\): + discover_tests failed to run command:.* + + Process terminated due to timeout diff --git a/Tests/RunCMake/discover_tests/discovery-timeout.cmake b/Tests/RunCMake/discover_tests/discovery-timeout.cmake new file mode 100644 index 0000000000..6655b14c23 --- /dev/null +++ b/Tests/RunCMake/discover_tests/discovery-timeout.cmake @@ -0,0 +1,15 @@ +enable_language(C) +enable_testing() + +add_executable(fake_discovery fake_discovery.c) + +discover_tests(COMMAND fake_discovery + DISCOVERY_ARGS --list_timeout + DISCOVERY_MATCH "^([^,]+),([^,]+)$" + DISCOVERY_PROPERTIES + TIMEOUT "0.1" + TEST_NAME "DT.\\1" + TEST_ARGS "\\1" + TEST_PROPERTIES + LABELS "\\2" +) diff --git a/Tests/RunCMake/discover_tests/fake_discovery.c b/Tests/RunCMake/discover_tests/fake_discovery.c new file mode 100644 index 0000000000..722072c487 --- /dev/null +++ b/Tests/RunCMake/discover_tests/fake_discovery.c @@ -0,0 +1,111 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file LICENSE.rst or https://cmake.org/licensing for details. */ + +#if defined(_MSC_VER) +# define _CRT_SECURE_NO_DEPRECATE +#endif + +#include +#include +#include + +#if defined(_WIN32) +# include +#else +# include +#endif + +static int list_tests(int ac, char** av) +{ + (void)ac, (void)av; + printf("this line should not match\n"); + printf("case_one,LBL1\n"); + printf("\n"); + printf("case_two,LBL2\n"); + printf("garbage,still,has,commas\n"); + printf("case_three,LBL1\n"); + return 0; +} + +static int list_fail(int ac, char** av) +{ + (void)ac, (void)av; + fprintf(stderr, "discovery failure\n"); + return -1; +} + +static int list_timeout(int ac, char** av) +{ + (void)ac, (void)av; + printf("case_one,LBL1\n"); +#if defined(_WIN32) + Sleep(5000); +#else + sleep(5); +#endif + return 0; +} + +static int list_args(int ac, char** av) +{ + int i; + for (i = 0; i < ac; i++) { + printf("case_%s\n", av[i]); + } + return 0; +} + +static int list_env(int ac, char** av) +{ + (void)ac, (void)av; + printf("case_%s,%s\n", getenv("TEST_NAME"), getenv("TEST_LABEL")); + return 0; +} + +static int success(int ac, char** av) +{ + (void)ac, (void)av; + return 0; +} + +typedef int (*function_ptr)(int, char**); + +struct function_entry +{ + char const* name; + function_ptr function; +}; + +struct function_entry const function_map[] = { + { "--list_tests", list_tests }, + { "--list_fail", list_fail }, + { "--list_timeout", list_timeout }, + { "--list_args", list_args }, + { "--list_env", list_env }, + { "case_one", success }, + { "case_two", success }, + { "case_three", success }, + { NULL, NULL }, +}; + +static function_ptr lookup(char const* name) +{ + struct function_entry const* it = function_map; + for (; it->name != NULL; ++it) { + if (strcmp(name, it->name) == 0) { + return it->function; + } + } + return NULL; +} + +int main(int argc, char** argv) +{ + function_ptr fn = argc > 1 ? lookup(argv[1]) : NULL; + if (fn == NULL) { + fprintf(stderr, "invalid argument\n"); + return -1; + } + + return fn(argc - 2, argv + 2); +}