|
|
|
@ -106,7 +106,7 @@ bool tags_needed[kAvailableTags]; |
|
|
|
|
|
|
|
|
|
// Mark that a tag is expected; this function must be executed in the
|
|
|
|
|
// main thread only while there are no other threads altering the
|
|
|
|
|
// expectation set (e.g., running callbacks).
|
|
|
|
|
// expectation set (e.g., by calling expect_tag or verify_tags)
|
|
|
|
|
static void expect_tag(intptr_t tag, bool ok) { |
|
|
|
|
size_t idx = static_cast<size_t>(tag); |
|
|
|
|
GPR_ASSERT(idx < kAvailableTags); |
|
|
|
@ -114,10 +114,14 @@ static void expect_tag(intptr_t tag, bool ok) { |
|
|
|
|
tags_expected[idx] = ok; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// The tag verifier doesn't have to drive the CQ at all (unlike the
|
|
|
|
|
// next-based end2end tests) because the tags will get set when the
|
|
|
|
|
// callbacks are executed, which happens when a particular batch
|
|
|
|
|
// related to a callback is complete
|
|
|
|
|
// Check that the expected tags have reached, within a certain
|
|
|
|
|
// deadline. This must also be executed only on the main thread while
|
|
|
|
|
// there are no other threads altering the expectation set (e.g., by
|
|
|
|
|
// calling expect_tag or verify_tags). The tag verifier doesn't have
|
|
|
|
|
// to drive the CQ at all (unlike the next-based end2end tests)
|
|
|
|
|
// because the tags will get set when the callbacks are executed,
|
|
|
|
|
// which happens when a particular batch related to a callback is
|
|
|
|
|
// complete.
|
|
|
|
|
static void verify_tags(gpr_timespec deadline) { |
|
|
|
|
bool done = false; |
|
|
|
|
|
|
|
|
@ -342,14 +346,13 @@ static void simple_request_body(grpc_end2end_test_config config, |
|
|
|
|
GPR_ASSERT(GRPC_CALL_OK == error); |
|
|
|
|
|
|
|
|
|
// Register a call at the server-side to match the incoming client call
|
|
|
|
|
// First mark that we are expecting its tag to complete in this round
|
|
|
|
|
expect_tag(2, true); |
|
|
|
|
error = grpc_server_request_call(f.server, &s, &call_details, |
|
|
|
|
&request_metadata_recv, f.cq, f.cq, tag(2)); |
|
|
|
|
GPR_ASSERT(GRPC_CALL_OK == error); |
|
|
|
|
|
|
|
|
|
// We expect that the server call creation callback (and no others) will
|
|
|
|
|
// execute now since no other batch should be complete.
|
|
|
|
|
expect_tag(2, true); |
|
|
|
|
verify_tags(deadline); |
|
|
|
|
|
|
|
|
|
peer = grpc_call_get_peer(s); |
|
|
|
@ -361,11 +364,6 @@ static void simple_request_body(grpc_end2end_test_config config, |
|
|
|
|
gpr_log(GPR_DEBUG, "client_peer=%s", peer); |
|
|
|
|
gpr_free(peer); |
|
|
|
|
|
|
|
|
|
// Both the client request and server response batches should get complete
|
|
|
|
|
// in this round and we should see that their callbacks get executed
|
|
|
|
|
expect_tag(3, true); |
|
|
|
|
expect_tag(1, true); |
|
|
|
|
|
|
|
|
|
// Create the server response batch (no payload)
|
|
|
|
|
memset(ops, 0, sizeof(ops)); |
|
|
|
|
op = ops; |
|
|
|
@ -391,7 +389,10 @@ static void simple_request_body(grpc_end2end_test_config config, |
|
|
|
|
nullptr); |
|
|
|
|
GPR_ASSERT(GRPC_CALL_OK == error); |
|
|
|
|
|
|
|
|
|
// Make sure that the tags get executed by the deadline
|
|
|
|
|
// Both the client request and server response batches should get complete
|
|
|
|
|
// now and we should see that their callbacks have been executed
|
|
|
|
|
expect_tag(3, true); |
|
|
|
|
expect_tag(1, true); |
|
|
|
|
verify_tags(deadline); |
|
|
|
|
|
|
|
|
|
GPR_ASSERT(status == GRPC_STATUS_UNIMPLEMENTED); |
|
|
|
|