test_bridges.c 17 KB

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