unittest_poller.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MPL-2.0 */
2 
3 #include "../tests/testutil.hpp"
4 
5 #include <poller.hpp>
6 #include <i_poll_events.hpp>
7 #include <ip.hpp>
8 
9 #include <unity.h>
10 
11 #ifndef _WIN32
12 #include <unistd.h>
13 #define closesocket close
14 #endif
15 
16 void setUp ()
17 {
18 }
19 void tearDown ()
20 {
21 }
22 
23 void test_create ()
24 {
25  zmq::thread_ctx_t thread_ctx;
26  zmq::poller_t poller (thread_ctx);
27 }
28 
29 #if 0
30 // TODO this triggers an assertion. should it be a valid use case?
31 void test_start_empty ()
32 {
33  zmq::thread_ctx_t thread_ctx;
34  zmq::poller_t poller (thread_ctx);
35  poller.start ();
37 }
38 #endif
39 
41 {
42  test_events_t (zmq::fd_t fd_, zmq::poller_t &poller_) :
43  _fd (fd_),
44  _poller (poller_)
45  {
46  (void) _fd;
47  }
48 
50  {
51  _poller.rm_fd (_handle);
52  _handle = (zmq::poller_t::handle_t) NULL;
53 
54  // this must only be incremented after rm_fd
55  in_events.add (1);
56  }
57 
58 
60  {
61  // TODO
62  }
63 
64 
65  void timer_event (int id_) ZMQ_OVERRIDE
66  {
67  LIBZMQ_UNUSED (id_);
68  _poller.rm_fd (_handle);
69  _handle = (zmq::poller_t::handle_t) NULL;
70 
71  // this must only be incremented after rm_fd
72  timer_events.add (1);
73  }
74 
75  void set_handle (zmq::poller_t::handle_t handle_) { _handle = handle_; }
76 
78 
79  private:
81  zmq::poller_t &_poller;
82  zmq::poller_t::handle_t _handle;
83 };
84 
86 {
87  void *watch = zmq_stopwatch_start ();
88  while (events_.in_events.get () < 1) {
89  msleep (1);
90 #ifdef ZMQ_BUILD_DRAFT
93  "Timeout waiting for in event");
94 #endif
95  }
96  zmq_stopwatch_stop (watch);
97 }
98 
100 {
101  void *watch = zmq_stopwatch_start ();
102  while (events_.timer_events.get () < 1) {
103  msleep (1);
104 #ifdef ZMQ_BUILD_DRAFT
107  "Timeout waiting for timer event");
108 #endif
109  }
110  zmq_stopwatch_stop (watch);
111 }
112 
114 {
115  int rc = zmq::make_fdpair (r_, w_);
116  TEST_ASSERT_EQUAL_INT (0, rc);
119  zmq::unblock_socket (*r_);
120  zmq::unblock_socket (*w_);
121 }
122 
124 {
125 #if defined ZMQ_HAVE_EVENTFD
126  const uint64_t inc = 1;
127  ssize_t sz = write (w_, &inc, sizeof (inc));
128  assert (sz == sizeof (inc));
129 #else
130  {
131  char msg[] = "test";
132  int rc = send (w_, msg, sizeof (msg), 0);
133  assert (rc == sizeof (msg));
134  }
135 #endif
136 }
137 
139 {
140  int rc = closesocket (w_);
141  TEST_ASSERT_EQUAL_INT (0, rc);
142 #if !defined ZMQ_HAVE_EVENTFD
143  rc = closesocket (r_);
144  TEST_ASSERT_EQUAL_INT (0, rc);
145 #else
146  LIBZMQ_UNUSED (r_);
147 #endif
148 }
149 
151 {
152  zmq::thread_ctx_t thread_ctx;
153  zmq::poller_t poller (thread_ctx);
154 
155  zmq::fd_t r, w;
157 
158  test_events_t events (r, poller);
159 
160  zmq::poller_t::handle_t handle = poller.add_fd (r, &events);
161  events.set_handle (handle);
162  poller.set_pollin (handle);
163  poller.start ();
164 
165  send_signal (w);
166 
167  wait_in_events (events);
168 
169  // required cleanup
170  close_fdpair (w, r);
171 }
172 
174 {
175  zmq::fd_t r, w;
177 
178  zmq::thread_ctx_t thread_ctx;
179  zmq::poller_t poller (thread_ctx);
180 
181  test_events_t events (r, poller);
182 
183  zmq::poller_t::handle_t handle = poller.add_fd (r, &events);
184  events.set_handle (handle);
185 
186  poller.add_timer (50, &events, 0);
187  poller.start ();
188 
189  wait_timer_events (events);
190 
191  // required cleanup
192  close_fdpair (w, r);
193 }
194 
195 #ifdef _WIN32
196 void test_add_fd_with_pending_failing_connect ()
197 {
198  zmq::thread_ctx_t thread_ctx;
199  zmq::poller_t poller (thread_ctx);
200 
201  zmq::fd_t bind_socket = socket (AF_INET, SOCK_STREAM, 0);
202  sockaddr_in addr = {0};
203  addr.sin_family = AF_INET;
204  addr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
205  addr.sin_port = 0;
206  TEST_ASSERT_EQUAL_INT (0, bind (bind_socket,
207  reinterpret_cast<const sockaddr *> (&addr),
208  sizeof (addr)));
209 
210  int addr_len = static_cast<int> (sizeof (addr));
211  TEST_ASSERT_EQUAL_INT (0, getsockname (bind_socket,
212  reinterpret_cast<sockaddr *> (&addr),
213  &addr_len));
214 
215  zmq::fd_t connect_socket = socket (AF_INET, SOCK_STREAM, 0);
217 
219  -1, connect (connect_socket, reinterpret_cast<const sockaddr *> (&addr),
220  sizeof (addr)));
221  TEST_ASSERT_EQUAL_INT (WSAEWOULDBLOCK, WSAGetLastError ());
222 
223  test_events_t events (connect_socket, poller);
224 
225  zmq::poller_t::handle_t handle = poller.add_fd (connect_socket, &events);
226  events.set_handle (handle);
227  poller.set_pollin (handle);
228  poller.start ();
229 
230  wait_in_events (events);
231 
232  int value;
233  int value_len = sizeof (value);
234  TEST_ASSERT_EQUAL_INT (0, getsockopt (connect_socket, SOL_SOCKET, SO_ERROR,
235  reinterpret_cast<char *> (&value),
236  &value_len));
237  TEST_ASSERT_EQUAL_INT (WSAECONNREFUSED, value);
238 
239  // required cleanup
240  close (connect_socket);
241  close (bind_socket);
242 }
243 #endif
244 
245 int main (void)
246 {
247  UNITY_BEGIN ();
248 
251 
255 
256 #if defined _WIN32
257  RUN_TEST (test_add_fd_with_pending_failing_connect);
258 #endif
259 
261 
262  return UNITY_END ();
263 }
test_events_t::set_handle
void set_handle(zmq::poller_t::handle_t handle_)
Definition: unittest_poller.cpp:75
closesocket
#define closesocket
Definition: unittest_poller.cpp:13
test_events_t::timer_event
void timer_event(int id_) ZMQ_OVERRIDE
Definition: unittest_poller.cpp:65
ip.hpp
test_events_t
Definition: unittest_poller.cpp:40
i_poll_events.hpp
close_fdpair
void close_fdpair(zmq::fd_t w_, zmq::fd_t r_)
Definition: unittest_poller.cpp:138
NULL
NULL
Definition: test_security_zap.cpp:405
UNITY_END
return UNITY_END()
zmq::retired_fd
@ retired_fd
Definition: fd.hpp:32
msleep
void msleep(int milliseconds_)
Definition: testutil.cpp:227
RUN_TEST
#define RUN_TEST(func)
Definition: unity_internals.h:615
test_events_t::timer_events
zmq::atomic_counter_t timer_events
Definition: unittest_poller.cpp:77
test_events_t::in_events
zmq::atomic_counter_t in_events
Definition: unittest_poller.cpp:77
wait_in_events
void wait_in_events(test_events_t &events_)
Definition: unittest_poller.cpp:85
test_events_t::out_event
void out_event() ZMQ_OVERRIDE
Definition: unittest_poller.cpp:59
zmq::i_poll_events
Definition: i_poll_events.hpp:13
send
void send(fd_t fd_, const char(&data_)[N])
Definition: test_security_curve.cpp:209
test_events_t::_handle
zmq::poller_t::handle_t _handle
Definition: unittest_poller.cpp:82
TEST_ASSERT_NOT_EQUAL
#define TEST_ASSERT_NOT_EQUAL(expected, actual)
Definition: unity.h:134
zmq::fd_t
int fd_t
Definition: zmq.hpp:287
test_add_fd_and_remove_by_timer
void test_add_fd_and_remove_by_timer()
Definition: unittest_poller.cpp:173
zmq_stopwatch_intermediate
ZMQ_EXPORT unsigned long zmq_stopwatch_intermediate(void *watch_)
Definition: zmq_utils.cpp:40
ZMQ_OVERRIDE
#define ZMQ_OVERRIDE
Definition: zmq.hpp:91
TEST_ASSERT_LESS_OR_EQUAL_MESSAGE
#define TEST_ASSERT_LESS_OR_EQUAL_MESSAGE(threshold, actual, message)
Definition: unity.h:392
zmq::shutdown_network
void shutdown_network()
Definition: ip.cpp:305
LIBZMQ_UNUSED
#define LIBZMQ_UNUSED(object)
Definition: macros.hpp:6
poller.hpp
send_signal
void send_signal(zmq::fd_t w_)
Definition: unittest_poller.cpp:123
zmq::atomic_counter_t
Definition: atomic_counter.hpp:61
zmq::atomic_counter_t::get
integer_t get() const ZMQ_NOEXCEPT
Definition: atomic_counter.hpp:173
test_events_t::_fd
zmq::fd_t _fd
Definition: unittest_poller.cpp:80
zmq::atomic_counter_t::add
integer_t add(integer_t increment_) ZMQ_NOEXCEPT
Definition: atomic_counter.hpp:73
zmq_stopwatch_start
ZMQ_EXPORT void * zmq_stopwatch_start(void)
Definition: zmq_utils.cpp:32
connect_socket
fd_t connect_socket(const char *endpoint_, const int af_, const int protocol_)
Definition: testutil.cpp:353
zmq::make_fdpair
int make_fdpair(fd_t *r_, fd_t *w_)
Definition: ip.cpp:532
create_nonblocking_fdpair
void create_nonblocking_fdpair(zmq::fd_t *r_, zmq::fd_t *w_)
Definition: unittest_poller.cpp:113
tearDown
void tearDown()
Definition: unittest_poller.cpp:19
test_events_t::in_event
void in_event() ZMQ_OVERRIDE
Definition: unittest_poller.cpp:49
zmq::unblock_socket
void unblock_socket(fd_t s_)
Definition: ip.cpp:107
SETTLE_TIME
#define SETTLE_TIME
Definition: libzmq/tests/testutil.hpp:31
TEST_ASSERT_EQUAL_INT
#define TEST_ASSERT_EQUAL_INT(expected, actual)
Definition: unity.h:128
test_add_fd_and_start_and_receive_data
void test_add_fd_and_start_and_receive_data()
Definition: unittest_poller.cpp:150
main
int main(void)
Definition: unittest_poller.cpp:245
void
typedef void(APIENTRY *GLDEBUGPROCARB)(GLenum source
zmq::thread_ctx_t
Definition: ctx.hpp:37
unity.h
zmq::initialize_network
bool initialize_network()
Definition: ip.cpp:264
test_events_t::test_events_t
test_events_t(zmq::fd_t fd_, zmq::poller_t &poller_)
Definition: unittest_poller.cpp:42
setup_test_environment
void setup_test_environment(int timeout_seconds_)
Definition: testutil.cpp:201
UNITY_BEGIN
UNITY_BEGIN()
r
GLboolean r
Definition: glcorearb.h:3228
test_create
void test_create()
Definition: unittest_poller.cpp:23
test_events_t::_poller
zmq::poller_t & _poller
Definition: unittest_poller.cpp:81
value
GLsizei const GLfloat * value
Definition: glcorearb.h:3093
w
GLubyte GLubyte GLubyte GLubyte w
Definition: glcorearb.h:3126
setUp
void setUp()
Definition: unittest_poller.cpp:16
wait_timer_events
void wait_timer_events(test_events_t &events_)
Definition: unittest_poller.cpp:99
zmq_stopwatch_stop
ZMQ_EXPORT unsigned long zmq_stopwatch_stop(void *watch_)
Definition: zmq_utils.cpp:47


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