183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2e5a9d27fSSimon Glass /*
3e5a9d27fSSimon Glass * Copyright (c) 2012, The Chromium Authors
4e5a9d27fSSimon Glass */
5e5a9d27fSSimon Glass
6e5a9d27fSSimon Glass #define DEBUG
7e5a9d27fSSimon Glass
8e5a9d27fSSimon Glass #include <common.h>
97a9e6ee6SHeinrich Schuchardt #if CONFIG_IS_ENABLED(EFI_LOADER) && !defined(API_BUILD)
10256060e4SHeinrich Schuchardt #include <efi_api.h>
11256060e4SHeinrich Schuchardt #endif
12e5a9d27fSSimon Glass #include <display_options.h>
13*f486b9d0SPali Rohár #include <version_string.h>
14e5a9d27fSSimon Glass
15e5a9d27fSSimon Glass #define FAKE_BUILD_TAG "jenkins-u-boot-denx_uboot_dm-master-build-aarch64" \
16e5a9d27fSSimon Glass "and a lot more text to come"
17e5a9d27fSSimon Glass
18256060e4SHeinrich Schuchardt /* Test efi_loader specific printing */
efi_ut_print(void)19256060e4SHeinrich Schuchardt static void efi_ut_print(void)
20256060e4SHeinrich Schuchardt {
217a9e6ee6SHeinrich Schuchardt #if CONFIG_IS_ENABLED(EFI_LOADER) && !defined(API_BUILD)
22256060e4SHeinrich Schuchardt char str[10];
23256060e4SHeinrich Schuchardt u8 buf[sizeof(struct efi_device_path_sd_mmc_path) +
24256060e4SHeinrich Schuchardt sizeof(struct efi_device_path)];
25256060e4SHeinrich Schuchardt u8 *pos = buf;
26256060e4SHeinrich Schuchardt struct efi_device_path *dp_end;
27256060e4SHeinrich Schuchardt struct efi_device_path_sd_mmc_path *dp_sd =
28256060e4SHeinrich Schuchardt (struct efi_device_path_sd_mmc_path *)pos;
29256060e4SHeinrich Schuchardt
30256060e4SHeinrich Schuchardt /* Create a device path for an SD card */
31256060e4SHeinrich Schuchardt dp_sd->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
32256060e4SHeinrich Schuchardt dp_sd->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_SD;
33256060e4SHeinrich Schuchardt dp_sd->dp.length = sizeof(struct efi_device_path_sd_mmc_path);
34256060e4SHeinrich Schuchardt dp_sd->slot_number = 3;
35256060e4SHeinrich Schuchardt pos += sizeof(struct efi_device_path_sd_mmc_path);
36256060e4SHeinrich Schuchardt /* Append end node */
37256060e4SHeinrich Schuchardt dp_end = (struct efi_device_path *)pos;
38256060e4SHeinrich Schuchardt dp_end->type = DEVICE_PATH_TYPE_END;
39256060e4SHeinrich Schuchardt dp_end->sub_type = DEVICE_PATH_SUB_TYPE_END;
40256060e4SHeinrich Schuchardt dp_end->length = sizeof(struct efi_device_path);
41256060e4SHeinrich Schuchardt
42256060e4SHeinrich Schuchardt snprintf(str, sizeof(str), "_%pD_", buf);
43256060e4SHeinrich Schuchardt assert(!strcmp("_/SD(3)_", str));
445f1ce1d4SHeinrich Schuchardt
455f1ce1d4SHeinrich Schuchardt /* NULL device path */
465f1ce1d4SHeinrich Schuchardt snprintf(str, sizeof(str), "_%pD_", NULL);
475f1ce1d4SHeinrich Schuchardt assert(!strcmp("_<NULL>_", str));
48256060e4SHeinrich Schuchardt #endif
49256060e4SHeinrich Schuchardt }
50256060e4SHeinrich Schuchardt
do_ut_print(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])51e5a9d27fSSimon Glass static int do_ut_print(cmd_tbl_t *cmdtp, int flag, int argc,
52e5a9d27fSSimon Glass char *const argv[])
53e5a9d27fSSimon Glass {
54e5a9d27fSSimon Glass char big_str[400];
55e5a9d27fSSimon Glass int big_str_len;
56e5a9d27fSSimon Glass char str[10], *s;
57e5a9d27fSSimon Glass int len;
58e5a9d27fSSimon Glass
59e5a9d27fSSimon Glass printf("%s: Testing print\n", __func__);
60e5a9d27fSSimon Glass
61e5a9d27fSSimon Glass snprintf(str, sizeof(str), "testing");
62e5a9d27fSSimon Glass assert(!strcmp("testing", str));
63e5a9d27fSSimon Glass
64e5a9d27fSSimon Glass snprintf(str, sizeof(str), "testing but too long");
65e5a9d27fSSimon Glass assert(!strcmp("testing b", str));
66e5a9d27fSSimon Glass
67e5a9d27fSSimon Glass snprintf(str, 1, "testing none");
68e5a9d27fSSimon Glass assert(!strcmp("", str));
69e5a9d27fSSimon Glass
70e5a9d27fSSimon Glass *str = 'x';
71e5a9d27fSSimon Glass snprintf(str, 0, "testing none");
72e5a9d27fSSimon Glass assert(*str == 'x');
73e5a9d27fSSimon Glass
74085391b2SRob Clark sprintf(big_str, "_%ls_", L"foo");
75085391b2SRob Clark assert(!strcmp("_foo_", big_str));
76085391b2SRob Clark
77e5a9d27fSSimon Glass /* Test the banner function */
78e5a9d27fSSimon Glass s = display_options_get_banner(true, str, sizeof(str));
79e5a9d27fSSimon Glass assert(s == str);
80e5a9d27fSSimon Glass assert(!strcmp("\n\nU-Boo\n\n", s));
81e5a9d27fSSimon Glass
82e5a9d27fSSimon Glass s = display_options_get_banner(true, str, 1);
83e5a9d27fSSimon Glass assert(s == str);
84e5a9d27fSSimon Glass assert(!strcmp("", s));
85e5a9d27fSSimon Glass
86e5a9d27fSSimon Glass s = display_options_get_banner(true, str, 2);
87e5a9d27fSSimon Glass assert(s == str);
88e5a9d27fSSimon Glass assert(!strcmp("\n", s));
89e5a9d27fSSimon Glass
90e5a9d27fSSimon Glass s = display_options_get_banner(false, str, sizeof(str));
91e5a9d27fSSimon Glass assert(s == str);
92e5a9d27fSSimon Glass assert(!strcmp("U-Boot \n\n", s));
93e5a9d27fSSimon Glass
94e5a9d27fSSimon Glass /* Give it enough space for some of the version */
95e5a9d27fSSimon Glass big_str_len = strlen(version_string) - 5;
96e5a9d27fSSimon Glass s = display_options_get_banner_priv(false, FAKE_BUILD_TAG, big_str,
97e5a9d27fSSimon Glass big_str_len);
98e5a9d27fSSimon Glass assert(s == big_str);
99e5a9d27fSSimon Glass assert(!strncmp(version_string, s, big_str_len - 3));
100e5a9d27fSSimon Glass assert(!strcmp("\n\n", s + big_str_len - 3));
101e5a9d27fSSimon Glass
102e5a9d27fSSimon Glass /* Give it enough space for the version and some of the build tag */
103e5a9d27fSSimon Glass big_str_len = strlen(version_string) + 9 + 20;
104e5a9d27fSSimon Glass s = display_options_get_banner_priv(false, FAKE_BUILD_TAG, big_str,
105e5a9d27fSSimon Glass big_str_len);
106e5a9d27fSSimon Glass assert(s == big_str);
107e5a9d27fSSimon Glass len = strlen(version_string);
108e5a9d27fSSimon Glass assert(!strncmp(version_string, s, len));
109e5a9d27fSSimon Glass assert(!strncmp(", Build: ", s + len, 9));
110e5a9d27fSSimon Glass assert(!strncmp(FAKE_BUILD_TAG, s + 9 + len, 12));
111e5a9d27fSSimon Glass assert(!strcmp("\n\n", s + big_str_len - 3));
112e5a9d27fSSimon Glass
113256060e4SHeinrich Schuchardt /* Test efi_loader specific printing */
114256060e4SHeinrich Schuchardt efi_ut_print();
115256060e4SHeinrich Schuchardt
116e5a9d27fSSimon Glass printf("%s: Everything went swimmingly\n", __func__);
117e5a9d27fSSimon Glass return 0;
118e5a9d27fSSimon Glass }
119e5a9d27fSSimon Glass
120e5a9d27fSSimon Glass U_BOOT_CMD(
121e5a9d27fSSimon Glass ut_print, 1, 1, do_ut_print,
122e5a9d27fSSimon Glass "Very basic test of printf(), etc.",
123e5a9d27fSSimon Glass ""
124e5a9d27fSSimon Glass );
125