tests: cmake: Add zephyr_get
As `zephyr_get()` grows in complexity and significance, it must continue working as expected. Unfortunately, it has a few minor bugs already, but they will be taken care of in the next few commits. Before that, though, let's go ahead and add a test suite for this function. For now, some tests will pass by using incorrect values, annotated with the `# BUG` comments; they will be removed in later patches. The purpose of having them now is to make it easier to see what's about to be fixed. Signed-off-by: Grzegorz Swiderski <grzegorz.swiderski@nordicsemi.no>
This commit is contained in:
parent
d59944465a
commit
5ef7229a8c
585
tests/cmake/zephyr_get/CMakeLists.txt
Normal file
585
tests/cmake/zephyr_get/CMakeLists.txt
Normal file
|
@ -0,0 +1,585 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
cmake_minimum_required(VERSION 3.20.0)
|
||||
|
||||
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
|
||||
project(zephyr_get_test)
|
||||
target_sources(app PRIVATE ${ZEPHYR_BASE}/misc/empty_file.c)
|
||||
|
||||
if(SYSBUILD)
|
||||
get_property(IMAGE_NAME TARGET sysbuild_cache PROPERTY SYSBUILD_NAME)
|
||||
else()
|
||||
set(IMAGE_NAME "no_sysbuild")
|
||||
endif()
|
||||
|
||||
# Usage:
|
||||
# - run_suite(<test-1> [<test-2> ...])
|
||||
#
|
||||
# Run tests and count assert failures. An error report will be shown
|
||||
# at the end, either here or in sysbuild.cmake.
|
||||
#
|
||||
macro(run_suite)
|
||||
set(ASSERT_FAIL_COUNT 0 CACHE INTERNAL "")
|
||||
|
||||
foreach(TEST_NAME ${ARGV})
|
||||
cmake_language(CALL ${TEST_NAME})
|
||||
endforeach()
|
||||
|
||||
if($CACHE{ASSERT_FAIL_COUNT} GREATER 0)
|
||||
if(NOT SYSBUILD)
|
||||
set(mode FATAL_ERROR)
|
||||
else()
|
||||
set(mode WARNING)
|
||||
endif()
|
||||
message(${mode} "$CACHE{ASSERT_FAIL_COUNT} assertion(s) failed")
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
# Usage:
|
||||
# - assert_equal(<variable> <expected-value>)
|
||||
#
|
||||
# - assert_equal(<variable>
|
||||
# IMAGE <image-1> <expected-value-for-image-1>
|
||||
# [IMAGE <image-2> <expected-value-for-image-2> ...]
|
||||
# )
|
||||
#
|
||||
function(assert_equal variable expected_value)
|
||||
if("${variable}" MATCHES "{.+}$")
|
||||
string(CONFIGURE "$${variable}" actual_value)
|
||||
else()
|
||||
set(actual_value "${${variable}}")
|
||||
endif()
|
||||
|
||||
if(expected_value STREQUAL "IMAGE")
|
||||
set(i 1)
|
||||
while(i LESS ARGC)
|
||||
if(NOT ARGV${i} STREQUAL "IMAGE")
|
||||
message(FATAL_ERROR "Invalid argument ${i}: '${ARGV${i}}' (expected 'IMAGE')")
|
||||
endif()
|
||||
math(EXPR i "${i} + 1")
|
||||
set(image_name "${ARGV${i}}")
|
||||
math(EXPR i "${i} + 1")
|
||||
set(expected_value "${ARGV${i}}")
|
||||
math(EXPR i "${i} + 1")
|
||||
|
||||
if(image_name STREQUAL IMAGE_NAME)
|
||||
break()
|
||||
endif()
|
||||
set(expected_value)
|
||||
endwhile()
|
||||
if(NOT DEFINED expected_value)
|
||||
message(FATAL_ERROR "No value provided for image: '${IMAGE_NAME}'")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
set(info "${TEST_NAME}: ${variable} == '${actual_value}'")
|
||||
if("${actual_value}" STREQUAL "${expected_value}")
|
||||
message("PASS: ${info}")
|
||||
else()
|
||||
message("FAIL: ${info}\n expected '${expected_value}'")
|
||||
math(EXPR ASSERT_FAIL_COUNT "$CACHE{ASSERT_FAIL_COUNT} + 1")
|
||||
set(ASSERT_FAIL_COUNT ${ASSERT_FAIL_COUNT} CACHE INTERNAL "")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
|
||||
function(test_precedence)
|
||||
# Test with a local variable not controlled by sysbuild.
|
||||
set(ENV{VARIABLE} "environment")
|
||||
set(VARIABLE "cmake cache" CACHE INTERNAL "")
|
||||
set(VARIABLE "local")
|
||||
|
||||
# CMake cache value has the highest precedence.
|
||||
zephyr_get(VARIABLE)
|
||||
assert_equal(VARIABLE "cmake cache")
|
||||
|
||||
# Environment value has the next highest precedence.
|
||||
unset(VARIABLE CACHE)
|
||||
unset(VARIABLE)
|
||||
|
||||
zephyr_get(VARIABLE)
|
||||
assert_equal(VARIABLE "environment")
|
||||
|
||||
# Environment value is cached after it's retrieved.
|
||||
assert_equal(CACHE{VARIABLE} "environment")
|
||||
|
||||
# Locally scoped value has the lowest precedence.
|
||||
unset(VARIABLE CACHE)
|
||||
unset(ENV{VARIABLE})
|
||||
set(VARIABLE "local")
|
||||
|
||||
zephyr_get(VARIABLE)
|
||||
assert_equal(VARIABLE "local")
|
||||
assert_equal(CACHE{VARIABLE} "")
|
||||
|
||||
unset(VARIABLE)
|
||||
zephyr_get(VARIABLE)
|
||||
assert_equal(VARIABLE "")
|
||||
endfunction()
|
||||
|
||||
|
||||
function(test_precedence_with_sysbuild)
|
||||
# Test with an external variable provided in testcase.yaml
|
||||
set(ENV{TESTCASE_VARIABLE} "environment")
|
||||
set(TESTCASE_VARIABLE "cmake cache" CACHE INTERNAL "")
|
||||
set(TESTCASE_VARIABLE "local")
|
||||
|
||||
zephyr_get(TESTCASE_VARIABLE SYSBUILD GLOBAL)
|
||||
assert_equal(TESTCASE_VARIABLE
|
||||
IMAGE no_sysbuild "cmake cache"
|
||||
# Provided -DTESTCASE_VARIABLE=<...> serves as the
|
||||
# LOCAL sysbuild-defined value for this primary image.
|
||||
IMAGE zephyr_get "sysbuild.main"
|
||||
# Provided -Dzephyr_get_2nd_TESTCASE_VARIABLE=<...> serves as
|
||||
# the LOCAL sysbuild-defined value for this secondary image.
|
||||
IMAGE zephyr_get_2nd "sysbuild.2nd"
|
||||
# Provided -DTESTCASE_VARIABLE=<...> serves as the
|
||||
# GLOBAL sysbuild-defined value for this tertiary image;
|
||||
# it has no LOCAL value of its own.
|
||||
IMAGE zephyr_get_3rd "sysbuild.main"
|
||||
)
|
||||
|
||||
unset(TESTCASE_VARIABLE CACHE)
|
||||
unset(TESTCASE_VARIABLE)
|
||||
|
||||
zephyr_get(TESTCASE_VARIABLE SYSBUILD LOCAL)
|
||||
assert_equal(TESTCASE_VARIABLE
|
||||
IMAGE no_sysbuild "environment"
|
||||
IMAGE zephyr_get "sysbuild.main"
|
||||
IMAGE zephyr_get_2nd "sysbuild.2nd"
|
||||
# This image has no LOCAL sysbuild-defined value.
|
||||
IMAGE zephyr_get_3rd "environment"
|
||||
)
|
||||
assert_equal(CACHE{TESTCASE_VARIABLE}
|
||||
IMAGE no_sysbuild "environment"
|
||||
IMAGE zephyr_get ""
|
||||
IMAGE zephyr_get_2nd ""
|
||||
IMAGE zephyr_get_3rd "environment"
|
||||
)
|
||||
|
||||
unset(TESTCASE_VARIABLE CACHE)
|
||||
unset(ENV{TESTCASE_VARIABLE})
|
||||
set(TESTCASE_VARIABLE "local")
|
||||
|
||||
# This should be equivalent to: zephyr_get(... SYSBUILD GLOBAL)
|
||||
zephyr_get(TESTCASE_VARIABLE)
|
||||
assert_equal(TESTCASE_VARIABLE
|
||||
IMAGE no_sysbuild "local"
|
||||
IMAGE zephyr_get "sysbuild.main"
|
||||
IMAGE zephyr_get_2nd "sysbuild.2nd"
|
||||
IMAGE zephyr_get_3rd "sysbuild.main"
|
||||
)
|
||||
endfunction()
|
||||
|
||||
|
||||
function(test_merge)
|
||||
# Test with a local variable not controlled by sysbuild.
|
||||
set(ENV{VARIABLE} "environment")
|
||||
set(VARIABLE "cmake cache" CACHE INTERNAL "")
|
||||
set(VARIABLE "local")
|
||||
|
||||
zephyr_get(VARIABLE MERGE)
|
||||
assert_equal(VARIABLE "cmake cache;environment;local")
|
||||
|
||||
# Environment is not cached when using MERGE.
|
||||
unset(VARIABLE CACHE)
|
||||
unset(VARIABLE)
|
||||
|
||||
zephyr_get(VARIABLE MERGE)
|
||||
assert_equal(VARIABLE "environment")
|
||||
assert_equal(CACHE{VARIABLE} "")
|
||||
|
||||
unset(ENV{VARIABLE})
|
||||
set(VARIABLE "cmake cache" CACHE INTERNAL "")
|
||||
set(VARIABLE "local")
|
||||
|
||||
zephyr_get(VARIABLE MERGE)
|
||||
assert_equal(VARIABLE "cmake cache;local")
|
||||
|
||||
unset(VARIABLE CACHE)
|
||||
unset(VARIABLE)
|
||||
|
||||
zephyr_get(VARIABLE MERGE)
|
||||
assert_equal(VARIABLE "")
|
||||
|
||||
# Lists are combined and *rightmost* duplicates are removed.
|
||||
set(ENV{VARIABLE} "A;B;C;D")
|
||||
set(VARIABLE "F;E;D;C")
|
||||
|
||||
zephyr_get(VARIABLE MERGE)
|
||||
assert_equal(VARIABLE "A;B;C;D;F;E")
|
||||
|
||||
# Test with an external variable provided in testcase.yaml
|
||||
unset(ENV{TESTCASE_VARIABLE})
|
||||
unset(TESTCASE_VARIABLE CACHE)
|
||||
|
||||
zephyr_get(TESTCASE_VARIABLE MERGE SYSBUILD LOCAL)
|
||||
assert_equal(TESTCASE_VARIABLE
|
||||
IMAGE no_sysbuild ""
|
||||
IMAGE zephyr_get "sysbuild.main"
|
||||
IMAGE zephyr_get_2nd "sysbuild.2nd"
|
||||
# This image has no LOCAL sysbuild-defined value.
|
||||
IMAGE zephyr_get_3rd ""
|
||||
)
|
||||
|
||||
unset(TESTCASE_VARIABLE)
|
||||
|
||||
# Add the GLOBAL sysbuild-defined value.
|
||||
zephyr_get(TESTCASE_VARIABLE MERGE SYSBUILD GLOBAL)
|
||||
assert_equal(TESTCASE_VARIABLE
|
||||
IMAGE no_sysbuild ""
|
||||
# This image's LOCAL and GLOBAL are identical; duplicates are removed.
|
||||
IMAGE zephyr_get "sysbuild.main"
|
||||
IMAGE zephyr_get_2nd "sysbuild.2nd" # BUG
|
||||
IMAGE zephyr_get_3rd "sysbuild.main"
|
||||
)
|
||||
|
||||
# Add more variable scopes.
|
||||
set(ENV{TESTCASE_VARIABLE} "environment")
|
||||
set(TESTCASE_VARIABLE "cmake cache" CACHE INTERNAL "")
|
||||
set(TESTCASE_VARIABLE "local")
|
||||
|
||||
zephyr_get(TESTCASE_VARIABLE MERGE SYSBUILD GLOBAL)
|
||||
assert_equal(TESTCASE_VARIABLE
|
||||
IMAGE no_sysbuild "cmake cache;environment;local"
|
||||
IMAGE zephyr_get "cmake cache;sysbuild.main;environment;local" # BUG
|
||||
IMAGE zephyr_get_2nd "cmake cache;sysbuild.2nd;environment;local" # BUG
|
||||
IMAGE zephyr_get_3rd "cmake cache;sysbuild.main;environment;local" # BUG
|
||||
)
|
||||
|
||||
unset(TESTCASE_VARIABLE)
|
||||
zephyr_get(TESTCASE_VARIABLE MERGE SYSBUILD LOCAL)
|
||||
assert_equal(TESTCASE_VARIABLE
|
||||
IMAGE no_sysbuild "cmake cache;environment"
|
||||
IMAGE zephyr_get "cmake cache;sysbuild.main;environment" # BUG
|
||||
IMAGE zephyr_get_2nd "cmake cache;sysbuild.2nd;environment" # BUG
|
||||
IMAGE zephyr_get_3rd "cmake cache;environment"
|
||||
)
|
||||
|
||||
unset(TESTCASE_VARIABLE)
|
||||
unset(TESTCASE_VARIABLE CACHE)
|
||||
|
||||
# This should be equivalent to: zephyr_get(... SYSBUILD GLOBAL)
|
||||
zephyr_get(TESTCASE_VARIABLE MERGE)
|
||||
assert_equal(TESTCASE_VARIABLE
|
||||
IMAGE no_sysbuild "environment"
|
||||
IMAGE zephyr_get "sysbuild.main;environment"
|
||||
IMAGE zephyr_get_2nd "sysbuild.2nd;environment" # BUG
|
||||
IMAGE zephyr_get_3rd "sysbuild.main;environment"
|
||||
)
|
||||
assert_equal(CACHE{TESTCASE_VARIABLE} "")
|
||||
endfunction()
|
||||
|
||||
|
||||
function(test_multivar)
|
||||
# Test with local variables not controlled by sysbuild.
|
||||
foreach(var VARIABLE_1 VARIABLE_2 VARIABLE_3)
|
||||
unset(ENV{${var}})
|
||||
unset(${var} CACHE)
|
||||
unset(${var})
|
||||
endforeach()
|
||||
|
||||
set(ENV{VARIABLE_1} "environment 1")
|
||||
set(ENV{VARIABLE_3} "environment 3")
|
||||
set(VARIABLE_2 "cmake cache 2" CACHE INTERNAL "")
|
||||
set(VARIABLE_2 "local 2")
|
||||
set(VARIABLE_3 "local 3")
|
||||
|
||||
# Highest precedence scope always wins.
|
||||
zephyr_get(RESULT VAR VARIABLE_1 VARIABLE_2 VARIABLE_3)
|
||||
assert_equal(RESULT "cmake cache 2")
|
||||
zephyr_get(RESULT VAR VARIABLE_3 VARIABLE_1 VARIABLE_2)
|
||||
assert_equal(RESULT "cmake cache 2")
|
||||
|
||||
# With multiple variables in the same scope, the first variable wins.
|
||||
set(VARIABLE_1 "cmake cache 1" CACHE INTERNAL "")
|
||||
zephyr_get(RESULT VAR VARIABLE_1 VARIABLE_2 VARIABLE_3)
|
||||
assert_equal(RESULT "cmake cache 1")
|
||||
zephyr_get(RESULT VAR VARIABLE_2 VARIABLE_3 VARIABLE_1)
|
||||
assert_equal(RESULT "cmake cache 2")
|
||||
|
||||
unset(ENV{RESULT})
|
||||
unset(RESULT CACHE)
|
||||
unset(RESULT)
|
||||
|
||||
# With MERGE, all scopes are reflected subject to variable order.
|
||||
zephyr_get(RESULT MERGE VAR VARIABLE_1 VARIABLE_2 VARIABLE_3)
|
||||
assert_equal(RESULT "cmake cache 1;cmake cache 2;environment 1;environment 3;local 2;local 3")
|
||||
|
||||
set(ENV{RESULT} "environment r")
|
||||
set(RESULT "cmake cache r" CACHE INTERNAL "")
|
||||
set(RESULT "local r")
|
||||
|
||||
# Unless RESULT is included in VAR, it does not affect the output.
|
||||
zephyr_get(RESULT MERGE VAR VARIABLE_3 VARIABLE_2 VARIABLE_1)
|
||||
assert_equal(RESULT "local r;cmake cache 2;cmake cache 1;environment 3;environment 1;local 3;local 2") # BUG
|
||||
|
||||
set(RESULT "local r")
|
||||
zephyr_get(RESULT MERGE VAR RESULT VARIABLE_3 VARIABLE_2 VARIABLE_1)
|
||||
assert_equal(RESULT "cmake cache r;cmake cache 2;cmake cache 1;environment r;environment 3;environment 1;local r;local 3;local 2")
|
||||
|
||||
set(RESULT "local r")
|
||||
zephyr_get(RESULT MERGE VAR VARIABLE_2 VARIABLE_3 VARIABLE_1 RESULT)
|
||||
assert_equal(RESULT "cmake cache r;cmake cache 2;cmake cache 1;environment 3;environment 1;environment r;local 2;local 3;local r") # BUG
|
||||
|
||||
unset(ENV{RESULT})
|
||||
unset(RESULT CACHE)
|
||||
unset(RESULT)
|
||||
|
||||
# If an environment value wins, it is cached afterwards.
|
||||
unset(VARIABLE_1 CACHE)
|
||||
unset(VARIABLE_2 CACHE)
|
||||
|
||||
zephyr_get(RESULT VAR VARIABLE_1 VARIABLE_2 VARIABLE_3)
|
||||
assert_equal(RESULT "environment 1")
|
||||
assert_equal(CACHE{VARIABLE_1} "environment 1")
|
||||
assert_equal(CACHE{VARIABLE_2} "")
|
||||
assert_equal(CACHE{VARIABLE_3} "")
|
||||
assert_equal(CACHE{RESULT} "")
|
||||
|
||||
unset(VARIABLE_1 CACHE)
|
||||
unset(VARIABLE_3)
|
||||
|
||||
zephyr_get(RESULT VAR VARIABLE_3 VARIABLE_1 VARIABLE_2)
|
||||
assert_equal(RESULT "environment 3")
|
||||
assert_equal(CACHE{VARIABLE_1} "")
|
||||
assert_equal(CACHE{VARIABLE_2} "")
|
||||
assert_equal(CACHE{VARIABLE_3} "environment 3")
|
||||
assert_equal(CACHE{RESULT} "")
|
||||
|
||||
set(VARIABLE_2 "cmake cache 2" CACHE INTERNAL "")
|
||||
set(VARIABLE_2 "local 2")
|
||||
set(VARIABLE_3 "local 3")
|
||||
unset(VARIABLE_3 CACHE)
|
||||
|
||||
# Include the external variable provided in testcase.yaml
|
||||
set(ENV{TESTCASE_VARIABLE} "environment s")
|
||||
set(TESTCASE_VARIABLE "cmake cache s" CACHE INTERNAL "")
|
||||
set(TESTCASE_VARIABLE "local s")
|
||||
|
||||
zephyr_get(RESULT SYSBUILD GLOBAL VAR TESTCASE_VARIABLE VARIABLE_1 VARIABLE_2 VARIABLE_3)
|
||||
assert_equal(RESULT
|
||||
IMAGE no_sysbuild "cmake cache s"
|
||||
IMAGE zephyr_get "sysbuild.main"
|
||||
IMAGE zephyr_get_2nd "sysbuild.2nd"
|
||||
IMAGE zephyr_get_3rd "sysbuild.main"
|
||||
)
|
||||
zephyr_get(RESULT SYSBUILD LOCAL VAR TESTCASE_VARIABLE VARIABLE_1 VARIABLE_2 VARIABLE_3)
|
||||
assert_equal(RESULT
|
||||
IMAGE no_sysbuild "cmake cache s"
|
||||
IMAGE zephyr_get "sysbuild.main"
|
||||
IMAGE zephyr_get_2nd "sysbuild.2nd"
|
||||
IMAGE zephyr_get_3rd "cmake cache s"
|
||||
)
|
||||
|
||||
unset(RESULT)
|
||||
zephyr_get(RESULT SYSBUILD GLOBAL MERGE VAR TESTCASE_VARIABLE VARIABLE_1 VARIABLE_2 VARIABLE_3)
|
||||
assert_equal(RESULT
|
||||
IMAGE no_sysbuild "cmake cache s;cmake cache 2;environment s;environment 1;environment 3;local s;local 2;local 3"
|
||||
IMAGE zephyr_get "sysbuild.main;cmake cache s;cmake cache 2;environment s;environment 1;environment 3;local s;local 2;local 3"
|
||||
IMAGE zephyr_get_2nd "sysbuild.2nd;cmake cache s;cmake cache 2;environment s;environment 1;environment 3;local s;local 2;local 3" # BUG
|
||||
IMAGE zephyr_get_3rd "sysbuild.main;cmake cache s;cmake cache 2;environment s;environment 1;environment 3;local s;local 2;local 3"
|
||||
)
|
||||
unset(RESULT)
|
||||
zephyr_get(RESULT SYSBUILD LOCAL MERGE VAR TESTCASE_VARIABLE VARIABLE_1 VARIABLE_2 VARIABLE_3)
|
||||
assert_equal(RESULT
|
||||
IMAGE no_sysbuild "cmake cache s;cmake cache 2;environment s;environment 1;environment 3;local s;local 2;local 3"
|
||||
IMAGE zephyr_get "sysbuild.main;cmake cache s;cmake cache 2;environment s;environment 1;environment 3;local s;local 2;local 3"
|
||||
IMAGE zephyr_get_2nd "sysbuild.2nd;cmake cache s;cmake cache 2;environment s;environment 1;environment 3;local s;local 2;local 3"
|
||||
IMAGE zephyr_get_3rd "cmake cache s;cmake cache 2;environment s;environment 1;environment 3;local s;local 2;local 3"
|
||||
)
|
||||
unset(RESULT)
|
||||
zephyr_get(RESULT SYSBUILD GLOBAL MERGE VAR VARIABLE_3 VARIABLE_2 VARIABLE_1 TESTCASE_VARIABLE)
|
||||
assert_equal(RESULT
|
||||
IMAGE no_sysbuild "cmake cache 2;cmake cache s;environment 3;environment 1;environment s;local 3;local 2;local s"
|
||||
IMAGE zephyr_get "sysbuild.main;cmake cache 2;cmake cache s;environment 3;environment 1;environment s;local 3;local 2;local s"
|
||||
IMAGE zephyr_get_2nd "sysbuild.2nd;cmake cache 2;cmake cache s;environment 3;environment 1;environment s;local 3;local 2;local s" # BUG
|
||||
IMAGE zephyr_get_3rd "sysbuild.main;cmake cache 2;cmake cache s;environment 3;environment 1;environment s;local 3;local 2;local s"
|
||||
)
|
||||
unset(RESULT)
|
||||
zephyr_get(RESULT SYSBUILD LOCAL MERGE VAR VARIABLE_3 VARIABLE_2 VARIABLE_1 TESTCASE_VARIABLE)
|
||||
assert_equal(RESULT
|
||||
IMAGE no_sysbuild "cmake cache 2;cmake cache s;environment 3;environment 1;environment s;local 3;local 2;local s"
|
||||
IMAGE zephyr_get "sysbuild.main;cmake cache 2;cmake cache s;environment 3;environment 1;environment s;local 3;local 2;local s"
|
||||
IMAGE zephyr_get_2nd "sysbuild.2nd;cmake cache 2;cmake cache s;environment 3;environment 1;environment s;local 3;local 2;local s"
|
||||
IMAGE zephyr_get_3rd "cmake cache 2;cmake cache s;environment 3;environment 1;environment s;local 3;local 2;local s"
|
||||
)
|
||||
endfunction()
|
||||
|
||||
|
||||
function(test_merge_reverse)
|
||||
# Test with local variables not controlled by sysbuild.
|
||||
foreach(var VARIABLE_1 VARIABLE_2 VARIABLE_3)
|
||||
unset(ENV{${var}})
|
||||
unset(${var} CACHE)
|
||||
unset(${var})
|
||||
endforeach()
|
||||
|
||||
set(ENV{VARIABLE_1} "environment 1")
|
||||
set(ENV{VARIABLE_2} "environment 2")
|
||||
set(VARIABLE_1 "cmake cache 1" CACHE INTERNAL "")
|
||||
set(VARIABLE_2 "cmake cache 2" CACHE INTERNAL "")
|
||||
set(VARIABLE_1 "local 1")
|
||||
set(VARIABLE_2 "local 2")
|
||||
|
||||
# Only scopes are reversed; not variables.
|
||||
zephyr_get(VARIABLE_1 MERGE REVERSE)
|
||||
assert_equal(VARIABLE_1 "local 1;environment 1;cmake cache 1")
|
||||
|
||||
zephyr_get(RESULT MERGE REVERSE VAR VARIABLE_1 VARIABLE_2)
|
||||
assert_equal(RESULT "local 1;local 2;environment 1;environment 2;cmake cache 1;cmake cache 2")
|
||||
|
||||
# Lists are combined and *leftmost* duplicates are removed.
|
||||
set(ENV{VARIABLE_3} "A;B;C;D")
|
||||
set(VARIABLE_3 "F;E;D;C")
|
||||
unset(RESULT)
|
||||
|
||||
zephyr_get(VARIABLE_3 MERGE REVERSE)
|
||||
assert_equal(VARIABLE_3 "F;E;A;B;C;D")
|
||||
|
||||
zephyr_get(RESULT MERGE REVERSE VAR VARIABLE_1 VARIABLE_2 VARIABLE_3)
|
||||
assert_equal(RESULT "local 1;local 2;F;E;environment 1;environment 2;A;B;C;D;cmake cache 1;cmake cache 2")
|
||||
|
||||
# Test with an external variable provided in testcase.yaml
|
||||
unset(ENV{TESTCASE_VARIABLE})
|
||||
unset(TESTCASE_VARIABLE CACHE)
|
||||
|
||||
# In REVERSE, the GLOBAL value goes before the LOCAL.
|
||||
zephyr_get(TESTCASE_VARIABLE MERGE REVERSE SYSBUILD GLOBAL)
|
||||
assert_equal(TESTCASE_VARIABLE
|
||||
IMAGE no_sysbuild ""
|
||||
IMAGE zephyr_get "sysbuild.main"
|
||||
IMAGE zephyr_get_2nd "sysbuild.2nd" # BUG
|
||||
IMAGE zephyr_get_3rd "sysbuild.main"
|
||||
)
|
||||
|
||||
# Add more variable scopes.
|
||||
set(ENV{TESTCASE_VARIABLE} "environment s")
|
||||
set(TESTCASE_VARIABLE "cmake cache s" CACHE INTERNAL "")
|
||||
set(TESTCASE_VARIABLE "local s")
|
||||
|
||||
zephyr_get(TESTCASE_VARIABLE MERGE REVERSE SYSBUILD GLOBAL)
|
||||
assert_equal(TESTCASE_VARIABLE
|
||||
IMAGE no_sysbuild "local s;environment s;cmake cache s"
|
||||
IMAGE zephyr_get "local s;environment s;cmake cache s;sysbuild.main"
|
||||
IMAGE zephyr_get_2nd "local s;environment s;cmake cache s;sysbuild.2nd" # BUG
|
||||
IMAGE zephyr_get_3rd "local s;environment s;cmake cache s;sysbuild.main"
|
||||
)
|
||||
|
||||
unset(TESTCASE_VARIABLE)
|
||||
zephyr_get(TESTCASE_VARIABLE MERGE REVERSE SYSBUILD LOCAL)
|
||||
assert_equal(TESTCASE_VARIABLE
|
||||
IMAGE no_sysbuild "environment s;cmake cache s"
|
||||
IMAGE zephyr_get "environment s;cmake cache s;sysbuild.main"
|
||||
IMAGE zephyr_get_2nd "environment s;cmake cache s;sysbuild.2nd"
|
||||
IMAGE zephyr_get_3rd "environment s;cmake cache s"
|
||||
)
|
||||
|
||||
unset(RESULT)
|
||||
set(TESTCASE_VARIABLE "local s")
|
||||
|
||||
# This should be equivalent to: zephyr_get(... SYSBUILD GLOBAL)
|
||||
zephyr_get(RESULT MERGE REVERSE VAR TESTCASE_VARIABLE VARIABLE_1 VARIABLE_2)
|
||||
assert_equal(RESULT
|
||||
IMAGE no_sysbuild "local s;local 1;local 2;environment s;environment 1;environment 2;cmake cache s;cmake cache 1;cmake cache 2"
|
||||
IMAGE zephyr_get "local s;local 1;local 2;environment s;environment 1;environment 2;cmake cache s;cmake cache 1;cmake cache 2;sysbuild.main"
|
||||
IMAGE zephyr_get_2nd "local s;local 1;local 2;environment s;environment 1;environment 2;cmake cache s;cmake cache 1;cmake cache 2;sysbuild.2nd" # BUG
|
||||
IMAGE zephyr_get_3rd "local s;local 1;local 2;environment s;environment 1;environment 2;cmake cache s;cmake cache 1;cmake cache 2;sysbuild.main"
|
||||
)
|
||||
endfunction()
|
||||
|
||||
|
||||
function(test_snippets_scope)
|
||||
if(NOT TARGET snippets_scope)
|
||||
zephyr_create_scope(snippets)
|
||||
endif()
|
||||
|
||||
zephyr_set(VARIABLE_1 "snippet 1" SCOPE snippets)
|
||||
zephyr_set(VARIABLE_2 "snippet 2" SCOPE snippets)
|
||||
zephyr_set(VARIABLE_3 "snippet 3" SCOPE snippets)
|
||||
zephyr_set(TESTCASE_VARIABLE "snippet s" SCOPE snippets)
|
||||
|
||||
foreach(var VARIABLE_1 VARIABLE_2 VARIABLE_3 TESTCASE_VARIABLE)
|
||||
unset(ENV{${var}})
|
||||
unset(${var} CACHE)
|
||||
unset(${var})
|
||||
endforeach()
|
||||
|
||||
set(ENV{VARIABLE_1} "environment 1")
|
||||
set(ENV{VARIABLE_3} "environment 3")
|
||||
set(VARIABLE_2 "cmake cache 2" CACHE INTERNAL "")
|
||||
set(VARIABLE_3 "cmake cache 3" CACHE INTERNAL "")
|
||||
|
||||
# Snippets have higher precedence than environment, but lower than CMake cache.
|
||||
zephyr_get(VARIABLE_1)
|
||||
assert_equal(VARIABLE_1 "snippet 1")
|
||||
unset(VARIABLE_1)
|
||||
zephyr_get(VARIABLE_1 MERGE)
|
||||
assert_equal(VARIABLE_1 "snippet 1;environment 1")
|
||||
|
||||
zephyr_get(VARIABLE_2)
|
||||
assert_equal(VARIABLE_2 "cmake cache 2")
|
||||
set(VARIABLE_2 "local 2")
|
||||
zephyr_get(VARIABLE_2 MERGE)
|
||||
assert_equal(VARIABLE_2 "cmake cache 2;snippet 2;local 2")
|
||||
|
||||
zephyr_get(VARIABLE_3)
|
||||
assert_equal(VARIABLE_3 "cmake cache 3")
|
||||
set(VARIABLE_3 "local 3")
|
||||
zephyr_get(VARIABLE_3 MERGE)
|
||||
assert_equal(VARIABLE_3 "cmake cache 3;snippet 3;environment 3;local 3")
|
||||
|
||||
unset(VARIABLE_1)
|
||||
set(VARIABLE_2 "local 2")
|
||||
set(VARIABLE_3 "local 3")
|
||||
|
||||
zephyr_get(RESULT MERGE REVERSE VAR VARIABLE_1 VARIABLE_2 VARIABLE_3)
|
||||
assert_equal(RESULT "local 2;local 3;environment 1;environment 3;snippet 1;snippet 2;snippet 3;cmake cache 2;cmake cache 3")
|
||||
|
||||
# Transitively, snippets have lower precedence than sysbuild-defined values.
|
||||
zephyr_get(TESTCASE_VARIABLE)
|
||||
assert_equal(TESTCASE_VARIABLE
|
||||
IMAGE no_sysbuild "snippet s"
|
||||
IMAGE zephyr_get "sysbuild.main"
|
||||
IMAGE zephyr_get_2nd "sysbuild.2nd"
|
||||
IMAGE zephyr_get_3rd "sysbuild.main"
|
||||
)
|
||||
zephyr_get(TESTCASE_VARIABLE SYSBUILD LOCAL)
|
||||
assert_equal(TESTCASE_VARIABLE
|
||||
IMAGE no_sysbuild "snippet s"
|
||||
IMAGE zephyr_get "sysbuild.main"
|
||||
IMAGE zephyr_get_2nd "sysbuild.2nd"
|
||||
IMAGE zephyr_get_3rd "snippet s"
|
||||
)
|
||||
unset(TESTCASE_VARIABLE)
|
||||
zephyr_get(TESTCASE_VARIABLE MERGE SYSBUILD GLOBAL)
|
||||
assert_equal(TESTCASE_VARIABLE
|
||||
IMAGE no_sysbuild "snippet s"
|
||||
IMAGE zephyr_get "sysbuild.main;snippet s"
|
||||
IMAGE zephyr_get_2nd "sysbuild.2nd;snippet s" # BUG
|
||||
IMAGE zephyr_get_3rd "sysbuild.main;snippet s"
|
||||
)
|
||||
|
||||
# If an environment value wins, it gets cached and promoted above snippets.
|
||||
zephyr_set(VARIABLE_1 SCOPE snippets)
|
||||
zephyr_get(VARIABLE_1)
|
||||
assert_equal(VARIABLE_1 "environment 1")
|
||||
assert_equal(CACHE{VARIABLE_1} "environment 1")
|
||||
|
||||
zephyr_set(VARIABLE_1 "snippet 1" SCOPE snippets)
|
||||
zephyr_get(VARIABLE_1)
|
||||
assert_equal(VARIABLE_1 "environment 1")
|
||||
|
||||
unset(VARIABLE_1 CACHE)
|
||||
zephyr_get(VARIABLE_1)
|
||||
assert_equal(VARIABLE_1 "snippet 1")
|
||||
endfunction()
|
||||
|
||||
run_suite(
|
||||
test_precedence
|
||||
test_precedence_with_sysbuild
|
||||
test_merge
|
||||
test_multivar
|
||||
test_merge_reverse
|
||||
test_snippets_scope
|
||||
)
|
3
tests/cmake/zephyr_get/prj.conf
Normal file
3
tests/cmake/zephyr_get/prj.conf
Normal file
|
@ -0,0 +1,3 @@
|
|||
CONFIG_ASSERT=n
|
||||
CONFIG_ASSERT_VERBOSE=n
|
||||
CONFIG_CRC=n
|
35
tests/cmake/zephyr_get/sysbuild.cmake
Normal file
35
tests/cmake/zephyr_get/sysbuild.cmake
Normal file
|
@ -0,0 +1,35 @@
|
|||
# SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
# Add a few copies of the same image, so that we can configure
|
||||
# multiple instances of the same test suite with minor tweaks,
|
||||
# including different arguments given to them via testcase.yaml.
|
||||
foreach(suffix "2nd" "3rd")
|
||||
set(image ${DEFAULT_IMAGE}_${suffix})
|
||||
if(NOT TARGET ${image})
|
||||
ExternalZephyrProject_Add(
|
||||
APPLICATION ${image}
|
||||
SOURCE_DIR ${APP_DIR}
|
||||
)
|
||||
list(APPEND IMAGES ${image})
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
function(test_report)
|
||||
set(failures "")
|
||||
foreach(image ${IMAGES})
|
||||
sysbuild_get(ASSERT_FAIL_COUNT IMAGE ${image} CACHE)
|
||||
if(ASSERT_FAIL_COUNT GREATER 0)
|
||||
set(failures "${failures}\n - ${image}: ${ASSERT_FAIL_COUNT} assertion(s) failed")
|
||||
endif()
|
||||
unset(ASSERT_FAIL_COUNT)
|
||||
endforeach()
|
||||
|
||||
if(failures)
|
||||
message(FATAL_ERROR "Test failures per sysbuild image: ${failures}")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
if(NOT DEFERRED_TEST_REPORT)
|
||||
# Defer until all test suite copies have been executed.
|
||||
cmake_language(DEFER ID_VAR DEFERRED_TEST_REPORT CALL test_report)
|
||||
endif()
|
11
tests/cmake/zephyr_get/testcase.yaml
Normal file
11
tests/cmake/zephyr_get/testcase.yaml
Normal file
|
@ -0,0 +1,11 @@
|
|||
common:
|
||||
tags: cmake
|
||||
build_only: true
|
||||
platform_allow: native_posix
|
||||
tests:
|
||||
zephyr_get.no_sysbuild:
|
||||
sysbuild: false
|
||||
zephyr_get.sysbuild:
|
||||
sysbuild: true
|
||||
extra_args: TESTCASE_VARIABLE="sysbuild.main"
|
||||
zephyr_get_2nd_TESTCASE_VARIABLE="sysbuild.2nd"
|
Loading…
Reference in a new issue