test_bridges.c 17 KB

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