void test_router_2_router_while_receiving () { char buff[256]; const char msg[] = "hi 1"; const int zero = 0; char x_endpoint[MAX_SOCKET_STRING]; char z_endpoint[MAX_SOCKET_STRING]; // Create xbind socket. void *xbind = test_context_socket (ZMQ_ROUTER); TEST_ASSERT_SUCCESS_ERRNO ( zmq_setsockopt (xbind, ZMQ_LINGER, &zero, sizeof (zero))); bind_loopback_ipv4 (xbind, x_endpoint, sizeof x_endpoint); // Create zbind socket. void *zbind = test_context_socket (ZMQ_ROUTER); TEST_ASSERT_SUCCESS_ERRNO ( zmq_setsockopt (zbind, ZMQ_LINGER, &zero, sizeof (zero))); bind_loopback_ipv4 (zbind, z_endpoint, sizeof z_endpoint); // Create connection socket. void *yconn = test_context_socket (ZMQ_ROUTER); TEST_ASSERT_SUCCESS_ERRNO ( zmq_setsockopt (yconn, ZMQ_LINGER, &zero, sizeof (zero))); // set identities for each socket TEST_ASSERT_SUCCESS_ERRNO (zmq_setsockopt ( xbind, ZMQ_ROUTING_ID, x_routing_id, strlen (x_routing_id))); TEST_ASSERT_SUCCESS_ERRNO ( zmq_setsockopt (yconn, ZMQ_ROUTING_ID, y_routing_id, 2)); TEST_ASSERT_SUCCESS_ERRNO (zmq_setsockopt ( zbind, ZMQ_ROUTING_ID, z_routing_id, strlen (z_routing_id))); // Connect Y to X using a routing id TEST_ASSERT_SUCCESS_ERRNO (zmq_setsockopt ( yconn, ZMQ_CONNECT_ROUTING_ID, x_routing_id, strlen (x_routing_id))); TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (yconn, x_endpoint)); // Send some data from Y to X. send_string_expect_success (yconn, x_routing_id, ZMQ_SNDMORE); send_string_expect_success (yconn, msg, 0); // wait for the Y->X message to be received msleep (SETTLE_TIME); // Now X tries to connect to Z and send a message TEST_ASSERT_SUCCESS_ERRNO (zmq_setsockopt ( xbind, ZMQ_CONNECT_ROUTING_ID, z_routing_id, strlen (z_routing_id))); TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (xbind, z_endpoint)); // Try to send some data from X to Z. send_string_expect_success (xbind, z_routing_id, ZMQ_SNDMORE); send_string_expect_success (xbind, msg, 0); // wait for the X->Z message to be received (so that our non-blocking check will actually // fail if the message is routed to Y) msleep (SETTLE_TIME); // nothing should have been received on the Y socket TEST_ASSERT_FAILURE_ERRNO (EAGAIN, zmq_recv (yconn, buff, 256, ZMQ_DONTWAIT)); // the message should have been received on the Z socket recv_string_expect_success (zbind, x_routing_id, 0); recv_string_expect_success (zbind, msg, 0); TEST_ASSERT_SUCCESS_ERRNO (zmq_unbind (xbind, x_endpoint)); TEST_ASSERT_SUCCESS_ERRNO (zmq_unbind (zbind, z_endpoint)); test_context_socket_close (yconn); test_context_socket_close (xbind); test_context_socket_close (zbind); }
// hwm should apply to the messages that have already been received // with hwm 11024: send 9999 msg, receive 9999, send 1100, receive 1100 void test_reset_hwm () { const int first_count = 9999; const int second_count = 1100; int hwm = 11024; char my_endpoint[SOCKET_STRING_LEN]; // Set up bind socket void *pub_socket = test_context_socket (ZMQ_PUB); TEST_ASSERT_SUCCESS_ERRNO ( zmq_setsockopt (pub_socket, ZMQ_SNDHWM, &hwm, sizeof (hwm))); bind_loopback_ipv4 (pub_socket, my_endpoint, MAX_SOCKET_STRING); // Set up connect socket void *sub_socket = test_context_socket (ZMQ_SUB); TEST_ASSERT_SUCCESS_ERRNO ( zmq_setsockopt (sub_socket, ZMQ_RCVHWM, &hwm, sizeof (hwm))); TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (sub_socket, my_endpoint)); TEST_ASSERT_SUCCESS_ERRNO ( zmq_setsockopt (sub_socket, ZMQ_SUBSCRIBE, 0, 0)); msleep (SETTLE_TIME); // Send messages int send_count = 0; while (send_count < first_count && zmq_send (pub_socket, NULL, 0, ZMQ_DONTWAIT) == 0) ++send_count; TEST_ASSERT_EQUAL_INT (first_count, send_count); msleep (SETTLE_TIME); // Now receive all sent messages int recv_count = 0; while (0 == zmq_recv (sub_socket, NULL, 0, ZMQ_DONTWAIT)) { ++recv_count; } TEST_ASSERT_EQUAL_INT (first_count, recv_count); msleep (SETTLE_TIME); // Send messages send_count = 0; while (send_count < second_count && zmq_send (pub_socket, NULL, 0, ZMQ_DONTWAIT) == 0) ++send_count; TEST_ASSERT_EQUAL_INT (second_count, send_count); msleep (SETTLE_TIME); // Now receive all sent messages recv_count = 0; while (0 == zmq_recv (sub_socket, NULL, 0, ZMQ_DONTWAIT)) { ++recv_count; } TEST_ASSERT_EQUAL_INT (second_count, recv_count); // Clean up test_context_socket_close (sub_socket); test_context_socket_close (pub_socket); }