log_test_helpers.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /* Copyright (c) 2015, The Tor Project, Inc. */
  2. /* See LICENSE for licensing information */
  3. #define LOG_PRIVATE
  4. #include "torlog.h"
  5. #include "log_test_helpers.h"
  6. static smartlist_t *saved_logs = NULL;
  7. int
  8. setup_capture_of_logs(int new_level)
  9. {
  10. int previous_log = log_global_min_severity_;
  11. log_global_min_severity_ = new_level;
  12. mock_clean_saved_logs();
  13. MOCK(logv, mock_saving_logv);
  14. return previous_log;
  15. }
  16. void
  17. teardown_capture_of_logs(int prev)
  18. {
  19. UNMOCK(logv);
  20. log_global_min_severity_ = prev;
  21. mock_clean_saved_logs();
  22. }
  23. void
  24. mock_clean_saved_logs(void)
  25. {
  26. if (!saved_logs)
  27. return;
  28. SMARTLIST_FOREACH(saved_logs, mock_saved_log_entry_t *, m,
  29. { tor_free(m->generated_msg); tor_free(m); });
  30. smartlist_free(saved_logs);
  31. saved_logs = NULL;
  32. }
  33. static mock_saved_log_entry_t *
  34. mock_get_log_entry(int ix)
  35. {
  36. int saved_log_count = mock_saved_log_number();
  37. if (ix < 0) {
  38. ix = saved_log_count + ix;
  39. }
  40. if (saved_log_count <= ix)
  41. return NULL;
  42. return smartlist_get(saved_logs, ix);
  43. }
  44. const char *
  45. mock_saved_log_at(int ix)
  46. {
  47. mock_saved_log_entry_t *ent = mock_get_log_entry(ix);
  48. if (ent)
  49. return ent->generated_msg;
  50. else
  51. return "";
  52. }
  53. int
  54. mock_saved_severity_at(int ix)
  55. {
  56. mock_saved_log_entry_t *ent = mock_get_log_entry(ix);
  57. if (ent)
  58. return ent->severity;
  59. else
  60. return -1;
  61. }
  62. int
  63. mock_saved_log_number(void)
  64. {
  65. if (!saved_logs)
  66. return 0;
  67. return smartlist_len(saved_logs);
  68. }
  69. const smartlist_t *
  70. mock_saved_logs(void)
  71. {
  72. return saved_logs;
  73. }
  74. int
  75. mock_saved_log_has_message(const char *msg)
  76. {
  77. int has_msg = 0;
  78. if (saved_logs) {
  79. SMARTLIST_FOREACH(saved_logs, mock_saved_log_entry_t *, m,
  80. {
  81. if (msg && m->generated_msg &&
  82. !strcmp(msg, m->generated_msg)) {
  83. has_msg = 1;
  84. }
  85. });
  86. }
  87. return has_msg;
  88. }
  89. void
  90. mock_saving_logv(int severity, log_domain_mask_t domain,
  91. const char *funcname, const char *suffix,
  92. const char *format, va_list ap)
  93. {
  94. (void)domain;
  95. char *buf = tor_malloc_zero(10240);
  96. int n;
  97. n = tor_vsnprintf(buf,10240,format,ap);
  98. tor_assert(n < 10240-1);
  99. buf[n]='\n';
  100. buf[n+1]='\0';
  101. mock_saved_log_entry_t *e = tor_malloc_zero(sizeof(mock_saved_log_entry_t));
  102. e->severity = severity;
  103. e->funcname = funcname;
  104. e->suffix = suffix;
  105. e->format = format;
  106. e->generated_msg = tor_strdup(buf);
  107. tor_free(buf);
  108. if (!saved_logs)
  109. saved_logs = smartlist_new();
  110. smartlist_add(saved_logs, e);
  111. }