test_radio_dish.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MPL-2.0 */
2 
3 #include "testutil.hpp"
4 #include "testutil_unity.hpp"
5 
6 #include <string.h>
7 
8 #ifndef _WIN32
9 #include <sys/socket.h>
10 #include <netinet/in.h>
11 #include <arpa/inet.h>
12 #include <unistd.h>
13 #endif
14 
15 // Helper macro to define the v4/v6 function pairs
16 #define MAKE_TEST_V4V6(_test) \
17  static void _test##_ipv4 () \
18  { \
19  _test (false); \
20  } \
21  \
22  static void _test##_ipv6 () \
23  { \
24  if (!is_ipv6_available ()) { \
25  TEST_IGNORE_MESSAGE ("ipv6 is not available"); \
26  } \
27  _test (true); \
28  }
29 
31 
32 void msg_send_expect_success (void *s_, const char *group_, const char *body_)
33 {
34  zmq_msg_t msg;
35  const size_t len = strlen (body_);
37 
38  memcpy (zmq_msg_data (&msg), body_, len);
39 
41 
42  int rc = zmq_msg_send (&msg, s_, 0);
43  TEST_ASSERT_EQUAL_INT ((int) len, rc);
44 
45  // TODO isn't the msg closed by zmq_msg_send?
46  zmq_msg_close (&msg);
47 }
48 
49 void msg_recv_cmp (void *s_, const char *group_, const char *body_)
50 {
51  zmq_msg_t msg;
52  const size_t len = strlen (body_);
54 
55  int recv_rc = TEST_ASSERT_SUCCESS_ERRNO (zmq_msg_recv (&msg, s_, 0));
56  TEST_ASSERT_EQUAL_INT (len, recv_rc);
57 
58  TEST_ASSERT_EQUAL_STRING (group_, zmq_msg_group (&msg));
59 
61 
62  zmq_msg_close (&msg);
63 }
64 
66 {
67  void *dish = test_context_socket (ZMQ_DISH);
68 
69  // Leaving a group which we didn't join
70  TEST_ASSERT_FAILURE_ERRNO (EINVAL, zmq_leave (dish, "Movies"));
71 
73 }
74 
76 {
77  size_t len = MAX_SOCKET_STRING;
79 
80  void *radio = test_context_socket (ZMQ_RADIO);
81  bind_loopback (radio, false, my_endpoint, len);
82 
83  void *dish = test_context_socket (ZMQ_DISH);
84 
85  // Joining to a long group, over 14 chars
86  char group[19] = "0123456789ABCDEFGH";
88 
89  // Connecting
91 
93 
94  // This is going to be sent to the dish
95  msg_send_expect_success (radio, group, "HELLO");
96 
97  // Check the correct message arrived
98  msg_recv_cmp (dish, group, "HELLO");
99 
102 }
103 
105 {
106  void *dish = test_context_socket (ZMQ_DISH);
107 
108  // Joining too long group
109  char too_long_group[ZMQ_GROUP_MAX_LENGTH + 2];
110  for (int index = 0; index < ZMQ_GROUP_MAX_LENGTH + 2; index++)
111  too_long_group[index] = 'A';
112  too_long_group[ZMQ_GROUP_MAX_LENGTH + 1] = '\0';
113  TEST_ASSERT_FAILURE_ERRNO (EINVAL, zmq_join (dish, too_long_group));
114 
116 }
117 
119 {
120  void *dish = test_context_socket (ZMQ_DISH);
121 
122  TEST_ASSERT_SUCCESS_ERRNO (zmq_join (dish, "Movies"));
123 
124  // Duplicate Joining
125  TEST_ASSERT_FAILURE_ERRNO (EINVAL, zmq_join (dish, "Movies"));
126 
128 }
129 
130 void test_radio_dish_tcp_poll (int ipv6_)
131 {
132  size_t len = MAX_SOCKET_STRING;
134 
135  void *radio = test_context_socket (ZMQ_RADIO);
136  bind_loopback (radio, ipv6_, my_endpoint, len);
137 
138  void *dish = test_context_socket (ZMQ_DISH);
139 
141  zmq_setsockopt (dish, ZMQ_IPV6, &ipv6_, sizeof (int)));
142 
143  // Joining
144  TEST_ASSERT_SUCCESS_ERRNO (zmq_join (dish, "Movies"));
145 
146  // Connecting
148 
150 
151  // This is not going to be sent as dish only subscribe to "Movies"
152  msg_send_expect_success (radio, "TV", "Friends");
153 
154  // This is going to be sent to the dish
155  msg_send_expect_success (radio, "Movies", "Godfather");
156 
157  // Check the correct message arrived
158  msg_recv_cmp (dish, "Movies", "Godfather");
159 
160  // Join group during connection optvallen
161  TEST_ASSERT_SUCCESS_ERRNO (zmq_join (dish, "TV"));
162 
163  zmq_sleep (1);
164 
165  // This should arrive now as we joined the group
166  msg_send_expect_success (radio, "TV", "Friends");
167 
168  // Check the correct message arrived
169  msg_recv_cmp (dish, "TV", "Friends");
170 
171  // Leaving group
172  TEST_ASSERT_SUCCESS_ERRNO (zmq_leave (dish, "TV"));
173 
174  zmq_sleep (1);
175 
176  // This is not going to be sent as dish only subscribe to "Movies"
177  msg_send_expect_success (radio, "TV", "Friends");
178 
179  // This is going to be sent to the dish
180  msg_send_expect_success (radio, "Movies", "Godfather");
181 
182  // test zmq_poll with dish
183  zmq_pollitem_t items[] = {
184  {radio, 0, ZMQ_POLLIN, 0}, // read publications
185  {dish, 0, ZMQ_POLLIN, 0}, // read subscriptions
186  };
187  int rc = zmq_poll (items, 2, 2000);
188  TEST_ASSERT_EQUAL_INT (1, rc);
189  TEST_ASSERT_EQUAL_INT (ZMQ_POLLIN, items[1].revents);
190 
191  // Check the correct message arrived
192  msg_recv_cmp (dish, "Movies", "Godfather");
193 
196 }
198 
200 {
201  void *dish = test_context_socket (ZMQ_DISH);
202 
204  zmq_setsockopt (dish, ZMQ_IPV6, &ipv6_, sizeof (int)));
205 
206  const char *url = ipv6_ ? "udp://[::1]:5556" : "udp://127.0.0.1:5556";
207 
208  // Connecting dish should fail
210 
212 }
214 
216 {
217  void *radio = test_context_socket (ZMQ_RADIO);
218 
220  zmq_setsockopt (radio, ZMQ_IPV6, &ipv6_, sizeof (int)));
221 
222  // Connecting dish should fail
223  // Bind radio should fail
225  zmq_bind (radio, "udp://*:5556"));
226 
228 }
230 
232 {
233  void *radio = test_context_socket (ZMQ_RADIO);
234  void *dish = test_context_socket (ZMQ_DISH);
235 
237  zmq_setsockopt (radio, ZMQ_IPV6, &ipv6_, sizeof (int)));
239  zmq_setsockopt (dish, ZMQ_IPV6, &ipv6_, sizeof (int)));
240 
241  const char *radio_url = ipv6_ ? "udp://[::1]:5556" : "udp://127.0.0.1:5556";
242 
243  TEST_ASSERT_SUCCESS_ERRNO (zmq_bind (dish, "udp://*:5556"));
244  TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (radio, radio_url));
245 
247 
248  TEST_ASSERT_SUCCESS_ERRNO (zmq_join (dish, "TV"));
249 
250  msg_send_expect_success (radio, "TV", "Friends");
251  msg_recv_cmp (dish, "TV", "Friends");
252 
255 }
257 
258 #define MCAST_IPV4 "226.8.5.5"
259 #define MCAST_IPV6 "ff02::7a65:726f:6df1:0a01"
260 
261 static const char *mcast_url (int ipv6_)
262 {
263  if (ipv6_) {
264  return "udp://[" MCAST_IPV6 "]:5555";
265  }
266  return "udp://" MCAST_IPV4 ":5555";
267 }
268 
269 // OSX uses a different name for this socket option
270 #ifndef IPV6_ADD_MEMBERSHIP
271 #define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
272 #endif
273 
274 union sa_u
275 {
276  struct sockaddr generic;
277  struct sockaddr_in ipv4;
278  struct sockaddr_in6 ipv6;
279 };
280 
281 // Test if multicast is available on this machine by attempting to
282 // send a receive a multicast datagram
283 static bool is_multicast_available (int ipv6_)
284 {
285  int family = ipv6_ ? AF_INET6 : AF_INET;
286  fd_t bind_sock = retired_fd;
287  fd_t send_sock = retired_fd;
288  int port = 5555;
289  bool success = false;
290  const char *msg = "it works";
291  char buf[32];
292  union sa_u any;
293  union sa_u mcast;
294  socklen_t sl;
295  int rc;
296 
297  if (ipv6_) {
298  struct sockaddr_in6 *any_ipv6 = &any.ipv6;
299  struct sockaddr_in6 *mcast_ipv6 = &mcast.ipv6;
300 
301  any_ipv6->sin6_family = AF_INET6;
302  any_ipv6->sin6_port = htons (port);
303  any_ipv6->sin6_flowinfo = 0;
304  any_ipv6->sin6_scope_id = 0;
305 
306  rc = test_inet_pton (AF_INET6, "::", &any_ipv6->sin6_addr);
307  if (rc == 0) {
308  goto out;
309  }
310 
311  *mcast_ipv6 = *any_ipv6;
312 
313  rc = test_inet_pton (AF_INET6, MCAST_IPV6, &mcast_ipv6->sin6_addr);
314  if (rc == 0) {
315  goto out;
316  }
317 
318  sl = sizeof (*any_ipv6);
319  } else {
320  struct sockaddr_in *any_ipv4 = &any.ipv4;
321  struct sockaddr_in *mcast_ipv4 = &mcast.ipv4;
322 
323  any_ipv4->sin_family = AF_INET;
324  any_ipv4->sin_port = htons (5555);
325 
326  rc = test_inet_pton (AF_INET, "0.0.0.0", &any_ipv4->sin_addr);
327  if (rc == 0) {
328  goto out;
329  }
330 
331  *mcast_ipv4 = *any_ipv4;
332 
333  rc = test_inet_pton (AF_INET, MCAST_IPV4, &mcast_ipv4->sin_addr);
334  if (rc == 0) {
335  goto out;
336  }
337 
338  sl = sizeof (*any_ipv4);
339  }
340 
341  bind_sock = socket (family, SOCK_DGRAM, IPPROTO_UDP);
342  if (bind_sock < 0) {
343  goto out;
344  }
345 
346  send_sock = socket (family, SOCK_DGRAM, IPPROTO_UDP);
347  if (bind_sock < 0) {
348  goto out;
349  }
350 
351  rc = bind (bind_sock, &any.generic, sl);
352  if (rc < 0) {
353  goto out;
354  }
355 
356  if (ipv6_) {
357  struct ipv6_mreq mreq;
358  const sockaddr_in6 *const mcast_ipv6 = &mcast.ipv6;
359 
360  mreq.ipv6mr_multiaddr = mcast_ipv6->sin6_addr;
361  mreq.ipv6mr_interface = 0;
362 
363  rc = setsockopt (bind_sock, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP,
364  as_setsockopt_opt_t (&mreq), sizeof (mreq));
365  if (rc < 0) {
366  goto out;
367  }
368 
369  int loop = 1;
370  rc = setsockopt (send_sock, IPPROTO_IPV6, IPV6_MULTICAST_LOOP,
371  as_setsockopt_opt_t (&loop), sizeof (loop));
372  if (rc < 0) {
373  goto out;
374  }
375  } else {
376  struct ip_mreq mreq;
377  const sockaddr_in *const mcast_ipv4 = &mcast.ipv4;
378 
379  mreq.imr_multiaddr = mcast_ipv4->sin_addr;
380  mreq.imr_interface.s_addr = htonl (INADDR_ANY);
381 
382  rc = setsockopt (bind_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP,
383  as_setsockopt_opt_t (&mreq), sizeof (mreq));
384  if (rc < 0) {
385  goto out;
386  }
387 
388  int loop = 1;
389  rc = setsockopt (send_sock, IPPROTO_IP, IP_MULTICAST_LOOP,
390  as_setsockopt_opt_t (&loop), sizeof (loop));
391  if (rc < 0) {
392  goto out;
393  }
394  }
395 
397 
398  rc = sendto (send_sock, msg, static_cast<socklen_t> (strlen (msg)), 0,
399  &mcast.generic, sl);
400  if (rc < 0) {
401  goto out;
402  }
403 
405 
406  rc = recvfrom (bind_sock, buf, sizeof (buf) - 1, 0, NULL, 0);
407  if (rc < 0) {
408  goto out;
409  }
410 
411  buf[rc] = '\0';
412 
413  success = (strcmp (msg, buf) == 0);
414 
415 out:
416  if (bind_sock >= 0) {
417  close (bind_sock);
418  }
419 
420  if (send_sock >= 0) {
421  close (send_sock);
422  }
423 
424  return success;
425 }
426 
427 static void ignore_if_unavailable (int ipv6_)
428 {
429  if (ipv6_ && !is_ipv6_available ())
430  TEST_IGNORE_MESSAGE ("No IPV6 available");
431  if (!is_multicast_available (ipv6_))
432  TEST_IGNORE_MESSAGE ("No multicast available");
433 }
434 
435 static void test_radio_dish_mcast (int ipv6_)
436 {
437  ignore_if_unavailable (ipv6_);
438 
439  void *radio = test_context_socket (ZMQ_RADIO);
440  void *dish = test_context_socket (ZMQ_DISH);
441 
443  zmq_setsockopt (radio, ZMQ_IPV6, &ipv6_, sizeof (int)));
445  zmq_setsockopt (dish, ZMQ_IPV6, &ipv6_, sizeof (int)));
446 
447  const char *url = mcast_url (ipv6_);
448 
451 
453 
454  TEST_ASSERT_SUCCESS_ERRNO (zmq_join (dish, "TV"));
455 
456  msg_send_expect_success (radio, "TV", "Friends");
457  msg_recv_cmp (dish, "TV", "Friends");
458 
461 }
463 
464 static void test_radio_dish_no_loop (int ipv6_)
465 {
466 #ifdef _WIN32
468  "ZMQ_MULTICAST_LOOP=false does not appear to work on Windows (TODO)");
469 #endif
470  ignore_if_unavailable (ipv6_);
471 
472  void *radio = test_context_socket (ZMQ_RADIO);
473  void *dish = test_context_socket (ZMQ_DISH);
474 
476  zmq_setsockopt (radio, ZMQ_IPV6, &ipv6_, sizeof (int)));
478  zmq_setsockopt (dish, ZMQ_IPV6, &ipv6_, sizeof (int)));
479 
480  // Disable multicast loop for radio
481  int loop = 0;
483  zmq_setsockopt (radio, ZMQ_MULTICAST_LOOP, &loop, sizeof (int)));
484 
485  const char *url = mcast_url (ipv6_);
486 
489 
491 
492  TEST_ASSERT_SUCCESS_ERRNO (zmq_join (dish, "TV"));
493 
494  msg_send_expect_success (radio, "TV", "Friends");
495 
496  // Looping is disabled, we shouldn't receive anything
498 
500 
503 }
505 
506 int main (void)
507 {
509 
510  UNITY_BEGIN ();
515  RUN_TEST (test_radio_bind_fails_ipv4);
516  RUN_TEST (test_radio_bind_fails_ipv6);
517  RUN_TEST (test_dish_connect_fails_ipv4);
518  RUN_TEST (test_dish_connect_fails_ipv6);
519  RUN_TEST (test_radio_dish_tcp_poll_ipv4);
520  RUN_TEST (test_radio_dish_tcp_poll_ipv6);
521  RUN_TEST (test_radio_dish_udp_ipv4);
522  RUN_TEST (test_radio_dish_udp_ipv6);
523 
524  RUN_TEST (test_radio_dish_mcast_ipv4);
525  RUN_TEST (test_radio_dish_no_loop_ipv4);
526 
527  RUN_TEST (test_radio_dish_mcast_ipv6);
528  RUN_TEST (test_radio_dish_no_loop_ipv6);
529 
530  return UNITY_END ();
531 }
zmq_msg_group
const char * zmq_msg_group(zmq_msg_t *msg_)
Definition: zmq.cpp:704
TEST_ASSERT_EQUAL_STRING
#define TEST_ASSERT_EQUAL_STRING(expected, actual)
Definition: unity.h:235
sa_u::ipv4
struct sockaddr_in ipv4
Definition: test_radio_dish.cpp:277
as_setsockopt_opt_t
const void * as_setsockopt_opt_t(const void *opt_)
Definition: libzmq/tests/testutil.hpp:91
TEST_ASSERT_EQUAL_STRING_LEN
#define TEST_ASSERT_EQUAL_STRING_LEN(expected, actual, len)
Definition: unity.h:236
mcast_url
static const char * mcast_url(int ipv6_)
Definition: test_radio_dish.cpp:261
test_leave_unjoined_fails
void test_leave_unjoined_fails()
Definition: test_radio_dish.cpp:65
zmq_msg_set_group
int zmq_msg_set_group(zmq_msg_t *msg_, const char *group_)
Definition: zmq.cpp:699
NULL
NULL
Definition: test_security_zap.cpp:405
main
int main(void)
Definition: test_radio_dish.cpp:506
UNITY_END
return UNITY_END()
EINVAL
#define EINVAL
Definition: errno.hpp:25
msleep
void msleep(int milliseconds_)
Definition: testutil.cpp:227
is_ipv6_available
int is_ipv6_available()
Definition: testutil.cpp:236
zmq_msg_send
ZMQ_EXPORT int zmq_msg_send(zmq_msg_t *msg_, void *s_, int flags_)
Definition: zmq.cpp:609
zmq_poll
ZMQ_EXPORT int zmq_poll(zmq_pollitem_t *items_, int nitems_, long timeout_)
Definition: zmq.cpp:827
EAGAIN
#define EAGAIN
Definition: errno.hpp:14
RUN_TEST
#define RUN_TEST(func)
Definition: unity_internals.h:615
ZMQ_RADIO
#define ZMQ_RADIO
Definition: zmq_draft.h:16
SETUP_TEARDOWN_TESTCONTEXT
#define SETUP_TEARDOWN_TESTCONTEXT
Definition: testutil_unity.hpp:172
msg_recv_cmp
void msg_recv_cmp(void *s_, const char *group_, const char *body_)
Definition: test_radio_dish.cpp:49
ZMQ_MULTICAST_LOOP
#define ZMQ_MULTICAST_LOOP
Definition: zmq_draft.h:28
test_radio_dish_no_loop
static void test_radio_dish_no_loop(int ipv6_)
Definition: test_radio_dish.cpp:464
zmq_pollitem_t
Definition: zmq.h:487
test_radio_dish_mcast
static void test_radio_dish_mcast(int ipv6_)
Definition: test_radio_dish.cpp:435
ZMQ_GROUP_MAX_LENGTH
#define ZMQ_GROUP_MAX_LENGTH
Definition: zmq.h:368
zmq_msg_data
ZMQ_EXPORT void * zmq_msg_data(zmq_msg_t *msg_)
Definition: zmq.cpp:642
zmq_connect
ZMQ_EXPORT int zmq_connect(void *s_, const char *addr_)
Definition: zmq.cpp:307
ZMQ_POLLIN
#define ZMQ_POLLIN
Definition: zmq.h:482
retired_fd
@ retired_fd
Definition: libzmq/tests/testutil.hpp:117
MCAST_IPV6
#define MCAST_IPV6
Definition: test_radio_dish.cpp:259
testutil_unity.hpp
test_radio_dish_udp
void test_radio_dish_udp(int ipv6_)
Definition: test_radio_dish.cpp:231
zmq_setsockopt
ZMQ_EXPORT int zmq_setsockopt(void *s_, int option_, const void *optval_, size_t optvallen_)
Definition: zmq.cpp:250
testutil.hpp
zmq_msg_t
Definition: zmq.h:218
s_
std::string s_
Definition: gmock-matchers_test.cc:4128
my_endpoint
char my_endpoint[MAX_SOCKET_STRING]
Definition: test_security_curve.cpp:31
MAX_SOCKET_STRING
#define MAX_SOCKET_STRING
Definition: libzmq/tests/testutil.hpp:35
zmq_bind
ZMQ_EXPORT int zmq_bind(void *s_, const char *addr_)
Definition: zmq.cpp:299
bind_loopback
void bind_loopback(void *socket_, int ipv6_, char *my_endpoint_, size_t len_)
Definition: testutil_unity.cpp:233
zmq_msg_recv
ZMQ_EXPORT int zmq_msg_recv(zmq_msg_t *msg_, void *s_, int flags_)
Definition: zmq.cpp:617
sa_u::ipv6
struct sockaddr_in6 ipv6
Definition: test_radio_dish.cpp:278
test_context_socket
void * test_context_socket(int type_)
Definition: testutil_unity.cpp:200
sa_u
Definition: test_radio_dish.cpp:274
ZMQ_DONTWAIT
#define ZMQ_DONTWAIT
Definition: zmq.h:358
SETTLE_TIME
#define SETTLE_TIME
Definition: libzmq/tests/testutil.hpp:31
zmq_leave
int zmq_leave(void *s_, const char *group_)
Definition: zmq.cpp:291
buf
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glcorearb.h:4175
TEST_ASSERT_EQUAL_INT
#define TEST_ASSERT_EQUAL_INT(expected, actual)
Definition: unity.h:128
test_join_too_long_fails
void test_join_too_long_fails()
Definition: test_radio_dish.cpp:104
zmq_msg_init
ZMQ_EXPORT int zmq_msg_init(zmq_msg_t *msg_)
Definition: zmq.cpp:587
void
typedef void(APIENTRY *GLDEBUGPROCARB)(GLenum source
TEST_IGNORE_MESSAGE
#define TEST_IGNORE_MESSAGE(message)
Definition: unity.h:103
zmq_join
int zmq_join(void *s_, const char *group_)
Definition: zmq.cpp:283
test_dish_connect_fails
void test_dish_connect_fails(int ipv6_)
Definition: test_radio_dish.cpp:199
len
int len
Definition: php/ext/google/protobuf/map.c:206
zmq_recv
ZMQ_EXPORT int zmq_recv(void *s_, void *buf_, size_t len_, int flags_)
Definition: zmq.cpp:487
ZMQ_DISH
#define ZMQ_DISH
Definition: zmq_draft.h:17
test_long_group
void test_long_group()
Definition: test_radio_dish.cpp:75
ZMQ_IPV6
#define ZMQ_IPV6
Definition: zmq.h:307
setup_test_environment
void setup_test_environment(int timeout_seconds_)
Definition: testutil.cpp:201
is_multicast_available
static bool is_multicast_available(int ipv6_)
Definition: test_radio_dish.cpp:283
test_inet_pton
int test_inet_pton(int af_, const char *src_, void *dst_)
Definition: testutil.cpp:303
zmq_msg_init_size
ZMQ_EXPORT int zmq_msg_init_size(zmq_msg_t *msg_, size_t size_)
Definition: zmq.cpp:592
UNITY_BEGIN
UNITY_BEGIN()
fd_t
zmq_fd_t fd_t
Definition: libzmq/tests/testutil.hpp:98
TEST_ASSERT_FAILURE_ERRNO
#define TEST_ASSERT_FAILURE_ERRNO(error_code, expr)
Definition: testutil_unity.hpp:95
msg_send_expect_success
SETUP_TEARDOWN_TESTCONTEXT void msg_send_expect_success(void *s_, const char *group_, const char *body_)
Definition: test_radio_dish.cpp:32
zmq_sleep
ZMQ_EXPORT void zmq_sleep(int seconds_)
Definition: zmq_utils.cpp:23
sa_u::generic
struct sockaddr generic
Definition: test_radio_dish.cpp:276
test_join_twice_fails
void test_join_twice_fails()
Definition: test_radio_dish.cpp:118
setup.url
url
Definition: compatibility_tests/v2.5.0/setup.py:64
test_radio_bind_fails
void test_radio_bind_fails(int ipv6_)
Definition: test_radio_dish.cpp:215
ENOCOMPATPROTO
#define ENOCOMPATPROTO
Definition: zmq.h:160
ignore_if_unavailable
static void ignore_if_unavailable(int ipv6_)
Definition: test_radio_dish.cpp:427
test_context_socket_close
void * test_context_socket_close(void *socket_)
Definition: testutil_unity.cpp:208
test_radio_dish_tcp_poll
void test_radio_dish_tcp_poll(int ipv6_)
Definition: test_radio_dish.cpp:130
index
GLuint index
Definition: glcorearb.h:3055
group
static uint32_t * group(tarjan *t, upb_refcounted *r)
Definition: ruby/ext/google/protobuf_c/upb.c:5943
zmq_msg_close
ZMQ_EXPORT int zmq_msg_close(zmq_msg_t *msg_)
Definition: zmq.cpp:625
MAKE_TEST_V4V6
#define MAKE_TEST_V4V6(_test)
Definition: test_radio_dish.cpp:16
TEST_ASSERT_SUCCESS_ERRNO
#define TEST_ASSERT_SUCCESS_ERRNO(expr)
Definition: proxy_thr.cpp:47
MCAST_IPV4
#define MCAST_IPV4
Definition: test_radio_dish.cpp:258
IPV6_ADD_MEMBERSHIP
#define IPV6_ADD_MEMBERSHIP
Definition: test_radio_dish.cpp:271


libaditof
Author(s):
autogenerated on Wed May 21 2025 02:06:59