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