log_test.c 4.9 KB

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