From 1791df0a72cd6457f152172b65515196df6663fc Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Fri, 19 Jan 2018 18:23:20 -0800 Subject: Bad client changes to make large metadata test to work again --- test/core/bad_client/tests/window_overflow.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'test/core/bad_client/tests/window_overflow.cc') diff --git a/test/core/bad_client/tests/window_overflow.cc b/test/core/bad_client/tests/window_overflow.cc index ed8279c951..3c3b733f3f 100644 --- a/test/core/bad_client/tests/window_overflow.cc +++ b/test/core/bad_client/tests/window_overflow.cc @@ -92,8 +92,8 @@ int main(int argc, char** argv) { addbuf(message, sizeof(message)); } } - grpc_run_bad_client_test(verifier, nullptr, g_buffer, g_count, - GRPC_BAD_CLIENT_LARGE_REQUEST); + grpc_bad_client_arg bca = {nullptr, g_buffer, g_count}; + grpc_run_bad_client_test(verifier, &bca, 1, GRPC_BAD_CLIENT_LARGE_REQUEST); gpr_free(g_buffer); grpc_shutdown(); -- cgit v1.2.3 From 0d8b21e1000f6e3e1771234573e8d577762db681 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 23 Jan 2018 19:46:42 -0800 Subject: Add helper function for rst_stream --- test/core/bad_client/bad_client.cc | 67 ++++++++++++++++------ test/core/bad_client/bad_client.h | 36 +++++++----- .../core/bad_client/tests/head_of_line_blocking.cc | 2 +- test/core/bad_client/tests/large_metadata.cc | 41 +------------ test/core/bad_client/tests/window_overflow.cc | 9 +-- 5 files changed, 80 insertions(+), 75 deletions(-) (limited to 'test/core/bad_client/tests/window_overflow.cc') diff --git a/test/core/bad_client/bad_client.cc b/test/core/bad_client/bad_client.cc index 0c4deaf41c..7db77885b1 100644 --- a/test/core/bad_client/bad_client.cc +++ b/test/core/bad_client/bad_client.cc @@ -38,15 +38,6 @@ #define MIN_HTTP2_FRAME_SIZE 9 -/* connection preface and settings frame to be sent by the client */ -#define CONNECTION_PREFACE_FROM_CLIENT \ - "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" \ - "\x00\x00\x00\x04\x00\x00\x00\x00\x00" - -grpc_bad_client_arg connection_preface_arg = { - client_connection_preface_validator, CONNECTION_PREFACE_FROM_CLIENT, - sizeof(CONNECTION_PREFACE_FROM_CLIENT) - 1}; - /* Args to provide to thread running server side validator */ typedef struct { grpc_server* server; @@ -67,8 +58,9 @@ static void thd_func(void* arg) { /* Sets the done_write event */ static void set_done_write(void* arg, grpc_error* error) { - gpr_event* set_done = (gpr_event*)arg; - gpr_event_set(set_done, (void*)1); + gpr_log(GPR_INFO, "done writing"); + gpr_event* done_write = (gpr_event*)arg; + gpr_event_set(done_write, (void*)1); } static void server_setup_transport(void* ts, grpc_transport* transport) { @@ -84,10 +76,10 @@ static void set_read_done(void* arg, grpc_error* error) { gpr_event_set(read_done, (void*)1); } -/* Runs client side validators */ -void grpc_run_client_side_validators(grpc_bad_client_arg* arg, uint32_t flags, - grpc_endpoint_pair* sfd, - grpc_completion_queue* client_cq) { +/* Runs client side validator */ +void grpc_run_client_side_validator(grpc_bad_client_arg* arg, uint32_t flags, + grpc_endpoint_pair* sfd, + grpc_completion_queue* client_cq) { char* hex; gpr_event done_write; if (arg->client_payload_length < 4 * 1024) { @@ -156,7 +148,7 @@ void grpc_run_client_side_validators(grpc_bad_client_arg* arg, uint32_t flags, nullptr) .type == GRPC_QUEUE_TIMEOUT); } while (!gpr_event_get(&read_done_event)); - if (arg->client_validator(&incoming)) break; + if (arg->client_validator(&incoming, arg->client_validator_arg)) break; gpr_log(GPR_INFO, "client validator failed; trying additional read " "in case we didn't get all the data"); @@ -214,7 +206,7 @@ void grpc_run_bad_client_test( /* Start validator */ gpr_thd_new(&id, "grpc_bad_client", thd_func, &a, nullptr); for (int i = 0; i < num_args; i++) { - grpc_run_client_side_validators(&args[i], flags, &sfd, client_cq); + grpc_run_client_side_validator(&args[i], flags, &sfd, client_cq); } /* Wait for server thread to finish */ GPR_ASSERT(gpr_event_wait(&a.done_thd, grpc_timeout_seconds_to_deadline(1))); @@ -240,7 +232,8 @@ void grpc_run_bad_client_test( grpc_shutdown(); } -bool client_connection_preface_validator(grpc_slice_buffer* incoming) { +bool client_connection_preface_validator(grpc_slice_buffer* incoming, + void* arg) { if (incoming->count < 1) { return false; } @@ -257,6 +250,44 @@ bool client_connection_preface_validator(grpc_slice_buffer* incoming) { return true; } +/* connection preface and settings frame to be sent by the client */ +#define CONNECTION_PREFACE_FROM_CLIENT \ + "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" \ + "\x00\x00\x00\x04\x00\x00\x00\x00\x00" + +grpc_bad_client_arg connection_preface_arg = { + client_connection_preface_validator, nullptr, + CONNECTION_PREFACE_FROM_CLIENT, sizeof(CONNECTION_PREFACE_FROM_CLIENT) - 1}; + +bool rst_stream_client_validator(grpc_slice_buffer* incoming, void* arg) { + // Get last frame from incoming slice buffer. + grpc_slice_buffer last_frame_buffer; + grpc_slice_buffer_init(&last_frame_buffer); + grpc_slice_buffer_trim_end(incoming, 13, &last_frame_buffer); + GPR_ASSERT(last_frame_buffer.count == 1); + grpc_slice last_frame = last_frame_buffer.slices[0]; + + const uint8_t* p = GRPC_SLICE_START_PTR(last_frame); + bool success = + // Length == 4 + *p++ != 0 || *p++ != 0 || *p++ != 4 || + // Frame type (RST_STREAM) + *p++ != 3 || + // Flags + *p++ != 0 || + // Stream ID. + *p++ != 0 || *p++ != 0 || *p++ != 0 || *p++ != 1 || + // Payload (error code) + *p++ == 0 || *p++ == 0 || *p++ == 0 || *p == 0 || *p == 11; + + if (!success) { + gpr_log(GPR_INFO, "client expected RST_STREAM frame, not found"); + } + + grpc_slice_buffer_destroy(&last_frame_buffer); + return success; +} + static void* tag(intptr_t t) { return (void*)t; } void server_verifier_request_call(grpc_server* server, diff --git a/test/core/bad_client/bad_client.h b/test/core/bad_client/bad_client.h index 54bf0229c5..bf73a78886 100644 --- a/test/core/bad_client/bad_client.h +++ b/test/core/bad_client/bad_client.h @@ -35,10 +35,11 @@ typedef void (*grpc_bad_client_server_side_validator)(grpc_server* server, /* Returns false if we need to read more data. */ typedef bool (*grpc_bad_client_client_stream_validator)( - grpc_slice_buffer* incoming); + grpc_slice_buffer* incoming, void* arg); struct grpc_bad_client_arg { grpc_bad_client_client_stream_validator client_validator; + void* client_validator_arg; const char* client_payload; size_t client_payload_length; }; @@ -47,11 +48,12 @@ struct grpc_bad_client_arg { #define GRPC_BAD_CLIENT_LARGE_REQUEST 2 /* Test runner. - - Create a server, and for each arg in args send client_payload. For each - payload, run client_validator to make sure that the response is as expected. - Also execute server_validator in a separate thread to assert that the bytes - are handled as expected. */ + * + * Create a server, and for each arg in \a args send client_payload. For each + * payload, run client_validator to make sure that the response is as expected. + * Also execute \a server_validator in a separate thread to assert that the + * bytes are handled as expected. + */ void grpc_run_bad_client_test( grpc_bad_client_server_side_validator server_validator, grpc_bad_client_arg args[], int num_args, uint32_t flags); @@ -59,20 +61,28 @@ void grpc_run_bad_client_test( #define COMBINE1(X, Y) X##Y #define COMBINE(X, Y) COMBINE1(X, Y) -#define GRPC_RUN_BAD_CLIENT_TEST(server_validator, client_validator, payload, \ - flags) \ - grpc_bad_client_arg COMBINE(bca, __LINE__) = {client_validator, payload, \ - sizeof(payload) - 1}; \ +#define GRPC_RUN_BAD_CLIENT_TEST(server_validator, client_validator, payload, \ + flags) \ + grpc_bad_client_arg COMBINE(bca, __LINE__) = {client_validator, nullptr, \ + payload, sizeof(payload) - 1}; \ grpc_run_bad_client_test(server_validator, &COMBINE(bca, __LINE__), 1, flags) -/* Client side validator for connection preface from server */ -bool client_connection_preface_validator(grpc_slice_buffer* incoming); +/* Helper validator functions */ +/* Client side validator for connection preface from server. \a arg is unused */ +bool client_connection_preface_validator(grpc_slice_buffer* incoming, + void* arg); + +/* Client side validator for checking if reset stream is present at the end + * of the buffer. \a arg is unused. + */ +bool rst_stream_client_validator(grpc_slice_buffer* incoming, void* arg); +/* Helper grpc_bad_client_arg arguments for direct use */ /* Sends a connection preface from the client with an empty settings frame */ extern grpc_bad_client_arg connection_preface_arg; /* Server side verifier function that performs a - * single grpc_server_request_call */ + * single grpc_server_request_call */ void server_verifier_request_call(grpc_server* server, grpc_completion_queue* cq, void* registered_method); diff --git a/test/core/bad_client/tests/head_of_line_blocking.cc b/test/core/bad_client/tests/head_of_line_blocking.cc index 7b1940d480..8668e091b6 100644 --- a/test/core/bad_client/tests/head_of_line_blocking.cc +++ b/test/core/bad_client/tests/head_of_line_blocking.cc @@ -131,7 +131,7 @@ int main(int argc, char** argv) { addbuf(hdr, sizeof(hdr)); addbuf(msg, FRAME_SIZE); } - grpc_bad_client_arg bca = {nullptr, g_buffer, g_count}; + grpc_bad_client_arg bca = {nullptr, nullptr, g_buffer, g_count}; grpc_run_bad_client_test(verifier, &bca, 1, 0); gpr_free(g_buffer); grpc_shutdown(); diff --git a/test/core/bad_client/tests/large_metadata.cc b/test/core/bad_client/tests/large_metadata.cc index 600d0006eb..429af8c955 100644 --- a/test/core/bad_client/tests/large_metadata.cc +++ b/test/core/bad_client/tests/large_metadata.cc @@ -138,43 +138,6 @@ static void server_verifier_sends_too_much_metadata(grpc_server* server, cq_verifier_destroy(cqv); } -static bool client_validator(grpc_slice_buffer* incoming) { - for (size_t i = 0; i < incoming->count; ++i) { - const char* s = (const char*)GRPC_SLICE_START_PTR(incoming->slices[i]); - char* hex = gpr_dump(s, GRPC_SLICE_LENGTH(incoming->slices[i]), - GPR_DUMP_HEX | GPR_DUMP_ASCII); - gpr_log(GPR_INFO, "RESPONSE SLICE %" PRIdPTR ": %s", i, hex); - gpr_free(hex); - } - - // Get last frame from incoming slice buffer. - grpc_slice_buffer last_frame_buffer; - grpc_slice_buffer_init(&last_frame_buffer); - grpc_slice_buffer_trim_end(incoming, 13, &last_frame_buffer); - GPR_ASSERT(last_frame_buffer.count == 1); - grpc_slice last_frame = last_frame_buffer.slices[0]; - - const uint8_t* p = GRPC_SLICE_START_PTR(last_frame); - bool success = - // Length == 4 - *p++ != 0 || *p++ != 0 || *p++ != 4 || - // Frame type (RST_STREAM) - *p++ != 3 || - // Flags - *p++ != 0 || - // Stream ID. - *p++ != 0 || *p++ != 0 || *p++ != 0 || *p++ != 1 || - // Payload (error code) - *p++ == 0 || *p++ == 0 || *p++ == 0 || *p == 0 || *p == 11; - - if (!success) { - gpr_log(GPR_INFO, "client expected RST_STREAM frame, not found"); - } - - grpc_slice_buffer_destroy(&last_frame_buffer); - return success; -} - int main(int argc, char** argv) { int i; @@ -199,7 +162,7 @@ int main(int argc, char** argv) { client_headers, headers_len); grpc_bad_client_arg args[2]; args[0] = connection_preface_arg; - args[1].client_validator = client_validator; + args[1].client_validator = rst_stream_client_validator; args[1].client_payload = client_payload; args[1].client_payload_length = sizeof(client_payload) - 1; @@ -208,7 +171,7 @@ int main(int argc, char** argv) { // Test sending more metadata than the client will accept. GRPC_RUN_BAD_CLIENT_TEST(server_verifier_sends_too_much_metadata, - client_validator, + rst_stream_client_validator, PFX_TOO_MUCH_METADATA_FROM_SERVER_STR, 0); return 0; } diff --git a/test/core/bad_client/tests/window_overflow.cc b/test/core/bad_client/tests/window_overflow.cc index 3c3b733f3f..3fda2e27b4 100644 --- a/test/core/bad_client/tests/window_overflow.cc +++ b/test/core/bad_client/tests/window_overflow.cc @@ -26,8 +26,7 @@ #include "src/core/lib/surface/server.h" #define PFX_STR \ - "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" \ - "\x00\x00\x00\x04\x00\x00\x00\x00\x00" /* settings frame */ \ + "\x00\x00\x00\x04\x01\x00\x00\x00\x00" \ "\x00\x00\xc9\x01\x04\x00\x00\x00\x01" /* headers: generated from \ simple_request.headers in this \ directory */ \ @@ -92,8 +91,10 @@ int main(int argc, char** argv) { addbuf(message, sizeof(message)); } } - grpc_bad_client_arg bca = {nullptr, g_buffer, g_count}; - grpc_run_bad_client_test(verifier, &bca, 1, GRPC_BAD_CLIENT_LARGE_REQUEST); + grpc_bad_client_arg bca[2]; + bca[0] = connection_preface_arg; + bca[1] = {rst_stream_client_validator, nullptr, g_buffer, g_count}; + grpc_run_bad_client_test(verifier, bca, 2, GRPC_BAD_CLIENT_LARGE_REQUEST); gpr_free(g_buffer); grpc_shutdown(); -- cgit v1.2.3 From 153ebda1ba02cfbe4f39bf3a9025ababb947378c Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Wed, 24 Jan 2018 17:35:54 -0800 Subject: reduce send size for window overflow test --- test/core/bad_client/tests/window_overflow.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'test/core/bad_client/tests/window_overflow.cc') diff --git a/test/core/bad_client/tests/window_overflow.cc b/test/core/bad_client/tests/window_overflow.cc index 3fda2e27b4..fe6b05d03a 100644 --- a/test/core/bad_client/tests/window_overflow.cc +++ b/test/core/bad_client/tests/window_overflow.cc @@ -69,7 +69,7 @@ int main(int argc, char** argv) { #define MAX_FRAME_SIZE 16384 #define MESSAGES_PER_FRAME (MAX_FRAME_SIZE / 5) #define FRAME_SIZE (MESSAGES_PER_FRAME * 5) -#define SEND_SIZE (6 * 1024 * 1024) +#define SEND_SIZE (4 * 1024 * 1024) #define NUM_FRAMES (SEND_SIZE / FRAME_SIZE + 1) grpc_test_init(argc, argv); grpc_init(); -- cgit v1.2.3