log_test.c 4.9 KB

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