From a5a70c7c3eadcc8a48b5f513b0ec361e40a5aeca Mon Sep 17 00:00:00 2001 From: nicole mazzuca Date: Fri, 30 Jul 2021 12:57:07 -0700 Subject: [vcpkg_minimum_required] fix, add unit tests (#19257) * fix vcpkg_minimum_required drive-by scripts audit * initial unit tests * finish unit tests --- scripts/cmake/vcpkg_minimum_required.cmake | 23 +++++----- scripts/test_ports/unit-test-cmake/portfile.cmake | 30 ++++++++----- .../test-vcpkg_minimum_required.cmake | 49 ++++++++++++++++++++++ scripts/test_ports/unit-test-cmake/vcpkg.json | 6 ++- 4 files changed, 86 insertions(+), 22 deletions(-) create mode 100644 scripts/test_ports/unit-test-cmake/test-vcpkg_minimum_required.cmake (limited to 'scripts') diff --git a/scripts/cmake/vcpkg_minimum_required.cmake b/scripts/cmake/vcpkg_minimum_required.cmake index 44777875e..a8f3a1265 100644 --- a/scripts/cmake/vcpkg_minimum_required.cmake +++ b/scripts/cmake/vcpkg_minimum_required.cmake @@ -15,31 +15,32 @@ The date-version to check against. function(vcpkg_minimum_required) cmake_parse_arguments(PARSE_ARGV 0 arg "" "VERSION" "") - if (NOT DEFINED VCPKG_BASE_VERSION) - message(FATAL_ERROR - "Your vcpkg executable is outdated and is not compatible with the current CMake scripts. " - "Please re-acquire vcpkg by running bootstrap-vcpkg." + if(NOT DEFINED VCPKG_BASE_VERSION) + message(FATAL_ERROR "Your vcpkg executable is outdated and is not compatible with the current CMake scripts. + Please re-acquire vcpkg by running bootstrap-vcpkg." ) endif() + if(NOT DEFINED arg_VERSION) + message(FATAL_ERROR "VERSION must be specified") + endif() set(vcpkg_date_regex "^[12][0-9][0-9][0-9]-[01][0-9]-[0-3][0-9]$") - if (NOT VCPKG_BASE_VERSION MATCHES "${vcpkg_date_regex}") + if(NOT "${VCPKG_BASE_VERSION}" MATCHES "${vcpkg_date_regex}") message(FATAL_ERROR "vcpkg internal failure; VCPKG_BASE_VERSION (${VCPKG_BASE_VERSION}) was not a valid date." - ) + ) endif() - if (NOT arg_VERSION MATCHES "${vcpkg_date_regex}") + if(NOT "${arg_VERSION}" MATCHES "${vcpkg_date_regex}") message(FATAL_ERROR - "VERSION parameter to vcpkg_minimum_required was not a valid date. " - "Comparing with vcpkg tool version ${VCPKG_BASE_VERSION}" - ) + "VERSION (${arg_VERSION}) was not a valid date - expected something of the form 'YYYY-MM-DD'" + ) endif() string(REPLACE "-" "." VCPKG_BASE_VERSION_as_dotted "${VCPKG_BASE_VERSION}") string(REPLACE "-" "." arg_VERSION_as_dotted "${arg_VERSION}") - if (VCPKG_BASE_VERSION_as_dotted VERSION_LESS vcpkg_VERSION_as_dotted) + if("${VCPKG_BASE_VERSION_as_dotted}" VERSION_LESS "${arg_VERSION_as_dotted}") message(FATAL_ERROR "Your vcpkg executable is from ${VCPKG_BASE_VERSION} which is older than required by the caller " "of vcpkg_minimum_required(VERSION ${arg_VERSION}). " diff --git a/scripts/test_ports/unit-test-cmake/portfile.cmake b/scripts/test_ports/unit-test-cmake/portfile.cmake index 638b15974..a567c11de 100644 --- a/scripts/test_ports/unit-test-cmake/portfile.cmake +++ b/scripts/test_ports/unit-test-cmake/portfile.cmake @@ -1,10 +1,9 @@ -function(set_fatal_error) - if(ARGC EQUAL 0) - set(Z_VCPKG_UNIT_TEST_HAS_FATAL_ERROR "OFF" CACHE BOOL "" FORCE) - else() - set(Z_VCPKG_UNIT_TEST_HAS_FATAL_ERROR "ON" CACHE BOOL "" FORCE) - set(Z_VCPKG_UNIT_TEST_FATAL_ERROR "${ARGV0}" CACHE STRING "" FORCE) - endif() +function(set_fatal_error err) + set(Z_VCPKG_UNIT_TEST_HAS_FATAL_ERROR "ON" CACHE BOOL "" FORCE) + set(Z_VCPKG_UNIT_TEST_FATAL_ERROR "${err}" CACHE STRING "" FORCE) +endfunction() +function(unset_fatal_error) + set(Z_VCPKG_UNIT_TEST_HAS_FATAL_ERROR "OFF" CACHE BOOL "" FORCE) endfunction() function(set_has_error) set(Z_VCPKG_UNIT_TEST_HAS_ERROR ON CACHE BOOL "" FORCE) @@ -22,12 +21,12 @@ macro(message level msg) endmacro() set(Z_VCPKG_UNIT_TEST_HAS_ERROR OFF CACHE BOOL "" FORCE) -set_fatal_error() +unset_fatal_error() function(unit_test_check_variable_equal utcve_test utcve_variable utcve_value) cmake_language(EVAL CODE "${utcve_test}") if(Z_VCPKG_UNIT_TEST_HAS_FATAL_ERROR) - set_fatal_error() + unset_fatal_error() set_has_error() message(STATUS "${utcve_test} had an unexpected FATAL_ERROR; expected: \"${utcve_value}\"") @@ -50,17 +49,28 @@ function(unit_test_check_variable_equal utcve_test utcve_variable utcve_value) endif() endfunction() +function(unit_test_ensure_success utcve_test) + cmake_language(EVAL CODE "${utcve_test}") + if(Z_VCPKG_UNIT_TEST_HAS_FATAL_ERROR) + set_has_error() + message(STATUS "${utcve_test} was expected to be successful.") + endif() + unset_fatal_error() +endfunction() function(unit_test_ensure_fatal_error utcve_test) cmake_language(EVAL CODE "${utcve_test}") if(NOT Z_VCPKG_UNIT_TEST_HAS_FATAL_ERROR) set_has_error() message(STATUS "${utcve_test} was expected to be a FATAL_ERROR.") endif() - set_fatal_error() + unset_fatal_error() endfunction() set(VCPKG_POLICY_EMPTY_PACKAGE enabled) +if("minimum-required" IN_LIST FEATURES) + include("${CMAKE_CURRENT_LIST_DIR}/test-vcpkg_minimum_required.cmake") +endif() if("list" IN_LIST FEATURES) include("${CMAKE_CURRENT_LIST_DIR}/test-vcpkg_list.cmake") endif() diff --git a/scripts/test_ports/unit-test-cmake/test-vcpkg_minimum_required.cmake b/scripts/test_ports/unit-test-cmake/test-vcpkg_minimum_required.cmake new file mode 100644 index 000000000..93bfbcfaa --- /dev/null +++ b/scripts/test_ports/unit-test-cmake/test-vcpkg_minimum_required.cmake @@ -0,0 +1,49 @@ +# -- error cases -- +# VCPKG_BASE_VERSION not set - vcpkg version is too old +set(VCPKG_BASE_VERSION_backup "${VCPKG_BASE_VERSION}") +unset(VCPKG_BASE_VERSION) +unset(VCPKG_BASE_VERSION CACHE) +unit_test_ensure_fatal_error([[vcpkg_minimum_required(VERSION 2021-01-01)]]) +unit_test_ensure_fatal_error([[vcpkg_minimum_required()]]) +unit_test_ensure_fatal_error([[vcpkg_minimum_required(VERSION "")]]) +unit_test_ensure_fatal_error([[vcpkg_minimum_required(VERSION "2021.01.01")]]) + +set(VCPKG_BASE_VERSION 2021-02-02) + +# VERSION not passed +unit_test_ensure_fatal_error([[vcpkg_minimum_required()]]) +# VERSION weird - empty +unit_test_ensure_fatal_error([[vcpkg_minimum_required(VERSION "")]]) +# VERSION weird - dotted +unit_test_ensure_fatal_error([[vcpkg_minimum_required(VERSION 2021.01.01)]]) +# VERSION weird - not a valid year +unit_test_ensure_fatal_error([[vcpkg_minimum_required(VERSION 3000-01-01)]]) +# VERSION weird - list +unit_test_ensure_fatal_error([[vcpkg_minimum_required(VERSION "2021-01-01;2021-01-02")]]) +# VERSION weird - small year +unit_test_ensure_fatal_error([[vcpkg_minimum_required(VERSION 21-01-01)]]) +# VERSION weird - small month +unit_test_ensure_fatal_error([[vcpkg_minimum_required(VERSION 2021-1-01)]]) +# VERSION weird - small day +unit_test_ensure_fatal_error([[vcpkg_minimum_required(VERSION 2021-01-1)]]) +# VERSION too-new - later year, earlier month, earlier day +unit_test_ensure_fatal_error([[vcpkg_minimum_required(VERSION 2022-01-01)]]) +# VERSION too-new - same year, later month, earlier day +unit_test_ensure_fatal_error([[vcpkg_minimum_required(VERSION 2021-03-01)]]) +# VERSION too-new - same year, same month, later day +unit_test_ensure_fatal_error([[vcpkg_minimum_required(VERSION 2021-02-03)]]) + +# -- successes -- +# same date +unit_test_ensure_success([[vcpkg_minimum_required(VERSION 2021-02-02)]]) + +# VERSION old - earlier year, later month, later day +unit_test_ensure_success([[vcpkg_minimum_required(VERSION 2020-03-03)]]) +# VERSION old - same year, earlier month, later day +unit_test_ensure_success([[vcpkg_minimum_required(VERSION 2021-01-03)]]) +# VERSION old - same year, same month, earlier day +unit_test_ensure_success([[vcpkg_minimum_required(VERSION 2021-02-01)]]) + +# reset to backup +unset(VCPKG_BASE_VERSION) +set(VCPKG_BASE_VERSION "${VCPKG_BASE_VERSION_backup}" CACHE STRING "") diff --git a/scripts/test_ports/unit-test-cmake/vcpkg.json b/scripts/test_ports/unit-test-cmake/vcpkg.json index 5079f9e73..c20cf2c6c 100644 --- a/scripts/test_ports/unit-test-cmake/vcpkg.json +++ b/scripts/test_ports/unit-test-cmake/vcpkg.json @@ -5,7 +5,8 @@ "supports": "x64", "default-features": [ "function-arguments", - "list" + "list", + "minimum-required" ], "features": { "function-arguments": { @@ -13,6 +14,9 @@ }, "list": { "description": "Test the vcpkg_list function" + }, + "minimum-required": { + "description": "Test the vcpkg_minimum_required function" } } } -- cgit v1.2.3