|
|
|
@ -63,16 +63,9 @@ static void server_setup_transport(void *ts, grpc_transport *transport) { |
|
|
|
|
grpc_exec_ctx_finish(&exec_ctx); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
typedef struct { |
|
|
|
|
grpc_bad_client_client_stream_validator validator; |
|
|
|
|
grpc_slice_buffer incoming; |
|
|
|
|
gpr_event read_done; |
|
|
|
|
} read_args; |
|
|
|
|
|
|
|
|
|
static void read_done(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) { |
|
|
|
|
read_args *a = arg; |
|
|
|
|
a->validator(&a->incoming); |
|
|
|
|
gpr_event_set(&a->read_done, (void *)1); |
|
|
|
|
gpr_event *read_done = arg; |
|
|
|
|
gpr_event_set(read_done, (void *)1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void grpc_run_bad_client_test( |
|
|
|
@ -159,24 +152,31 @@ void grpc_run_bad_client_test( |
|
|
|
|
if (sfd.client != NULL) { |
|
|
|
|
// Validate client stream, if requested.
|
|
|
|
|
if (client_validator != NULL) { |
|
|
|
|
read_args args; |
|
|
|
|
args.validator = client_validator; |
|
|
|
|
grpc_slice_buffer_init(&args.incoming); |
|
|
|
|
gpr_event_init(&args.read_done); |
|
|
|
|
grpc_closure read_done_closure; |
|
|
|
|
GRPC_CLOSURE_INIT(&read_done_closure, read_done, &args, |
|
|
|
|
grpc_schedule_on_exec_ctx); |
|
|
|
|
grpc_endpoint_read(&exec_ctx, sfd.client, &args.incoming, |
|
|
|
|
&read_done_closure); |
|
|
|
|
grpc_exec_ctx_finish(&exec_ctx); |
|
|
|
|
gpr_timespec deadline = grpc_timeout_seconds_to_deadline(5); |
|
|
|
|
while (!gpr_event_get(&args.read_done)) { |
|
|
|
|
GPR_ASSERT(gpr_time_cmp(deadline, gpr_now(deadline.clock_type)) > 0); |
|
|
|
|
GPR_ASSERT(grpc_completion_queue_next( |
|
|
|
|
a.cq, grpc_timeout_milliseconds_to_deadline(100), NULL) |
|
|
|
|
.type == GRPC_QUEUE_TIMEOUT); |
|
|
|
|
grpc_slice_buffer incoming; |
|
|
|
|
grpc_slice_buffer_init(&incoming); |
|
|
|
|
// We may need to do multiple reads to read the complete server response.
|
|
|
|
|
while (true) { |
|
|
|
|
gpr_event read_done_event; |
|
|
|
|
gpr_event_init(&read_done_event); |
|
|
|
|
grpc_closure read_done_closure; |
|
|
|
|
GRPC_CLOSURE_INIT(&read_done_closure, read_done, &read_done_event, |
|
|
|
|
grpc_schedule_on_exec_ctx); |
|
|
|
|
grpc_endpoint_read(&exec_ctx, sfd.client, &incoming, |
|
|
|
|
&read_done_closure); |
|
|
|
|
grpc_exec_ctx_finish(&exec_ctx); |
|
|
|
|
do { |
|
|
|
|
GPR_ASSERT(gpr_time_cmp(deadline, gpr_now(deadline.clock_type)) > 0); |
|
|
|
|
GPR_ASSERT(grpc_completion_queue_next( |
|
|
|
|
a.cq, grpc_timeout_milliseconds_to_deadline(100), NULL) |
|
|
|
|
.type == GRPC_QUEUE_TIMEOUT); |
|
|
|
|
} while (!gpr_event_get(&read_done_event)); |
|
|
|
|
if (client_validator(&incoming)) break; |
|
|
|
|
gpr_log(GPR_INFO, |
|
|
|
|
"client validator failed; trying additional read " |
|
|
|
|
"in case we didn't get all the data"); |
|
|
|
|
} |
|
|
|
|
grpc_slice_buffer_destroy_internal(&exec_ctx, &args.incoming); |
|
|
|
|
grpc_slice_buffer_destroy_internal(&exec_ctx, &incoming); |
|
|
|
|
} |
|
|
|
|
// Shutdown.
|
|
|
|
|
grpc_endpoint_shutdown( |
|
|
|
|