test_bridges.c 17 KB

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