test_spec_router.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 <stdlib.h>
7 #include <string.h>
8 
10 
11 // SHALL receive incoming messages from its peers using a fair-queuing
12 // strategy.
13 void test_fair_queue_in (const char *bind_address_)
14 {
17  TEST_ASSERT_SUCCESS_ERRNO (zmq_bind (receiver, bind_address_));
18  size_t len = MAX_SOCKET_STRING;
21 
22  const unsigned char services = 5;
23  void *senders[services];
24  for (unsigned char peer = 0; peer < services; ++peer) {
25  senders[peer] = test_context_socket (ZMQ_DEALER);
26 
27  char *str = strdup ("A");
28  str[0] += peer;
30  zmq_setsockopt (senders[peer], ZMQ_ROUTING_ID, str, 2));
31  free (str);
32 
34  zmq_connect (senders[peer], connect_address));
35  }
36 
38 
39  zmq_msg_t msg;
41 
42  s_send_seq (senders[0], "M", SEQ_END);
43  s_recv_seq (receiver, "A", "M", SEQ_END);
44 
45  s_send_seq (senders[0], "M", SEQ_END);
46  s_recv_seq (receiver, "A", "M", SEQ_END);
47 
48  int sum = 0;
49 
50  // send N requests
51  for (unsigned char peer = 0; peer < services; ++peer) {
52  s_send_seq (senders[peer], "M", SEQ_END);
53  sum += 'A' + peer;
54  }
55 
56  TEST_ASSERT_EQUAL_INT (services * 'A' + services * (services - 1) / 2, sum);
57 
58  // handle N requests
59  for (unsigned char peer = 0; peer < services; ++peer) {
62  const char *id = static_cast<const char *> (zmq_msg_data (&msg));
63  sum -= id[0];
64 
65  s_recv_seq (receiver, "M", SEQ_END);
66  }
67 
68  TEST_ASSERT_EQUAL_INT (0, sum);
69 
71 
73 
74  for (size_t peer = 0; peer < services; ++peer)
76 
77  // Wait for disconnects.
79 }
80 
81 // SHALL create a double queue when a peer connects to it. If this peer
82 // disconnects, the ROUTER socket SHALL destroy its double queue and SHALL
83 // discard any messages it contains.
84 void test_destroy_queue_on_disconnect (const char *bind_address_)
85 {
87 
88  int enabled = 1;
91 
92  TEST_ASSERT_SUCCESS_ERRNO (zmq_bind (a, bind_address_));
93  size_t len = MAX_SOCKET_STRING;
97 
99 
101 
103 
104  // Wait for connection.
106 
107  // Send a message in both directions
108  s_send_seq (a, "B", "ABC", SEQ_END);
109  s_send_seq (b, "DEF", SEQ_END);
110 
112 
113  // Disconnect may take time and need command processing.
114  zmq_pollitem_t poller[2] = {{a, 0, 0, 0}, {b, 0, 0, 0}};
115  TEST_ASSERT_SUCCESS_ERRNO (zmq_poll (poller, 2, 100));
116  TEST_ASSERT_SUCCESS_ERRNO (zmq_poll (poller, 2, 100));
117 
118  // No messages should be available, sending should fail.
119  zmq_msg_t msg;
120  zmq_msg_init (&msg);
121 
124 
126 
127  // After a reconnect of B, the messages should still be gone
129 
131 
133 
135 
138 
139  // Wait for disconnects.
141 }
142 
143 #define TEST_SUITE(name, bind_address) \
144  void test_fair_queue_in_##name () \
145  { \
146  test_fair_queue_in (bind_address); \
147  } \
148  void test_destroy_queue_on_disconnect_##name () \
149  { \
150  test_destroy_queue_on_disconnect (bind_address); \
151  }
152 
153 TEST_SUITE (inproc, "inproc://a")
154 TEST_SUITE (tcp, "tcp://127.0.0.1:*")
155 
156 int main ()
157 {
159 
160  UNITY_BEGIN ();
163  // TODO commented out until libzmq implements this properly
164  // RUN_TEST (test_destroy_queue_on_disconnect_tcp);
165  // RUN_TEST (test_destroy_queue_on_disconnect_inproc);
166  return UNITY_END ();
167 }
TEST_SUITE
#define TEST_SUITE(name, bind_address)
Definition: test_spec_router.cpp:143
UNITY_END
return UNITY_END()
test_fair_queue_in_inproc
void test_fair_queue_in_inproc()
Definition: test_spec_rep.cpp:99
msleep
void msleep(int milliseconds_)
Definition: testutil.cpp:227
zmq::protocol_name::tcp
static const char tcp[]
Definition: address.hpp:38
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_LAST_ENDPOINT
#define ZMQ_LAST_ENDPOINT
Definition: zmq.h:298
SETUP_TEARDOWN_TESTCONTEXT
#define SETUP_TEARDOWN_TESTCONTEXT
Definition: testutil_unity.hpp:172
zmq_pollitem_t
Definition: zmq.h:487
services
const size_t services
Definition: test_req_relaxed.cpp:8
test_context_socket_close_zero_linger
void * test_context_socket_close_zero_linger(void *socket_)
Definition: testutil_unity.cpp:215
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
b
GLboolean GLboolean GLboolean b
Definition: glcorearb.h:3228
enabled
GLenum GLenum GLsizei const GLuint GLboolean enabled
Definition: glcorearb.h:4174
testutil_unity.hpp
ZMQ_DEALER
#define ZMQ_DEALER
Definition: zmq.h:263
zmq_setsockopt
ZMQ_EXPORT int zmq_setsockopt(void *s_, int option_, const void *optval_, size_t optvallen_)
Definition: zmq.cpp:250
zmq_disconnect
ZMQ_EXPORT int zmq_disconnect(void *s_, const char *addr_)
Definition: zmq.cpp:345
testutil.hpp
ZMQ_ROUTER
#define ZMQ_ROUTER
Definition: zmq.h:264
update_failure_list.str
str
Definition: update_failure_list.py:41
zmq_msg_t
Definition: zmq.h:218
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
test_fair_queue_in_tcp
void test_fair_queue_in_tcp()
Definition: test_spec_rep.cpp:104
zmq_msg_recv
ZMQ_EXPORT int zmq_msg_recv(zmq_msg_t *msg_, void *s_, int flags_)
Definition: zmq.cpp:617
test_context_socket
void * test_context_socket(int type_)
Definition: testutil_unity.cpp:200
ZMQ_DONTWAIT
#define ZMQ_DONTWAIT
Definition: zmq.h:358
SETTLE_TIME
#define SETTLE_TIME
Definition: libzmq/tests/testutil.hpp:31
zmq::protocol_name::inproc
static const char inproc[]
Definition: address.hpp:37
test_destroy_queue_on_disconnect
void test_destroy_queue_on_disconnect(const char *bind_address_)
Definition: test_spec_router.cpp:84
TEST_ASSERT_EQUAL_INT
#define TEST_ASSERT_EQUAL_INT(expected, actual)
Definition: unity.h:128
zmq_msg_init
ZMQ_EXPORT int zmq_msg_init(zmq_msg_t *msg_)
Definition: zmq.cpp:587
ZMQ_ROUTER_MANDATORY
#define ZMQ_ROUTER_MANDATORY
Definition: zmq.h:299
SEQ_END
const char * SEQ_END
Definition: testutil.cpp:47
len
int len
Definition: php/ext/google/protobuf/map.c:206
s_send_seq
void s_send_seq(void *socket_,...)
Definition: testutil.cpp:135
setup_test_environment
void setup_test_environment(int timeout_seconds_)
Definition: testutil.cpp:201
UNITY_BEGIN
UNITY_BEGIN()
s_recv_seq
void s_recv_seq(void *socket_,...)
Definition: testutil.cpp:158
connect_address
SETUP_TEARDOWN_TESTCONTEXT char connect_address[MAX_SOCKET_STRING]
Definition: tests/test_fork.cpp:14
ZMQ_SNDMORE
#define ZMQ_SNDMORE
Definition: zmq.h:359
receiver
static void receiver(void *socket_)
Definition: test_ctx_destroy.cpp:16
TEST_ASSERT_FAILURE_ERRNO
#define TEST_ASSERT_FAILURE_ERRNO(error_code, expr)
Definition: testutil_unity.hpp:95
ZMQ_ROUTING_ID
#define ZMQ_ROUTING_ID
Definition: zmq.h:277
test_fair_queue_in
SETUP_TEARDOWN_TESTCONTEXT void test_fair_queue_in(const char *bind_address_)
Definition: test_spec_router.cpp:13
main
int main()
Definition: test_spec_router.cpp:156
EHOSTUNREACH
#define EHOSTUNREACH
Definition: zmq.h:152
zmq_send
ZMQ_EXPORT int zmq_send(void *s_, const void *buf_, size_t len_, int flags_)
Definition: zmq.cpp:377
a
GLboolean GLboolean GLboolean GLboolean a
Definition: glcorearb.h:3228
zmq_msg_close
ZMQ_EXPORT int zmq_msg_close(zmq_msg_t *msg_)
Definition: zmq.cpp:625
TEST_ASSERT_SUCCESS_ERRNO
#define TEST_ASSERT_SUCCESS_ERRNO(expr)
Definition: proxy_thr.cpp:47
zmq_getsockopt
ZMQ_EXPORT int zmq_getsockopt(void *s_, int option_, void *optval_, size_t *optvallen_)
Definition: zmq.cpp:261


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