diff --git a/tests/test_security_zap.cpp b/tests/test_security_zap.cpp index 92987629..49486680 100644 --- a/tests/test_security_zap.cpp +++ b/tests/test_security_zap.cpp @@ -64,6 +64,16 @@ static void zap_handler_disconnect (void *ctx) zap_handler_generic (ctx, zap_disconnect); } +static void zap_handler_do_not_recv (void *ctx) +{ + zap_handler_generic (ctx, zap_do_not_recv); +} + +static void zap_handler_do_not_send (void *ctx) +{ + zap_handler_generic (ctx, zap_do_not_send); +} + int expect_new_client_bounce_fail_and_count_monitor_events ( void *ctx, char *my_endpoint, @@ -344,8 +354,42 @@ void test_zap_errors (socket_config_fn server_socket_config_, 0, 0, #endif client_socket_config_, client_socket_config_data_); - shutdown_context_and_server_side(ctx, zap_thread, server, server_mon, - handler, true); + shutdown_context_and_server_side (ctx, zap_thread, server, server_mon, + handler, true); + + // ZAP handler does not read request + fprintf (stderr, + "test_zap_unsuccessful ZAP handler does not read request\n"); + setup_context_and_server_side (&ctx, &handler, &zap_thread, &server, + &server_mon, my_endpoint, &zap_handler_do_not_recv, + server_socket_config_); + test_zap_unsuccessful_no_handler ( + ctx, my_endpoint, server, server_mon, +#ifdef ZMQ_BUILD_DRAFT_API + ZMQ_EVENT_HANDSHAKE_FAILED_NO_DETAIL, EPIPE, +#else + 0, 0, +#endif + client_socket_config_, client_socket_config_data_); + shutdown_context_and_server_side (ctx, zap_thread, server, server_mon, + handler); + + // ZAP handler does not send reply + fprintf (stderr, + "test_zap_unsuccessful ZAP handler does not write reply\n"); + setup_context_and_server_side ( + &ctx, &handler, &zap_thread, &server, &server_mon, my_endpoint, + &zap_handler_do_not_send, server_socket_config_); + test_zap_unsuccessful_no_handler ( + ctx, my_endpoint, server, server_mon, +#ifdef ZMQ_BUILD_DRAFT_API + ZMQ_EVENT_HANDSHAKE_FAILED_NO_DETAIL, EPIPE, +#else + 0, 0, +#endif + client_socket_config_, client_socket_config_data_); + shutdown_context_and_server_side (ctx, zap_thread, server, server_mon, + handler); } int main (void) diff --git a/tests/testutil_security.hpp b/tests/testutil_security.hpp index 4586f208..74564ba0 100644 --- a/tests/testutil_security.hpp +++ b/tests/testutil_security.hpp @@ -154,7 +154,9 @@ enum zap_protocol_t zap_wrong_request_id, zap_status_invalid, zap_too_many_parts, - zap_disconnect + zap_disconnect, + zap_do_not_recv, + zap_do_not_send }; void *zap_requests_handled; @@ -182,8 +184,11 @@ void zap_handler_generic (void *ctx, {handler, 0, ZMQ_POLLIN, 0}, }; + // if ordered not to receive the request, ignore the second poll item + const int numitems = (zap_protocol == zap_do_not_recv) ? 1 : 2; + // Process ZAP requests forever - while (zmq_poll (items, 2, -1) >= 0) { + while (zmq_poll (items, numitems, -1) >= 0) { if (items[0].revents & ZMQ_POLLIN) { char *buf = s_recv (control); assert (buf); @@ -198,7 +203,10 @@ void zap_handler_generic (void *ctx, if (!version) break; // Terminating - peer's socket closed if (zap_protocol == zap_disconnect) + { + free (version); break; + } char *sequence = s_recv (handler); char *domain = s_recv (handler); @@ -268,12 +276,14 @@ void zap_handler_generic (void *ctx, if (zap_protocol == zap_too_many_parts) { s_sendmore (handler, ""); } - s_send (handler, ""); + if (zap_protocol != zap_do_not_send) + s_send (handler, ""); } else { s_sendmore (handler, "400"); s_sendmore (handler, "Invalid client public key"); s_sendmore (handler, ""); - s_send (handler, ""); + if (zap_protocol != zap_do_not_send) + s_send(handler, ""); } free (version); free (sequence);