unittest_ip_resolver.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MPL-2.0 */
2 
3 #include <unity.h>
4 #include "../src/macros.hpp"
5 #include "../tests/testutil.hpp"
6 #include "../tests/testutil_unity.hpp"
7 #include "../unittests/unittest_resolver_common.hpp"
8 
9 #include <ip_resolver.hpp>
10 #include <ip.hpp>
11 
12 #ifndef _WIN32
13 #include <sys/types.h>
14 #include <sys/socket.h>
15 #include <netdb.h>
16 #endif
17 
18 void setUp ()
19 {
20 }
21 
22 void tearDown ()
23 {
24 }
25 
26 class test_ip_resolver_t ZMQ_FINAL : public zmq::ip_resolver_t
27 {
28  public:
30  ip_resolver_t (opts_)
31  {
32  }
33 
34  protected:
35  struct dns_lut_t
36  {
37  const char *hostname;
38  const char *ipv4;
39  const char *ipv6;
40  };
41 
42  int do_getaddrinfo (const char *node_,
43  const char *service_,
44  const struct addrinfo *hints_,
45  struct addrinfo **res_) ZMQ_FINAL
46  {
47  static const struct dns_lut_t dns_lut[] = {
48  {"ip.zeromq.org", "10.100.0.1", "fdf5:d058:d656::1"},
49  {"ipv4only.zeromq.org", "10.100.0.2", "::ffff:10.100.0.2"},
50  {"ipv6only.zeromq.org", NULL, "fdf5:d058:d656::2"},
51  };
52  unsigned lut_len = sizeof (dns_lut) / sizeof (dns_lut[0]);
53  struct addrinfo ai;
54 
55  TEST_ASSERT_NULL (service_);
56 
57  bool ipv6 = (hints_->ai_family == AF_INET6);
58  bool no_dns = (hints_->ai_flags & AI_NUMERICHOST) != 0;
59  const char *ip = NULL;
60 
61  if (!no_dns) {
62  for (unsigned i = 0; i < lut_len; i++) {
63  if (strcmp (dns_lut[i].hostname, node_) == 0) {
64  if (ipv6) {
65  ip = dns_lut[i].ipv6;
66  } else {
67  ip = dns_lut[i].ipv4;
68 
69  if (ip == NULL) {
70  // No address associated with NAME
71  return EAI_NODATA;
72  }
73  }
74  }
75  }
76  }
77 
78  if (ip == NULL) {
79  // No entry for 'node_' found in the LUT (or DNS is
80  // forbidden), assume that it's a numeric IP address
81  ip = node_;
82  }
83 
84  // Call the real getaddrinfo implementation, making sure that it won't
85  // attempt to resolve using DNS
86  ai = *hints_;
87  ai.ai_flags |= AI_NUMERICHOST;
88 
89  return zmq::ip_resolver_t::do_getaddrinfo (ip, NULL, &ai, res_);
90  }
91 
92  unsigned int do_if_nametoindex (const char *ifname_) ZMQ_FINAL
93  {
94  static const char *dummy_interfaces[] = {
95  "lo0",
96  "eth0",
97  "eth1",
98  };
99  unsigned lut_len =
100  sizeof (dummy_interfaces) / sizeof (dummy_interfaces[0]);
101 
102  for (unsigned i = 0; i < lut_len; i++) {
103  if (strcmp (dummy_interfaces[i], ifname_) == 0) {
104  // The dummy index will be the position in the array + 1 (0 is
105  // invalid)
106  return i + 1;
107  }
108  }
109 
110  // Not found
111  return 0;
112  }
113 };
114 
115 // Attempt a resolution and test the results. If 'expected_addr_' is NULL
116 // assume that the resolution is meant to fail.
117 //
118 // On windows we can receive an IPv4 address even when an IPv6 is requested, if
119 // we're in this situation then we compare to 'expected_addr_v4_failover_'
120 // instead.
122  const char *name_,
123  const char *expected_addr_,
124  uint16_t expected_port_ = 0,
125  uint16_t expected_zone_ = 0,
126  const char *expected_addr_v4_failover_ = NULL)
127 {
128  zmq::ip_addr_t addr;
129  int family = opts_.ipv6 () ? AF_INET6 : AF_INET;
130 
131  if (family == AF_INET6 && !is_ipv6_available ()) {
132  TEST_IGNORE_MESSAGE ("ipv6 is not available");
133  }
134 
135  // Generate an invalid but well-defined 'ip_addr_t'. Avoids testing
136  // uninitialized values if the code is buggy.
137  memset (&addr, 0xba, sizeof (addr));
138 
139  test_ip_resolver_t resolver (opts_);
140 
141  int rc = resolver.resolve (&addr, name_);
142 
143  if (expected_addr_ == NULL) {
144  // TODO also check the expected errno
145  TEST_ASSERT_EQUAL (-1, rc);
146  return;
147  }
149 
150 
151  validate_address (family, &addr, expected_addr_, expected_port_,
152  expected_zone_, expected_addr_v4_failover_);
153 }
154 
155 // Helper macro to define the v4/v6 function pairs
156 #define MAKE_TEST_V4V6(_test) \
157  static void _test##_ipv4 () { _test (false); } \
158  \
159  static void _test##_ipv6 () { _test (true); }
160 
161 static void test_bind_any (bool ipv6_)
162 {
163  zmq::ip_resolver_options_t resolver_opts;
164 
165  resolver_opts.bindable (true).expect_port (true).ipv6 (ipv6_);
166 
167  const char *expected = ipv6_ ? "::" : "0.0.0.0";
168  test_resolve (resolver_opts, "*:*", expected, 0);
169 }
171 
172 static void test_bind_any_port0 (bool ipv6_)
173 {
174  zmq::ip_resolver_options_t resolver_opts;
175 
176  resolver_opts.bindable (true).expect_port (true).ipv6 (ipv6_);
177 
178  // Should be equivalent to "*:*"
179  const char *expected = ipv6_ ? "::" : "0.0.0.0";
180  test_resolve (resolver_opts, "*:0", expected, 0);
181 }
183 
184 static void test_nobind_any (bool ipv6_)
185 {
186  zmq::ip_resolver_options_t resolver_opts;
187 
188  resolver_opts.expect_port (true).ipv6 (ipv6_);
189 
190  // Wildcard should be rejected if we're not looking for a
191  // bindable address
192  test_resolve (resolver_opts, "*:*", NULL);
193 }
195 
196 static void test_nobind_any_port (bool ipv6_)
197 {
198  zmq::ip_resolver_options_t resolver_opts;
199 
200  resolver_opts.expect_port (true).ipv6 (ipv6_);
201 
202  // Wildcard should be rejected if we're not looking for a
203  // bindable address
204  test_resolve (resolver_opts, "*:1234", NULL);
205 }
207 
208 static void test_nobind_addr_anyport (bool ipv6_)
209 {
210  zmq::ip_resolver_options_t resolver_opts;
211 
212  resolver_opts.expect_port (true).ipv6 (ipv6_);
213 
214  // Wildcard port should be rejected for non-bindable addresses
215  test_resolve (resolver_opts, "127.0.0.1:*", NULL);
216 }
218 
219 static void test_nobind_addr_port0 (bool ipv6_)
220 {
221  zmq::ip_resolver_options_t resolver_opts;
222 
223  resolver_opts.expect_port (true).ipv6 (ipv6_);
224 
225  // Connecting to port 0 is allowed, although it might not be massively
226  // useful
227  const char *expected = ipv6_ ? "::ffff:127.0.0.1" : "127.0.0.1";
228  const char *fallback = ipv6_ ? "127.0.0.1" : NULL;
229  test_resolve (resolver_opts, "127.0.0.1:0", expected, 0, 0, fallback);
230 }
232 
234 {
235  zmq::ip_resolver_options_t resolver_opts;
236 
237  test_resolve (resolver_opts, "1.2.128.129", "1.2.128.129");
238 }
239 
240 static void test_parse_ipv4_zero ()
241 {
242  zmq::ip_resolver_options_t resolver_opts;
243 
244  test_resolve (resolver_opts, "0.0.0.0", "0.0.0.0");
245 }
246 
247 static void test_parse_ipv4_max ()
248 {
249  zmq::ip_resolver_options_t resolver_opts;
250 
251  test_resolve (resolver_opts, "255.255.255.255", "255.255.255.255");
252 }
253 
255 {
256  zmq::ip_resolver_options_t resolver_opts;
257 
258  // Not particularly useful, but valid
259  test_resolve (resolver_opts, "[1.2.128.129]", "1.2.128.129");
260 }
261 
263 {
264  zmq::ip_resolver_options_t resolver_opts;
265 
266  test_resolve (resolver_opts, "1.2.128.129]", NULL);
267 }
268 
270 {
271  zmq::ip_resolver_options_t resolver_opts;
272 
273  test_resolve (resolver_opts, "[1.2.128.129", NULL);
274 }
275 
277 {
278  zmq::ip_resolver_options_t resolver_opts;
279 
280  test_resolve (resolver_opts, "[1.2.128].129", NULL);
281 }
282 
284 {
285  zmq::ip_resolver_options_t resolver_opts;
286 
287  // No port expected, should be rejected
288  test_resolve (resolver_opts, "1.2.128.129:123", NULL);
289 }
290 
292 {
293  zmq::ip_resolver_options_t resolver_opts;
294 
295  // No port expected, should be rejected
296  test_resolve (resolver_opts, "1.2.128.129:*", NULL);
297 }
298 
300 {
301  zmq::ip_resolver_options_t resolver_opts;
302 
303  // No port expected, should be rejected
304  test_resolve (resolver_opts, "::1", NULL);
305 }
306 
307 static void test_parse_ipv4_port ()
308 {
309  zmq::ip_resolver_options_t resolver_opts;
310 
311  resolver_opts.expect_port (true);
312 
313  test_resolve (resolver_opts, "1.2.128.129:123", "1.2.128.129", 123);
314 }
315 
316 static void test_parse_ipv4_port0 ()
317 {
318  zmq::ip_resolver_options_t resolver_opts;
319 
320  resolver_opts.expect_port (true);
321 
322  // Port 0 is accepted and is equivalent to *
323  test_resolve (resolver_opts, "1.2.128.129:0", "1.2.128.129", 0);
324 }
325 
327 {
328  zmq::ip_resolver_options_t resolver_opts;
329 
330  resolver_opts.expect_port (true);
331 
332  // The code doesn't validate that the port doesn't contain garbage
333  test_resolve (resolver_opts, "1.2.3.4:567bad", "1.2.3.4", 567);
334 }
335 
337 {
338  zmq::ip_resolver_options_t resolver_opts;
339 
340  resolver_opts.expect_port (true);
341 
342  test_resolve (resolver_opts, "1.2.3.4", NULL);
343 }
344 
346 {
347  zmq::ip_resolver_options_t resolver_opts;
348 
349  resolver_opts.expect_port (true);
350 
351  test_resolve (resolver_opts, "1.2.3.4:bad", NULL);
352 }
353 
355 {
356  zmq::ip_resolver_options_t resolver_opts;
357 
358  resolver_opts.expect_port (true);
359 
360  test_resolve (resolver_opts, "[192.168.1.1]:5555", "192.168.1.1", 5555);
361 }
362 
364 {
365  zmq::ip_resolver_options_t resolver_opts;
366 
367  resolver_opts.expect_port (true);
368 
369  test_resolve (resolver_opts, "[192.168.1.1:]5555", NULL);
370 }
371 
373 {
374  zmq::ip_resolver_options_t resolver_opts;
375 
376  resolver_opts.expect_port (true);
377 
378  test_resolve (resolver_opts, "[192.168.1.1:5555]", NULL);
379 }
380 
382 {
383  zmq::ip_resolver_options_t resolver_opts;
384 
385  resolver_opts.expect_port (true);
386 
387  test_resolve (resolver_opts, "[192.168.1.1:*]", NULL);
388 }
389 
391 {
392  zmq::ip_resolver_options_t resolver_opts;
393 
394  resolver_opts.expect_port (true);
395 
396  test_resolve (resolver_opts, "[::1]:1234", NULL);
397 }
398 
400 {
401  zmq::ip_resolver_options_t resolver_opts;
402 
403  resolver_opts.ipv6 (true);
404 
405  test_resolve (resolver_opts, "::1", "::1");
406 }
407 
409 {
410  zmq::ip_resolver_options_t resolver_opts;
411 
412  resolver_opts.ipv6 (true);
413 
414  test_resolve (resolver_opts, "abcd:1234::1:0:234", "abcd:1234::1:0:234");
415 }
416 
417 static void test_parse_ipv6_zero ()
418 {
419  zmq::ip_resolver_options_t resolver_opts;
420 
421  resolver_opts.ipv6 (true);
422 
423  test_resolve (resolver_opts, "::", "::");
424 }
425 
426 static void test_parse_ipv6_max ()
427 {
428  zmq::ip_resolver_options_t resolver_opts;
429 
430  resolver_opts.ipv6 (true);
431 
432  test_resolve (resolver_opts, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff",
433  "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff");
434 }
435 
437 {
438  zmq::ip_resolver_options_t resolver_opts;
439 
440  resolver_opts.ipv6 (true);
441 
442  test_resolve (resolver_opts, "[::1]", "::1");
443 }
444 
446 {
447  zmq::ip_resolver_options_t resolver_opts;
448 
449  resolver_opts.ipv6 (true);
450 
451  test_resolve (resolver_opts, "::1]", NULL);
452 }
453 
455 {
456  zmq::ip_resolver_options_t resolver_opts;
457 
458  resolver_opts.ipv6 (true);
459 
460  test_resolve (resolver_opts, "[::1", NULL);
461 }
462 
464 {
465  zmq::ip_resolver_options_t resolver_opts;
466 
467  resolver_opts.ipv6 (true);
468 
469  test_resolve (resolver_opts, "[abcd:1234::1:]0:234", NULL);
470 }
471 
472 static void test_parse_ipv6_port ()
473 {
474  zmq::ip_resolver_options_t resolver_opts;
475 
476  resolver_opts.ipv6 (true).expect_port (true);
477 
478  test_resolve (resolver_opts, "[1234::1]:80", "1234::1", 80);
479 }
480 
482 {
483  zmq::ip_resolver_options_t resolver_opts;
484 
485  resolver_opts.ipv6 (true).expect_port (true).bindable (true);
486 
487  test_resolve (resolver_opts, "[1234::1]:*", "1234::1", 0);
488 }
489 
491 {
492  zmq::ip_resolver_options_t resolver_opts;
493 
494  resolver_opts.ipv6 (true).expect_port (true);
495 
496  // Should this be allowed? Seems error-prone but so far ZMQ accepts it.
497  test_resolve (resolver_opts, "abcd:1234::1:0:234:123", "abcd:1234::1:0:234",
498  123);
499 }
500 
502 {
503  zmq::ip_resolver_options_t resolver_opts;
504 
505  resolver_opts.ipv6 (true);
506 
507  // Parsing IPv4 should also work if an IPv6 is requested, it returns an
508  // IPv6 with the IPv4 address embedded (except sometimes on Windows where
509  // we end up with an IPv4 anyway)
510  test_resolve (resolver_opts, "11.22.33.44", "::ffff:11.22.33.44", 0, 0,
511  "11.22.33.44");
512 }
513 
515 {
516  zmq::ip_resolver_options_t resolver_opts;
517 
518  resolver_opts.ipv6 (true).expect_port (true);
519 
520  test_resolve (resolver_opts, "11.22.33.44:55", "::ffff:11.22.33.44", 55, 0,
521  "11.22.33.44");
522 }
523 
525 {
526  zmq::ip_resolver_options_t resolver_opts;
527 
528  resolver_opts.ipv6 (true);
529 
530  test_resolve (resolver_opts, "3000:4:5::1:234%2", "3000:4:5::1:234", 0, 2);
531 }
532 
534 {
535  zmq::ip_resolver_options_t resolver_opts;
536 
537  resolver_opts.ipv6 (true);
538 
539  test_resolve (resolver_opts, "3000:4:5::1:234%0", NULL);
540 }
541 
543 {
544  zmq::ip_resolver_options_t resolver_opts;
545 
546  resolver_opts.expect_port (true).ipv6 (true);
547 
548  test_resolve (resolver_opts, "3000:4:5::1:234%2:1111", "3000:4:5::1:234",
549  1111, 2);
550 }
551 
553 {
554  zmq::ip_resolver_options_t resolver_opts;
555 
556  resolver_opts.ipv6 (true);
557 
558  test_resolve (resolver_opts, "3000:4:5::1:234%eth1", "3000:4:5::1:234", 0,
559  3);
560 }
561 
563 {
564  zmq::ip_resolver_options_t resolver_opts;
565 
566  resolver_opts.expect_port (true).ipv6 (true);
567 
568  test_resolve (resolver_opts, "3000:4:5::1:234%eth0:8080", "3000:4:5::1:234",
569  8080, 2);
570 }
571 
573 {
574  zmq::ip_resolver_options_t resolver_opts;
575 
576  resolver_opts.expect_port (true).ipv6 (true);
577 
578  test_resolve (resolver_opts, "[3000:4:5::1:234%eth0]:8080",
579  "3000:4:5::1:234", 8080, 2);
580 }
581 
583 {
584  zmq::ip_resolver_options_t resolver_opts;
585 
586  resolver_opts.ipv6 (true);
587 
588  test_resolve (resolver_opts, "3000:4:5::1:234%bad0", NULL);
589 }
590 
591 static void test_dns_ipv4_simple ()
592 {
593  zmq::ip_resolver_options_t resolver_opts;
594 
595  resolver_opts.allow_dns (true);
596 
597  test_resolve (resolver_opts, "ip.zeromq.org", "10.100.0.1");
598 }
599 
600 static void test_dns_ipv4_only ()
601 {
602  zmq::ip_resolver_options_t resolver_opts;
603 
604  resolver_opts.allow_dns (true);
605 
606  test_resolve (resolver_opts, "ipv4only.zeromq.org", "10.100.0.2");
607 }
608 
609 static void test_dns_ipv4_invalid ()
610 {
611  zmq::ip_resolver_options_t resolver_opts;
612 
613  resolver_opts.allow_dns (true);
614 
615  test_resolve (resolver_opts, "invalid.zeromq.org", NULL);
616 }
617 
618 static void test_dns_ipv4_ipv6 ()
619 {
620  zmq::ip_resolver_options_t resolver_opts;
621 
622  resolver_opts.allow_dns (true);
623 
624  test_resolve (resolver_opts, "ipv6only.zeromq.org", NULL);
625 }
626 
627 static void test_dns_ipv4_numeric ()
628 {
629  zmq::ip_resolver_options_t resolver_opts;
630 
631  resolver_opts.allow_dns (true);
632 
633  // Numeric IPs should still work
634  test_resolve (resolver_opts, "5.4.3.2", "5.4.3.2");
635 }
636 
637 static void test_dns_ipv4_port ()
638 {
639  zmq::ip_resolver_options_t resolver_opts;
640 
641  resolver_opts.expect_port (true).allow_dns (true);
642 
643  test_resolve (resolver_opts, "ip.zeromq.org:1234", "10.100.0.1", 1234);
644 }
645 
646 static void test_dns_ipv6_simple ()
647 {
648  zmq::ip_resolver_options_t resolver_opts;
649 
650  resolver_opts.ipv6 (true).allow_dns (true);
651 
652  test_resolve (resolver_opts, "ip.zeromq.org", "fdf5:d058:d656::1");
653 }
654 
655 static void test_dns_ipv6_only ()
656 {
657  zmq::ip_resolver_options_t resolver_opts;
658 
659  resolver_opts.ipv6 (true).allow_dns (true);
660 
661  test_resolve (resolver_opts, "ipv6only.zeromq.org", "fdf5:d058:d656::2");
662 }
663 
664 static void test_dns_ipv6_invalid ()
665 {
666  zmq::ip_resolver_options_t resolver_opts;
667 
668  resolver_opts.ipv6 (true).allow_dns (true);
669 
670  test_resolve (resolver_opts, "invalid.zeromq.org", NULL);
671 }
672 
673 static void test_dns_ipv6_ipv4 ()
674 {
675  zmq::ip_resolver_options_t resolver_opts;
676 
677  resolver_opts.ipv6 (true).allow_dns (true);
678 
679  // If a host doesn't have an IPv6 then it should resolve as an embedded v4
680  // address in an IPv6
681  test_resolve (resolver_opts, "ipv4only.zeromq.org", "::ffff:10.100.0.2");
682 }
683 
684 static void test_dns_ipv6_numeric ()
685 {
686  zmq::ip_resolver_options_t resolver_opts;
687 
688  resolver_opts.ipv6 (true).allow_dns (true);
689 
690  // Numeric IPs should still work
691  test_resolve (resolver_opts, "fdf5:d058:d656::1", "fdf5:d058:d656::1");
692 }
693 
694 static void test_dns_ipv6_port ()
695 {
696  zmq::ip_resolver_options_t resolver_opts;
697 
698  resolver_opts.ipv6 (true).expect_port (true).allow_dns (true);
699 
700  test_resolve (resolver_opts, "ip.zeromq.org:1234", "fdf5:d058:d656::1",
701  1234);
702 }
703 
705 {
706  zmq::ip_resolver_options_t resolver_opts;
707 
708  resolver_opts.allow_dns (true);
709 
710  test_resolve (resolver_opts, "[ip.zeromq.org]", "10.100.0.1");
711 }
712 
714 {
715  zmq::ip_resolver_options_t resolver_opts;
716 
717  resolver_opts.allow_dns (true);
718 
719  test_resolve (resolver_opts, "[ip.zeromq].org", NULL);
720 }
721 
723 {
724  zmq::ip_resolver_options_t resolver_opts;
725 
726  resolver_opts.allow_dns (true);
727 
728  test_resolve (resolver_opts, "[ip.zeromq.org]:22", "10.100.0.1", 22);
729 }
730 
732 {
733  zmq::ip_resolver_options_t resolver_opts;
734 
735  resolver_opts.allow_dns (true);
736 
737  test_resolve (resolver_opts, "[ip.zeromq.org:22]", NULL);
738 }
739 
740 void test_dns_deny (bool ipv6_)
741 {
742  zmq::ip_resolver_options_t resolver_opts;
743 
744  resolver_opts.allow_dns (false).ipv6 (ipv6_);
745 
746  // DNS resolution shouldn't work when disallowed
747  test_resolve (resolver_opts, "ip.zeromq.org", NULL);
748 }
750 
752 {
753  zmq::ip_resolver_options_t resolver_opts;
754 
755  resolver_opts.allow_dns (true).ipv6 (true);
756 
757  // Not sure if that's very useful but you could technically add a scope
758  // identifier to a hostname
759  test_resolve (resolver_opts, "ip.zeromq.org%lo0", "fdf5:d058:d656::1", 0,
760  1);
761 }
762 
764 {
765  zmq::ip_resolver_options_t resolver_opts;
766 
767  resolver_opts.allow_dns (true).expect_port (true).ipv6 (true);
768 
769  // Not sure if that's very useful but you could technically add a scope
770  // identifier to a hostname
771  test_resolve (resolver_opts, "ip.zeromq.org%lo0:4444", "fdf5:d058:d656::1",
772  4444, 1);
773 }
774 
776 {
777  zmq::ip_resolver_options_t resolver_opts;
778 
779  resolver_opts.allow_dns (true).expect_port (true).ipv6 (true);
780 
781  test_resolve (resolver_opts, "[ip.zeromq.org%lo0]:4444",
782  "fdf5:d058:d656::1", 4444, 1);
783 }
784 
785 static void test_addr (int family_, const char *addr_, bool multicast_)
786 {
787  if (family_ == AF_INET6 && !is_ipv6_available ()) {
788  TEST_IGNORE_MESSAGE ("ipv6 is not available");
789  }
790 
791  zmq::ip_resolver_options_t resolver_opts;
792 
793  resolver_opts.ipv6 (family_ == AF_INET6);
794 
795  test_ip_resolver_t resolver (resolver_opts);
796  zmq::ip_addr_t addr;
797 
798  TEST_ASSERT_SUCCESS_ERRNO (resolver.resolve (&addr, addr_));
799 
800  TEST_ASSERT_EQUAL (family_, addr.family ());
801  TEST_ASSERT_EQUAL (multicast_, addr.is_multicast ());
802 }
803 
805 {
806  test_addr (AF_INET, "1.2.3.4", false);
807 }
808 
810 {
811  test_addr (AF_INET6, "abcd::1", false);
812 }
813 
815 {
816  test_addr (AF_INET, "230.1.2.3", true);
817 }
818 
820 {
821  test_addr (AF_INET6, "ffab::1234", true);
822 }
823 
825 {
826  test_addr (AF_INET, "224.0.0.0", true);
827 }
828 
830 {
831  test_addr (AF_INET6, "ff00::", true);
832 }
833 
835 {
836  test_addr (AF_INET, "239.255.255.255", true);
837 }
838 
840 {
841  test_addr (AF_INET6, "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", true);
842 }
843 
845 {
846  test_addr (AF_INET, "223.255.255.255", false);
847 }
848 
850 {
851  test_addr (AF_INET6, "feff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", false);
852 }
853 
855 {
856  test_addr (AF_INET, "240.0.0.0", false);
857 }
858 
859 int main (void)
860 {
863 
864  UNITY_BEGIN ();
865 
866  RUN_TEST (test_bind_any_ipv4);
867  RUN_TEST (test_bind_any_ipv6);
868  RUN_TEST (test_bind_any_port0_ipv4);
869  RUN_TEST (test_bind_any_port0_ipv6);
870  RUN_TEST (test_nobind_any_ipv4);
871  RUN_TEST (test_nobind_any_ipv6);
872  RUN_TEST (test_nobind_any_port_ipv4);
873  RUN_TEST (test_nobind_any_port_ipv6);
874  RUN_TEST (test_nobind_addr_anyport_ipv4);
875  RUN_TEST (test_nobind_addr_anyport_ipv6);
876  RUN_TEST (test_nobind_addr_port0_ipv4);
877  RUN_TEST (test_nobind_addr_port0_ipv6);
932  RUN_TEST (test_dns_deny_ipv4);
933  RUN_TEST (test_dns_deny_ipv6);
948 
950 
951  return UNITY_END ();
952 }
test_addr_multicast_ipv6_max
static void test_addr_multicast_ipv6_max()
Definition: unittest_ip_resolver.cpp:839
MAKE_TEST_V4V6
#define MAKE_TEST_V4V6(_test)
Definition: unittest_ip_resolver.cpp:156
test_dns_ipv6_invalid
static void test_dns_ipv6_invalid()
Definition: unittest_ip_resolver.cpp:664
test_bind_any
static void test_bind_any(bool ipv6_)
Definition: unittest_ip_resolver.cpp:161
test_nobind_any_port
static void test_nobind_any_port(bool ipv6_)
Definition: unittest_ip_resolver.cpp:196
ip.hpp
zmq::ip_resolver_options_t::ipv6
ip_resolver_options_t & ipv6(bool ipv6_)
Definition: ip_resolver.cpp:121
test_dns_brackets
void test_dns_brackets()
Definition: unittest_ip_resolver.cpp:704
test_parse_ipv4_in_ipv6
static void test_parse_ipv4_in_ipv6()
Definition: unittest_ip_resolver.cpp:501
test_dns_ipv6_only
static void test_dns_ipv6_only()
Definition: unittest_ip_resolver.cpp:655
NULL
NULL
Definition: test_security_zap.cpp:405
UNITY_END
return UNITY_END()
test_parse_ipv4_reject_ipv6
static void test_parse_ipv4_reject_ipv6()
Definition: unittest_ip_resolver.cpp:299
test_parse_ipv4_zero
static void test_parse_ipv4_zero()
Definition: unittest_ip_resolver.cpp:240
test_dns_ipv4_invalid
static void test_dns_ipv4_invalid()
Definition: unittest_ip_resolver.cpp:609
test_dns_ipv4_ipv6
static void test_dns_ipv4_ipv6()
Definition: unittest_ip_resolver.cpp:618
test_parse_ipv4_port_ipv6_reject
static void test_parse_ipv4_port_ipv6_reject()
Definition: unittest_ip_resolver.cpp:390
test_parse_ipv6_brackets_missingr
static void test_parse_ipv6_brackets_missingr()
Definition: unittest_ip_resolver.cpp:454
test_dns_ipv6_port
static void test_dns_ipv6_port()
Definition: unittest_ip_resolver.cpp:694
test_nobind_addr_anyport
static void test_nobind_addr_anyport(bool ipv6_)
Definition: unittest_ip_resolver.cpp:208
test_dns_deny
void test_dns_deny(bool ipv6_)
Definition: unittest_ip_resolver.cpp:740
test_dns_ipv6_ipv4
static void test_dns_ipv6_ipv4()
Definition: unittest_ip_resolver.cpp:673
is_ipv6_available
int is_ipv6_available()
Definition: testutil.cpp:236
test_parse_ipv4_port_garbage
static void test_parse_ipv4_port_garbage()
Definition: unittest_ip_resolver.cpp:326
test_parse_ipv6_scope_if_port
static void test_parse_ipv6_scope_if_port()
Definition: unittest_ip_resolver.cpp:562
test_dns_ipv6_scope_port
void test_dns_ipv6_scope_port()
Definition: unittest_ip_resolver.cpp:763
RUN_TEST
#define RUN_TEST(func)
Definition: unity_internals.h:615
test_parse_ipv6_zero
static void test_parse_ipv6_zero()
Definition: unittest_ip_resolver.cpp:417
test_parse_ipv4_port_brackets_bad
static void test_parse_ipv4_port_brackets_bad()
Definition: unittest_ip_resolver.cpp:363
zmq::ip_resolver_options_t::bindable
ip_resolver_options_t & bindable(bool bindable_)
Definition: ip_resolver.cpp:106
test_parse_ipv4_wild_brackets_bad
static void test_parse_ipv4_wild_brackets_bad()
Definition: unittest_ip_resolver.cpp:381
test_nobind_any
static void test_nobind_any(bool ipv6_)
Definition: unittest_ip_resolver.cpp:184
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
main
int main(void)
Definition: unittest_ip_resolver.cpp:859
test_parse_ipv6_scope_if_port_brackets
static void test_parse_ipv6_scope_if_port_brackets()
Definition: unittest_ip_resolver.cpp:572
test_addr_unicast_ipv4
static void test_addr_unicast_ipv4()
Definition: unittest_ip_resolver.cpp:804
test_parse_ipv4_brackets
static void test_parse_ipv4_brackets()
Definition: unittest_ip_resolver.cpp:254
test_parse_ipv6_port_nobrackets
static void test_parse_ipv6_port_nobrackets()
Definition: unittest_ip_resolver.cpp:490
zmq::ip_resolver_t::do_getaddrinfo
virtual int do_getaddrinfo(const char *node_, const char *service_, const struct addrinfo *hints_, struct addrinfo **res_)
Definition: ip_resolver.cpp:716
zmq::ip_addr_t
Definition: ip_resolver.hpp:16
test_addr_multicast_ipv4
static void test_addr_multicast_ipv4()
Definition: unittest_ip_resolver.cpp:814
zmq::shutdown_network
void shutdown_network()
Definition: ip.cpp:305
test_parse_ipv4_brackets_missingl
static void test_parse_ipv4_brackets_missingl()
Definition: unittest_ip_resolver.cpp:262
test_parse_ipv4_port_bad
static void test_parse_ipv4_port_bad()
Definition: unittest_ip_resolver.cpp:345
test_parse_ipv4_port_brackets
static void test_parse_ipv4_port_brackets()
Definition: unittest_ip_resolver.cpp:354
test_parse_ipv6_brackets
static void test_parse_ipv6_brackets()
Definition: unittest_ip_resolver.cpp:436
test_dns_ipv4_simple
static void test_dns_ipv4_simple()
Definition: unittest_ip_resolver.cpp:591
test_dns_ipv6_scope_port_brackets
void test_dns_ipv6_scope_port_brackets()
Definition: unittest_ip_resolver.cpp:775
test_dns_ipv4_port
static void test_dns_ipv4_port()
Definition: unittest_ip_resolver.cpp:637
test_addr_multicast_ipv4_min
static void test_addr_multicast_ipv4_min()
Definition: unittest_ip_resolver.cpp:824
test_nobind_addr_port0
static void test_nobind_addr_port0(bool ipv6_)
Definition: unittest_ip_resolver.cpp:219
zmq::ip_resolver_options_t::allow_dns
ip_resolver_options_t & allow_dns(bool allow_)
Definition: ip_resolver.cpp:138
test_parse_ipv4_in_ipv6_port
static void test_parse_ipv4_in_ipv6_port()
Definition: unittest_ip_resolver.cpp:514
ZMQ_FINAL::dns_lut_t::hostname
const char * hostname
Definition: unittest_ip_resolver.cpp:37
test_parse_ipv4_reject_port
static void test_parse_ipv4_reject_port()
Definition: unittest_ip_resolver.cpp:283
ZMQ_FINAL::do_if_nametoindex
unsigned int do_if_nametoindex(const char *ifname_) ZMQ_FINAL
Definition: unittest_ip_resolver.cpp:92
test_bind_any_port0
static void test_bind_any_port0(bool ipv6_)
Definition: unittest_ip_resolver.cpp:172
test_parse_ipv4_port0
static void test_parse_ipv4_port0()
Definition: unittest_ip_resolver.cpp:316
test_parse_ipv6_scope_int_port
static void test_parse_ipv6_scope_int_port()
Definition: unittest_ip_resolver.cpp:542
test_parse_ipv4_reject_any
static void test_parse_ipv4_reject_any()
Definition: unittest_ip_resolver.cpp:291
name_
string name_
Definition: googletest.cc:182
TEST_ASSERT_EQUAL
#define TEST_ASSERT_EQUAL(expected, actual)
Definition: unity.h:133
zmq::ip_resolver_options_t::expect_port
ip_resolver_options_t & expect_port(bool expect_)
Definition: ip_resolver.cpp:131
test_parse_ipv6_brackets_bad
static void test_parse_ipv6_brackets_bad()
Definition: unittest_ip_resolver.cpp:463
test_dns_brackets_port_bad
void test_dns_brackets_port_bad()
Definition: unittest_ip_resolver.cpp:731
test_resolve
static void test_resolve(zmq::ip_resolver_options_t opts_, const char *name_, const char *expected_addr_, uint16_t expected_port_=0, uint16_t expected_zone_=0, const char *expected_addr_v4_failover_=NULL)
Definition: unittest_ip_resolver.cpp:121
zmq::ip_resolver_t
Definition: ip_resolver.hpp:62
tearDown
void tearDown()
Definition: unittest_ip_resolver.cpp:22
void
typedef void(APIENTRY *GLDEBUGPROCARB)(GLenum source
test_parse_ipv4_max
static void test_parse_ipv4_max()
Definition: unittest_ip_resolver.cpp:247
i
int i
Definition: gmock-matchers_test.cc:764
TEST_IGNORE_MESSAGE
#define TEST_IGNORE_MESSAGE(message)
Definition: unity.h:103
unity.h
test_parse_ipv6_scope_if
static void test_parse_ipv6_scope_if()
Definition: unittest_ip_resolver.cpp:552
test_parse_ipv6_scope_int
static void test_parse_ipv6_scope_int()
Definition: unittest_ip_resolver.cpp:524
test_parse_ipv4_brackets_missingr
static void test_parse_ipv4_brackets_missingr()
Definition: unittest_ip_resolver.cpp:269
test_parse_ipv6_scope_zero
static void test_parse_ipv6_scope_zero()
Definition: unittest_ip_resolver.cpp:533
zmq::initialize_network
bool initialize_network()
Definition: ip.cpp:264
test_dns_ipv6_simple
static void test_dns_ipv6_simple()
Definition: unittest_ip_resolver.cpp:646
ZMQ_FINAL::dns_lut_t::ipv4
const char * ipv4
Definition: unittest_ip_resolver.cpp:38
zmq::ip_addr_t::family
int family() const
Definition: ip_resolver.cpp:23
zmq::ip_resolver_options_t
Definition: ip_resolver.hpp:34
test_dns_ipv6_numeric
static void test_dns_ipv6_numeric()
Definition: unittest_ip_resolver.cpp:684
test_parse_ipv6_simple2
static void test_parse_ipv6_simple2()
Definition: unittest_ip_resolver.cpp:408
test_parse_ipv6_simple
static void test_parse_ipv6_simple()
Definition: unittest_ip_resolver.cpp:399
test_dns_ipv6_scope
void test_dns_ipv6_scope()
Definition: unittest_ip_resolver.cpp:751
ZMQ_FINAL::do_getaddrinfo
int do_getaddrinfo(const char *node_, const char *service_, const struct addrinfo *hints_, struct addrinfo **res_) ZMQ_FINAL
Definition: unittest_ip_resolver.cpp:42
setup_test_environment
void setup_test_environment(int timeout_seconds_)
Definition: testutil.cpp:201
test_addr_multicast_ipv6_sub
static void test_addr_multicast_ipv6_sub()
Definition: unittest_ip_resolver.cpp:849
UNITY_BEGIN
UNITY_BEGIN()
test_addr_unicast_ipv6
static void test_addr_unicast_ipv6()
Definition: unittest_ip_resolver.cpp:809
test_dns_ipv4_numeric
static void test_dns_ipv4_numeric()
Definition: unittest_ip_resolver.cpp:627
test_parse_ipv6_port
static void test_parse_ipv6_port()
Definition: unittest_ip_resolver.cpp:472
zmq::ip_addr_t::is_multicast
bool is_multicast() const
Definition: ip_resolver.cpp:28
test_addr
static void test_addr(int family_, const char *addr_, bool multicast_)
Definition: unittest_ip_resolver.cpp:785
test_parse_ipv6_scope_badif
static void test_parse_ipv6_scope_badif()
Definition: unittest_ip_resolver.cpp:582
test_parse_ipv4_simple
static void test_parse_ipv4_simple()
Definition: unittest_ip_resolver.cpp:233
test_parse_ipv6_max
static void test_parse_ipv6_max()
Definition: unittest_ip_resolver.cpp:426
test_parse_ipv4_brackets_bad
static void test_parse_ipv4_brackets_bad()
Definition: unittest_ip_resolver.cpp:276
test_dns_brackets_port
void test_dns_brackets_port()
Definition: unittest_ip_resolver.cpp:722
test_addr_multicast_ipv4_over
static void test_addr_multicast_ipv4_over()
Definition: unittest_ip_resolver.cpp:854
test_parse_ipv4_port_missing
static void test_parse_ipv4_port_missing()
Definition: unittest_ip_resolver.cpp:336
test_parse_ipv6_port_any
static void test_parse_ipv6_port_any()
Definition: unittest_ip_resolver.cpp:481
test_parse_ipv4_port_brackets_bad2
static void test_parse_ipv4_port_brackets_bad2()
Definition: unittest_ip_resolver.cpp:372
ZMQ_FINAL::test_ip_resolver_t
test_ip_resolver_t(zmq::ip_resolver_options_t opts_)
Definition: unittest_ip_resolver.cpp:29
ip_resolver.hpp
test_addr_multicast_ipv4_sub
static void test_addr_multicast_ipv4_sub()
Definition: unittest_ip_resolver.cpp:844
test_dns_brackets_bad
void test_dns_brackets_bad()
Definition: unittest_ip_resolver.cpp:713
ZMQ_FINAL
Definition: unittest_ip_resolver.cpp:26
setUp
void setUp()
Definition: unittest_ip_resolver.cpp:18
ZMQ_FINAL::dns_lut_t
Definition: unittest_ip_resolver.cpp:35
test_addr_multicast_ipv6
static void test_addr_multicast_ipv6()
Definition: unittest_ip_resolver.cpp:819
test_addr_multicast_ipv6_min
static void test_addr_multicast_ipv6_min()
Definition: unittest_ip_resolver.cpp:829
TEST_ASSERT_SUCCESS_ERRNO
#define TEST_ASSERT_SUCCESS_ERRNO(expr)
Definition: proxy_thr.cpp:47
test_dns_ipv4_only
static void test_dns_ipv4_only()
Definition: unittest_ip_resolver.cpp:600
test_parse_ipv6_brackets_missingl
static void test_parse_ipv6_brackets_missingl()
Definition: unittest_ip_resolver.cpp:445
test_addr_multicast_ipv4_max
static void test_addr_multicast_ipv4_max()
Definition: unittest_ip_resolver.cpp:834
test_parse_ipv4_port
static void test_parse_ipv4_port()
Definition: unittest_ip_resolver.cpp:307
ZMQ_FINAL::dns_lut_t::ipv6
const char * ipv6
Definition: unittest_ip_resolver.cpp:39
TEST_ASSERT_NULL
#define TEST_ASSERT_NULL(pointer)
Definition: unity.h:124


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