test_scheduler.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. /* Copyright (c) 2014, The Tor Project, Inc. */
  2. /* See LICENSE for licensing information */
  3. #include <math.h>
  4. #include "orconfig.h"
  5. /* Libevent stuff */
  6. #ifdef HAVE_EVENT2_EVENT_H
  7. #include <event2/event.h>
  8. #else
  9. #include <event.h>
  10. #endif
  11. #define TOR_CHANNEL_INTERNAL_
  12. #include "or.h"
  13. #include "compat_libevent.h"
  14. #include "scheduler.h"
  15. /* Test suite stuff */
  16. #include "test.h"
  17. /* Statics in scheduler.c exposed to the test suite */
  18. extern smartlist_t *channels_pending;
  19. extern struct event *run_sched_ev;
  20. extern uint64_t queue_heuristic;
  21. extern time_t queue_heuristic_timestamp;
  22. /* Event base for scheduelr tests */
  23. static struct event_base *mock_event_base = NULL;
  24. /* Setup for mock event stuff */
  25. static void mock_event_free_all(void);
  26. static void mock_event_init(void);
  27. /* Mocks used by scheduler tests */
  28. static struct event_base * tor_libevent_get_base_mock(void);
  29. /* Scheduler test cases */
  30. static void test_scheduler_initfree(void *arg);
  31. /* Mock event init/free */
  32. /* Shamelessly stolen from compat_libevent.c */
  33. #define V(major, minor, patch) \
  34. (((major) << 24) | ((minor) << 16) | ((patch) << 8))
  35. static void
  36. mock_event_free_all(void)
  37. {
  38. test_assert(mock_event_base != NULL);
  39. if (mock_event_base) {
  40. event_base_free(mock_event_base);
  41. mock_event_base = NULL;
  42. }
  43. test_eq(mock_event_base, NULL);
  44. done:
  45. return;
  46. }
  47. static void
  48. mock_event_init(void)
  49. {
  50. #ifdef HAVE_EVENT2_EVENT_H
  51. struct event_config *cfg = NULL;
  52. #endif
  53. test_eq(mock_event_base, NULL);
  54. /*
  55. * Really cut down from tor_libevent_initialize of
  56. * src/common/compat_libevent.c to kill config dependencies
  57. */
  58. if (!mock_event_base) {
  59. #ifdef HAVE_EVENT2_EVENT_H
  60. cfg = event_config_new();
  61. #if LIBEVENT_VERSION_NUMBER >= V(2,0,9)
  62. /* We can enable changelist support with epoll, since we don't give
  63. * Libevent any dup'd fds. This lets us avoid some syscalls. */
  64. event_config_set_flag(cfg, EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST);
  65. #endif
  66. mock_event_base = event_base_new_with_config(cfg);
  67. event_config_free(cfg);
  68. #else
  69. mock_event_base = event_init();
  70. #endif
  71. }
  72. test_assert(mock_event_base != NULL);
  73. done:
  74. return;
  75. }
  76. /* Mocks */
  77. static struct event_base *
  78. tor_libevent_get_base_mock(void)
  79. {
  80. return mock_event_base;
  81. }
  82. /* Test cases */
  83. static void
  84. test_scheduler_initfree(void *arg)
  85. {
  86. (void)arg;
  87. test_eq(channels_pending, NULL);
  88. test_eq(run_sched_ev, NULL);
  89. mock_event_init();
  90. MOCK(tor_libevent_get_base, tor_libevent_get_base_mock);
  91. scheduler_init();
  92. test_assert(channels_pending != NULL);
  93. test_assert(run_sched_ev != NULL);
  94. scheduler_free_all();
  95. UNMOCK(tor_libevent_get_base);
  96. mock_event_free_all();
  97. test_eq(channels_pending, NULL);
  98. test_eq(run_sched_ev, NULL);
  99. done:
  100. return;
  101. }
  102. struct testcase_t scheduler_tests[] = {
  103. { "initfree", test_scheduler_initfree, TT_FORK, NULL, NULL },
  104. END_OF_TESTCASES
  105. };