unittest_udp_address.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MPL-2.0 */
2 
3 #include <unity.h>
4 #include "../tests/testutil.hpp"
5 #include "../unittests/unittest_resolver_common.hpp"
6 
7 #include <ip.hpp>
8 #include <udp_address.hpp>
9 
10 void setUp ()
11 {
12 }
13 
14 void tearDown ()
15 {
16 }
17 
18 // Test an UDP address resolution. If 'dest_addr_' is NULL assume the
19 // resolution is supposed to fail.
20 static void test_resolve (bool bind_,
21  int family_,
22  const char *name_,
23  const char *target_addr_,
24  uint16_t expected_port_,
25  const char *bind_addr_,
26  bool multicast_)
27 {
28  if (family_ == AF_INET6 && !is_ipv6_available ()) {
29  TEST_IGNORE_MESSAGE ("ipv6 is not available");
30  }
31 
32  zmq::udp_address_t addr;
33 
34  int rc = addr.resolve (name_, bind_, family_ == AF_INET6);
35 
36  if (target_addr_ == NULL) {
37  TEST_ASSERT_EQUAL (-1, rc);
39  return;
40  }
41  TEST_ASSERT_EQUAL (0, rc);
42 
43 
44  TEST_ASSERT_EQUAL (multicast_, addr.is_mcast ());
45 
46  if (bind_addr_ == NULL) {
47  // Bind ANY
48  if (family_ == AF_INET) {
49  bind_addr_ = "0.0.0.0";
50  } else {
51  bind_addr_ = "::";
52  }
53  }
54 
55  validate_address (family_, addr.target_addr (), target_addr_,
56  expected_port_);
57  validate_address (family_, addr.bind_addr (), bind_addr_, expected_port_);
58 }
59 
60 static void test_resolve_bind (int family_,
61  const char *name_,
62  const char *dest_addr_,
63  uint16_t expected_port_ = 0,
64  const char *bind_addr_ = NULL,
65  bool multicast_ = false)
66 {
67  test_resolve (true, family_, name_, dest_addr_, expected_port_, bind_addr_,
68  multicast_);
69 }
70 
71 static void test_resolve_connect (int family_,
72  const char *name_,
73  const char *dest_addr_,
74  uint16_t expected_port_ = 0,
75  const char *bind_addr_ = NULL,
76  bool multicast_ = false)
77 {
78  test_resolve (false, family_, name_, dest_addr_, expected_port_, bind_addr_,
79  multicast_);
80 }
81 
83 {
84  test_resolve_connect (AF_INET, "127.0.0.1:5555", "127.0.0.1", 5555);
85 }
86 
88 {
89  test_resolve_connect (AF_INET6, "[::1]:123", "::1", 123);
90 }
91 
92 static void test_resolve_ipv4_bind ()
93 {
94  test_resolve_bind (AF_INET, "127.0.0.1:5555", "127.0.0.1", 5555,
95  "127.0.0.1");
96 }
97 
98 static void test_resolve_ipv6_bind ()
99 {
100  test_resolve_bind (AF_INET6, "[abcd::1234:1]:5555", "abcd::1234:1", 5555,
101  "abcd::1234:1");
102 }
103 
105 {
106  test_resolve_bind (AF_INET, "*:*", "0.0.0.0", 0, "0.0.0.0");
107 }
108 
110 {
111  test_resolve_bind (AF_INET6, "*:*", "::", 0, "::");
112 }
113 
115 {
116  test_resolve_bind (AF_INET, "127.0.0.1:*", "127.0.0.1", 0, "127.0.0.1");
117 }
118 
120 {
121  test_resolve_bind (AF_INET6, "[1:2:3:4::5]:*", "1:2:3:4::5", 0,
122  "1:2:3:4::5");
123 }
124 
126 {
127  test_resolve_bind (AF_INET, "*:5555", "0.0.0.0", 5555, "0.0.0.0");
128 }
129 
131 {
132  test_resolve_bind (AF_INET6, "*:5555", "::", 5555, "::");
133 }
134 
136 {
137  // Cannot use wildcard for connection
138  test_resolve_connect (AF_INET, "*:5555", NULL);
139 }
140 
142 {
143  // Cannot use wildcard for connection
144  test_resolve_connect (AF_INET6, "*:5555", NULL);
145 }
146 
148 {
149  test_resolve_connect (AF_INET, "127.0.0.1:*", NULL);
150 }
151 
153 {
154  test_resolve_connect (AF_INET6, "[::1]:*", NULL);
155 }
156 
158 {
159  test_resolve_connect (AF_INET, "127.0.0.1:0", "127.0.0.1", 0);
160 }
161 
163 {
164  test_resolve_connect (AF_INET6, "[2000:abcd::1]:0", "2000:abcd::1", 0);
165 }
166 
168 {
169  test_resolve_bind (AF_INET, "239.0.0.1:1234", "239.0.0.1", 1234, "0.0.0.0",
170  true);
171 }
172 
174 {
175  test_resolve_bind (AF_INET6, "[ff00::1]:1234", "ff00::1", 1234, "::", true);
176 }
177 
179 {
180  test_resolve_connect (AF_INET, "239.0.0.1:2222", "239.0.0.1", 2222, NULL,
181  true);
182 }
183 
185 {
186  test_resolve_connect (AF_INET6, "[ff00::1]:2222", "ff00::1", 2222, NULL,
187  true);
188 }
189 
191 {
192  test_resolve_bind (AF_INET, "127.0.0.1;230.2.8.12:5555", "230.2.8.12", 5555,
193  "127.0.0.1", true);
194 }
195 
197 {
198  if (!is_ipv6_available ()) {
199  TEST_IGNORE_MESSAGE ("ipv6 is not available");
200  }
201 
202  zmq::udp_address_t addr;
203  int rc = addr.resolve ("[::1];[ffab::4]:5555", true, true);
204 
205  // For the time being this fails because we only support binding multicast
206  // by interface name, not interface IP
207  TEST_ASSERT_EQUAL (-1, rc);
208  TEST_ASSERT_EQUAL (ENODEV, errno);
209 }
210 
212 {
213  test_resolve_bind (AF_INET, "*;230.2.8.12:5555", "230.2.8.12", 5555,
214  "0.0.0.0", true);
215 }
216 
218 {
219  test_resolve_bind (AF_INET6, "*;[ffff::]:5555", "ffff::", 5555, "::", true);
220 }
221 
223 {
224  test_resolve_connect (AF_INET, "8.9.10.11;230.2.8.12:5555", "230.2.8.12",
225  5555, "8.9.10.11", true);
226 }
227 
229 {
230  if (!is_ipv6_available ()) {
231  TEST_IGNORE_MESSAGE ("ipv6 is not available");
232  }
233 
234  zmq::udp_address_t addr;
235  int rc = addr.resolve ("[1:2:3::4];[ff01::1]:5555", false, true);
236 
237  // For the time being this fails because we only support binding multicast
238  // by interface name, not interface IP
239  TEST_ASSERT_EQUAL (-1, rc);
240  TEST_ASSERT_EQUAL (ENODEV, errno);
241 }
242 
244 {
245  test_resolve_connect (AF_INET, "*;230.2.8.12:5555", "230.2.8.12", 5555,
246  "0.0.0.0", true);
247 }
248 
250 {
251  test_resolve_connect (AF_INET6, "*;[ff10::1]:5555", "ff10::1", 5555,
252  "::", true);
253 }
254 
256 {
257  test_resolve_bind (AF_INET, "127.0.0.1;1.2.3.4:5555", NULL);
258 }
259 
261 {
262  test_resolve_bind (AF_INET6, "[::1];[fe00::1]:5555", NULL);
263 }
264 
266 {
267  test_resolve_connect (AF_INET, "127.0.0.1;1.2.3.4:5555", NULL);
268 }
269 
271 {
272  test_resolve_connect (AF_INET6, "[::1];[fe00:1]:5555", NULL);
273 }
274 
275 int main (void)
276 {
279 
280  UNITY_BEGIN ();
281 
314 
316 
317  return UNITY_END ();
318 }
test_resolve_ipv6_connect_mcast
static void test_resolve_ipv6_connect_mcast()
Definition: unittest_udp_address.cpp:184
test_resolve_ipv4_bind_any_port
static void test_resolve_ipv4_bind_any_port()
Definition: unittest_udp_address.cpp:125
ip.hpp
udp_address.hpp
NULL
NULL
Definition: test_security_zap.cpp:405
UNITY_END
return UNITY_END()
test_resolve_ipv4_simple
static void test_resolve_ipv4_simple()
Definition: unittest_udp_address.cpp:82
setUp
void setUp()
Definition: unittest_udp_address.cpp:10
EINVAL
#define EINVAL
Definition: errno.hpp:25
zmq::udp_address_t::is_mcast
bool is_mcast() const
Definition: udp_address.cpp:157
is_ipv6_available
int is_ipv6_available()
Definition: testutil.cpp:236
RUN_TEST
#define RUN_TEST(func)
Definition: unity_internals.h:615
test_resolve_ipv6_mcast_src_connect_bad
static void test_resolve_ipv6_mcast_src_connect_bad()
Definition: unittest_udp_address.cpp:270
test_resolve_ipv4_connect_port0
static void test_resolve_ipv4_connect_port0()
Definition: unittest_udp_address.cpp:157
zmq::udp_address_t::bind_addr
const ip_addr_t * bind_addr() const
Definition: udp_address.cpp:162
test_resolve_ipv4_mcast_src_connect
static void test_resolve_ipv4_mcast_src_connect()
Definition: unittest_udp_address.cpp:222
test_resolve
static void test_resolve(bool bind_, int family_, const char *name_, const char *target_addr_, uint16_t expected_port_, const char *bind_addr_, bool multicast_)
Definition: unittest_udp_address.cpp:20
main
int main(void)
Definition: unittest_udp_address.cpp:275
errno
int errno
test_resolve_ipv4_bind_mcast
static void test_resolve_ipv4_bind_mcast()
Definition: unittest_udp_address.cpp:167
zmq::udp_address_t::resolve
int resolve(const char *name_, bool bind_, bool ipv6_)
Definition: udp_address.cpp:32
test_resolve_ipv6_bind_anyport
static void test_resolve_ipv6_bind_anyport()
Definition: unittest_udp_address.cpp:119
test_resolve_connect
static void test_resolve_connect(int family_, const char *name_, const char *dest_addr_, uint16_t expected_port_=0, const char *bind_addr_=NULL, bool multicast_=false)
Definition: unittest_udp_address.cpp:71
validate_address
void validate_address(int family, const zmq::ip_addr_t *addr_, const char *expected_addr_, uint16_t expected_port_=0, uint16_t expected_zone_=0, const char *expected_addr_v4_failover_=NULL)
Definition: unittest_resolver_common.hpp:14
test_resolve_ipv4_mcast_src_bind_bad
static void test_resolve_ipv4_mcast_src_bind_bad()
Definition: unittest_udp_address.cpp:255
test_resolve_ipv4_bind_anyport
static void test_resolve_ipv4_bind_anyport()
Definition: unittest_udp_address.cpp:114
test_resolve_ipv4_mcast_src_connect_bad
static void test_resolve_ipv4_mcast_src_connect_bad()
Definition: unittest_udp_address.cpp:265
test_resolve_ipv4_bind_any
static void test_resolve_ipv4_bind_any()
Definition: unittest_udp_address.cpp:104
test_resolve_ipv4_bind
static void test_resolve_ipv4_bind()
Definition: unittest_udp_address.cpp:92
test_resolve_ipv6_connect_port0
static void test_resolve_ipv6_connect_port0()
Definition: unittest_udp_address.cpp:162
test_resolve_ipv6_mcast_src_connect
static void test_resolve_ipv6_mcast_src_connect()
Definition: unittest_udp_address.cpp:228
test_resolve_ipv6_bind
static void test_resolve_ipv6_bind()
Definition: unittest_udp_address.cpp:98
test_resolve_ipv6_bind_mcast
static void test_resolve_ipv6_bind_mcast()
Definition: unittest_udp_address.cpp:173
zmq::udp_address_t
Definition: udp_address.hpp:17
test_resolve_ipv6_connect_any
static void test_resolve_ipv6_connect_any()
Definition: unittest_udp_address.cpp:141
zmq::shutdown_network
void shutdown_network()
Definition: ip.cpp:305
test_resolve_bind
static void test_resolve_bind(int family_, const char *name_, const char *dest_addr_, uint16_t expected_port_=0, const char *bind_addr_=NULL, bool multicast_=false)
Definition: unittest_udp_address.cpp:60
test_resolve_ipv6_connect_anyport
static void test_resolve_ipv6_connect_anyport()
Definition: unittest_udp_address.cpp:152
test_resolve_ipv6_bind_any_port
static void test_resolve_ipv6_bind_any_port()
Definition: unittest_udp_address.cpp:130
test_resolve_ipv4_connect_any
static void test_resolve_ipv4_connect_any()
Definition: unittest_udp_address.cpp:135
test_resolve_ipv4_connect_mcast
static void test_resolve_ipv4_connect_mcast()
Definition: unittest_udp_address.cpp:178
name_
string name_
Definition: googletest.cc:182
zmq::udp_address_t::target_addr
const ip_addr_t * target_addr() const
Definition: udp_address.cpp:172
TEST_ASSERT_EQUAL
#define TEST_ASSERT_EQUAL(expected, actual)
Definition: unity.h:133
test_resolve_ipv6_mcast_src_connect_any
static void test_resolve_ipv6_mcast_src_connect_any()
Definition: unittest_udp_address.cpp:249
TEST_IGNORE_MESSAGE
#define TEST_IGNORE_MESSAGE(message)
Definition: unity.h:103
unity.h
zmq::initialize_network
bool initialize_network()
Definition: ip.cpp:264
test_resolve_ipv6_bind_any
static void test_resolve_ipv6_bind_any()
Definition: unittest_udp_address.cpp:109
test_resolve_ipv4_mcast_src_bind
static void test_resolve_ipv4_mcast_src_bind()
Definition: unittest_udp_address.cpp:190
tearDown
void tearDown()
Definition: unittest_udp_address.cpp:14
setup_test_environment
void setup_test_environment(int timeout_seconds_)
Definition: testutil.cpp:201
UNITY_BEGIN
UNITY_BEGIN()
test_resolve_ipv6_mcast_src_bind_any
static void test_resolve_ipv6_mcast_src_bind_any()
Definition: unittest_udp_address.cpp:217
test_resolve_ipv6_mcast_src_bind_bad
static void test_resolve_ipv6_mcast_src_bind_bad()
Definition: unittest_udp_address.cpp:260
test_resolve_ipv4_mcast_src_connect_any
static void test_resolve_ipv4_mcast_src_connect_any()
Definition: unittest_udp_address.cpp:243
test_resolve_ipv4_connect_anyport
static void test_resolve_ipv4_connect_anyport()
Definition: unittest_udp_address.cpp:147
test_resolve_ipv6_simple
static void test_resolve_ipv6_simple()
Definition: unittest_udp_address.cpp:87
test_resolve_ipv4_mcast_src_bind_any
static void test_resolve_ipv4_mcast_src_bind_any()
Definition: unittest_udp_address.cpp:211
test_resolve_ipv6_mcast_src_bind
static void test_resolve_ipv6_mcast_src_bind()
Definition: unittest_udp_address.cpp:196


libaditof
Author(s):
autogenerated on Wed May 21 2025 02:07:00