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