]> Git Repo - u-boot.git/blob - test/print_ut.c
bded2b6ebe5adda45dedb1fc1823679263f6ffe6
[u-boot.git] / test / print_ut.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (c) 2012, The Chromium Authors
4  */
5
6 #include <command.h>
7 #include <efi_api.h>
8 #include <display_options.h>
9 #include <log.h>
10 #include <mapmem.h>
11 #include <version_string.h>
12 #include <vsprintf.h>
13 #include <test/suites.h>
14 #include <test/test.h>
15 #include <test/ut.h>
16
17 #define BUF_SIZE        0x100
18
19 #define FAKE_BUILD_TAG  "jenkins-u-boot-denx_uboot_dm-master-build-aarch64" \
20                         "and a lot more text to come"
21
22 /* Declare a new print test */
23 #define PRINT_TEST(_name, _flags)       UNIT_TEST(_name, _flags, print_test)
24
25 #if CONFIG_IS_ENABLED(LIB_UUID)
26 /* Test printing GUIDs */
27 static int print_guid(struct unit_test_state *uts)
28 {
29         unsigned char guid[16] = {
30                 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16
31         };
32         unsigned char guid_esp[16] = {
33                 0x28, 0x73, 0x2a, 0xc1, 0x1f, 0xf8, 0xd2, 0x11,
34                 0xBA, 0x4B, 0x00, 0xA0, 0xC9, 0x3E, 0xC9, 0x3B
35         };
36         char str[40];
37         int ret;
38
39         sprintf(str, "%pUb", guid);
40         ut_asserteq_str("01020304-0506-0708-090a-0b0c0d0e0f10", str);
41         sprintf(str, "%pUB", guid);
42         ut_asserteq_str("01020304-0506-0708-090A-0B0C0D0E0F10", str);
43         sprintf(str, "%pUl", guid);
44         ut_asserteq_str("04030201-0605-0807-090a-0b0c0d0e0f10", str);
45         sprintf(str, "%pUs", guid);
46         ut_asserteq_str("04030201-0605-0807-090a-0b0c0d0e0f10", str);
47         sprintf(str, "%pUL", guid);
48         ut_asserteq_str("04030201-0605-0807-090A-0B0C0D0E0F10", str);
49         sprintf(str, "%pUs", guid_esp);
50         if (IS_ENABLED(CONFIG_PARTITION_TYPE_GUID)) { /* brace needed */
51                 ut_asserteq_str("system", str);
52         } else {
53                 ut_asserteq_str("c12a7328-f81f-11d2-ba4b-00a0c93ec93b", str);
54         }
55         ret = snprintf(str, 4, "%pUL", guid);
56         ut_asserteq(0, str[3]);
57         ut_asserteq(36, ret);
58
59         return 0;
60 }
61 PRINT_TEST(print_guid, 0);
62 #endif
63
64 #if CONFIG_IS_ENABLED(EFI_LOADER) && !defined(API_BUILD)
65 /* Test efi_loader specific printing */
66 static int print_efi_ut(struct unit_test_state *uts)
67 {
68         char str[10];
69         u8 buf[sizeof(struct efi_device_path_sd_mmc_path) +
70                sizeof(struct efi_device_path)];
71         u8 *pos = buf;
72         struct efi_device_path *dp_end;
73         struct efi_device_path_sd_mmc_path *dp_sd =
74                         (struct efi_device_path_sd_mmc_path *)pos;
75
76         /* Create a device path for an SD card */
77         dp_sd->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
78         dp_sd->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_SD;
79         dp_sd->dp.length = sizeof(struct efi_device_path_sd_mmc_path);
80         dp_sd->slot_number = 3;
81         pos += sizeof(struct efi_device_path_sd_mmc_path);
82         /* Append end node */
83         dp_end = (struct efi_device_path *)pos;
84         dp_end->type = DEVICE_PATH_TYPE_END;
85         dp_end->sub_type = DEVICE_PATH_SUB_TYPE_END;
86         dp_end->length = sizeof(struct efi_device_path);
87
88         snprintf(str, sizeof(str), "_%pD_", buf);
89         ut_assertok(strcmp("_/SD(3)_", str));
90
91         /* NULL device path */
92         snprintf(str, sizeof(str), "_%pD_", NULL);
93         ut_assertok(strcmp("_<NULL>_", str));
94
95         return 0;
96 }
97 PRINT_TEST(print_efi_ut, 0);
98 #endif
99
100 static int print_printf(struct unit_test_state *uts)
101 {
102         char big_str[400];
103         int big_str_len;
104         char str[10], *s;
105         int len;
106
107         snprintf(str, sizeof(str), "testing");
108         ut_assertok(strcmp("testing", str));
109
110         snprintf(str, sizeof(str), "testing but too long");
111         ut_assertok(strcmp("testing b", str));
112
113         snprintf(str, 1, "testing none");
114         ut_assertok(strcmp("", str));
115
116         *str = 'x';
117         snprintf(str, 0, "testing none");
118         ut_asserteq('x', *str);
119
120         sprintf(big_str, "_%ls_", u"foo");
121         ut_assertok(strcmp("_foo_", big_str));
122
123         /* Test the banner function */
124         s = display_options_get_banner(true, str, sizeof(str));
125         ut_asserteq_ptr(str, s);
126         ut_assertok(strcmp("\n\nU-Boo\n\n", s));
127
128         /* Assert that we do not overwrite memory before the buffer */
129         str[0] = '`';
130         s = display_options_get_banner(true, str + 1, 1);
131         ut_asserteq_ptr(str + 1, s);
132         ut_assertok(strcmp("`", str));
133
134         str[0] = '~';
135         s = display_options_get_banner(true, str + 1, 2);
136         ut_asserteq_ptr(str + 1, s);
137         ut_assertok(strcmp("~\n", str));
138
139         /* The last two characters are set to \n\n for all buffer sizes > 2 */
140         s = display_options_get_banner(false, str, sizeof(str));
141         ut_asserteq_ptr(str, s);
142         ut_assertok(strcmp("U-Boot \n\n", s));
143
144         /* Give it enough space for some of the version */
145         big_str_len = strlen(version_string) - 5;
146         s = display_options_get_banner_priv(false, FAKE_BUILD_TAG, big_str,
147                                             big_str_len);
148         ut_asserteq_ptr(big_str, s);
149         ut_assertok(strncmp(version_string, s, big_str_len - 3));
150         ut_assertok(strcmp("\n\n", s + big_str_len - 3));
151
152         /* Give it enough space for the version and some of the build tag */
153         big_str_len = strlen(version_string) + 9 + 20;
154         s = display_options_get_banner_priv(false, FAKE_BUILD_TAG, big_str,
155                                             big_str_len);
156         ut_asserteq_ptr(big_str, s);
157         len = strlen(version_string);
158         ut_assertok(strncmp(version_string, s, len));
159         ut_assertok(strncmp(", Build: ", s + len, 9));
160         ut_assertok(strncmp(FAKE_BUILD_TAG, s + 9 + len, 12));
161         ut_assertok(strcmp("\n\n", s + big_str_len - 3));
162
163         return 0;
164 }
165 PRINT_TEST(print_printf, 0);
166
167 static int print_display_buffer(struct unit_test_state *uts)
168 {
169         u8 *buf;
170         int i;
171
172         /* This test requires writable memory at zero */
173         if (IS_ENABLED(CONFIG_X86))
174                 return -EAGAIN;
175
176         buf = map_sysmem(0, BUF_SIZE);
177         memset(buf, '\0', BUF_SIZE);
178         for (i = 0; i < 0x11; i++)
179                 buf[i] = i * 0x11;
180
181         /* bytes */
182         console_record_reset();
183         print_buffer(0, buf, 1, 0x12, 0);
184         ut_assert_nextline("00000000: 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff  ..\"3DUfw........");
185         ut_assert_nextline("00000010: 10 00                                            ..");
186         ut_assert_console_end();
187
188         /* line length */
189         console_record_reset();
190         print_buffer(0, buf, 1, 0x12, 8);
191         ut_assert_nextline("00000000: 00 11 22 33 44 55 66 77  ..\"3DUfw");
192         ut_assert_nextline("00000008: 88 99 aa bb cc dd ee ff  ........");
193         ut_assert_nextline("00000010: 10 00                    ..");
194         ut_assert_console_end();
195
196         /* long line */
197         console_record_reset();
198         buf[0x41] = 0x41;
199         print_buffer(0, buf, 1, 0x42, 0x40);
200         ut_assert_nextline("00000000: 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ..\"3DUfw........................................................");
201         ut_assert_nextline("00000040: 00 41                                                                                                                                                                                            .A");
202         ut_assert_console_end();
203
204         /* address */
205         console_record_reset();
206         print_buffer(0x12345678, buf, 1, 0x12, 0);
207         ut_assert_nextline("12345678: 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff  ..\"3DUfw........");
208         ut_assert_nextline("12345688: 10 00                                            ..");
209         ut_assert_console_end();
210
211         /* 16-bit */
212         console_record_reset();
213         print_buffer(0, buf, 2, 9, 0);
214         ut_assert_nextline("00000000: 1100 3322 5544 7766 9988 bbaa ddcc ffee  ..\"3DUfw........");
215         ut_assert_nextline("00000010: 0010                                     ..");
216         ut_assert_console_end();
217
218         /* 32-bit */
219         console_record_reset();
220         print_buffer(0, buf, 4, 5, 0);
221         ut_assert_nextline("00000000: 33221100 77665544 bbaa9988 ffeeddcc  ..\"3DUfw........");
222         ut_assert_nextline("00000010: 00000010                             ....");
223         ut_assert_console_end();
224
225         /* 64-bit */
226         console_record_reset();
227         print_buffer(0, buf, 8, 3, 0);
228         ut_assert_nextline("00000000: 7766554433221100 ffeeddccbbaa9988  ..\"3DUfw........");
229         ut_assert_nextline("00000010: 0000000000000010                   ........");
230         ut_assert_console_end();
231
232         /* ASCII */
233         console_record_reset();
234         buf[1] = 31;
235         buf[2] = 32;
236         buf[3] = 33;
237         for (i = 0; i < 4; i++)
238                 buf[4 + i] = 126 + i;
239         buf[8] = 255;
240         print_buffer(0, buf, 1, 10, 0);
241         ut_assert_nextline("00000000: 00 1f 20 21 7e 7f 80 81 ff 99                    .. !~.....");
242         ut_assert_console_end();
243
244         unmap_sysmem(buf);
245
246         return 0;
247 }
248 PRINT_TEST(print_display_buffer, UT_TESTF_CONSOLE_REC);
249
250 static int print_hexdump_line(struct unit_test_state *uts)
251 {
252         char *linebuf;
253         u8 *buf;
254         int i;
255
256         buf = map_sysmem(0, BUF_SIZE);
257         memset(buf, '\0', BUF_SIZE);
258         for (i = 0; i < 0x11; i++)
259                 buf[i] = i * 0x11;
260
261         /* Check buffer size calculations */
262         linebuf = map_sysmem(0x400, BUF_SIZE);
263         memset(linebuf, '\xff', BUF_SIZE);
264         ut_asserteq(-ENOSPC, hexdump_line(0, buf, 1, 0x10, 0, linebuf, 75));
265         ut_asserteq(-1, linebuf[0]);
266         ut_asserteq(0x10, hexdump_line(0, buf, 1, 0x10, 0, linebuf, 76));
267         ut_asserteq(0, linebuf[75]);
268         ut_asserteq(-1, linebuf[76]);
269
270         unmap_sysmem(buf);
271
272         return 0;
273 }
274 PRINT_TEST(print_hexdump_line, UT_TESTF_CONSOLE_REC);
275
276 static int print_do_hex_dump(struct unit_test_state *uts)
277 {
278         u8 *buf;
279         int i;
280
281         /* This test requires writable memory at zero */
282         if (IS_ENABLED(CONFIG_X86))
283                 return -EAGAIN;
284
285         buf = map_sysmem(0, BUF_SIZE);
286         memset(buf, '\0', BUF_SIZE);
287         for (i = 0; i < 0x11; i++)
288                 buf[i] = i * 0x11;
289
290         /* bytes */
291         console_record_reset();
292         print_hex_dump_bytes("", DUMP_PREFIX_ADDRESS, buf, 0x12);
293         ut_assert_nextline("%0*lx: 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff  ..\"3DUfw........",
294                            IS_ENABLED(CONFIG_PHYS_64BIT) ? 16 : 8, 0x0UL);
295         ut_assert_nextline("%0*lx: 10 00                                            ..",
296                            IS_ENABLED(CONFIG_PHYS_64BIT) ? 16 : 8, 0x10UL);
297         ut_assert_console_end();
298
299         /* line length */
300         console_record_reset();
301         print_hex_dump("", DUMP_PREFIX_ADDRESS, 8, 1, buf, 0x12, true);
302         ut_assert_nextline("%0*lx: 00 11 22 33 44 55 66 77  ..\"3DUfw",
303                            IS_ENABLED(CONFIG_PHYS_64BIT) ? 16 : 8, 0x0UL);
304         ut_assert_nextline("%0*lx: 88 99 aa bb cc dd ee ff  ........",
305                            IS_ENABLED(CONFIG_PHYS_64BIT) ? 16 : 8, 0x8UL);
306         ut_assert_nextline("%0*lx: 10 00                    ..",
307                            IS_ENABLED(CONFIG_PHYS_64BIT) ? 16 : 8, 0x10UL);
308         ut_assert_console_end();
309         unmap_sysmem(buf);
310
311         /* long line */
312         console_record_reset();
313         buf[0x41] = 0x41;
314         print_hex_dump("", DUMP_PREFIX_ADDRESS, 0x40, 1, buf, 0x42, true);
315         ut_assert_nextline("%0*lx: 00 11 22 33 44 55 66 77 88 99 aa bb cc dd ee ff 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ..\"3DUfw........................................................",
316                            IS_ENABLED(CONFIG_PHYS_64BIT) ? 16 : 8, 0x0UL);
317         ut_assert_nextline("%0*lx: 00 41                                                                                                                                                                                            .A",
318                            IS_ENABLED(CONFIG_PHYS_64BIT) ? 16 : 8, 0x40UL);
319         ut_assert_console_end();
320
321         /* 16-bit */
322         console_record_reset();
323         print_hex_dump("", DUMP_PREFIX_ADDRESS, 0, 2, buf, 0x12, true);
324         ut_assert_nextline("%0*lx: 1100 3322 5544 7766 9988 bbaa ddcc ffee  ..\"3DUfw........",
325                            IS_ENABLED(CONFIG_PHYS_64BIT) ? 16 : 8, 0x0UL);
326         ut_assert_nextline("%0*lx: 0010                                     ..",
327                            IS_ENABLED(CONFIG_PHYS_64BIT) ? 16 : 8, 0x10UL);
328         ut_assert_console_end();
329         unmap_sysmem(buf);
330
331         /* 32-bit */
332         console_record_reset();
333         print_hex_dump("", DUMP_PREFIX_ADDRESS, 0, 4, buf, 0x14, true);
334         ut_assert_nextline("%0*lx: 33221100 77665544 bbaa9988 ffeeddcc  ..\"3DUfw........",
335                            IS_ENABLED(CONFIG_PHYS_64BIT) ? 16 : 8, 0x0UL);
336         ut_assert_nextline("%0*lx: 00000010                             ....",
337                            IS_ENABLED(CONFIG_PHYS_64BIT) ? 16 : 8, 0x10UL);
338         ut_assert_console_end();
339         unmap_sysmem(buf);
340
341         /* 64-bit */
342         console_record_reset();
343         print_hex_dump("", DUMP_PREFIX_ADDRESS, 16, 8, buf, 0x18, true);
344         ut_assert_nextline("%0*lx: 7766554433221100 ffeeddccbbaa9988  ..\"3DUfw........",
345                            IS_ENABLED(CONFIG_PHYS_64BIT) ? 16 : 8, 0x0UL);
346         ut_assert_nextline("%0*lx: 0000000000000010                   ........",
347                            IS_ENABLED(CONFIG_PHYS_64BIT) ? 16 : 8, 0x10UL);
348         ut_assert_console_end();
349         unmap_sysmem(buf);
350
351         /* ASCII */
352         console_record_reset();
353         buf[1] = 31;
354         buf[2] = 32;
355         buf[3] = 33;
356         for (i = 0; i < 4; i++)
357                 buf[4 + i] = 126 + i;
358         buf[8] = 255;
359         print_hex_dump("", DUMP_PREFIX_ADDRESS, 0, 1, buf, 10, true);
360         ut_assert_nextline("%0*lx: 00 1f 20 21 7e 7f 80 81 ff 99                    .. !~.....",
361                            IS_ENABLED(CONFIG_PHYS_64BIT) ? 16 : 8, 0x0UL);
362         ut_assert_console_end();
363         unmap_sysmem(buf);
364
365         return 0;
366 }
367 PRINT_TEST(print_do_hex_dump, UT_TESTF_CONSOLE_REC);
368
369 static int snprint(struct unit_test_state *uts)
370 {
371         char buf[10] = "xxxxxxxxx";
372         int ret;
373
374         ret = snprintf(buf, 5, "%d", 12345678);
375         ut_asserteq_str("1234", buf);
376         ut_asserteq(8, ret);
377         ret = snprintf(buf, 5, "0x%x", 0x1234);
378         ut_asserteq_str("0x12", buf);
379         ut_asserteq(6, ret);
380         ret = snprintf(buf, 5, "0x%08x", 0x1234);
381         ut_asserteq_str("0x00", buf);
382         ut_asserteq(10, ret);
383         ret = snprintf(buf, 3, "%s", "abc");
384         ut_asserteq_str("ab", buf);
385         ut_asserteq(3, ret);
386         ret = snprintf(buf, 4, "%s:%s", "abc", "def");
387         ut_asserteq(0, buf[3]);
388         ut_asserteq(7, ret);
389         ret = snprintf(buf, 4, "%s:%d", "abc", 9999);
390         ut_asserteq(8, ret);
391         return 0;
392 }
393 PRINT_TEST(snprint, 0);
394
395 int do_ut_print(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
396 {
397         struct unit_test *tests = UNIT_TEST_SUITE_START(print_test);
398         const int n_ents = UNIT_TEST_SUITE_COUNT(print_test);
399
400         return cmd_ut_category("print", "print_", tests, n_ents, argc, argv);
401 }
This page took 0.038599 seconds and 2 git commands to generate.