xref: /openbmc/u-boot/test/print_ut.c (revision 772b9e8b)
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*772b9e8bSPali 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