# 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( [ ...]) # # 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( ) # # - assert_equal( # IMAGE # [IMAGE ...] # ) # 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;sysbuild.main" 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 "sysbuild.main;cmake cache;environment;local" IMAGE zephyr_get_2nd "sysbuild.2nd;sysbuild.main;cmake cache;environment;local" IMAGE zephyr_get_3rd "sysbuild.main;cmake cache;environment;local" ) unset(TESTCASE_VARIABLE) zephyr_get(TESTCASE_VARIABLE MERGE SYSBUILD LOCAL) assert_equal(TESTCASE_VARIABLE IMAGE no_sysbuild "cmake cache;environment" IMAGE zephyr_get "sysbuild.main;cmake cache;environment" IMAGE zephyr_get_2nd "sysbuild.2nd;cmake cache;environment" 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;sysbuild.main;environment" 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 "cmake cache 2;cmake cache 1;environment 3;environment 1;local 3;local 2") 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 2;cmake cache 1;cmake cache r;environment 3;environment 1;environment r;local 2;local 3;local r") 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;sysbuild.main;cmake cache s;cmake cache 2;environment s;environment 1;environment 3;local s;local 2;local 3" 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;sysbuild.main;cmake cache 2;cmake cache s;environment 3;environment 1;environment s;local 3;local 2;local s" 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.main;sysbuild.2nd" 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.main;sysbuild.2nd" 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.main;sysbuild.2nd" 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;sysbuild.main;snippet s" 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 )