// SPDX-License-Identifier: GPL-2.0+ /* * Copyright (c) 2012, The Chromium Authors */ #include #include #include #include #include #include #include #include #include #define FAKE_BUILD_TAG "jenkins-u-boot-denx_uboot_dm-master-build-aarch64" \ "and a lot more text to come" /* Declare a new print test */ #define PRINT_TEST(_name, _flags) UNIT_TEST(_name, _flags, print_test) #if CONFIG_IS_ENABLED(LIB_UUID) /* Test printing GUIDs */ static int print_guid(struct unit_test_state *uts) { unsigned char guid[16] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; char str[40]; sprintf(str, "%pUb", guid); ut_assertok(strcmp("01020304-0506-0708-090a-0b0c0d0e0f10", str)); sprintf(str, "%pUB", guid); ut_assertok(strcmp("01020304-0506-0708-090A-0B0C0D0E0F10", str)); sprintf(str, "%pUl", guid); ut_assertok(strcmp("04030201-0605-0807-090a-0b0c0d0e0f10", str)); sprintf(str, "%pUL", guid); ut_assertok(strcmp("04030201-0605-0807-090A-0B0C0D0E0F10", str)); return 0; } PRINT_TEST(print_guid, 0); #endif #if CONFIG_IS_ENABLED(EFI_LOADER) && !defined(API_BUILD) /* Test efi_loader specific printing */ static int print_efi_ut(struct unit_test_state *uts) { char str[10]; u8 buf[sizeof(struct efi_device_path_sd_mmc_path) + sizeof(struct efi_device_path)]; u8 *pos = buf; struct efi_device_path *dp_end; struct efi_device_path_sd_mmc_path *dp_sd = (struct efi_device_path_sd_mmc_path *)pos; /* Create a device path for an SD card */ dp_sd->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE; dp_sd->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_SD; dp_sd->dp.length = sizeof(struct efi_device_path_sd_mmc_path); dp_sd->slot_number = 3; pos += sizeof(struct efi_device_path_sd_mmc_path); /* Append end node */ dp_end = (struct efi_device_path *)pos; dp_end->type = DEVICE_PATH_TYPE_END; dp_end->sub_type = DEVICE_PATH_SUB_TYPE_END; dp_end->length = sizeof(struct efi_device_path); snprintf(str, sizeof(str), "_%pD_", buf); ut_assertok(strcmp("_/SD(3)_", str)); /* NULL device path */ snprintf(str, sizeof(str), "_%pD_", NULL); ut_assertok(strcmp("__", str)); return 0; } PRINT_TEST(print_efi_ut, 0); #endif static int print_printf(struct unit_test_state *uts) { char big_str[400]; int big_str_len; char str[10], *s; int len; snprintf(str, sizeof(str), "testing"); ut_assertok(strcmp("testing", str)); snprintf(str, sizeof(str), "testing but too long"); ut_assertok(strcmp("testing b", str)); snprintf(str, 1, "testing none"); ut_assertok(strcmp("", str)); *str = 'x'; snprintf(str, 0, "testing none"); ut_asserteq('x', *str); sprintf(big_str, "_%ls_", L"foo"); ut_assertok(strcmp("_foo_", big_str)); /* Test the banner function */ s = display_options_get_banner(true, str, sizeof(str)); ut_asserteq_ptr(str, s); ut_assertok(strcmp("\n\nU-Boo\n\n", s)); /* Assert that we do not overwrite memory before the buffer */ str[0] = '`'; s = display_options_get_banner(true, str + 1, 1); ut_asserteq_ptr(str + 1, s); ut_assertok(strcmp("`", str)); str[0] = '~'; s = display_options_get_banner(true, str + 1, 2); ut_asserteq_ptr(str + 1, s); ut_assertok(strcmp("~\n", str)); /* The last two characters are set to \n\n for all buffer sizes > 2 */ s = display_options_get_banner(false, str, sizeof(str)); ut_asserteq_ptr(str, s); ut_assertok(strcmp("U-Boot \n\n", s)); /* Give it enough space for some of the version */ big_str_len = strlen(version_string) - 5; s = display_options_get_banner_priv(false, FAKE_BUILD_TAG, big_str, big_str_len); ut_asserteq_ptr(big_str, s); ut_assertok(strncmp(version_string, s, big_str_len - 3)); ut_assertok(strcmp("\n\n", s + big_str_len - 3)); /* Give it enough space for the version and some of the build tag */ big_str_len = strlen(version_string) + 9 + 20; s = display_options_get_banner_priv(false, FAKE_BUILD_TAG, big_str, big_str_len); ut_asserteq_ptr(big_str, s); len = strlen(version_string); ut_assertok(strncmp(version_string, s, len)); ut_assertok(strncmp(", Build: ", s + len, 9)); ut_assertok(strncmp(FAKE_BUILD_TAG, s + 9 + len, 12)); ut_assertok(strcmp("\n\n", s + big_str_len - 3)); return 0; } PRINT_TEST(print_printf, 0); int do_ut_print(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) { struct unit_test *tests = UNIT_TEST_SUITE_START(print_test); const int n_ents = UNIT_TEST_SUITE_COUNT(print_test); return cmd_ut_category("print", "print_", tests, n_ents, argc, argv); }