xref: /openbmc/u-boot/test/log/log_test.c (revision ef11ed8239bf02b347e7fb9fc6d980aec0c7810a)
1*ef11ed82SSimon Glass /*
2*ef11ed82SSimon Glass  * Logging support test program
3*ef11ed82SSimon Glass  *
4*ef11ed82SSimon Glass  * Copyright (c) 2017 Google, Inc
5*ef11ed82SSimon Glass  * Written by Simon Glass <sjg@chromium.org>
6*ef11ed82SSimon Glass  *
7*ef11ed82SSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
8*ef11ed82SSimon Glass  */
9*ef11ed82SSimon Glass 
10*ef11ed82SSimon Glass #include <common.h>
11*ef11ed82SSimon Glass 
12*ef11ed82SSimon Glass /* emit some sample log records in different ways, for testing */
13*ef11ed82SSimon Glass static int log_run(enum uclass_id cat, const char *file)
14*ef11ed82SSimon Glass {
15*ef11ed82SSimon Glass 	int i;
16*ef11ed82SSimon Glass 
17*ef11ed82SSimon Glass 	debug("debug\n");
18*ef11ed82SSimon Glass 	for (i = LOGL_FIRST; i < LOGL_COUNT; i++) {
19*ef11ed82SSimon Glass 		log(cat, i, "log %d\n", i);
20*ef11ed82SSimon Glass 		_log(log_uc_cat(cat), i, file, 100 + i, "func", "_log %d\n",
21*ef11ed82SSimon Glass 		     i);
22*ef11ed82SSimon Glass 	}
23*ef11ed82SSimon Glass 
24*ef11ed82SSimon Glass 	return 0;
25*ef11ed82SSimon Glass }
26*ef11ed82SSimon Glass 
27*ef11ed82SSimon Glass static int log_test(int testnum)
28*ef11ed82SSimon Glass {
29*ef11ed82SSimon Glass 	int ret;
30*ef11ed82SSimon Glass 
31*ef11ed82SSimon Glass 	printf("test %d\n", testnum);
32*ef11ed82SSimon Glass 	switch (testnum) {
33*ef11ed82SSimon Glass 	case 0: {
34*ef11ed82SSimon Glass 		/* Check a category filter using the first category */
35*ef11ed82SSimon Glass 		enum log_category_t cat_list[] = {
36*ef11ed82SSimon Glass 			log_uc_cat(UCLASS_MMC), log_uc_cat(UCLASS_SPI),
37*ef11ed82SSimon Glass 			LOGC_NONE, LOGC_END
38*ef11ed82SSimon Glass 		};
39*ef11ed82SSimon Glass 
40*ef11ed82SSimon Glass 		ret = log_add_filter("console", cat_list, LOGL_MAX, NULL);
41*ef11ed82SSimon Glass 		if (ret < 0)
42*ef11ed82SSimon Glass 			return ret;
43*ef11ed82SSimon Glass 		log_run(UCLASS_MMC, "file");
44*ef11ed82SSimon Glass 		ret = log_remove_filter("console", ret);
45*ef11ed82SSimon Glass 		if (ret < 0)
46*ef11ed82SSimon Glass 			return ret;
47*ef11ed82SSimon Glass 		break;
48*ef11ed82SSimon Glass 	}
49*ef11ed82SSimon Glass 	case 1: {
50*ef11ed82SSimon Glass 		/* Check a category filter using the second category */
51*ef11ed82SSimon Glass 		enum log_category_t cat_list[] = {
52*ef11ed82SSimon Glass 			log_uc_cat(UCLASS_MMC), log_uc_cat(UCLASS_SPI), LOGC_END
53*ef11ed82SSimon Glass 		};
54*ef11ed82SSimon Glass 
55*ef11ed82SSimon Glass 		ret = log_add_filter("console", cat_list, LOGL_MAX, NULL);
56*ef11ed82SSimon Glass 		if (ret < 0)
57*ef11ed82SSimon Glass 			return ret;
58*ef11ed82SSimon Glass 		log_run(UCLASS_SPI, "file");
59*ef11ed82SSimon Glass 		ret = log_remove_filter("console", ret);
60*ef11ed82SSimon Glass 		if (ret < 0)
61*ef11ed82SSimon Glass 			return ret;
62*ef11ed82SSimon Glass 		break;
63*ef11ed82SSimon Glass 	}
64*ef11ed82SSimon Glass 	case 2: {
65*ef11ed82SSimon Glass 		/* Check a category filter that should block log entries */
66*ef11ed82SSimon Glass 		enum log_category_t cat_list[] = {
67*ef11ed82SSimon Glass 			log_uc_cat(UCLASS_MMC),  LOGC_NONE, LOGC_END
68*ef11ed82SSimon Glass 		};
69*ef11ed82SSimon Glass 
70*ef11ed82SSimon Glass 		ret = log_add_filter("console", cat_list, LOGL_MAX, NULL);
71*ef11ed82SSimon Glass 		if (ret < 0)
72*ef11ed82SSimon Glass 			return ret;
73*ef11ed82SSimon Glass 		log_run(UCLASS_SPI, "file");
74*ef11ed82SSimon Glass 		ret = log_remove_filter("console", ret);
75*ef11ed82SSimon Glass 		if (ret < 0)
76*ef11ed82SSimon Glass 			return ret;
77*ef11ed82SSimon Glass 		break;
78*ef11ed82SSimon Glass 	}
79*ef11ed82SSimon Glass 	case 3: {
80*ef11ed82SSimon Glass 		/* Check a passing file filter */
81*ef11ed82SSimon Glass 		ret = log_add_filter("console", NULL, LOGL_MAX, "file");
82*ef11ed82SSimon Glass 		if (ret < 0)
83*ef11ed82SSimon Glass 			return ret;
84*ef11ed82SSimon Glass 		log_run(UCLASS_SPI, "file");
85*ef11ed82SSimon Glass 		ret = log_remove_filter("console", ret);
86*ef11ed82SSimon Glass 		if (ret < 0)
87*ef11ed82SSimon Glass 			return ret;
88*ef11ed82SSimon Glass 		break;
89*ef11ed82SSimon Glass 	}
90*ef11ed82SSimon Glass 	case 4: {
91*ef11ed82SSimon Glass 		/* Check a failing file filter */
92*ef11ed82SSimon Glass 		ret = log_add_filter("console", NULL, LOGL_MAX, "file");
93*ef11ed82SSimon Glass 		if (ret < 0)
94*ef11ed82SSimon Glass 			return ret;
95*ef11ed82SSimon Glass 		log_run(UCLASS_SPI, "file2");
96*ef11ed82SSimon Glass 		ret = log_remove_filter("console", ret);
97*ef11ed82SSimon Glass 		if (ret < 0)
98*ef11ed82SSimon Glass 			return ret;
99*ef11ed82SSimon Glass 		break;
100*ef11ed82SSimon Glass 	}
101*ef11ed82SSimon Glass 	case 5: {
102*ef11ed82SSimon Glass 		/* Check a passing file filter (second in list) */
103*ef11ed82SSimon Glass 		ret = log_add_filter("console", NULL, LOGL_MAX, "file,file2");
104*ef11ed82SSimon Glass 		if (ret < 0)
105*ef11ed82SSimon Glass 			return ret;
106*ef11ed82SSimon Glass 		log_run(UCLASS_SPI, "file2");
107*ef11ed82SSimon Glass 		ret = log_remove_filter("console", ret);
108*ef11ed82SSimon Glass 		if (ret < 0)
109*ef11ed82SSimon Glass 			return ret;
110*ef11ed82SSimon Glass 		break;
111*ef11ed82SSimon Glass 	}
112*ef11ed82SSimon Glass 	case 6: {
113*ef11ed82SSimon Glass 		/* Check a passing file filter */
114*ef11ed82SSimon Glass 		ret = log_add_filter("console", NULL, LOGL_MAX,
115*ef11ed82SSimon Glass 				     "file,file2,log/log_test.c");
116*ef11ed82SSimon Glass 		if (ret < 0)
117*ef11ed82SSimon Glass 			return ret;
118*ef11ed82SSimon Glass 		log_run(UCLASS_SPI, "file2");
119*ef11ed82SSimon Glass 		ret = log_remove_filter("console", ret);
120*ef11ed82SSimon Glass 		if (ret < 0)
121*ef11ed82SSimon Glass 			return ret;
122*ef11ed82SSimon Glass 		break;
123*ef11ed82SSimon Glass 	}
124*ef11ed82SSimon Glass 	case 7: {
125*ef11ed82SSimon Glass 		/* Check a log level filter */
126*ef11ed82SSimon Glass 		ret = log_add_filter("console", NULL, LOGL_WARNING, NULL);
127*ef11ed82SSimon Glass 		if (ret < 0)
128*ef11ed82SSimon Glass 			return ret;
129*ef11ed82SSimon Glass 		log_run(UCLASS_SPI, "file");
130*ef11ed82SSimon Glass 		ret = log_remove_filter("console", ret);
131*ef11ed82SSimon Glass 		if (ret < 0)
132*ef11ed82SSimon Glass 			return ret;
133*ef11ed82SSimon Glass 		break;
134*ef11ed82SSimon Glass 	}
135*ef11ed82SSimon Glass 	case 8: {
136*ef11ed82SSimon Glass 		/* Check two filters, one of which passes everything */
137*ef11ed82SSimon Glass 		int filt1, filt2;
138*ef11ed82SSimon Glass 
139*ef11ed82SSimon Glass 		ret = log_add_filter("console", NULL, LOGL_WARNING, NULL);
140*ef11ed82SSimon Glass 		if (ret < 0)
141*ef11ed82SSimon Glass 			return ret;
142*ef11ed82SSimon Glass 		filt1 = ret;
143*ef11ed82SSimon Glass 		ret = log_add_filter("console", NULL, LOGL_MAX, NULL);
144*ef11ed82SSimon Glass 		if (ret < 0)
145*ef11ed82SSimon Glass 			return ret;
146*ef11ed82SSimon Glass 		filt2 = ret;
147*ef11ed82SSimon Glass 		log_run(UCLASS_SPI, "file");
148*ef11ed82SSimon Glass 		ret = log_remove_filter("console", filt1);
149*ef11ed82SSimon Glass 		if (ret < 0)
150*ef11ed82SSimon Glass 			return ret;
151*ef11ed82SSimon Glass 		ret = log_remove_filter("console", filt2);
152*ef11ed82SSimon Glass 		if (ret < 0)
153*ef11ed82SSimon Glass 			return ret;
154*ef11ed82SSimon Glass 		break;
155*ef11ed82SSimon Glass 	}
156*ef11ed82SSimon Glass 	case 9: {
157*ef11ed82SSimon Glass 		/* Check three filters, which together pass everything */
158*ef11ed82SSimon Glass 		int filt1, filt2, filt3;
159*ef11ed82SSimon Glass 
160*ef11ed82SSimon Glass 		ret = log_add_filter("console", NULL, LOGL_MAX, "file)");
161*ef11ed82SSimon Glass 		if (ret < 0)
162*ef11ed82SSimon Glass 			return ret;
163*ef11ed82SSimon Glass 		filt1 = ret;
164*ef11ed82SSimon Glass 		ret = log_add_filter("console", NULL, LOGL_MAX, "file2");
165*ef11ed82SSimon Glass 		if (ret < 0)
166*ef11ed82SSimon Glass 			return ret;
167*ef11ed82SSimon Glass 		filt2 = ret;
168*ef11ed82SSimon Glass 		ret = log_add_filter("console", NULL, LOGL_MAX,
169*ef11ed82SSimon Glass 				     "log/log_test.c");
170*ef11ed82SSimon Glass 		if (ret < 0)
171*ef11ed82SSimon Glass 			return ret;
172*ef11ed82SSimon Glass 		filt3 = ret;
173*ef11ed82SSimon Glass 		log_run(UCLASS_SPI, "file2");
174*ef11ed82SSimon Glass 		ret = log_remove_filter("console", filt1);
175*ef11ed82SSimon Glass 		if (ret < 0)
176*ef11ed82SSimon Glass 			return ret;
177*ef11ed82SSimon Glass 		ret = log_remove_filter("console", filt2);
178*ef11ed82SSimon Glass 		if (ret < 0)
179*ef11ed82SSimon Glass 			return ret;
180*ef11ed82SSimon Glass 		ret = log_remove_filter("console", filt3);
181*ef11ed82SSimon Glass 		if (ret < 0)
182*ef11ed82SSimon Glass 			return ret;
183*ef11ed82SSimon Glass 		break;
184*ef11ed82SSimon Glass 	}
185*ef11ed82SSimon Glass 	}
186*ef11ed82SSimon Glass 
187*ef11ed82SSimon Glass 	return 0;
188*ef11ed82SSimon Glass }
189*ef11ed82SSimon Glass 
190*ef11ed82SSimon Glass #ifdef CONFIG_LOG_TEST
191*ef11ed82SSimon Glass int do_log_test(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
192*ef11ed82SSimon Glass {
193*ef11ed82SSimon Glass 	int testnum = 0;
194*ef11ed82SSimon Glass 	int ret;
195*ef11ed82SSimon Glass 
196*ef11ed82SSimon Glass 	if (argc > 1)
197*ef11ed82SSimon Glass 		testnum = simple_strtoul(argv[1], NULL, 10);
198*ef11ed82SSimon Glass 
199*ef11ed82SSimon Glass 	ret = log_test(testnum);
200*ef11ed82SSimon Glass 	if (ret)
201*ef11ed82SSimon Glass 		printf("Test failure (err=%d)\n", ret);
202*ef11ed82SSimon Glass 
203*ef11ed82SSimon Glass 	return ret ? CMD_RET_FAILURE : 0;
204*ef11ed82SSimon Glass }
205*ef11ed82SSimon Glass #endif
206