1// SPDX-License-Identifier: GPL-2.0
2/*
3 * (C) Copyright 2015
4 * Joe Hershberger, National Instruments, joe.hershberger@ni.com
5 */
6
7#include <common.h>
8#include <command.h>
9#include <console.h>
10#include <test/suites.h>
11#include <test/test.h>
12#include <test/ut.h>
13
14static int do_ut_all(struct cmd_tbl *cmdtp, int flag, int argc,
15		     char *const argv[]);
16
17static int do_ut_info(struct cmd_tbl *cmdtp, int flag, int argc,
18		      char *const argv[]);
19
20int cmd_ut_category(const char *name, const char *prefix,
21		    struct unit_test *tests, int n_ents,
22		    int argc, char *const argv[])
23{
24	const char *test_insert = NULL;
25	int runs_per_text = 1;
26	bool force_run = false;
27	int ret;
28
29	while (argc > 1 && *argv[1] == '-') {
30		const char *str = argv[1];
31
32		switch (str[1]) {
33		case 'r':
34			runs_per_text = dectoul(str + 2, NULL);
35			break;
36		case 'f':
37			force_run = true;
38			break;
39		case 'I':
40			test_insert = str + 2;
41			break;
42		}
43		argv++;
44		argc--;
45	}
46
47	ret = ut_run_list(name, prefix, tests, n_ents,
48			  cmd_arg1(argc, argv), runs_per_text, force_run,
49			  test_insert);
50
51	return ret ? CMD_RET_FAILURE : 0;
52}
53
54static struct cmd_tbl cmd_ut_sub[] = {
55	U_BOOT_CMD_MKENT(all, CONFIG_SYS_MAXARGS, 1, do_ut_all, "", ""),
56	U_BOOT_CMD_MKENT(info, 1, 1, do_ut_info, "", ""),
57#ifdef CONFIG_CMD_BDI
58	U_BOOT_CMD_MKENT(bdinfo, CONFIG_SYS_MAXARGS, 1, do_ut_bdinfo, "", ""),
59#endif
60#ifdef CONFIG_UT_BOOTSTD
61	U_BOOT_CMD_MKENT(bootstd, CONFIG_SYS_MAXARGS, 1, do_ut_bootstd,
62			 "", ""),
63#endif
64#ifdef CONFIG_CMDLINE
65	U_BOOT_CMD_MKENT(cmd, CONFIG_SYS_MAXARGS, 1, do_ut_cmd, "", ""),
66#endif
67	U_BOOT_CMD_MKENT(common, CONFIG_SYS_MAXARGS, 1, do_ut_common, "", ""),
68#if defined(CONFIG_UT_DM)
69	U_BOOT_CMD_MKENT(dm, CONFIG_SYS_MAXARGS, 1, do_ut_dm, "", ""),
70#endif
71#if defined(CONFIG_UT_ENV)
72	U_BOOT_CMD_MKENT(env, CONFIG_SYS_MAXARGS, 1, do_ut_env, "", ""),
73#endif
74	U_BOOT_CMD_MKENT(exit, CONFIG_SYS_MAXARGS, 1, do_ut_exit, "", ""),
75#ifdef CONFIG_CMD_FDT
76	U_BOOT_CMD_MKENT(fdt, CONFIG_SYS_MAXARGS, 1, do_ut_fdt, "", ""),
77#endif
78#ifdef CONFIG_CONSOLE_TRUETYPE
79	U_BOOT_CMD_MKENT(font, CONFIG_SYS_MAXARGS, 1, do_ut_font, "", ""),
80#endif
81#ifdef CONFIG_UT_OPTEE
82	U_BOOT_CMD_MKENT(optee, CONFIG_SYS_MAXARGS, 1, do_ut_optee, "", ""),
83#endif
84#ifdef CONFIG_UT_OVERLAY
85	U_BOOT_CMD_MKENT(overlay, CONFIG_SYS_MAXARGS, 1, do_ut_overlay, "", ""),
86#endif
87#ifdef CONFIG_UT_LIB
88	U_BOOT_CMD_MKENT(lib, CONFIG_SYS_MAXARGS, 1, do_ut_lib, "", ""),
89#endif
90#ifdef CONFIG_UT_LOG
91	U_BOOT_CMD_MKENT(log, CONFIG_SYS_MAXARGS, 1, do_ut_log, "", ""),
92#endif
93#if defined(CONFIG_SANDBOX) && defined(CONFIG_CMD_MBR) && defined(CONFIG_CMD_MMC) \
94        && defined(CONFIG_MMC_SANDBOX) && defined(CONFIG_MMC_WRITE)
95	U_BOOT_CMD_MKENT(mbr, CONFIG_SYS_MAXARGS, 1, do_ut_mbr, "", ""),
96#endif
97	U_BOOT_CMD_MKENT(mem, CONFIG_SYS_MAXARGS, 1, do_ut_mem, "", ""),
98#if defined(CONFIG_SANDBOX) && defined(CONFIG_CMD_SETEXPR)
99	U_BOOT_CMD_MKENT(setexpr, CONFIG_SYS_MAXARGS, 1, do_ut_setexpr, "",
100			 ""),
101#endif
102	U_BOOT_CMD_MKENT(print, CONFIG_SYS_MAXARGS, 1, do_ut_print, "", ""),
103#ifdef CONFIG_UT_TIME
104	U_BOOT_CMD_MKENT(time, CONFIG_SYS_MAXARGS, 1, do_ut_time, "", ""),
105#endif
106#if CONFIG_IS_ENABLED(UT_UNICODE) && !defined(API_BUILD)
107	U_BOOT_CMD_MKENT(unicode, CONFIG_SYS_MAXARGS, 1, do_ut_unicode, "", ""),
108#endif
109#ifdef CONFIG_MEASURED_BOOT
110	U_BOOT_CMD_MKENT(measurement, CONFIG_SYS_MAXARGS, 1, do_ut_measurement,
111			 "", ""),
112#endif
113#ifdef CONFIG_SANDBOX
114	U_BOOT_CMD_MKENT(compression, CONFIG_SYS_MAXARGS, 1, do_ut_compression,
115			 "", ""),
116	U_BOOT_CMD_MKENT(bloblist, CONFIG_SYS_MAXARGS, 1, do_ut_bloblist,
117			 "", ""),
118	U_BOOT_CMD_MKENT(bootm, CONFIG_SYS_MAXARGS, 1, do_ut_bootm, "", ""),
119#endif
120	U_BOOT_CMD_MKENT(str, CONFIG_SYS_MAXARGS, 1, do_ut_str, "", ""),
121#ifdef CONFIG_CMD_ADDRMAP
122	U_BOOT_CMD_MKENT(addrmap, CONFIG_SYS_MAXARGS, 1, do_ut_addrmap, "", ""),
123#endif
124#if CONFIG_IS_ENABLED(HUSH_PARSER)
125	U_BOOT_CMD_MKENT(hush, CONFIG_SYS_MAXARGS, 1, do_ut_hush, "", ""),
126#endif
127#ifdef CONFIG_CMD_LOADM
128	U_BOOT_CMD_MKENT(loadm, CONFIG_SYS_MAXARGS, 1, do_ut_loadm, "", ""),
129#endif
130#ifdef CONFIG_CMD_PCI_MPS
131	U_BOOT_CMD_MKENT(pci_mps, CONFIG_SYS_MAXARGS, 1, do_ut_pci_mps, "", ""),
132#endif
133#ifdef CONFIG_CMD_SEAMA
134	U_BOOT_CMD_MKENT(seama, CONFIG_SYS_MAXARGS, 1, do_ut_seama, "", ""),
135#endif
136};
137
138static int do_ut_all(struct cmd_tbl *cmdtp, int flag, int argc,
139		     char *const argv[])
140{
141	int i;
142	int retval;
143	int any_fail = 0;
144
145	for (i = 1; i < ARRAY_SIZE(cmd_ut_sub); i++) {
146		printf("----Running %s tests----\n", cmd_ut_sub[i].name);
147		retval = cmd_ut_sub[i].cmd(cmdtp, flag, 1, &cmd_ut_sub[i].name);
148		if (!any_fail)
149			any_fail = retval;
150	}
151
152	return any_fail;
153}
154
155static int do_ut_info(struct cmd_tbl *cmdtp, int flag, int argc,
156		      char *const argv[])
157{
158	printf("Test suites: %d\n", (int)ARRAY_SIZE(cmd_ut_sub));
159	printf("Total tests: %d\n", (int)UNIT_TEST_ALL_COUNT());
160
161	return 0;
162}
163
164static int do_ut(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
165{
166	struct cmd_tbl *cp;
167
168	if (argc < 2)
169		return CMD_RET_USAGE;
170
171	/* drop initial "ut" arg */
172	argc--;
173	argv++;
174
175	cp = find_cmd_tbl(argv[0], cmd_ut_sub, ARRAY_SIZE(cmd_ut_sub));
176
177	if (cp)
178		return cp->cmd(cmdtp, flag, argc, argv);
179
180	return CMD_RET_USAGE;
181}
182
183U_BOOT_LONGHELP(ut,
184	"[-r] [-f] [<suite>] - run unit tests\n"
185	"   -r<runs>   Number of times to run each test\n"
186	"   -f         Force 'manual' tests to run as well\n"
187	"   <suite>    Test suite to run, or all\n"
188	"\n"
189	"\nOptions for <suite>:"
190	"\nall - execute all enabled tests"
191	"\ninfo - show info about tests"
192#ifdef CONFIG_CMD_ADDRMAP
193	"\naddrmap - very basic test of addrmap command"
194#endif
195#ifdef CONFIG_CMD_BDI
196	"\nbdinfo - bdinfo command"
197#endif
198#ifdef CONFIG_SANDBOX
199	"\nbloblist - bloblist implementation"
200#endif
201#ifdef CONFIG_BOOTSTD
202	"\nbootstd - standard boot implementation"
203#endif
204#ifdef CONFIG_CMDLINE
205	"\ncmd - test various commands"
206#endif
207#ifdef CONFIG_SANDBOX
208	"\ncompression - compressors and bootm decompression"
209#endif
210#ifdef CONFIG_UT_DM
211	"\ndm - driver model"
212#endif
213#ifdef CONFIG_UT_ENV
214	"\nenv - environment"
215#endif
216#ifdef CONFIG_CMD_FDT
217	"\nfdt - fdt command"
218#endif
219#ifdef CONFIG_CONSOLE_TRUETYPE
220	"\nfont - font command"
221#endif
222#if CONFIG_IS_ENABLED(HUSH_PARSER)
223	"\nhush - Test hush behavior"
224#endif
225#ifdef CONFIG_CMD_LOADM
226	"\nloadm - loadm command parameters and loading memory blob"
227#endif
228#ifdef CONFIG_UT_LIB
229	"\nlib - library functions"
230#endif
231#ifdef CONFIG_UT_LOG
232	"\nlog - logging functions"
233#endif
234	"\nmem - memory-related commands"
235#ifdef CONFIG_UT_OPTEE
236	"\noptee - test OP-TEE"
237#endif
238#ifdef CONFIG_UT_OVERLAY
239	"\noverlay - device tree overlays"
240#endif
241#ifdef CONFIG_CMD_PCI_MPS
242	"\npci_mps - PCI Express Maximum Payload Size"
243#endif
244	"\nprint  - printing things to the console"
245	"\nsetexpr - setexpr command"
246#ifdef CONFIG_SANDBOX
247	"\nstr - basic test of string functions"
248#endif
249#ifdef CONFIG_CMD_SEAMA
250	"\nseama - seama command parameters loading and decoding"
251#endif
252#ifdef CONFIG_UT_TIME
253	"\ntime - very basic test of time functions"
254#endif
255#if defined(CONFIG_UT_UNICODE) && \
256	!defined(CONFIG_SPL_BUILD) && !defined(API_BUILD)
257	"\nunicode - Unicode functions"
258#endif
259	);
260
261U_BOOT_CMD(
262	ut, CONFIG_SYS_MAXARGS, 1, do_ut,
263	"unit tests", ut_help_text
264);
265