1 /* Copyright (c) 2018, The Tor Project, Inc. */
2 /* See LICENSE for licensing information */
6 * \brief Unittests for code in bridges.c
9 #define TOR_BRIDGES_PRIVATE
10 #define PT_PRIVATE /* Only needed for the mock_* items below */
14 #include "core/or/or.h"
15 #include "lib/net/address.h"
16 #include "feature/client/bridges.h"
17 #include "app/config/config.h"
18 #include "feature/client/transports.h"
19 #include "feature/nodelist/node_st.h"
20 #include "feature/nodelist/routerinfo_st.h"
21 #include "feature/nodelist/routerstatus_st.h"
22 #include "feature/nodelist/microdesc_st.h"
24 /* Test suite stuff */
25 #include "test/test.h"
28 * A mocked transport_t, constructed via mock_transport_get_by_name().
30 static transport_t
*mock_transport
= NULL
;
33 * Mock transport_get_by_name() to simply return a transport_t for the
34 * transport name that was input to it.
37 mock_transport_get_by_name(const char *name
)
39 tor_addr_t
*addr
= tor_malloc(sizeof(tor_addr_t
));
42 char *args
= tor_strdup("foo=bar");
44 if (!mock_transport
) {
45 tor_addr_parse(addr
, "99.99.99.99");
46 mock_transport
= transport_new(addr
, port
, name
, socksv
, args
);
52 return mock_transport
;
55 #undef PT_PRIVATE /* defined(PT_PRIVATE) */
58 * Test helper: Add a variety of bridges to our global bridgelist.
61 helper_add_bridges_to_bridgelist(void *arg
)
63 /* Note: the two bridges which do not have specified fingerprints will be
64 * internally stored as both having the same fingerprint of all-zero bytes.
68 char *bridge0
= tor_strdup("6.6.6.6:6666");
69 char *bridge1
= tor_strdup("6.6.6.7:6667 "
70 "A10C4F666D27364036B562823E5830BC448E046A");
71 char *bridge2
= tor_strdup("obfs4 198.245.60.51:443 "
72 "752CF7825B3B9EA6A98C83AC41F7099D67007EA5 "
73 "cert=xpmQtKUqQ/6v5X7ijgYE/f03+l2/EuQ1dexjyUhh16wQlu/"
74 "cpXUGalmhDIlhuiQPNEKmKw iat-mode=0");
75 char *bridge3
= tor_strdup("banana 5.5.5.5:5555 "
76 "9D6AE1BD4FDF39721CE908966E79E16F9BFCCF2F");
77 char *bridge4
= tor_strdup("obfs4 1.2.3.4:1234 "
78 "foo=abcdefghijklmnopqrstuvwxyz");
79 char *bridge5
= tor_strdup("apple 4.4.4.4:4444 "
80 "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA "
81 "foo=abcdefghijklmnopqrstuvwxyz");
82 char *bridge6
= tor_strdup("[2001:0db8:85a3:0000:0000:8a2e:0370:7334]:6666");
86 #define ADD_BRIDGE(bridge) \
87 bridge_line_t *bridge_line_ ##bridge = parse_bridge_line(bridge); \
88 if (!bridge_line_ ##bridge) { \
89 printf("Unparseable bridge line: '%s'", #bridge); \
91 bridge_add_from_config(bridge_line_ ##bridge); \
108 * Make sure our test helper works too.
111 test_bridges_helper_func_add_bridges_to_bridgelist(void *arg
)
113 helper_add_bridges_to_bridgelist(arg
);
122 * Calling bridge_list_get() should create a new bridgelist if we
123 * didn't have one before.
126 test_bridges_bridge_list_get_creates_new_bridgelist(void *arg
)
128 const smartlist_t
*bridgelist
= bridge_list_get();
132 tt_ptr_op(bridgelist
, OP_NE
, NULL
);
139 * Calling clear_bridge_list() should remove all bridges from the bridgelist.
142 test_bridges_clear_bridge_list(void *arg
)
144 const smartlist_t
*bridgelist
;
145 const smartlist_t
*bridgelist_after
;
146 const bridge_info_t
*bridge
;
148 helper_add_bridges_to_bridgelist(arg
);
149 bridgelist
= bridge_list_get();
150 tt_ptr_op(bridgelist
, OP_NE
, NULL
);
152 bridge
= smartlist_get(bridgelist
, 0);
153 tt_ptr_op(bridge
, OP_NE
, NULL
);
156 bridgelist_after
= bridge_list_get();
157 tt_ptr_op(bridgelist_after
, OP_NE
, NULL
);
158 tt_int_op(smartlist_len(bridgelist_after
), OP_EQ
, 0);
165 * Calling bridge_get_addrport() should give me the address and port
166 * of the bridge. In this case, we sort the smartlist of bridges on
167 * fingerprints and choose the first one.
170 test_bridges_bridge_get_addrport(void *arg
)
172 smartlist_t
*bridgelist
;
173 const bridge_info_t
*bridge
;
174 const tor_addr_port_t
*addrport
;
176 helper_add_bridges_to_bridgelist(arg
);
177 bridgelist
= (smartlist_t
*)bridge_list_get();
178 tt_ptr_op(bridgelist
, OP_NE
, NULL
);
180 // This should be the bridge at 6.6.6.6:6666 with fingerprint
181 // 0000000000000000000000000000000000000000
182 bridge
= smartlist_get(bridgelist
, 0);
183 tt_ptr_op(bridge
, OP_NE
, NULL
);
185 addrport
= bridge_get_addr_port(bridge
);
186 tt_int_op(addrport
->port
, OP_EQ
, 6666);
194 * Calling get_configured_bridge_by_orports_digest() with two
195 * configured bridge orports and an invalid digest should return the
196 * bridge of the first addrport in the list.
199 test_bridges_get_configured_bridge_by_orports_digest(void *arg
)
201 smartlist_t
*orports
= NULL
;
202 const smartlist_t
*bridgelist
;
203 const bridge_info_t
*bridge1
;
204 const bridge_info_t
*bridge2
;
205 const bridge_info_t
*ret
;
206 tor_addr_port_t
*addrport1
;
207 tor_addr_port_t
*addrport2
;
210 helper_add_bridges_to_bridgelist(arg
);
211 bridgelist
= bridge_list_get();
212 tt_ptr_op(bridgelist
, OP_NE
, NULL
);
214 // This should be the bridge at 6.6.6.6:6666 with fingerprint
215 // 0000000000000000000000000000000000000000
216 bridge1
= smartlist_get(bridgelist
, 0);
217 tt_ptr_op(bridge1
, OP_NE
, NULL
);
218 // This should be the bridge at 6.6.6.7:6667 with fingerprint
219 // A10C4F666D27364036B562823E5830BC448E046A
220 bridge2
= smartlist_get(bridgelist
, 1);
221 tt_ptr_op(bridge2
, OP_NE
, NULL
);
223 addrport1
= (tor_addr_port_t
*)bridge_get_addr_port(bridge1
);
224 tt_int_op(addrport1
->port
, OP_EQ
, 6666);
225 addrport2
= (tor_addr_port_t
*)bridge_get_addr_port(bridge2
);
226 tt_int_op(addrport2
->port
, OP_EQ
, 6667);
228 orports
= smartlist_new();
229 smartlist_add(orports
, addrport1
);
230 smartlist_add(orports
, addrport2
);
232 digest
= "zzzzzzzzzzzzzzzz";
234 ret
= get_configured_bridge_by_orports_digest(digest
, orports
);
235 tt_ptr_op(ret
, OP_NE
, NULL
);
237 tt_assert(tor_addr_port_eq(addrport1
, bridge_get_addr_port(ret
)));
240 smartlist_free(orports
);
247 * Calling get_configured_bridge_by_addr_port_digest() with a digest that we do
248 * have and an addr:port pair we don't should return the bridge for that
252 test_bridges_get_configured_bridge_by_addr_port_digest_digest_only(void *arg
)
254 char digest
[DIGEST_LEN
];
255 bridge_info_t
*bridge
;
256 const char fingerprint
[HEX_DIGEST_LEN
] =
257 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
258 tor_addr_t
*addr
= tor_malloc(sizeof(tor_addr_t
));
260 uint16_t port
= 11111;
263 helper_add_bridges_to_bridgelist(arg
);
265 // We don't actually have a bridge with this addr:port pair
266 base16_decode(digest
, DIGEST_LEN
, fingerprint
, HEX_DIGEST_LEN
);
267 ret
= tor_addr_parse(addr
, "111.111.111.111");
268 tt_int_op(ret
, OP_EQ
, 2); // it returns the address family on success
270 bridge
= get_configured_bridge_by_addr_port_digest(addr
, port
, digest
);
271 tt_ptr_op(bridge
, OP_NE
, NULL
);
273 tor_addr_to_str(ret_addr
, &bridge_get_addr_port(bridge
)->addr
, 16, 0);
274 tt_str_op("4.4.4.4", OP_EQ
, ret_addr
);
284 * Calling get_configured_bridge_by_addr_port_digest() with only an
285 * addr:port (i.e. digest set to NULL) should return the bridge for
286 * that digest when there is such a bridge.
289 test_bridges_get_configured_bridge_by_addr_port_digest_address_only(void *arg
)
291 bridge_info_t
*bridge
;
292 tor_addr_t
*addr
= tor_malloc(sizeof(tor_addr_t
));
294 uint16_t port
= 6666;
297 helper_add_bridges_to_bridgelist(arg
);
299 ret
= tor_addr_parse(addr
, "6.6.6.6");
300 tt_int_op(ret
, OP_EQ
, 2); // it returns the address family on success
302 bridge
= get_configured_bridge_by_addr_port_digest(addr
, port
, NULL
);
303 tt_ptr_op(bridge
, OP_NE
, NULL
);
305 tor_addr_to_str(ret_addr
, &bridge_get_addr_port(bridge
)->addr
, 16, 0);
306 tt_str_op("6.6.6.6", OP_EQ
, ret_addr
);
316 * Calling get_configured_bridge_by_exact_addr_port_digest() with a digest that
317 * we do have, and an addr:port pair we don't have, should return NULL.
320 test_bridges_get_configured_bridge_by_exact_addr_port_digest_donly(void *arg
)
322 char digest
[DIGEST_LEN
];
323 bridge_info_t
*bridge
;
324 const char fingerprint
[HEX_DIGEST_LEN
] =
325 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
326 tor_addr_t
*addr
= tor_malloc(sizeof(tor_addr_t
));
327 uint16_t port
= 11111;
330 helper_add_bridges_to_bridgelist(arg
);
332 // We don't actually have a bridge with this addr:port pair
333 base16_decode(digest
, DIGEST_LEN
, fingerprint
, HEX_DIGEST_LEN
);
334 ret
= tor_addr_parse(addr
, "111.111.111.111");
335 tt_int_op(ret
, OP_EQ
, 2); // it returns the address family on success
337 bridge
= get_configured_bridge_by_exact_addr_port_digest(addr
, port
, digest
);
338 tt_ptr_op(bridge
, OP_EQ
, NULL
);
348 * Calling get_configured_bridge_by_exact_addr_port_digest() with a digest that
349 * we do have, and an addr:port pair we do have, should return the bridge.
352 test_bridges_get_configured_bridge_by_exact_addr_port_digest_both(void *arg
)
354 char digest
[DIGEST_LEN
];
355 bridge_info_t
*bridge
;
356 const char fingerprint
[HEX_DIGEST_LEN
] =
357 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
358 tor_addr_t
*addr
= tor_malloc(sizeof(tor_addr_t
));
359 uint16_t port
= 4444;
363 helper_add_bridges_to_bridgelist(arg
);
365 base16_decode(digest
, DIGEST_LEN
, fingerprint
, HEX_DIGEST_LEN
);
366 ret
= tor_addr_parse(addr
, "4.4.4.4");
367 tt_int_op(ret
, OP_EQ
, 2); // it returns the address family on success
369 bridge
= get_configured_bridge_by_exact_addr_port_digest(addr
, port
, digest
);
370 tt_ptr_op(bridge
, OP_NE
, NULL
);
372 tor_addr_to_str(ret_addr
, &bridge_get_addr_port(bridge
)->addr
, 16, 0);
373 tt_str_op("4.4.4.4", OP_EQ
, ret_addr
);
383 * Calling get_configured_bridge_by_exact_addr_port_digest() with no digest,
384 * and an addr:port pair we do have, should return the bridge.
387 test_bridges_get_configured_bridge_by_exact_addr_port_digest_aonly(void *arg
)
389 bridge_info_t
*bridge
;
390 tor_addr_t
*addr
= tor_malloc(sizeof(tor_addr_t
));
391 uint16_t port
= 4444;
395 helper_add_bridges_to_bridgelist(arg
);
397 ret
= tor_addr_parse(addr
, "4.4.4.4");
398 tt_int_op(ret
, OP_EQ
, 2); // it returns the address family on success
400 bridge
= get_configured_bridge_by_exact_addr_port_digest(addr
, port
, NULL
);
401 tt_ptr_op(bridge
, OP_NE
, NULL
);
403 tor_addr_to_str(ret_addr
, &bridge_get_addr_port(bridge
)->addr
, 16, 0);
404 tt_str_op("4.4.4.4", OP_EQ
, ret_addr
);
414 * Calling find_bridge_by_digest() when we have a bridge with a known
415 * identity digest should return the bridge's information.
418 test_bridges_find_bridge_by_digest_known(void *arg
)
420 char digest1
[DIGEST_LEN
];
421 bridge_info_t
*bridge
;
422 const char fingerprint
[HEX_DIGEST_LEN
] =
423 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
425 helper_add_bridges_to_bridgelist(arg
);
427 base16_decode(digest1
, DIGEST_LEN
, fingerprint
, HEX_DIGEST_LEN
);
428 bridge
= find_bridge_by_digest(digest1
);
430 tt_ptr_op(bridge
, OP_NE
, NULL
);
432 /* We have to call bridge_get_rsa_id_digest() here because the bridge_info_t
433 * struct is opaquely defined in bridges.h. */
434 const uint8_t *digest2
= bridge_get_rsa_id_digest(bridge
);
436 tt_mem_op((char*)digest2
, OP_EQ
, digest1
, DIGEST_LEN
);
444 * Calling find_bridge_by_digest() when we do NOT have a bridge with that
445 * identity digest should return NULL.
448 test_bridges_find_bridge_by_digest_unknown(void *arg
)
450 const char *fingerprint
= "cccccccccccccccccccccccccccccccccccccccc";
451 bridge_info_t
*bridge
;
453 helper_add_bridges_to_bridgelist(arg
);
455 bridge
= find_bridge_by_digest(fingerprint
);
457 tt_ptr_op(bridge
, OP_EQ
, NULL
);
465 * Calling bridge_resolve_conflicts() with an identical bridge to one we've
466 * already configure should mark the pre-configured bridge for removal.
469 test_bridges_bridge_resolve_conflicts(void *arg
)
471 tor_addr_t
*addr
= tor_malloc(sizeof(tor_addr_t
));
472 uint16_t port
= 4444;
473 const char *digest
= "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
474 const char *transport
= "apple";
477 helper_add_bridges_to_bridgelist(arg
);
479 ret
= tor_addr_parse(addr
, "4.4.4.4");
480 tt_int_op(ret
, OP_EQ
, 2); // it returns the address family on success
482 bridge_resolve_conflicts((const tor_addr_t
*)addr
, port
, digest
, transport
);
484 /* The bridge should now be marked for removal, and removed when we sweep the
487 ret
= addr_is_a_configured_bridge((const tor_addr_t
*)addr
, port
, digest
);
488 tt_int_op(ret
, OP_EQ
, 0);
498 * Calling transport_is_needed() with a transport we do need ("obfs4") and a
499 * bogus transport that we don't need should return 1 and 0, respectively.
502 test_bridges_transport_is_needed(void *arg
)
506 helper_add_bridges_to_bridgelist(arg
);
508 ret
= transport_is_needed("obfs4");
509 tt_int_op(ret
, OP_EQ
, 1);
511 ret
= transport_is_needed("apowefjaoewpaief");
512 tt_int_op(ret
, OP_EQ
, 0);
520 * Calling get_transport_by_bridge_addrport() with the address and port of a
521 * configured bridge which uses a pluggable transport when there is no global
522 * transport_list should return -1 and the transport_t should be NULL.
525 test_bridges_get_transport_by_bridge_addrport_no_ptlist(void *arg
)
527 transport_t
*transport
= NULL
;
528 tor_addr_t
*addr
= tor_malloc(sizeof(tor_addr_t
));
529 uint16_t port
= 1234;
532 helper_add_bridges_to_bridgelist(arg
);
534 ret
= tor_addr_parse(addr
, "1.2.3.4");
535 tt_int_op(ret
, OP_EQ
, 2); // it returns the address family on success?
537 /* This will fail because the global transport_list has nothing in it, and so
538 * transport_get_by_name() has nothing to return, even the the bridge *did*
539 * say it had an obfs4 transport.
541 ret
= get_transport_by_bridge_addrport((const tor_addr_t
*)addr
, port
,
542 (const transport_t
**)&transport
);
543 tt_int_op(ret
, OP_EQ
, -1); // returns -1 on failure
544 tt_ptr_op(transport
, OP_EQ
, NULL
);
556 * Calling get_transport_by_bridge_addrport() with the address and port of a
557 * configured bridge which uses a pluggable transport should return 0 and set
558 * appropriate transport_t.
561 test_bridges_get_transport_by_bridge_addrport(void *arg
)
563 transport_t
*transport
= NULL
;
564 tor_addr_t
*addr
= tor_malloc(sizeof(tor_addr_t
));
565 uint16_t port
= 1234;
568 helper_add_bridges_to_bridgelist(arg
);
569 mark_transport_list(); // Also initialise our transport_list
571 ret
= tor_addr_parse(addr
, "1.2.3.4");
572 tt_int_op(ret
, OP_EQ
, 2); // it returns the address family on success?
574 /* After we mock transport_get_by_name() to return a bogus transport_t with
575 * the name it was asked for, the call should succeed.
577 MOCK(transport_get_by_name
, mock_transport_get_by_name
);
578 ret
= get_transport_by_bridge_addrport((const tor_addr_t
*)addr
, port
,
579 (const transport_t
**)&transport
);
580 tt_int_op(ret
, OP_EQ
, 0); // returns 0 on success
581 tt_ptr_op(transport
, OP_NE
, NULL
);
582 tt_str_op(transport
->name
, OP_EQ
, "obfs4");
585 UNMOCK(transport_get_by_name
);
588 transport_free(transport
);
595 test_bridges_node_is_a_configured_bridge(void *arg
)
597 routerinfo_t ri_ipv4
= { .addr
= 0x06060606, .or_port
= 6666 };
598 routerstatus_t rs_ipv4
= { .addr
= 0x06060606, .or_port
= 6666 };
600 routerinfo_t ri_ipv6
= { .ipv6_orport
= 6666 };
601 tor_addr_parse(&(ri_ipv6
.ipv6_addr
),
602 "2001:0db8:85a3:0000:0000:8a2e:0370:7334");
604 routerstatus_t rs_ipv6
= { .ipv6_orport
= 6666 };
605 tor_addr_parse(&(rs_ipv6
.ipv6_addr
),
606 "2001:0db8:85a3:0000:0000:8a2e:0370:7334");
608 microdesc_t md_ipv6
= { .ipv6_orport
= 6666 };
609 tor_addr_parse(&(md_ipv6
.ipv6_addr
),
610 "2001:0db8:85a3:0000:0000:8a2e:0370:7334");
612 helper_add_bridges_to_bridgelist(arg
);
614 node_t node_with_digest
;
615 memset(&node_with_digest
, 0, sizeof(node_with_digest
));
617 const char fingerprint
[HEX_DIGEST_LEN
] =
618 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
620 const char fingerprint2
[HEX_DIGEST_LEN
] =
621 "ffffffffffffffffffffffffffffffffffffffff";
623 base16_decode(node_with_digest
.identity
, DIGEST_LEN
,
624 fingerprint
, HEX_DIGEST_LEN
);
626 node_t node_ri_ipv4
= { .ri
= &ri_ipv4
};
627 base16_decode(node_ri_ipv4
.identity
, DIGEST_LEN
,
628 fingerprint2
, HEX_DIGEST_LEN
);
629 tt_assert(node_is_a_configured_bridge(&node_ri_ipv4
));
631 /* This will still match bridge0, since bridge0 has no digest set. */
632 memset(node_ri_ipv4
.identity
, 0x3f, DIGEST_LEN
);
633 tt_assert(node_is_a_configured_bridge(&node_ri_ipv4
));
635 /* It won't match bridge1, though, since bridge1 has a digest, and this
637 node_ri_ipv4
.ri
->addr
= 0x06060607;
638 node_ri_ipv4
.ri
->or_port
= 6667;
639 tt_assert(! node_is_a_configured_bridge(&node_ri_ipv4
));
640 /* If we set the fingerprint right, though, it will match. */
641 base16_decode(node_ri_ipv4
.identity
, DIGEST_LEN
,
642 "A10C4F666D27364036B562823E5830BC448E046A", HEX_DIGEST_LEN
);
643 tt_assert(node_is_a_configured_bridge(&node_ri_ipv4
));
645 node_t node_rs_ipv4
= { .rs
= &rs_ipv4
};
646 base16_decode(node_rs_ipv4
.identity
, DIGEST_LEN
,
647 fingerprint2
, HEX_DIGEST_LEN
);
648 tt_assert(node_is_a_configured_bridge(&node_rs_ipv4
));
650 node_t node_ri_ipv6
= { .ri
= &ri_ipv6
};
651 base16_decode(node_ri_ipv6
.identity
, DIGEST_LEN
,
652 fingerprint2
, HEX_DIGEST_LEN
);
653 tt_assert(node_is_a_configured_bridge(&node_ri_ipv6
));
655 node_t node_rs_ipv6
= { .rs
= &rs_ipv6
};
656 base16_decode(node_rs_ipv6
.identity
, DIGEST_LEN
,
657 fingerprint2
, HEX_DIGEST_LEN
);
658 tt_assert(node_is_a_configured_bridge(&node_rs_ipv6
));
660 node_t node_md_ipv6
= { .md
= &md_ipv6
};
661 base16_decode(node_md_ipv6
.identity
, DIGEST_LEN
,
662 fingerprint2
, HEX_DIGEST_LEN
);
663 tt_assert(node_is_a_configured_bridge(&node_md_ipv6
));
668 tt_assert(!node_is_a_configured_bridge(&node_with_digest
));
669 tt_assert(!node_is_a_configured_bridge(&node_ri_ipv4
));
670 tt_assert(!node_is_a_configured_bridge(&node_ri_ipv6
));
671 tt_assert(!node_is_a_configured_bridge(&node_rs_ipv4
));
672 tt_assert(!node_is_a_configured_bridge(&node_rs_ipv6
));
673 tt_assert(!node_is_a_configured_bridge(&node_md_ipv6
));
680 #undef PT_PRIVATE /* defined(PT_PRIVATE) */
682 #define B_TEST(name, flags) \
683 { #name, test_bridges_ ##name, (flags), NULL, NULL }
685 struct testcase_t bridges_tests
[] = {
686 B_TEST(helper_func_add_bridges_to_bridgelist
, 0),
687 B_TEST(bridge_list_get_creates_new_bridgelist
, 0),
688 B_TEST(clear_bridge_list
, 0),
689 B_TEST(bridge_get_addrport
, 0),
690 B_TEST(get_configured_bridge_by_orports_digest
, 0),
691 B_TEST(get_configured_bridge_by_addr_port_digest_digest_only
, 0),
692 B_TEST(get_configured_bridge_by_addr_port_digest_address_only
, 0),
693 B_TEST(get_configured_bridge_by_exact_addr_port_digest_donly
, 0),
694 B_TEST(get_configured_bridge_by_exact_addr_port_digest_both
, 0),
695 B_TEST(get_configured_bridge_by_exact_addr_port_digest_aonly
, 0),
696 B_TEST(find_bridge_by_digest_known
, 0),
697 B_TEST(find_bridge_by_digest_unknown
, 0),
698 B_TEST(bridge_resolve_conflicts
, 0),
699 B_TEST(get_transport_by_bridge_addrport_no_ptlist
, 0),
700 B_TEST(get_transport_by_bridge_addrport
, 0),
701 B_TEST(transport_is_needed
, 0),
702 B_TEST(node_is_a_configured_bridge
, 0),