| /* Copyright 2021 The ChromiumOS Authors |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| * |
| * Test ec version |
| */ |
| |
| #include "common.h" |
| #include "ec_commands.h" |
| #include "stddef.h" |
| #include "system.h" |
| #include "test_util.h" |
| #include "util.h" |
| |
| /* |
| * Tests that fw version adheres to the expected format. |
| * Example fw version: host_v2.0.10135+b3e38e380c |
| */ |
| static int test_version(void) |
| { |
| const char *fw_version; |
| size_t board_name_length, major_version_length, minor_version_length, |
| sub_minor_version_length, hash_length; |
| const char *major_version_ptr, *minor_version_ptr, |
| *sub_minor_version_ptr, *hash_ptr; |
| |
| fw_version = system_get_version(EC_IMAGE_RO); |
| |
| TEST_ASSERT(fw_version != NULL); |
| |
| ccprintf("fw_version: %s\n", fw_version); |
| |
| TEST_LE(strlen(fw_version), (size_t)32, "%zu"); |
| |
| board_name_length = strcspn(fw_version, "_"); |
| |
| TEST_GE(board_name_length, (size_t)3, "%zu"); |
| |
| major_version_ptr = fw_version + board_name_length + 1; |
| major_version_length = strcspn(major_version_ptr, "."); |
| |
| TEST_GE(major_version_length, (size_t)2, "%zu"); |
| TEST_EQ(major_version_ptr[0], 'v', "%c"); |
| for (int i = 1; i < major_version_length; i++) |
| TEST_ASSERT(isdigit(major_version_ptr[i])); |
| |
| minor_version_ptr = major_version_ptr + major_version_length + 1; |
| minor_version_length = strcspn(minor_version_ptr, "."); |
| |
| TEST_GE(minor_version_length, (size_t)1, "%zu"); |
| for (int i = 0; i < minor_version_length; i++) |
| TEST_ASSERT(isdigit(minor_version_ptr[i])); |
| |
| sub_minor_version_ptr = minor_version_ptr + minor_version_length + 1; |
| sub_minor_version_length = strcspn(sub_minor_version_ptr, "-+"); |
| |
| TEST_GE(sub_minor_version_length, (size_t)1, "%zu"); |
| for (int i = 0; i < sub_minor_version_length; i++) |
| TEST_ASSERT(isdigit(sub_minor_version_ptr[i])); |
| |
| hash_ptr = sub_minor_version_ptr + sub_minor_version_length + 1; |
| hash_length = strlen(hash_ptr); |
| |
| TEST_GE(hash_length, (size_t)8, "%zu"); |
| for (int i = 0; i < hash_length; i++) |
| TEST_ASSERT(isdigit(hash_ptr[i]) || |
| (hash_ptr[i] >= 'a' && hash_ptr[i] <= 'f')); |
| |
| return EC_SUCCESS; |
| } |
| |
| /* |
| * Tests that cros fwid adheres to the expected format. |
| * Example cros fwid: host_14175.0.21_08_24 |
| */ |
| static int test_fwid(void) |
| { |
| const char *cros_fwid; |
| size_t board_name_length, major_version_length, minor_version_length, |
| sub_minor_version_length; |
| const char *major_version_ptr, *minor_version_ptr, |
| *sub_minor_version_ptr; |
| |
| cros_fwid = system_get_cros_fwid(EC_IMAGE_RO); |
| |
| TEST_ASSERT(cros_fwid != NULL); |
| |
| ccprintf("cros_fwid: %s\n", cros_fwid); |
| |
| TEST_LE(strlen(cros_fwid), (size_t)32, "%zu"); |
| |
| board_name_length = strcspn(cros_fwid, "_"); |
| TEST_GE(board_name_length, (size_t)3, "%zu"); |
| |
| major_version_ptr = cros_fwid + board_name_length + 1; |
| major_version_length = strcspn(major_version_ptr, "."); |
| TEST_GE(major_version_length, (size_t)5, "%zu"); |
| |
| for (int i = 0; i < major_version_length; i++) |
| TEST_ASSERT(isdigit(major_version_ptr[i])); |
| |
| minor_version_ptr = major_version_ptr + major_version_length + 1; |
| minor_version_length = strcspn(minor_version_ptr, "."); |
| TEST_GE(minor_version_length, (size_t)1, "%zu"); |
| |
| for (int i = 0; i < minor_version_length; i++) |
| TEST_ASSERT(isdigit(minor_version_ptr[i])); |
| |
| sub_minor_version_ptr = minor_version_ptr + minor_version_length + 1; |
| sub_minor_version_length = strlen(sub_minor_version_ptr); |
| TEST_GE(sub_minor_version_length, (size_t)1, "%zu"); |
| |
| for (int i = 0; i < sub_minor_version_length; i++) |
| TEST_ASSERT(isdigit(sub_minor_version_ptr[i]) || |
| sub_minor_version_ptr[i] == '_'); |
| |
| return EC_SUCCESS; |
| } |
| |
| /* |
| * Tests requesting TEST. |
| * Example fw version: host_v2.0.10135+b3e38e380c |
| */ |
| static int test_image_unknown(void) |
| { |
| const char *fw_version; |
| const char *cros_fwid; |
| |
| fw_version = system_get_version(EC_IMAGE_UNKNOWN); |
| |
| TEST_ASSERT(fw_version != NULL); |
| TEST_LE(strlen(fw_version), (size_t)32, "%zu"); |
| |
| cros_fwid = system_get_cros_fwid(EC_IMAGE_UNKNOWN); |
| |
| TEST_ASSERT(cros_fwid != NULL); |
| TEST_LE(strlen(cros_fwid), (size_t)32, "%zu"); |
| |
| return EC_SUCCESS; |
| } |
| |
| void run_test(int argc, const char **argv) |
| { |
| RUN_TEST(test_version); |
| RUN_TEST(test_fwid); |
| RUN_TEST(test_image_unknown); |
| |
| test_print_result(); |
| } |