test_ws_transport.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MPL-2.0 */
2 
3 #include <string.h>
4 #include "testutil.hpp"
5 #include "testutil_unity.hpp"
6 
8 
10 {
13  size_t addr_length = sizeof (connect_address);
14 
15  void *sb = test_context_socket (ZMQ_REP);
16  void *sc = test_context_socket (ZMQ_REQ);
17 
18  TEST_ASSERT_SUCCESS_ERRNO (zmq_bind (sb, "ws://*:*/roundtrip"));
21 
22  // Windows can't connect to 0.0.0.0
23  snprintf (connect_address, MAX_SOCKET_STRING * sizeof (char),
24  "ws://127.0.0.1%s", strrchr (bind_address, ':'));
25 
27 
28  bounce (sb, sc);
29 
32 
35 }
36 
38 {
40  size_t addr_length = sizeof (connect_address);
41  void *sb = test_context_socket (ZMQ_REP);
42  TEST_ASSERT_SUCCESS_ERRNO (zmq_bind (sb, "ws://127.0.0.1:*"));
45 
46  void *sc = test_context_socket (ZMQ_REQ);
48 
49  bounce (sb, sc);
50 
53 }
54 
55 
57 {
59  size_t addr_length = sizeof (connect_address);
60  void *sb = test_context_socket (ZMQ_REP);
61  TEST_ASSERT_SUCCESS_ERRNO (zmq_bind (sb, "ws://127.0.0.1:*/heartbeat"));
64 
65  void *sc = test_context_socket (ZMQ_REQ);
66 
67  // Setting heartbeat settings
68  int ivl = 10;
70  zmq_setsockopt (sc, ZMQ_HEARTBEAT_IVL, &ivl, sizeof (ivl)));
71 
72  // Disable reconnect, to make sure the ping-pong actually work
73  ivl = -1;
75  zmq_setsockopt (sc, ZMQ_RECONNECT_IVL, &ivl, sizeof (ivl)));
76 
77  // Connect to server
79 
80  // Make sure some ping and pong going through
81  msleep (100);
82 
83  bounce (sb, sc);
84 
87 }
88 
90 {
92  size_t addr_length = sizeof (connect_address);
93  void *sb = test_context_socket (ZMQ_REP);
94  TEST_ASSERT_SUCCESS_ERRNO (zmq_bind (sb, "ws://127.0.0.1:*/short"));
97 
98  void *sc = test_context_socket (ZMQ_REQ);
100 
101  zmq_msg_t msg;
103 
104  for (unsigned char i = 0; i < 255; ++i)
105  ((unsigned char *) zmq_msg_data (&msg))[i] = i;
106 
107  int rc = zmq_msg_send (&msg, sc, 0);
108  TEST_ASSERT_EQUAL_INT (255, rc);
109 
110  rc = zmq_msg_recv (&msg, sb, 0);
111  TEST_ASSERT_EQUAL_INT (255, rc);
112 
113  for (unsigned char i = 0; i < 255; ++i)
114  TEST_ASSERT_EQUAL_INT (i, ((unsigned char *) zmq_msg_data (&msg))[i]);
115 
117 
120 }
121 
123 {
125  size_t addr_length = sizeof (connect_address);
126  void *sb = test_context_socket (ZMQ_REP);
127  TEST_ASSERT_SUCCESS_ERRNO (zmq_bind (sb, "ws://127.0.0.1:*/large"));
130 
131  void *sc = test_context_socket (ZMQ_REQ);
133 
134  zmq_msg_t msg;
136 
137  for (int i = 0; i < 65536; ++i)
138  ((unsigned char *) zmq_msg_data (&msg))[i] = i % 255;
139 
140  int rc = zmq_msg_send (&msg, sc, 0);
141  TEST_ASSERT_EQUAL_INT (65536, rc);
142 
143  rc = zmq_msg_recv (&msg, sb, 0);
144  TEST_ASSERT_EQUAL_INT (65536, rc);
145 
146  for (int i = 0; i < 65536; ++i)
147  TEST_ASSERT_EQUAL_INT (i % 255,
148  ((unsigned char *) zmq_msg_data (&msg))[i]);
149 
151 
154 }
155 
156 void test_curve ()
157 {
159  size_t addr_length = sizeof (connect_address);
160  char client_public[41];
161  char client_secret[41];
162  char server_public[41];
163  char server_secret[41];
164 
166  zmq_curve_keypair (server_public, server_secret));
168  zmq_curve_keypair (client_public, client_secret));
169 
171  int as_server = 1;
173  zmq_setsockopt (server, ZMQ_CURVE_SERVER, &as_server, sizeof (int)));
175  zmq_setsockopt (server, ZMQ_CURVE_SECRETKEY, server_secret, 41));
176  TEST_ASSERT_SUCCESS_ERRNO (zmq_bind (server, "ws://127.0.0.1:*/roundtrip"));
178  connect_address, &addr_length));
179 
182  zmq_setsockopt (client, ZMQ_CURVE_SERVERKEY, server_public, 41));
184  zmq_setsockopt (client, ZMQ_CURVE_PUBLICKEY, client_public, 41));
186  zmq_setsockopt (client, ZMQ_CURVE_SECRETKEY, client_secret, 41));
188 
189  bounce (server, client);
190 
193 }
194 
195 
197 {
199  size_t addr_length = sizeof (connect_address);
201  TEST_ASSERT_SUCCESS_ERRNO (zmq_bind (sb, "ws://127.0.0.1:*/mask-shared"));
204 
207 
208  zmq_msg_t msg;
210  &msg, 255); // Message have to be long enough so it won't fit inside msg
211  unsigned char *data = (unsigned char *) zmq_msg_data (&msg);
212  for (int i = 0; i < 255; i++)
213  data[i] = i;
214 
215  // Taking a copy to make the msg shared
216  zmq_msg_t copy;
217  zmq_msg_init (&copy);
218  zmq_msg_copy (&copy, &msg);
219 
220  // Sending the shared msg
221  int rc = zmq_msg_send (&msg, sc, 0);
222  TEST_ASSERT_EQUAL_INT (255, rc);
223 
224  // Recv the msg and check that it was masked correctly
225  rc = zmq_msg_recv (&msg, sb, 0);
226  TEST_ASSERT_EQUAL_INT (255, rc);
227  data = (unsigned char *) zmq_msg_data (&msg);
228  for (int i = 0; i < 255; i++)
230 
231  // Testing that copy was not masked
232  data = (unsigned char *) zmq_msg_data (&copy);
233  for (int i = 0; i < 255; i++)
235 
236  // Constant msg cannot be masked as well, as it is constant
237  rc = zmq_send_const (sc, "HELLO", 5, 0);
238  TEST_ASSERT_EQUAL_INT (5, rc);
239  recv_string_expect_success (sb, "HELLO", 0);
240 
241  zmq_msg_close (&copy);
242  zmq_msg_close (&msg);
243 
246 }
247 
249 {
251  size_t addr_length = sizeof (connect_address);
252  void *sb = test_context_socket (ZMQ_XPUB);
253  TEST_ASSERT_SUCCESS_ERRNO (zmq_bind (sb, "ws://127.0.0.1:*"));
256 
257  void *sc = test_context_socket (ZMQ_SUB);
261 
262  recv_string_expect_success (sb, "\1A", 0);
263  recv_string_expect_success (sb, "\1B", 0);
264 
265  send_string_expect_success (sb, "A", 0);
266  send_string_expect_success (sb, "B", 0);
267 
268  recv_string_expect_success (sc, "A", 0);
269  recv_string_expect_success (sc, "B", 0);
270 
273 }
274 
275 
276 int main ()
277 {
279 
280  UNITY_BEGIN ();
288 
289  if (zmq_has ("curve"))
291 
292  return UNITY_END ();
293 }
bounce
static void bounce(void *socket_)
Definition: test_req_relaxed.cpp:50
test_mask_shared_msg
void test_mask_shared_msg()
Definition: test_ws_transport.cpp:196
ZMQ_HEARTBEAT_IVL
#define ZMQ_HEARTBEAT_IVL
Definition: zmq.h:336
bind_address
const SETUP_TEARDOWN_TESTCONTEXT char bind_address[]
Definition: test_xpub_topic.cpp:8
UNITY_END
return UNITY_END()
ZMQ_XPUB
#define ZMQ_XPUB
Definition: zmq.h:267
msleep
void msleep(int milliseconds_)
Definition: testutil.cpp:227
zmq_unbind
ZMQ_EXPORT int zmq_unbind(void *s_, const char *addr_)
Definition: zmq.cpp:337
zmq_msg_send
ZMQ_EXPORT int zmq_msg_send(zmq_msg_t *msg_, void *s_, int flags_)
Definition: zmq.cpp:609
RUN_TEST
#define RUN_TEST(func)
Definition: unity_internals.h:615
ZMQ_CURVE_SECRETKEY
#define ZMQ_CURVE_SECRETKEY
Definition: zmq.h:314
zmq_has
ZMQ_EXPORT int zmq_has(const char *capability_)
Definition: zmq.cpp:1763
test_pub_sub
void test_pub_sub()
Definition: test_ws_transport.cpp:248
ZMQ_LAST_ENDPOINT
#define ZMQ_LAST_ENDPOINT
Definition: zmq.h:298
ZMQ_CURVE_SERVERKEY
#define ZMQ_CURVE_SERVERKEY
Definition: zmq.h:315
SETUP_TEARDOWN_TESTCONTEXT
#define SETUP_TEARDOWN_TESTCONTEXT
Definition: testutil_unity.hpp:172
ZMQ_SUBSCRIBE
#define ZMQ_SUBSCRIBE
Definition: zmq.h:278
client
void client(int num)
Definition: test_multithread.cpp:134
ZMQ_SUB
#define ZMQ_SUB
Definition: zmq.h:260
ZMQ_REQ
#define ZMQ_REQ
Definition: zmq.h:261
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
test_short_message
void test_short_message()
Definition: test_ws_transport.cpp:89
testutil_unity.hpp
snprintf
int snprintf(char *str, size_t size, const char *format,...)
Definition: port.cc:64
ZMQ_DEALER
#define ZMQ_DEALER
Definition: zmq.h:263
test_roundtrip_without_path
void test_roundtrip_without_path()
Definition: test_ws_transport.cpp:37
zmq_send_const
ZMQ_EXPORT int zmq_send_const(void *s_, const void *buf_, size_t len_, int flags_)
Definition: zmq.cpp:400
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
sb
void * sb
Definition: test_channel.cpp:8
testutil.hpp
zmq_msg_t
Definition: zmq.h:218
ZMQ_REP
#define ZMQ_REP
Definition: zmq.h:262
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
zmq_msg_recv
ZMQ_EXPORT int zmq_msg_recv(zmq_msg_t *msg_, void *s_, int flags_)
Definition: zmq.cpp:617
sc
void * sc
Definition: test_channel.cpp:9
main
int main()
Definition: test_ws_transport.cpp:276
test_context_socket
void * test_context_socket(int type_)
Definition: testutil_unity.cpp:200
test_large_message
void test_large_message()
Definition: test_ws_transport.cpp:122
server
void * server
Definition: test_security_curve.cpp:29
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
i
int i
Definition: gmock-matchers_test.cc:764
zmq_curve_keypair
ZMQ_EXPORT int zmq_curve_keypair(char *z85_public_key_, char *z85_secret_key_)
Definition: zmq_utils.cpp:190
test_heartbeat
void test_heartbeat()
Definition: test_ws_transport.cpp:56
send_string_expect_success
void send_string_expect_success(void *socket_, const char *str_, int flags_)
Definition: testutil_unity.cpp:94
ZMQ_CURVE_SERVER
#define ZMQ_CURVE_SERVER
Definition: zmq.h:312
recv_string_expect_success
void recv_string_expect_success(void *socket_, const char *str_, int flags_)
Definition: testutil_unity.cpp:101
setup_test_environment
void setup_test_environment(int timeout_seconds_)
Definition: testutil.cpp:201
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()
zmq_msg_copy
ZMQ_EXPORT int zmq_msg_copy(zmq_msg_t *dest_, zmq_msg_t *src_)
Definition: zmq.cpp:636
connect_address
SETUP_TEARDOWN_TESTCONTEXT char connect_address[MAX_SOCKET_STRING]
Definition: tests/test_fork.cpp:14
test_curve
void test_curve()
Definition: test_ws_transport.cpp:156
data
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: glcorearb.h:2879
ZMQ_RECONNECT_IVL
#define ZMQ_RECONNECT_IVL
Definition: zmq.h:289
test_roundtrip
SETUP_TEARDOWN_TESTCONTEXT void test_roundtrip()
Definition: test_ws_transport.cpp:9
test_context_socket_close
void * test_context_socket_close(void *socket_)
Definition: testutil_unity.cpp:208
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
ZMQ_CURVE_PUBLICKEY
#define ZMQ_CURVE_PUBLICKEY
Definition: zmq.h:313


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