| /* Copyright 2024 The ChromiumOS Authors | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #include <sys/stat.h> | |
| #include <sys/types.h> | |
| #include <unistd.h> | |
| #include "2return_codes.h" | |
| #include "cbfstool.h" | |
| #include "common/tests.h" | |
| #define ME "cbfstool_tests" | |
| /* Utility functions. */ | |
| static bool is_file(const char *path) | |
| { | |
| struct stat st = {0}; | |
| return stat(path, &st) == 0 && S_ISREG(st.st_mode); | |
| } | |
| /* Setup and teardown functions. */ | |
| const char *tmp_dir; | |
| static void setup(void) | |
| { | |
| tmp_dir = create_test_tmp_dir(ME); | |
| } | |
| static void teardown(void) | |
| { | |
| free((char *)tmp_dir); | |
| } | |
| /* Test functions. */ | |
| #define IMAGE "tests/futility/data/bios_coachz_cbfs.bin" | |
| static void cbfstool_file_exists_tests(void) | |
| { | |
| /* Region not exists. */ | |
| TEST_FALSE(cbfstool_file_exists(IMAGE, "NO_SUCH_REGION", "config"), | |
| "region NO_SUCH_REGION not exists"); | |
| /* Default FMAP region. */ | |
| TEST_TRUE(cbfstool_file_exists(IMAGE, NULL, "font.bin"), | |
| "font.bin found in COREBOOT"); | |
| /* File not found. */ | |
| TEST_FALSE(cbfstool_file_exists(IMAGE, "FW_MAIN_A", "font.bin"), | |
| "font.bin not found in FW_MAIN_A"); | |
| /* File found in specified region. */ | |
| TEST_TRUE(cbfstool_file_exists(IMAGE, "FW_MAIN_A", "ecrw"), | |
| "ecrw found in FW_MAIN_A"); | |
| } | |
| static void cbfstool_extract_tests(void) | |
| { | |
| char *tmp_file = NULL; | |
| xasprintf(&tmp_file, "%s/tmp_file", tmp_dir); | |
| /* Default FMAP region. */ | |
| unlink(tmp_file); | |
| TEST_EQ(cbfstool_extract(IMAGE, NULL, "font.bin", tmp_file), 0, | |
| "extract font.bin from COREBOOT"); | |
| TEST_TRUE(is_file(tmp_file), " extracted"); | |
| /* File not found. */ | |
| unlink(tmp_file); | |
| TEST_NEQ(cbfstool_extract(IMAGE, "FW_MAIN_A", "font.bin", tmp_file), 0, | |
| "extract font.bin from FW_MAIN_A"); | |
| /* File from specified region. */ | |
| unlink(tmp_file); | |
| TEST_EQ(cbfstool_extract(IMAGE, "FW_MAIN_A", "ecrw", tmp_file), 0, | |
| "extract ecrw from FW_MAIN_A"); | |
| TEST_TRUE(is_file(tmp_file), " extracted"); | |
| free(tmp_file); | |
| } | |
| static void cbfstool_get_config_bool_tests(void) | |
| { | |
| bool value; | |
| vb2_error_t rv; | |
| /* File not found */ | |
| value = true; | |
| rv = cbfstool_get_config_bool("no_such_file", NULL, | |
| "CONFIG_CHROMEOS", &value); | |
| TEST_FAIL(rv, "file not found"); | |
| TEST_FALSE(value, " value is false"); | |
| /* Config not found */ | |
| value = true; | |
| rv = cbfstool_get_config_bool(IMAGE, NULL, | |
| "CONFIG_NOT_FOUND", &value); | |
| TEST_SUCC(rv, "config not found"); | |
| TEST_FALSE(value, " value is false"); | |
| /* Config CHROMEOS */ | |
| value = false; | |
| rv = cbfstool_get_config_bool(IMAGE, NULL, | |
| "CONFIG_CHROMEOS", &value); | |
| TEST_SUCC(rv, "get CHROMEOS value"); | |
| TEST_TRUE(value, " value is true"); | |
| /* Config CHROMEOS from FW_MAIN_A */ | |
| value = false; | |
| rv = cbfstool_get_config_bool(IMAGE, "FW_MAIN_A", | |
| "CONFIG_CHROMEOS", &value); | |
| TEST_SUCC(rv, "get CHROMEOS value from FW_MAIN_A"); | |
| TEST_TRUE(value, " value is true"); | |
| } | |
| static void cbfstool_get_config_string_tests(void) | |
| { | |
| char *value; | |
| char init_value[] = "INIT_VALUE"; | |
| vb2_error_t rv; | |
| /* Config not found */ | |
| value = init_value; | |
| rv = cbfstool_get_config_string(IMAGE, NULL, | |
| "CONFIG_NOT_FOUND", &value); | |
| TEST_FAIL(rv, "config not found"); | |
| TEST_PTR_EQ(value, NULL, " value is null"); | |
| /* Config MAINBOARD_PART_NUMBER */ | |
| value = NULL; | |
| rv = cbfstool_get_config_string(IMAGE, NULL, | |
| "CONFIG_MAINBOARD_PART_NUMBER", &value); | |
| TEST_SUCC(rv, "get MAINBOARD_PART_NUMBER value"); | |
| TEST_PTR_NEQ(value, NULL, " value not null"); | |
| TEST_EQ(strcmp(value, "Coachz"), 0, " value is Coachz"); | |
| } | |
| static void cbfstool_get_compression_tests(void) | |
| { | |
| char comp[32]; | |
| /* LZMA compressed entry */ | |
| cbfstool_get_compression(IMAGE, "FW_MAIN_A", "ecrw", "none", | |
| comp, sizeof(comp)); | |
| TEST_EQ(strcasecmp(comp, "lzma"), 0, "ecrw compression is lzma"); | |
| /* LZ4 compressed entry */ | |
| cbfstool_get_compression(IMAGE, "FW_MAIN_A", "fallback/romstage", | |
| "none", comp, sizeof(comp)); | |
| TEST_EQ(strcasecmp(comp, "lz4"), 0, | |
| "fallback/romstage compression is lz4"); | |
| /* Uncompressed entry */ | |
| cbfstool_get_compression(IMAGE, "FW_MAIN_A", "ecrw.hash", "lzma", | |
| comp, sizeof(comp)); | |
| TEST_EQ(strcmp(comp, "none"), 0, "ecrw.hash compression is none"); | |
| /* Non-existent entry falls back to default */ | |
| cbfstool_get_compression(IMAGE, "FW_MAIN_A", "no_such_entry", "lzma", | |
| comp, sizeof(comp)); | |
| TEST_EQ(strcmp(comp, "lzma"), 0, | |
| "missing entry falls back to default"); | |
| } | |
| int main(int argc, char *argv[]) | |
| { | |
| setup(); | |
| cbfstool_file_exists_tests(); | |
| cbfstool_extract_tests(); | |
| cbfstool_get_config_bool_tests(); | |
| cbfstool_get_config_string_tests(); | |
| cbfstool_get_compression_tests(); | |
| teardown(); | |
| return gTestSuccess ? 0 : 255; | |
| } |