test_unbind_wildcard.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. /*
  2. Copyright (c) 2007-2017 Contributors as noted in the AUTHORS file
  3. This file is part of 0MQ.
  4. 0MQ is free software; you can redistribute it and/or modify it under
  5. the terms of the GNU Lesser General Public License as published by
  6. the Free Software Foundation; either version 3 of the License, or
  7. (at your option) any later version.
  8. 0MQ is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU Lesser General Public License for more details.
  12. You should have received a copy of the GNU Lesser General Public License
  13. along with this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. #include "testutil.hpp"
  16. #include "testutil_unity.hpp"
  17. #include <string.h>
  18. SETUP_TEARDOWN_TESTCONTEXT
  19. void test_address_wildcard_ipv4 ()
  20. {
  21. /* Address wildcard, IPv6 disabled */
  22. void *sb = test_context_socket (ZMQ_REP);
  23. void *sc = test_context_socket (ZMQ_REQ);
  24. TEST_ASSERT_SUCCESS_ERRNO (zmq_bind (sb, "tcp://*:*"));
  25. char bind_endpoint[256];
  26. char connect_endpoint[256];
  27. size_t endpoint_len = sizeof (bind_endpoint);
  28. TEST_ASSERT_SUCCESS_ERRNO (
  29. zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, bind_endpoint, &endpoint_len));
  30. // Apparently Windows can't connect to 0.0.0.0. A better fix would be welcome.
  31. #ifdef ZMQ_HAVE_WINDOWS
  32. sprintf (connect_endpoint, "tcp://127.0.0.1:%s",
  33. strrchr (bind_endpoint, ':') + 1);
  34. #else
  35. strcpy (connect_endpoint, bind_endpoint);
  36. #endif
  37. TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (sc, connect_endpoint));
  38. bounce (sb, sc);
  39. TEST_ASSERT_SUCCESS_ERRNO (zmq_disconnect (sc, connect_endpoint));
  40. TEST_ASSERT_SUCCESS_ERRNO (zmq_unbind (sb, bind_endpoint));
  41. test_context_socket_close (sc);
  42. test_context_socket_close (sb);
  43. }
  44. void test_address_wildcard_ipv6 ()
  45. {
  46. int ipv6 = is_ipv6_available ();
  47. /* Address wildcard, IPv6 enabled */
  48. void *sb = test_context_socket (ZMQ_REP);
  49. void *sc = test_context_socket (ZMQ_REQ);
  50. TEST_ASSERT_SUCCESS_ERRNO (
  51. zmq_setsockopt (sb, ZMQ_IPV6, &ipv6, sizeof (int)));
  52. TEST_ASSERT_SUCCESS_ERRNO (
  53. zmq_setsockopt (sc, ZMQ_IPV6, &ipv6, sizeof (int)));
  54. TEST_ASSERT_SUCCESS_ERRNO (zmq_bind (sb, "tcp://*:*"));
  55. char bind_endpoint[256];
  56. char connect_endpoint[256];
  57. size_t endpoint_len = sizeof (bind_endpoint);
  58. memset (bind_endpoint, 0, endpoint_len);
  59. TEST_ASSERT_SUCCESS_ERRNO (
  60. zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, bind_endpoint, &endpoint_len));
  61. #ifdef ZMQ_HAVE_WINDOWS
  62. if (ipv6)
  63. sprintf (connect_endpoint, "tcp://[::1]:%s",
  64. strrchr (bind_endpoint, ':') + 1);
  65. else
  66. sprintf (connect_endpoint, "tcp://127.0.0.1:%s",
  67. strrchr (bind_endpoint, ':') + 1);
  68. #else
  69. strcpy (connect_endpoint, bind_endpoint);
  70. #endif
  71. TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (sc, connect_endpoint));
  72. bounce (sb, sc);
  73. TEST_ASSERT_SUCCESS_ERRNO (zmq_disconnect (sc, connect_endpoint));
  74. TEST_ASSERT_SUCCESS_ERRNO (zmq_unbind (sb, bind_endpoint));
  75. test_context_socket_close (sc);
  76. test_context_socket_close (sb);
  77. }
  78. void test_port_wildcard_ipv4_address ()
  79. {
  80. /* Port wildcard, IPv4 address, IPv6 disabled */
  81. void *sb = test_context_socket (ZMQ_REP);
  82. void *sc = test_context_socket (ZMQ_REQ);
  83. TEST_ASSERT_SUCCESS_ERRNO (zmq_bind (sb, "tcp://127.0.0.1:*"));
  84. char endpoint[256];
  85. size_t endpoint_len = sizeof (endpoint);
  86. memset (endpoint, 0, endpoint_len);
  87. TEST_ASSERT_SUCCESS_ERRNO (
  88. zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, endpoint, &endpoint_len));
  89. TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (sc, endpoint));
  90. bounce (sb, sc);
  91. TEST_ASSERT_SUCCESS_ERRNO (zmq_disconnect (sc, endpoint));
  92. TEST_ASSERT_SUCCESS_ERRNO (zmq_unbind (sb, endpoint));
  93. test_context_socket_close (sc);
  94. test_context_socket_close (sb);
  95. }
  96. void test_port_wildcard_ipv4_address_ipv6 ()
  97. {
  98. /* Port wildcard, IPv4 address, IPv6 enabled */
  99. void *sb = test_context_socket (ZMQ_REP);
  100. void *sc = test_context_socket (ZMQ_REQ);
  101. const int ipv6 = is_ipv6_available ();
  102. TEST_ASSERT_SUCCESS_ERRNO (
  103. zmq_setsockopt (sb, ZMQ_IPV6, &ipv6, sizeof (int)));
  104. TEST_ASSERT_SUCCESS_ERRNO (
  105. zmq_setsockopt (sc, ZMQ_IPV6, &ipv6, sizeof (int)));
  106. TEST_ASSERT_SUCCESS_ERRNO (zmq_bind (sb, "tcp://127.0.0.1:*"));
  107. char endpoint[256];
  108. size_t endpoint_len = sizeof (endpoint);
  109. memset (endpoint, 0, endpoint_len);
  110. TEST_ASSERT_SUCCESS_ERRNO (
  111. zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, endpoint, &endpoint_len));
  112. TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (sc, endpoint));
  113. bounce (sb, sc);
  114. TEST_ASSERT_SUCCESS_ERRNO (zmq_disconnect (sc, endpoint));
  115. TEST_ASSERT_SUCCESS_ERRNO (zmq_unbind (sb, endpoint));
  116. test_context_socket_close (sc);
  117. test_context_socket_close (sb);
  118. }
  119. void test_port_wildcard_ipv6_address ()
  120. {
  121. const int ipv6 = is_ipv6_available ();
  122. if (!ipv6)
  123. TEST_IGNORE_MESSAGE ("ipv6 is not available");
  124. /* Port wildcard, IPv6 address, IPv6 enabled */
  125. void *sb = test_context_socket (ZMQ_REP);
  126. void *sc = test_context_socket (ZMQ_REQ);
  127. TEST_ASSERT_SUCCESS_ERRNO (
  128. zmq_setsockopt (sb, ZMQ_IPV6, &ipv6, sizeof (int)));
  129. TEST_ASSERT_SUCCESS_ERRNO (
  130. zmq_setsockopt (sc, ZMQ_IPV6, &ipv6, sizeof (int)));
  131. TEST_ASSERT_SUCCESS_ERRNO (zmq_bind (sb, "tcp://[::1]:*"));
  132. char endpoint[256];
  133. size_t endpoint_len = sizeof (endpoint);
  134. memset (endpoint, 0, endpoint_len);
  135. TEST_ASSERT_SUCCESS_ERRNO (
  136. zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, endpoint, &endpoint_len));
  137. TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (sc, endpoint));
  138. bounce (sb, sc);
  139. TEST_ASSERT_SUCCESS_ERRNO (zmq_disconnect (sc, endpoint));
  140. TEST_ASSERT_SUCCESS_ERRNO (zmq_unbind (sb, endpoint));
  141. test_context_socket_close (sc);
  142. test_context_socket_close (sb);
  143. }
  144. int main ()
  145. {
  146. setup_test_environment ();
  147. UNITY_BEGIN ();
  148. RUN_TEST (test_address_wildcard_ipv4);
  149. RUN_TEST (test_address_wildcard_ipv6);
  150. RUN_TEST (test_port_wildcard_ipv4_address);
  151. RUN_TEST (test_port_wildcard_ipv4_address_ipv6);
  152. RUN_TEST (test_port_wildcard_ipv6_address);
  153. return UNITY_END ();
  154. }