Merge tag 'efi-2020-07-rc2-3' of https://gitlab.denx.de/u-boot/custodians/u-boot-efi
[oweals/u-boot.git] / test / log / log_test.c
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