test_bridges.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704
  1. /* Copyright (c) 2018, The Tor Project, Inc. */
  2. /* See LICENSE for licensing information */
  3. /**
  4. * \file test_bridges.c
  5. * \brief Unittests for code in bridges.c
  6. **/
  7. #define TOR_BRIDGES_PRIVATE
  8. #define PT_PRIVATE /* Only needed for the mock_* items below */
  9. #include <stdbool.h>
  10. #include "core/or/or.h"
  11. #include "lib/net/address.h"
  12. #include "feature/client/bridges.h"
  13. #include "app/config/config.h"
  14. #include "feature/client/transports.h"
  15. #include "feature/nodelist/node_st.h"
  16. #include "feature/nodelist/routerinfo_st.h"
  17. #include "feature/nodelist/routerstatus_st.h"
  18. #include "feature/nodelist/microdesc_st.h"
  19. /* Test suite stuff */
  20. #include "test/test.h"
  21. /**
  22. * A mocked transport_t, constructed via mock_transport_get_by_name().
  23. */
  24. static transport_t *mock_transport = NULL;
  25. /**
  26. * Mock transport_get_by_name() to simply return a transport_t for the
  27. * transport name that was input to it.
  28. */
  29. static transport_t *
  30. mock_transport_get_by_name(const char *name)
  31. {
  32. tor_addr_t *addr = tor_malloc(sizeof(tor_addr_t));
  33. uint16_t port = 9999;
  34. int socksv = 9;
  35. char *args = tor_strdup("foo=bar");
  36. if (!mock_transport) {
  37. tor_addr_parse(addr, "99.99.99.99");
  38. mock_transport = transport_new(addr, port, name, socksv, args);
  39. }
  40. tor_free(addr);
  41. tor_free(args);
  42. return mock_transport;
  43. }
  44. #undef PT_PRIVATE /* defined(PT_PRIVATE) */
  45. /**
  46. * Test helper: Add a variety of bridges to our global bridgelist.
  47. */
  48. static void
  49. helper_add_bridges_to_bridgelist(void *arg)
  50. {
  51. /* Note: the two bridges which do not have specified fingerprints will be
  52. * internally stored as both having the same fingerprint of all-zero bytes.
  53. */
  54. (void)arg;
  55. char *bridge0 = tor_strdup("6.6.6.6:6666");
  56. char *bridge1 = tor_strdup("6.6.6.7:6667 "
  57. "A10C4F666D27364036B562823E5830BC448E046A");
  58. char *bridge2 = tor_strdup("obfs4 198.245.60.51:443 "
  59. "752CF7825B3B9EA6A98C83AC41F7099D67007EA5 "
  60. "cert=xpmQtKUqQ/6v5X7ijgYE/f03+l2/EuQ1dexjyUhh16wQlu/"
  61. "cpXUGalmhDIlhuiQPNEKmKw iat-mode=0");
  62. char *bridge3 = tor_strdup("banana 5.5.5.5:5555 "
  63. "9D6AE1BD4FDF39721CE908966E79E16F9BFCCF2F");
  64. char *bridge4 = tor_strdup("obfs4 1.2.3.4:1234 "
  65. "foo=abcdefghijklmnopqrstuvwxyz");
  66. char *bridge5 = tor_strdup("apple 4.4.4.4:4444 "
  67. "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA "
  68. "foo=abcdefghijklmnopqrstuvwxyz");
  69. char *bridge6 = tor_strdup("[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:6666");
  70. mark_bridge_list();
  71. #define ADD_BRIDGE(bridge) \
  72. bridge_line_t *bridge_line_ ##bridge = parse_bridge_line(bridge); \
  73. if (!bridge_line_ ##bridge) { \
  74. printf("Unparseable bridge line: '%s'", #bridge); \
  75. } else { \
  76. bridge_add_from_config(bridge_line_ ##bridge); \
  77. } \
  78. tor_free(bridge);
  79. ADD_BRIDGE(bridge0);
  80. ADD_BRIDGE(bridge1);
  81. ADD_BRIDGE(bridge2);
  82. ADD_BRIDGE(bridge3);
  83. ADD_BRIDGE(bridge4);
  84. ADD_BRIDGE(bridge5);
  85. ADD_BRIDGE(bridge6);
  86. #undef ADD_BRIDGES
  87. sweep_bridge_list();
  88. }
  89. /**
  90. * Make sure our test helper works too.
  91. */
  92. static void
  93. test_bridges_helper_func_add_bridges_to_bridgelist(void *arg)
  94. {
  95. helper_add_bridges_to_bridgelist(arg);
  96. tt_finished();
  97. done:
  98. mark_bridge_list();
  99. sweep_bridge_list();
  100. }
  101. /**
  102. * Calling bridge_list_get() should create a new bridgelist if we
  103. * didn't have one before.
  104. */
  105. static void
  106. test_bridges_bridge_list_get_creates_new_bridgelist(void *arg)
  107. {
  108. const smartlist_t *bridgelist = bridge_list_get();
  109. (void)arg;
  110. tt_ptr_op(bridgelist, OP_NE, NULL);
  111. done:
  112. return;
  113. }
  114. /**
  115. * Calling clear_bridge_list() should remove all bridges from the bridgelist.
  116. */
  117. static void
  118. test_bridges_clear_bridge_list(void *arg)
  119. {
  120. const smartlist_t *bridgelist;
  121. const smartlist_t *bridgelist_after;
  122. const bridge_info_t *bridge;
  123. helper_add_bridges_to_bridgelist(arg);
  124. bridgelist = bridge_list_get();
  125. tt_ptr_op(bridgelist, OP_NE, NULL);
  126. bridge = smartlist_get(bridgelist, 0);
  127. tt_ptr_op(bridge, OP_NE, NULL);
  128. clear_bridge_list();
  129. bridgelist_after = bridge_list_get();
  130. tt_ptr_op(bridgelist_after, OP_NE, NULL);
  131. tt_int_op(smartlist_len(bridgelist_after), OP_EQ, 0);
  132. done:
  133. return;
  134. }
  135. /**
  136. * Calling bridge_get_addrport() should give me the address and port
  137. * of the bridge. In this case, we sort the smartlist of bridges on
  138. * fingerprints and choose the first one.
  139. */
  140. static void
  141. test_bridges_bridge_get_addrport(void *arg)
  142. {
  143. smartlist_t *bridgelist;
  144. const bridge_info_t *bridge;
  145. const tor_addr_port_t *addrport;
  146. helper_add_bridges_to_bridgelist(arg);
  147. bridgelist = (smartlist_t*)bridge_list_get();
  148. tt_ptr_op(bridgelist, OP_NE, NULL);
  149. // This should be the bridge at 6.6.6.6:6666 with fingerprint
  150. // 0000000000000000000000000000000000000000
  151. bridge = smartlist_get(bridgelist, 0);
  152. tt_ptr_op(bridge, OP_NE, NULL);
  153. addrport = bridge_get_addr_port(bridge);
  154. tt_int_op(addrport->port, OP_EQ, 6666);
  155. done:
  156. mark_bridge_list();
  157. sweep_bridge_list();
  158. }
  159. /**
  160. * Calling get_configured_bridge_by_orports_digest() with two
  161. * configured bridge orports and an invalid digest should return the
  162. * bridge of the first addrport in the list.
  163. */
  164. static void
  165. test_bridges_get_configured_bridge_by_orports_digest(void *arg)
  166. {
  167. smartlist_t *orports = NULL;
  168. const smartlist_t *bridgelist;
  169. const bridge_info_t *bridge1;
  170. const bridge_info_t *bridge2;
  171. const bridge_info_t *ret;
  172. tor_addr_port_t *addrport1;
  173. tor_addr_port_t *addrport2;
  174. const char *digest;
  175. helper_add_bridges_to_bridgelist(arg);
  176. bridgelist = bridge_list_get();
  177. tt_ptr_op(bridgelist, OP_NE, NULL);
  178. // This should be the bridge at 6.6.6.6:6666 with fingerprint
  179. // 0000000000000000000000000000000000000000
  180. bridge1 = smartlist_get(bridgelist, 0);
  181. tt_ptr_op(bridge1, OP_NE, NULL);
  182. // This should be the bridge at 6.6.6.7:6667 with fingerprint
  183. // A10C4F666D27364036B562823E5830BC448E046A
  184. bridge2 = smartlist_get(bridgelist, 1);
  185. tt_ptr_op(bridge2, OP_NE, NULL);
  186. addrport1 = (tor_addr_port_t*)bridge_get_addr_port(bridge1);
  187. tt_int_op(addrport1->port, OP_EQ, 6666);
  188. addrport2 = (tor_addr_port_t*)bridge_get_addr_port(bridge2);
  189. tt_int_op(addrport2->port, OP_EQ, 6667);
  190. orports = smartlist_new();
  191. smartlist_add(orports, addrport1);
  192. smartlist_add(orports, addrport2);
  193. digest = "zzzzzzzzzzzzzzzz";
  194. ret = get_configured_bridge_by_orports_digest(digest, orports);
  195. tt_ptr_op(ret, OP_NE, NULL);
  196. tt_assert(tor_addr_port_eq(addrport1, bridge_get_addr_port(ret)));
  197. done:
  198. smartlist_free(orports);
  199. mark_bridge_list();
  200. sweep_bridge_list();
  201. }
  202. /**
  203. * Calling get_configured_bridge_by_addr_port_digest() with a digest that we do
  204. * have and an addr:port pair we don't should return the bridge for that
  205. * digest.
  206. */
  207. static void
  208. test_bridges_get_configured_bridge_by_addr_port_digest_digest_only(void *arg)
  209. {
  210. char digest[DIGEST_LEN];
  211. bridge_info_t *bridge;
  212. const char fingerprint[HEX_DIGEST_LEN] =
  213. "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
  214. tor_addr_t *addr = tor_malloc(sizeof(tor_addr_t));
  215. char ret_addr[16];
  216. uint16_t port = 11111;
  217. int ret;
  218. helper_add_bridges_to_bridgelist(arg);
  219. // We don't actually have a bridge with this addr:port pair
  220. base16_decode(digest, DIGEST_LEN, fingerprint, HEX_DIGEST_LEN);
  221. ret = tor_addr_parse(addr, "111.111.111.111");
  222. tt_int_op(ret, OP_EQ, 2); // it returns the address family on success
  223. bridge = get_configured_bridge_by_addr_port_digest(addr, port, digest);
  224. tt_ptr_op(bridge, OP_NE, NULL);
  225. tor_addr_to_str(ret_addr, &bridge_get_addr_port(bridge)->addr, 16, 0);
  226. tt_str_op("4.4.4.4", OP_EQ, ret_addr);
  227. done:
  228. tor_free(addr);
  229. mark_bridge_list();
  230. sweep_bridge_list();
  231. }
  232. /**
  233. * Calling get_configured_bridge_by_addr_port_digest() with only an
  234. * addr:port (i.e. digest set to NULL) should return the bridge for
  235. * that digest when there is such a bridge.
  236. */
  237. static void
  238. test_bridges_get_configured_bridge_by_addr_port_digest_address_only(void *arg)
  239. {
  240. bridge_info_t *bridge;
  241. tor_addr_t *addr = tor_malloc(sizeof(tor_addr_t));
  242. char ret_addr[16];
  243. uint16_t port = 6666;
  244. int ret;
  245. helper_add_bridges_to_bridgelist(arg);
  246. ret = tor_addr_parse(addr, "6.6.6.6");
  247. tt_int_op(ret, OP_EQ, 2); // it returns the address family on success
  248. bridge = get_configured_bridge_by_addr_port_digest(addr, port, NULL);
  249. tt_ptr_op(bridge, OP_NE, NULL);
  250. tor_addr_to_str(ret_addr, &bridge_get_addr_port(bridge)->addr, 16, 0);
  251. tt_str_op("6.6.6.6", OP_EQ, ret_addr);
  252. done:
  253. tor_free(addr);
  254. mark_bridge_list();
  255. sweep_bridge_list();
  256. }
  257. /**
  258. * Calling get_configured_bridge_by_exact_addr_port_digest() with a digest that
  259. * we do have, and an addr:port pair we don't have, should return NULL.
  260. */
  261. static void
  262. test_bridges_get_configured_bridge_by_exact_addr_port_digest_donly(void *arg)
  263. {
  264. char digest[DIGEST_LEN];
  265. bridge_info_t *bridge;
  266. const char fingerprint[HEX_DIGEST_LEN] =
  267. "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
  268. tor_addr_t *addr = tor_malloc(sizeof(tor_addr_t));
  269. uint16_t port = 11111;
  270. int ret;
  271. helper_add_bridges_to_bridgelist(arg);
  272. // We don't actually have a bridge with this addr:port pair
  273. base16_decode(digest, DIGEST_LEN, fingerprint, HEX_DIGEST_LEN);
  274. ret = tor_addr_parse(addr, "111.111.111.111");
  275. tt_int_op(ret, OP_EQ, 2); // it returns the address family on success
  276. bridge = get_configured_bridge_by_exact_addr_port_digest(addr, port, digest);
  277. tt_ptr_op(bridge, OP_EQ, NULL);
  278. done:
  279. tor_free(addr);
  280. mark_bridge_list();
  281. sweep_bridge_list();
  282. }
  283. /**
  284. * Calling get_configured_bridge_by_exact_addr_port_digest() with a digest that
  285. * we do have, and an addr:port pair we do have, should return the bridge.
  286. */
  287. static void
  288. test_bridges_get_configured_bridge_by_exact_addr_port_digest_both(void *arg)
  289. {
  290. char digest[DIGEST_LEN];
  291. bridge_info_t *bridge;
  292. const char fingerprint[HEX_DIGEST_LEN] =
  293. "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
  294. tor_addr_t *addr = tor_malloc(sizeof(tor_addr_t));
  295. uint16_t port = 4444;
  296. char ret_addr[16];
  297. int ret;
  298. helper_add_bridges_to_bridgelist(arg);
  299. base16_decode(digest, DIGEST_LEN, fingerprint, HEX_DIGEST_LEN);
  300. ret = tor_addr_parse(addr, "4.4.4.4");
  301. tt_int_op(ret, OP_EQ, 2); // it returns the address family on success
  302. bridge = get_configured_bridge_by_exact_addr_port_digest(addr, port, digest);
  303. tt_ptr_op(bridge, OP_NE, NULL);
  304. tor_addr_to_str(ret_addr, &bridge_get_addr_port(bridge)->addr, 16, 0);
  305. tt_str_op("4.4.4.4", OP_EQ, ret_addr);
  306. done:
  307. tor_free(addr);
  308. mark_bridge_list();
  309. sweep_bridge_list();
  310. }
  311. /**
  312. * Calling get_configured_bridge_by_exact_addr_port_digest() with no digest,
  313. * and an addr:port pair we do have, should return the bridge.
  314. */
  315. static void
  316. test_bridges_get_configured_bridge_by_exact_addr_port_digest_aonly(void *arg)
  317. {
  318. bridge_info_t *bridge;
  319. tor_addr_t *addr = tor_malloc(sizeof(tor_addr_t));
  320. uint16_t port = 4444;
  321. char ret_addr[16];
  322. int ret;
  323. helper_add_bridges_to_bridgelist(arg);
  324. ret = tor_addr_parse(addr, "4.4.4.4");
  325. tt_int_op(ret, OP_EQ, 2); // it returns the address family on success
  326. bridge = get_configured_bridge_by_exact_addr_port_digest(addr, port, NULL);
  327. tt_ptr_op(bridge, OP_NE, NULL);
  328. tor_addr_to_str(ret_addr, &bridge_get_addr_port(bridge)->addr, 16, 0);
  329. tt_str_op("4.4.4.4", OP_EQ, ret_addr);
  330. done:
  331. tor_free(addr);
  332. mark_bridge_list();
  333. sweep_bridge_list();
  334. }
  335. /**
  336. * Calling find_bridge_by_digest() when we have a bridge with a known
  337. * identity digest should return the bridge's information.
  338. */
  339. static void
  340. test_bridges_find_bridge_by_digest_known(void *arg)
  341. {
  342. char digest1[DIGEST_LEN];
  343. bridge_info_t *bridge;
  344. const char fingerprint[HEX_DIGEST_LEN] =
  345. "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
  346. helper_add_bridges_to_bridgelist(arg);
  347. base16_decode(digest1, DIGEST_LEN, fingerprint, HEX_DIGEST_LEN);
  348. bridge = find_bridge_by_digest(digest1);
  349. tt_ptr_op(bridge, OP_NE, NULL);
  350. /* We have to call bridge_get_rsa_id_digest() here because the bridge_info_t
  351. * struct is opaquely defined in bridges.h. */
  352. const uint8_t *digest2 = bridge_get_rsa_id_digest(bridge);
  353. tt_mem_op((char*)digest2, OP_EQ, digest1, DIGEST_LEN);
  354. done:
  355. mark_bridge_list();
  356. sweep_bridge_list();
  357. }
  358. /**
  359. * Calling find_bridge_by_digest() when we do NOT have a bridge with that
  360. * identity digest should return NULL.
  361. */
  362. static void
  363. test_bridges_find_bridge_by_digest_unknown(void *arg)
  364. {
  365. const char *fingerprint = "cccccccccccccccccccccccccccccccccccccccc";
  366. bridge_info_t *bridge;
  367. helper_add_bridges_to_bridgelist(arg);
  368. bridge = find_bridge_by_digest(fingerprint);
  369. tt_ptr_op(bridge, OP_EQ, NULL);
  370. done:
  371. mark_bridge_list();
  372. sweep_bridge_list();
  373. }
  374. /**
  375. * Calling bridge_resolve_conflicts() with an identical bridge to one we've
  376. * already configure should mark the pre-configured bridge for removal.
  377. */
  378. static void
  379. test_bridges_bridge_resolve_conflicts(void *arg)
  380. {
  381. tor_addr_t *addr = tor_malloc(sizeof(tor_addr_t));
  382. uint16_t port = 4444;
  383. const char *digest = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
  384. const char *transport = "apple";
  385. int ret;
  386. helper_add_bridges_to_bridgelist(arg);
  387. ret = tor_addr_parse(addr, "4.4.4.4");
  388. tt_int_op(ret, OP_EQ, 2); // it returns the address family on success
  389. bridge_resolve_conflicts((const tor_addr_t*)addr, port, digest, transport);
  390. /* The bridge should now be marked for removal, and removed when we sweep the
  391. * bridge_list */
  392. sweep_bridge_list();
  393. ret = addr_is_a_configured_bridge((const tor_addr_t*)addr, port, digest);
  394. tt_int_op(ret, OP_EQ, 0);
  395. done:
  396. tor_free(addr);
  397. mark_bridge_list();
  398. sweep_bridge_list();
  399. }
  400. /**
  401. * Calling transport_is_needed() with a transport we do need ("obfs4") and a
  402. * bogus transport that we don't need should return 1 and 0, respectively.
  403. */
  404. static void
  405. test_bridges_transport_is_needed(void *arg)
  406. {
  407. int ret;
  408. helper_add_bridges_to_bridgelist(arg);
  409. ret = transport_is_needed("obfs4");
  410. tt_int_op(ret, OP_EQ, 1);
  411. ret = transport_is_needed("apowefjaoewpaief");
  412. tt_int_op(ret, OP_EQ, 0);
  413. done:
  414. mark_bridge_list();
  415. sweep_bridge_list();
  416. }
  417. /**
  418. * Calling get_transport_by_bridge_addrport() with the address and port of a
  419. * configured bridge which uses a pluggable transport when there is no global
  420. * transport_list should return -1 and the transport_t should be NULL.
  421. */
  422. static void
  423. test_bridges_get_transport_by_bridge_addrport_no_ptlist(void *arg)
  424. {
  425. transport_t *transport = NULL;
  426. tor_addr_t *addr = tor_malloc(sizeof(tor_addr_t));
  427. uint16_t port = 1234;
  428. int ret;
  429. helper_add_bridges_to_bridgelist(arg);
  430. ret = tor_addr_parse(addr, "1.2.3.4");
  431. tt_int_op(ret, OP_EQ, 2); // it returns the address family on success?
  432. /* This will fail because the global transport_list has nothing in it, and so
  433. * transport_get_by_name() has nothing to return, even the the bridge *did*
  434. * say it had an obfs4 transport.
  435. */
  436. ret = get_transport_by_bridge_addrport((const tor_addr_t*)addr, port,
  437. (const transport_t**)&transport);
  438. tt_int_op(ret, OP_EQ, -1); // returns -1 on failure
  439. tt_ptr_op(transport, OP_EQ, NULL);
  440. done:
  441. tor_free(addr);
  442. mark_bridge_list();
  443. sweep_bridge_list();
  444. }
  445. #define PT_PRIVATE
  446. /**
  447. * Calling get_transport_by_bridge_addrport() with the address and port of a
  448. * configured bridge which uses a pluggable transport should return 0 and set
  449. * appropriate transport_t.
  450. */
  451. static void
  452. test_bridges_get_transport_by_bridge_addrport(void *arg)
  453. {
  454. transport_t *transport = NULL;
  455. tor_addr_t *addr = tor_malloc(sizeof(tor_addr_t));
  456. uint16_t port = 1234;
  457. int ret;
  458. helper_add_bridges_to_bridgelist(arg);
  459. mark_transport_list(); // Also initialise our transport_list
  460. ret = tor_addr_parse(addr, "1.2.3.4");
  461. tt_int_op(ret, OP_EQ, 2); // it returns the address family on success?
  462. /* After we mock transport_get_by_name() to return a bogus transport_t with
  463. * the name it was asked for, the call should succeed.
  464. */
  465. MOCK(transport_get_by_name, mock_transport_get_by_name);
  466. ret = get_transport_by_bridge_addrport((const tor_addr_t*)addr, port,
  467. (const transport_t**)&transport);
  468. tt_int_op(ret, OP_EQ, 0); // returns 0 on success
  469. tt_ptr_op(transport, OP_NE, NULL);
  470. tt_str_op(transport->name, OP_EQ, "obfs4");
  471. done:
  472. UNMOCK(transport_get_by_name);
  473. tor_free(addr);
  474. transport_free(transport);
  475. mark_bridge_list();
  476. sweep_bridge_list();
  477. }
  478. static void
  479. test_bridges_node_is_a_configured_bridge(void *arg)
  480. {
  481. routerinfo_t ri_ipv4 = { .addr = 0x06060606, .or_port = 6666 };
  482. routerstatus_t rs_ipv4 = { .addr = 0x06060606, .or_port = 6666 };
  483. routerinfo_t ri_ipv6 = { .ipv6_orport = 6666 };
  484. tor_addr_parse(&(ri_ipv6.ipv6_addr),
  485. "2001:0db8:85a3:0000:0000:8a2e:0370:7334");
  486. routerstatus_t rs_ipv6 = { .ipv6_orport = 6666 };
  487. tor_addr_parse(&(rs_ipv6.ipv6_addr),
  488. "2001:0db8:85a3:0000:0000:8a2e:0370:7334");
  489. microdesc_t md_ipv6 = { .ipv6_orport = 6666 };
  490. tor_addr_parse(&(md_ipv6.ipv6_addr),
  491. "2001:0db8:85a3:0000:0000:8a2e:0370:7334");
  492. helper_add_bridges_to_bridgelist(arg);
  493. node_t node_with_digest;
  494. memset(&node_with_digest, 0, sizeof(node_with_digest));
  495. const char fingerprint[HEX_DIGEST_LEN] =
  496. "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
  497. const char fingerprint2[HEX_DIGEST_LEN] =
  498. "ffffffffffffffffffffffffffffffffffffffff";
  499. base16_decode(node_with_digest.identity, DIGEST_LEN,
  500. fingerprint, HEX_DIGEST_LEN);
  501. node_t node_ri_ipv4 = { .ri = &ri_ipv4 };
  502. base16_decode(node_ri_ipv4.identity, DIGEST_LEN,
  503. fingerprint2, HEX_DIGEST_LEN);
  504. tt_assert(node_is_a_configured_bridge(&node_ri_ipv4));
  505. /* This will still match bridge0, since bridge0 has no digest set. */
  506. memset(node_ri_ipv4.identity, 0x3f, DIGEST_LEN);
  507. tt_assert(node_is_a_configured_bridge(&node_ri_ipv4));
  508. /* It won't match bridge1, though, since bridge1 has a digest, and this
  509. isn't it! */
  510. node_ri_ipv4.ri->addr = 0x06060607;
  511. node_ri_ipv4.ri->or_port = 6667;
  512. tt_assert(! node_is_a_configured_bridge(&node_ri_ipv4));
  513. /* If we set the fingerprint right, though, it will match. */
  514. base16_decode(node_ri_ipv4.identity, DIGEST_LEN,
  515. "A10C4F666D27364036B562823E5830BC448E046A", HEX_DIGEST_LEN);
  516. tt_assert(node_is_a_configured_bridge(&node_ri_ipv4));
  517. node_t node_rs_ipv4 = { .rs = &rs_ipv4 };
  518. base16_decode(node_rs_ipv4.identity, DIGEST_LEN,
  519. fingerprint2, HEX_DIGEST_LEN);
  520. tt_assert(node_is_a_configured_bridge(&node_rs_ipv4));
  521. node_t node_ri_ipv6 = { .ri = &ri_ipv6 };
  522. base16_decode(node_ri_ipv6.identity, DIGEST_LEN,
  523. fingerprint2, HEX_DIGEST_LEN);
  524. tt_assert(node_is_a_configured_bridge(&node_ri_ipv6));
  525. node_t node_rs_ipv6 = { .rs = &rs_ipv6 };
  526. base16_decode(node_rs_ipv6.identity, DIGEST_LEN,
  527. fingerprint2, HEX_DIGEST_LEN);
  528. tt_assert(node_is_a_configured_bridge(&node_rs_ipv6));
  529. node_t node_md_ipv6 = { .md = &md_ipv6 };
  530. base16_decode(node_md_ipv6.identity, DIGEST_LEN,
  531. fingerprint2, HEX_DIGEST_LEN);
  532. tt_assert(node_is_a_configured_bridge(&node_md_ipv6));
  533. mark_bridge_list();
  534. sweep_bridge_list();
  535. tt_assert(!node_is_a_configured_bridge(&node_with_digest));
  536. tt_assert(!node_is_a_configured_bridge(&node_ri_ipv4));
  537. tt_assert(!node_is_a_configured_bridge(&node_ri_ipv6));
  538. tt_assert(!node_is_a_configured_bridge(&node_rs_ipv4));
  539. tt_assert(!node_is_a_configured_bridge(&node_rs_ipv6));
  540. tt_assert(!node_is_a_configured_bridge(&node_md_ipv6));
  541. done:
  542. mark_bridge_list();
  543. sweep_bridge_list();
  544. }
  545. #undef PT_PRIVATE /* defined(PT_PRIVATE) */
  546. #define B_TEST(name, flags) \
  547. { #name, test_bridges_ ##name, (flags), NULL, NULL }
  548. struct testcase_t bridges_tests[] = {
  549. B_TEST(helper_func_add_bridges_to_bridgelist, 0),
  550. B_TEST(bridge_list_get_creates_new_bridgelist, 0),
  551. B_TEST(clear_bridge_list, 0),
  552. B_TEST(bridge_get_addrport, 0),
  553. B_TEST(get_configured_bridge_by_orports_digest, 0),
  554. B_TEST(get_configured_bridge_by_addr_port_digest_digest_only, 0),
  555. B_TEST(get_configured_bridge_by_addr_port_digest_address_only, 0),
  556. B_TEST(get_configured_bridge_by_exact_addr_port_digest_donly, 0),
  557. B_TEST(get_configured_bridge_by_exact_addr_port_digest_both, 0),
  558. B_TEST(get_configured_bridge_by_exact_addr_port_digest_aonly, 0),
  559. B_TEST(find_bridge_by_digest_known, 0),
  560. B_TEST(find_bridge_by_digest_unknown, 0),
  561. B_TEST(bridge_resolve_conflicts, 0),
  562. B_TEST(get_transport_by_bridge_addrport_no_ptlist, 0),
  563. B_TEST(get_transport_by_bridge_addrport, 0),
  564. B_TEST(transport_is_needed, 0),
  565. B_TEST(node_is_a_configured_bridge, 0),
  566. END_OF_TESTCASES
  567. };