diff --git a/tests/cmake/yaml/CMakeLists.txt b/tests/cmake/yaml/CMakeLists.txt new file mode 100644 index 00000000000..ee3c6a82861 --- /dev/null +++ b/tests/cmake/yaml/CMakeLists.txt @@ -0,0 +1,405 @@ +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) + +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(zephyr_yaml_test) +target_sources(app PRIVATE ${ZEPHYR_BASE}/misc/empty_file.c) + +set_property(GLOBAL PROPERTY EXPECTED_ERROR 0) + +function(message) + if(DEFINED expect_failure) + if(${ARGV0} STREQUAL FATAL_ERROR) + if("${ARGV1}" STREQUAL "${expect_failure}") + # This is an expected error. + get_property(error_count GLOBAL PROPERTY EXPECTED_ERROR) + math(EXPR error_count "${error_count} + 1") + set_property(GLOBAL PROPERTY EXPECTED_ERROR ${error_count}) + return() + else() + _message("Unexpected error occurred") + endif() + endif() + endif() + _message(${ARGN}) +endfunction() + +macro(test_assert) + cmake_parse_arguments(TA_ARG "" "COMMENT" "TEST" ${ARGN}) + if(${TA_ARG_TEST}) + message("${CMAKE_CURRENT_FUNCTION}(): Passed") + else() + message(FATAL_ERROR + "${CMAKE_CURRENT_FUNCTION}(): Failed\n" + "Test: ${TA_ARG_TEST}\n" + "${TA_ARG_COMMENT}" + ) + endif() +endmacro() + +function(test_reading_string) + set(expected "Simple string") + yaml_get(actual NAME yaml-test KEY cmake test key-string) + + test_assert(TEST ${expected} STREQUAL ${actual} + COMMENT "yaml key value does not match expectation." + ) +endfunction() + +function(test_reading_list_strings) + set(expected 4) + yaml_length(actual NAME yaml-test KEY cmake test key-list-string) + test_assert(TEST ${expected} EQUAL ${actual} + COMMENT "yaml list length does not match expectation." + ) + + set(expected "a" "list" "of" "strings") + yaml_get(actual NAME yaml-test KEY cmake test key-list-string) + + foreach(a e IN ZIP_LISTS actual expected) + test_assert(TEST "${e}" STREQUAL "${a}" + COMMENT "list values mismatch." + ) + endforeach() +endfunction() + +function(test_reading_int) + set(expected 42) + yaml_get(actual NAME yaml-test KEY cmake test key-int) + + test_assert(TEST ${expected} EQUAL ${actual} + COMMENT "yaml key value does not match expectation." + ) +endfunction() + +function(test_reading_list_int) + set(expected 3) + yaml_length(actual NAME yaml-test KEY cmake test key-list-int) + test_assert(TEST ${expected} EQUAL ${actual} + COMMENT "yaml list length does not match expectation." + ) + + set(expected 4 10 2) + yaml_get(actual NAME yaml-test KEY cmake test key-list-int) + + foreach(a e IN ZIP_LISTS actual expected) + test_assert(TEST "${e}" STREQUAL "${a}" + COMMENT "list values mismatch." + ) + endforeach() +endfunction() + +function(test_reading_int) + set(expected 42) + yaml_get(actual NAME yaml-test KEY cmake test key-int) + + test_assert(TEST ${expected} EQUAL ${actual} + COMMENT "yaml key value does not match expectation." + ) +endfunction() + +function(test_reading_not_found) + set(expected cmake-missing-NOTFOUND) + yaml_get(actual NAME yaml-test KEY cmake missing test key) + + test_assert(TEST ${expected} STREQUAL ${actual} + COMMENT "Expected -NOTFOUND, but something was found." + ) +endfunction() + +function(test_reading_not_found_array) + set(expected cmake-missing-NOTFOUND) + yaml_length(actual NAME yaml-test KEY cmake missing test array list) + + test_assert(TEST ${expected} STREQUAL ${actual} + COMMENT "Expected -NOTFOUND, but something was found." + ) +endfunction() + +function(test_reading_not_array) + set(expected -1) + yaml_length(actual NAME yaml-test KEY cmake test key-int) + + test_assert(TEST ${expected} STREQUAL ${actual} + COMMENT "Not array expected, so length should be -1." + ) +endfunction() + +function(test_save_new_file) + yaml_save(NAME yaml-test FILE ${CMAKE_BINARY_DIR}/${CMAKE_CURRENT_FUNCTION}_test_save.yaml) + + # Read-back the yaml and verify the value. + yaml_load(FILE ${CMAKE_BINARY_DIR}/${CMAKE_CURRENT_FUNCTION}_test_save.yaml + NAME ${CMAKE_CURRENT_FUNCTION}_readback + ) + set(expected "Simple string") + yaml_get(actual NAME ${CMAKE_CURRENT_FUNCTION}_readback KEY cmake test key-string) + + test_assert(TEST ${expected} STREQUAL ${actual} + COMMENT "yaml key value does not match expectation." + ) + + set(expected 42) + yaml_get(actual NAME ${CMAKE_CURRENT_FUNCTION}_readback KEY cmake test key-int) + + test_assert(TEST ${expected} EQUAL ${actual} + COMMENT "yaml key value does not match expectation." + ) +endfunction() + +function(test_setting_string) + yaml_create(FILE ${CMAKE_BINARY_DIR}/${CMAKE_CURRENT_FUNCTION}_test_create.yaml + NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create + ) + + set(new_value "A new string") + yaml_set(actual NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create + KEY cmake test set key-string VALUE ${new_value} + ) + + yaml_save(NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create) + + # Read-back the yaml and verify the value. + yaml_load(FILE ${CMAKE_BINARY_DIR}/${CMAKE_CURRENT_FUNCTION}_test_create.yaml + NAME ${CMAKE_CURRENT_FUNCTION}_readback + ) + + yaml_get(readback NAME ${CMAKE_CURRENT_FUNCTION}_readback KEY cmake test set key-string) + + test_assert(TEST ${new_value} STREQUAL ${readback} + COMMENT "new yaml value does not match readback value." + ) +endfunction() + +function(test_setting_list_strings) + yaml_create(FILE ${CMAKE_BINARY_DIR}/${CMAKE_CURRENT_FUNCTION}_test_create.yaml + NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create + ) + + set(new_value "A" "new" "list" "of" "strings") + yaml_set(actual NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create + KEY cmake test set key-list-string LIST ${new_value} + ) + + yaml_save(NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create) + + # Read-back the yaml and verify the value. + yaml_load(FILE ${CMAKE_BINARY_DIR}/${CMAKE_CURRENT_FUNCTION}_test_create.yaml + NAME ${CMAKE_CURRENT_FUNCTION}_readback + ) + + yaml_length(readback NAME ${CMAKE_CURRENT_FUNCTION}_readback KEY cmake test set key-list-string) + + test_assert(TEST 5 EQUAL ${readback} + COMMENT "readback yaml list length does not match original." + ) + + yaml_get(readback NAME ${CMAKE_CURRENT_FUNCTION}_readback KEY cmake test set key-list-string) + + foreach(a e IN ZIP_LISTS readback new_value) + test_assert(TEST "${e}" STREQUAL "${a}" + COMMENT "list values mismatch." + ) + endforeach() +endfunction() + +function(test_setting_int) + yaml_create(FILE ${CMAKE_BINARY_DIR}/${CMAKE_CURRENT_FUNCTION}_test_create.yaml + NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create + ) + + set(new_value 42) + yaml_set(actual NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create + KEY cmake test set key-int VALUE ${new_value} + ) + + yaml_save(NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create) + + # Read-back the yaml and verify the value. + yaml_load(FILE ${CMAKE_BINARY_DIR}/${CMAKE_CURRENT_FUNCTION}_test_create.yaml + NAME ${CMAKE_CURRENT_FUNCTION}_readback + ) + + yaml_get(readback NAME ${CMAKE_CURRENT_FUNCTION}_readback KEY cmake test set key-int) + + test_assert(TEST ${new_value} STREQUAL ${readback} + COMMENT "new yaml value does not match readback value." + ) +endfunction() + +function(test_setting_list_int) + yaml_create(FILE ${CMAKE_BINARY_DIR}/${CMAKE_CURRENT_FUNCTION}_test_create.yaml + NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create + ) + + set(new_value 42 41 40 2 10) + yaml_set(actual NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create + KEY cmake test set key-list-int LIST ${new_value} + ) + + yaml_save(NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create) + + # Read-back the yaml and verify the value. + yaml_load(FILE ${CMAKE_BINARY_DIR}/${CMAKE_CURRENT_FUNCTION}_test_create.yaml + NAME ${CMAKE_CURRENT_FUNCTION}_readback + ) + + yaml_length(readback NAME ${CMAKE_CURRENT_FUNCTION}_readback KEY cmake test set key-list-int) + + test_assert(TEST 5 EQUAL ${readback} + COMMENT "readback yaml list length does not match original." + ) + + yaml_get(readback NAME ${CMAKE_CURRENT_FUNCTION}_readback KEY cmake test set key-list-int) + + foreach(a e IN ZIP_LISTS readback new_value) + test_assert(TEST "${e}" STREQUAL "${a}" + COMMENT "list values mismatch." + ) + endforeach() +endfunction() + +function(test_setting_empty_value) + yaml_create(FILE ${CMAKE_BINARY_DIR}/${CMAKE_CURRENT_FUNCTION}_test_create.yaml + NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create + ) + + set(new_value) + yaml_set(actual NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create + KEY cmake test set key-int VALUE ${new_value} + ) + + yaml_save(NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create) + + # Read-back the yaml and verify the value. + yaml_load(FILE ${CMAKE_BINARY_DIR}/${CMAKE_CURRENT_FUNCTION}_test_create.yaml + NAME ${CMAKE_CURRENT_FUNCTION}_readback + ) + + yaml_get(readback NAME ${CMAKE_CURRENT_FUNCTION}_readback KEY cmake test set key-int) + + if(DEFINED readback) + message(FATAL_ERROR "${CMAKE_CURRENT_FUNCTION}(): Failed\n" + "Empty value expected, but got: ${readback}" + ) + else() + message("${CMAKE_CURRENT_FUNCTION}(): Passed") + endif() +endfunction() + +function(test_setting_empty_list) + yaml_create(FILE ${CMAKE_BINARY_DIR}/${CMAKE_CURRENT_FUNCTION}_test_create.yaml + NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create + ) + + set(new_value) + yaml_set(NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create + KEY cmake test set key-list-int LIST ${new_value} + ) + + yaml_save(NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create) + + # Read-back the yaml and verify the value. + yaml_load(FILE ${CMAKE_BINARY_DIR}/${CMAKE_CURRENT_FUNCTION}_test_create.yaml + NAME ${CMAKE_CURRENT_FUNCTION}_readback + ) + + yaml_length(readback NAME ${CMAKE_CURRENT_FUNCTION}_readback KEY cmake test set key-list-int) + + test_assert(TEST 0 EQUAL ${readback} + COMMENT "readback yaml list length does not match original." + ) + + yaml_get(readback NAME ${CMAKE_CURRENT_FUNCTION}_readback KEY cmake test set key-list-int) + + foreach(a e IN ZIP_LISTS readback new_value) + test_assert(TEST "${e}" STREQUAL "${a}" + COMMENT "list values mismatch." + ) + endforeach() +endfunction() + +function(test_set_remove_int) + yaml_create(FILE ${CMAKE_BINARY_DIR}/${CMAKE_CURRENT_FUNCTION}_test_create.yaml + NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create + ) + + set(new_value 42) + yaml_set(NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create + KEY cmake test set key-int VALUE ${new_value} + ) + + yaml_save(NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create) + + # Read-back the yaml and verify the value. + yaml_load(FILE ${CMAKE_BINARY_DIR}/${CMAKE_CURRENT_FUNCTION}_test_create.yaml + NAME ${CMAKE_CURRENT_FUNCTION}_readback + ) + + yaml_get(readback NAME ${CMAKE_CURRENT_FUNCTION}_readback KEY cmake test set key-int) + + test_assert(TEST ${new_value} STREQUAL ${readback} + COMMENT "new yaml value does not match readback value." + ) + + # Remove the setting and write the file again. + yaml_remove(NAME ${CMAKE_CURRENT_FUNCTION}_readback KEY cmake test set key-int) + yaml_save(NAME ${CMAKE_CURRENT_FUNCTION}_readback) + + # Read-back again and verify the value has been removed. + yaml_load(FILE ${CMAKE_BINARY_DIR}/${CMAKE_CURRENT_FUNCTION}_test_create.yaml + NAME ${CMAKE_CURRENT_FUNCTION}_readback_removed + ) + + yaml_get(readback NAME ${CMAKE_CURRENT_FUNCTION}_readback_removed KEY cmake test set key-int) + + set(expected cmake-test-set-key-int-NOTFOUND) + + test_assert(TEST ${expected} STREQUAL ${readback} + COMMENT "Expected -NOTFOUND, but something was found." + ) +endfunction() + +function(test_fail_missing_filename) + yaml_create(NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create) + + set(new_value 42) + yaml_set(actual NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create + KEY cmake test set key-int VALUE ${new_value} + ) + + set(expect_failure "yaml_save(...) missing a required argument: FILE") + yaml_save(NAME ${CMAKE_CURRENT_FUNCTION}_yaml-create) + + get_property(errors GLOBAL PROPERTY EXPECTED_ERROR) + test_assert(TEST 1 EQUAL ${errors} + COMMENT "No error occurred when error was expected.\nExpected error: ${expect_failure}" + ) + set_property(GLOBAL PROPERTY EXPECTED_ERROR 0) +endfunction() + +yaml_load(FILE ${CMAKE_CURRENT_LIST_DIR}/test.yaml NAME yaml-test) +test_reading_string() +test_reading_int() +test_reading_list_strings() +test_reading_list_int() +test_reading_not_found() +test_reading_not_found_array() +test_reading_not_array() + +test_save_new_file() + +test_setting_int() +test_setting_string() +test_setting_list_strings() +test_setting_list_int() + +test_setting_empty_value() +test_setting_empty_list() + +test_set_remove_int() + +test_fail_missing_filename() + +target_sources(app PRIVATE src/main.c) diff --git a/tests/cmake/yaml/prj.conf b/tests/cmake/yaml/prj.conf new file mode 100644 index 00000000000..ac841e11e6e --- /dev/null +++ b/tests/cmake/yaml/prj.conf @@ -0,0 +1 @@ +# Intentionally left empty, we're testing CMake diff --git a/tests/cmake/yaml/src/main.c b/tests/cmake/yaml/src/main.c new file mode 100644 index 00000000000..0bed5a30798 --- /dev/null +++ b/tests/cmake/yaml/src/main.c @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2024 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: Apache-2.0 + */ + +void test_main(void) +{ + /* Intentionally left empty, we are testing CMake. */ +} diff --git a/tests/cmake/yaml/test.yaml b/tests/cmake/yaml/test.yaml new file mode 100644 index 00000000000..4f21cff2c2a --- /dev/null +++ b/tests/cmake/yaml/test.yaml @@ -0,0 +1,13 @@ +cmake: + test: + key-string: "Simple string" + key-int: 42 + key-list-int: + - 4 + - 10 + - 2 + key-list-string: + - "a" + - "list" + - "of" + - "strings" diff --git a/tests/cmake/yaml/testcase.yaml b/tests/cmake/yaml/testcase.yaml new file mode 100644 index 00000000000..430e5424af6 --- /dev/null +++ b/tests/cmake/yaml/testcase.yaml @@ -0,0 +1,7 @@ +common: + tags: cmake + build_only: true + platform_allow: native_sim +tests: + buildsystem.module.yaml: + sysbuild: false