test_reconnect_options.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MPL-2.0 */
2 #include <assert.h>
3 
4 #include "testutil.hpp"
5 #include "testutil_unity.hpp"
7 
8 #include <unity.h>
9 
10 // test behavior with (mostly) default values
12 {
13  // setup pub socket
14  void *pub = test_context_socket (ZMQ_PUB);
15  // Bind pub socket
17 
18  // setup sub socket
19  void *sub = test_context_socket (ZMQ_SUB);
20  // Monitor all events on sub
22  zmq_socket_monitor (sub, "inproc://monitor-sub", ZMQ_EVENT_ALL));
23  // Create socket for collecting monitor events
24  void *sub_mon = test_context_socket (ZMQ_PAIR);
25  // Connect so they'll get events
26  TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (sub_mon, "inproc://monitor-sub"));
27  // set reconnect interval so only a single reconnect is tried
28  int interval = 60 * 1000;
30  zmq_setsockopt (sub, ZMQ_RECONNECT_IVL, &interval, sizeof (interval)));
31  // connect to pub
33 
34  // confirm that we get following events
38 
39  // close the pub socket
41 
42  // confirm that we get following events
45 
46  // ZMQ_EVENT_CONNECT_RETRIED should be last event, because of timeout set above
47  int event;
48  char *event_address;
49  int rc = get_monitor_event_with_timeout (sub_mon, &event, &event_address,
50  2 * 1000);
51  assert (rc == -1);
52  LIBZMQ_UNUSED (rc);
53 
54  // Close sub
55  // TODO why does this use zero_linger?
57 
58  // Close monitor
59  // TODO why does this use zero_linger?
61 }
62 
63 
64 // test successful reconnect
66 {
67  // setup pub socket
68  void *pub = test_context_socket (ZMQ_PUB);
69  // Bind pub socket
71 
72  // setup sub socket
73  void *sub = test_context_socket (ZMQ_SUB);
74  // Monitor all events on sub
76  zmq_socket_monitor (sub, "inproc://monitor-sub", ZMQ_EVENT_ALL));
77  // Create socket for collecting monitor events
78  void *sub_mon = test_context_socket (ZMQ_PAIR);
79  // Connect so they'll get events
80  TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (sub_mon, "inproc://monitor-sub"));
81  // set reconnect interval so only a single reconnect is tried
82  int interval = 1 * 1000;
84  zmq_setsockopt (sub, ZMQ_RECONNECT_IVL, &interval, sizeof (interval)));
85  // connect to pub
87 
88  // confirm that we get following events
92 
93  // close the pub socket
95 
96  // confirm that we get following events
99 
100  // ZMQ_EVENT_CONNECT_RETRIED should be last event, because of timeout set above
101  int event;
102  char *event_address;
103  int rc = get_monitor_event_with_timeout (sub_mon, &event, &event_address,
104  SETTLE_TIME);
105  assert (rc == -1);
106  LIBZMQ_UNUSED (rc);
107 
108  // Now re-bind pub socket and wait for re-connect
112 
113  // confirm that we get following events
117 
118  // ZMQ_EVENT_HANDSHAKE_SUCCEEDED should be last event
119  rc = get_monitor_event_with_timeout (sub_mon, &event, &event_address,
120  SETTLE_TIME);
121  assert (rc == -1);
122 
123  // Close sub
124  // TODO why does this use zero_linger?
127 
128  // Close monitor
129  // TODO why does this use zero_linger?
131 }
132 
133 
134 #ifdef ZMQ_BUILD_DRAFT_API
135 // test stopping reconnect on connection refused
136 void reconnect_stop_on_refused ()
137 {
138  // setup pub socket
139  void *pub = test_context_socket (ZMQ_PUB);
140  // Bind pub socket
142 
143  // setup sub socket
144  void *sub = test_context_socket (ZMQ_SUB);
145  // Monitor all events on sub
147  zmq_socket_monitor (sub, "inproc://monitor-sub", ZMQ_EVENT_ALL));
148  // Create socket for collecting monitor events
149  void *sub_mon = test_context_socket (ZMQ_PAIR);
150  // Connect so they'll get events
151  TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (sub_mon, "inproc://monitor-sub"));
152  // set option to stop reconnecting on error
153  int stopReconnectOnError = ZMQ_RECONNECT_STOP_CONN_REFUSED;
155  &stopReconnectOnError,
156  sizeof (stopReconnectOnError)));
157  // connect to pub
159 
160  // confirm that we get following events
164 
165  // close the pub socket
167 
168  // confirm that we get following events
173 
174  // ZMQ_EVENT_CLOSED should be last event, because of ZMQ_RECONNECT_STOP set above
175  int event = 0;
176  char *event_address;
177  int rc = get_monitor_event_with_timeout (sub_mon, &event, &event_address,
178  2 * 1000);
179  int limit = 0;
180  while ((rc != -1) && (++limit < 1000)) {
182  rc = get_monitor_event_with_timeout (sub_mon, &event, &event_address,
183  2 * 1000);
184  }
185 
186  // Close sub
187  // TODO why does this use zero_linger?
189 
190  // Close monitor
191  // TODO why does this use zero_linger?
193 }
194 #endif
195 
196 #ifdef ZMQ_BUILD_DRAFT_API
197 // test stopping reconnect on connection refused
198 void reconnect_stop_on_handshake_failed ()
199 {
201  size_t addr_length = sizeof (bind_address);
203  TEST_ASSERT_SUCCESS_ERRNO (zmq_bind (dummy, "tcp://127.0.0.1:0"));
206 
207  // setup sub socket
208  void *sub = test_context_socket (ZMQ_SUB);
209  // Monitor all events on sub
211  zmq_socket_monitor (sub, "inproc://monitor-sub", ZMQ_EVENT_ALL));
212  // Create socket for collecting monitor events
213  void *sub_mon = test_context_socket (ZMQ_PAIR);
214  // Connect so they'll get events
215  TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (sub_mon, "inproc://monitor-sub"));
216  // set handshake interval (i.e., timeout) to a more reasonable value
217  int handshakeInterval = 1000;
219  sub, ZMQ_HANDSHAKE_IVL, &handshakeInterval, sizeof (handshakeInterval)));
220  // set option to stop reconnecting on failed handshake
221  int stopReconnectOnError = ZMQ_RECONNECT_STOP_HANDSHAKE_FAILED;
223  &stopReconnectOnError,
224  sizeof (stopReconnectOnError)));
225  // connect to dummy stream socket above
227 
228 #if 1
229  // ZMQ_EVENT_DISCONNECTED should be last event, because of ZMQ_RECONNECT_STOP set above
234 #else
235  print_events (sub_mon, 2 * 1000, 1000);
236 #endif
237 
238  // Close sub
239  // TODO why does this use zero_linger?
242 
243  // Close monitor
244  // TODO why does this use zero_linger?
246 }
247 #endif
248 
249 #if defined(ZMQ_BUILD_DRAFT_API) && defined(ZMQ_HAVE_IPC)
250 // test stopping reconnect after disconnect
251 void reconnect_stop_after_disconnect ()
252 {
253  // Setup sub socket
254  void *sub = test_context_socket (ZMQ_SUB);
255  // Monitor all events on sub
257  zmq_socket_monitor (sub, "inproc://monitor-sub", ZMQ_EVENT_ALL));
258  // Create socket for collecting monitor events
259  void *sub_mon = test_context_socket (ZMQ_PAIR);
260  // Connect so they'll get events
261  TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (sub_mon, "inproc://monitor-sub"));
262  // Set option to stop reconnecting after disconnect
263  int stopReconnectAfterDisconnect = ZMQ_RECONNECT_STOP_AFTER_DISCONNECT;
265  zmq_setsockopt (sub, ZMQ_RECONNECT_STOP, &stopReconnectAfterDisconnect,
266  sizeof (stopReconnectAfterDisconnect)));
267 
268  // Connect to a dummy that cannot be connected
269  TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (sub, "ipc://@dummy"));
270 
271  // Confirm that connect failed and reconnect
274 
275  // Disconnect the sub socket
276  TEST_ASSERT_SUCCESS_ERRNO (zmq_disconnect (sub, "ipc://@dummy"));
277 
278  // Confirm that connect failed and will not reconnect
280 
281  // Close sub
283 
284  // Close monitor
286 }
287 #endif
288 
289 void setUp ()
290 {
292 }
293 
294 void tearDown ()
295 {
297 }
298 
299 int main (void)
300 {
302 
303  UNITY_BEGIN ();
304 
307 #ifdef ZMQ_BUILD_DRAFT_API
308  RUN_TEST (reconnect_stop_on_refused);
309  RUN_TEST (reconnect_stop_on_handshake_failed);
310 #endif
311 #if defined(ZMQ_BUILD_DRAFT_API) && defined(ZMQ_HAVE_IPC)
312  RUN_TEST (reconnect_stop_after_disconnect);
313 #endif
314  return UNITY_END ();
315 }
ENDPOINT_0
#define ENDPOINT_0
Definition: libzmq/tests/testutil.hpp:39
ZMQ_RECONNECT_STOP
#define ZMQ_RECONNECT_STOP
Definition: zmq_draft.h:41
print_unexpected_event_stderr
void print_unexpected_event_stderr(int event_, int err_, int expected_event_, int expected_err_)
Definition: testutil_monitoring.cpp:116
ZMQ_RECONNECT_STOP_AFTER_DISCONNECT
#define ZMQ_RECONNECT_STOP_AFTER_DISCONNECT
Definition: zmq_draft.h:68
ZMQ_RECONNECT_STOP_HANDSHAKE_FAILED
#define ZMQ_RECONNECT_STOP_HANDSHAKE_FAILED
Definition: zmq_draft.h:67
ZMQ_EVENT_HANDSHAKE_FAILED_NO_DETAIL
#define ZMQ_EVENT_HANDSHAKE_FAILED_NO_DETAIL
Definition: zmq.h:414
bind_address
const SETUP_TEARDOWN_TESTCONTEXT char bind_address[]
Definition: test_xpub_topic.cpp:8
UNITY_END
return UNITY_END()
ZMQ_PUB
#define ZMQ_PUB
Definition: zmq.h:259
ZMQ_STREAM
#define ZMQ_STREAM
Definition: zmq.h:269
msleep
void msleep(int milliseconds_)
Definition: testutil.cpp:227
zmq_socket_monitor
ZMQ_EXPORT int zmq_socket_monitor(void *s_, const char *addr_, int events_)
Definition: zmq.cpp:278
ZMQ_EVENT_CLOSED
#define ZMQ_EVENT_CLOSED
Definition: zmq.h:408
RUN_TEST
#define RUN_TEST(func)
Definition: unity_internals.h:615
get_monitor_event_with_timeout
int get_monitor_event_with_timeout(void *monitor_, int *value_, char **address_, int timeout_)
Definition: testutil_monitoring.cpp:60
setUp
void setUp()
Definition: test_reconnect_options.cpp:289
ZMQ_LAST_ENDPOINT
#define ZMQ_LAST_ENDPOINT
Definition: zmq.h:298
setup_test_context
void setup_test_context()
Definition: testutil_unity.cpp:179
teardown_test_context
void teardown_test_context()
Definition: testutil_unity.cpp:189
dummy
ReturnVal dummy
Definition: register_benchmark_test.cc:68
ZMQ_SUB
#define ZMQ_SUB
Definition: zmq.h:260
test_context_socket_close_zero_linger
void * test_context_socket_close_zero_linger(void *socket_)
Definition: testutil_unity.cpp:215
zmq_connect
ZMQ_EXPORT int zmq_connect(void *s_, const char *addr_)
Definition: zmq.cpp:307
testutil_unity.hpp
ZMQ_EVENT_HANDSHAKE_SUCCEEDED
#define ZMQ_EVENT_HANDSHAKE_SUCCEEDED
Definition: zmq.h:417
zmq_setsockopt
ZMQ_EXPORT int zmq_setsockopt(void *s_, int option_, const void *optval_, size_t optvallen_)
Definition: zmq.cpp:250
ZMQ_EVENT_CONNECTED
#define ZMQ_EVENT_CONNECTED
Definition: zmq.h:401
zmq_disconnect
ZMQ_EXPORT int zmq_disconnect(void *s_, const char *addr_)
Definition: zmq.cpp:345
event
struct _cl_event * event
Definition: glcorearb.h:4163
LIBZMQ_UNUSED
#define LIBZMQ_UNUSED(object)
Definition: macros.hpp:6
testutil.hpp
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
tearDown
void tearDown()
Definition: test_reconnect_options.cpp:294
reconnect_default
void reconnect_default()
Definition: test_reconnect_options.cpp:11
reconnect_success
void reconnect_success()
Definition: test_reconnect_options.cpp:65
test_context_socket
void * test_context_socket(int type_)
Definition: testutil_unity.cpp:200
SETTLE_TIME
#define SETTLE_TIME
Definition: libzmq/tests/testutil.hpp:31
ZMQ_HANDSHAKE_IVL
#define ZMQ_HANDSHAKE_IVL
Definition: zmq.h:328
unity.h
expect_monitor_event
void expect_monitor_event(void *monitor_, int expected_event_)
Definition: testutil_monitoring.cpp:96
main
int main(void)
Definition: test_reconnect_options.cpp:299
ZMQ_EVENT_CONNECT_DELAYED
#define ZMQ_EVENT_CONNECT_DELAYED
Definition: zmq.h:402
ZMQ_PAIR
#define ZMQ_PAIR
Definition: zmq.h:258
ZMQ_EVENT_CONNECT_RETRIED
#define ZMQ_EVENT_CONNECT_RETRIED
Definition: zmq.h:403
ZMQ_EVENT_ALL
#define ZMQ_EVENT_ALL
Definition: zmq.h:412
ZMQ_RECONNECT_STOP_CONN_REFUSED
#define ZMQ_RECONNECT_STOP_CONN_REFUSED
Definition: zmq_draft.h:66
ZMQ_EVENT_DISCONNECTED
#define ZMQ_EVENT_DISCONNECTED
Definition: zmq.h:410
testutil_monitoring.hpp
setup_test_environment
void setup_test_environment(int timeout_seconds_)
Definition: testutil.cpp:201
UNITY_BEGIN
UNITY_BEGIN()
ZMQ_RECONNECT_IVL
#define ZMQ_RECONNECT_IVL
Definition: zmq.h:289
assert.h
print_events
void print_events(void *socket, int timeout, int limit)
Definition: testutil_monitoring.cpp:365
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