test_routerlist.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /* Copyright (c) 2014, The Tor Project, Inc. */
  2. /* See LICENSE for licensing information */
  3. #define ROUTERLIST_PRIVATE
  4. #include "or.h"
  5. #include "routerlist.h"
  6. #include "directory.h"
  7. #include "connection.h"
  8. #include "test.h"
  9. /* 4 digests + 3 sep + pre + post + NULL */
  10. static char output[4*BASE64_DIGEST256_LEN+3+2+2+1];
  11. static void
  12. mock_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose,
  13. const char *resource, int pds_flags,
  14. download_want_authority_t want_authority)
  15. {
  16. (void)dir_purpose;
  17. (void)router_purpose;
  18. (void)pds_flags;
  19. (void)want_authority;
  20. tt_assert(resource);
  21. strlcpy(output, resource, sizeof(output));
  22. done:
  23. ;
  24. }
  25. static void
  26. test_routerlist_initiate_descriptor_downloads(void *arg)
  27. {
  28. const char *prose = "unhurried and wise, we perceive.";
  29. smartlist_t *digests = smartlist_new();
  30. (void)arg;
  31. for (int i = 0; i < 20; i++) {
  32. smartlist_add(digests, (char*)prose);
  33. }
  34. MOCK(directory_get_from_dirserver, mock_get_from_dirserver);
  35. initiate_descriptor_downloads(NULL, DIR_PURPOSE_FETCH_MICRODESC,
  36. digests, 3, 7, 0);
  37. UNMOCK(directory_get_from_dirserver);
  38. tt_str_op(output, OP_EQ, "d/"
  39. "dW5odXJyaWVkIGFuZCB3aXNlLCB3ZSBwZXJjZWl2ZS4-"
  40. "dW5odXJyaWVkIGFuZCB3aXNlLCB3ZSBwZXJjZWl2ZS4-"
  41. "dW5odXJyaWVkIGFuZCB3aXNlLCB3ZSBwZXJjZWl2ZS4-"
  42. "dW5odXJyaWVkIGFuZCB3aXNlLCB3ZSBwZXJjZWl2ZS4"
  43. ".z");
  44. done:
  45. smartlist_free(digests);
  46. }
  47. static int count = 0;
  48. static void
  49. mock_initiate_descriptor_downloads(const routerstatus_t *source,
  50. int purpose, smartlist_t *digests,
  51. int lo, int hi, int pds_flags)
  52. {
  53. (void)source;
  54. (void)purpose;
  55. (void)digests;
  56. (void)pds_flags;
  57. (void)hi;
  58. (void)lo;
  59. count += 1;
  60. }
  61. static void
  62. test_routerlist_launch_descriptor_downloads(void *arg)
  63. {
  64. smartlist_t *downloadable = smartlist_new();
  65. time_t now = time(NULL);
  66. char *cp;
  67. (void)arg;
  68. for (int i = 0; i < 100; i++) {
  69. cp = tor_malloc(DIGEST256_LEN);
  70. tt_assert(cp);
  71. crypto_rand(cp, DIGEST256_LEN);
  72. smartlist_add(downloadable, cp);
  73. }
  74. MOCK(initiate_descriptor_downloads, mock_initiate_descriptor_downloads);
  75. launch_descriptor_downloads(DIR_PURPOSE_FETCH_MICRODESC, downloadable,
  76. NULL, now);
  77. tt_int_op(3, ==, count);
  78. UNMOCK(initiate_descriptor_downloads);
  79. done:
  80. SMARTLIST_FOREACH(downloadable, char *, cp1, tor_free(cp1));
  81. smartlist_free(downloadable);
  82. }
  83. connection_t *mocked_connection = NULL;
  84. /* Mock connection_get_by_type_addr_port_purpose by returning
  85. * mocked_connection. */
  86. static connection_t *
  87. mock_connection_get_by_type_addr_port_purpose(int type,
  88. const tor_addr_t *addr,
  89. uint16_t port, int purpose)
  90. {
  91. (void)type;
  92. (void)addr;
  93. (void)port;
  94. (void)purpose;
  95. return mocked_connection;
  96. }
  97. #define TEST_ADDR_STR "127.0.0.1"
  98. #define TEST_DIR_PORT 12345
  99. static void
  100. test_routerlist_router_is_already_dir_fetching(void *arg)
  101. {
  102. (void)arg;
  103. tor_addr_port_t test_ap, null_addr_ap, zero_port_ap;
  104. /* Setup */
  105. tor_addr_parse(&test_ap.addr, TEST_ADDR_STR);
  106. test_ap.port = TEST_DIR_PORT;
  107. tor_addr_make_null(&null_addr_ap.addr, AF_INET6);
  108. null_addr_ap.port = TEST_DIR_PORT;
  109. tor_addr_parse(&zero_port_ap.addr, TEST_ADDR_STR);
  110. zero_port_ap.port = 0;
  111. MOCK(connection_get_by_type_addr_port_purpose,
  112. mock_connection_get_by_type_addr_port_purpose);
  113. /* Test that we never get 1 from a NULL connection */
  114. mocked_connection = NULL;
  115. tt_assert(router_is_already_dir_fetching(&test_ap, 1, 1) == 0);
  116. tt_assert(router_is_already_dir_fetching(&test_ap, 1, 0) == 0);
  117. tt_assert(router_is_already_dir_fetching(&test_ap, 0, 1) == 0);
  118. /* We always expect 0 in these cases */
  119. tt_assert(router_is_already_dir_fetching(&test_ap, 0, 0) == 0);
  120. tt_assert(router_is_already_dir_fetching(NULL, 1, 1) == 0);
  121. tt_assert(router_is_already_dir_fetching(&null_addr_ap, 1, 1) == 0);
  122. tt_assert(router_is_already_dir_fetching(&zero_port_ap, 1, 1) == 0);
  123. /* Test that we get 1 with a connection in the appropriate circumstances */
  124. mocked_connection = connection_new(CONN_TYPE_DIR, AF_INET);
  125. tt_assert(router_is_already_dir_fetching(&test_ap, 1, 1) == 1);
  126. tt_assert(router_is_already_dir_fetching(&test_ap, 1, 0) == 1);
  127. tt_assert(router_is_already_dir_fetching(&test_ap, 0, 1) == 1);
  128. /* Test that we get 0 even with a connection in the appropriate
  129. * circumstances */
  130. tt_assert(router_is_already_dir_fetching(&test_ap, 0, 0) == 0);
  131. tt_assert(router_is_already_dir_fetching(NULL, 1, 1) == 0);
  132. tt_assert(router_is_already_dir_fetching(&null_addr_ap, 1, 1) == 0);
  133. tt_assert(router_is_already_dir_fetching(&zero_port_ap, 1, 1) == 0);
  134. done:
  135. /* If a connection is never set up, connection_free chokes on it. */
  136. buf_free(mocked_connection->inbuf);
  137. buf_free(mocked_connection->outbuf);
  138. tor_free(mocked_connection);
  139. UNMOCK(connection_get_by_type_addr_port_purpose);
  140. }
  141. #undef TEST_ADDR_STR
  142. #undef TEST_DIR_PORT
  143. #define NODE(name, flags) \
  144. { #name, test_routerlist_##name, (flags), NULL, NULL }
  145. struct testcase_t routerlist_tests[] = {
  146. NODE(initiate_descriptor_downloads, 0),
  147. NODE(launch_descriptor_downloads, 0),
  148. NODE(router_is_already_dir_fetching, TT_FORK),
  149. END_OF_TESTCASES
  150. };