xref: /openbmc/u-boot/test/log/log_test.c (revision dd1033e4)
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 */
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 
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
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