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