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