|
|
@ -59,13 +59,21 @@ static void *tag(gpr_intptr t) { return (void *)t; } |
|
|
|
|
|
|
|
|
|
|
|
static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config, |
|
|
|
static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config, |
|
|
|
const char *test_name, |
|
|
|
const char *test_name, |
|
|
|
grpc_channel_args *client_args, |
|
|
|
int fail_server_auth_check) { |
|
|
|
grpc_channel_args *server_args) { |
|
|
|
|
|
|
|
grpc_end2end_test_fixture f; |
|
|
|
grpc_end2end_test_fixture f; |
|
|
|
gpr_log(GPR_INFO, "%s/%s", test_name, config.name); |
|
|
|
gpr_log(GPR_INFO, "%s/%s", test_name, config.name); |
|
|
|
f = config.create_fixture(client_args, server_args); |
|
|
|
f = config.create_fixture(NULL, NULL); |
|
|
|
config.init_client(&f, client_args); |
|
|
|
config.init_client(&f, NULL); |
|
|
|
config.init_server(&f, server_args); |
|
|
|
if (fail_server_auth_check) { |
|
|
|
|
|
|
|
grpc_arg fail_auth_arg = { |
|
|
|
|
|
|
|
GRPC_ARG_STRING, FAIL_AUTH_CHECK_SERVER_ARG_NAME, {NULL}}; |
|
|
|
|
|
|
|
grpc_channel_args args; |
|
|
|
|
|
|
|
args.num_args= 1; |
|
|
|
|
|
|
|
args.args = &fail_auth_arg; |
|
|
|
|
|
|
|
config.init_server(&f, &args); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
config.init_server(&f, NULL); |
|
|
|
|
|
|
|
} |
|
|
|
return f; |
|
|
|
return f; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -128,7 +136,7 @@ static void test_call_creds_failure(grpc_end2end_test_config config) { |
|
|
|
grpc_call *c; |
|
|
|
grpc_call *c; |
|
|
|
grpc_credentials *creds = NULL; |
|
|
|
grpc_credentials *creds = NULL; |
|
|
|
grpc_end2end_test_fixture f = |
|
|
|
grpc_end2end_test_fixture f = |
|
|
|
begin_test(config, "test_call_creds_failure", NULL, NULL); |
|
|
|
begin_test(config, "test_call_creds_failure", 0); |
|
|
|
gpr_timespec deadline = five_seconds_time(); |
|
|
|
gpr_timespec deadline = five_seconds_time(); |
|
|
|
c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, |
|
|
|
c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, |
|
|
|
"/foo", "foo.test.google.fr", deadline); |
|
|
|
"/foo", "foo.test.google.fr", deadline); |
|
|
@ -157,9 +165,8 @@ static void request_response_with_payload_and_call_creds( |
|
|
|
grpc_byte_buffer *response_payload = |
|
|
|
grpc_byte_buffer *response_payload = |
|
|
|
grpc_raw_byte_buffer_create(&response_payload_slice, 1); |
|
|
|
grpc_raw_byte_buffer_create(&response_payload_slice, 1); |
|
|
|
gpr_timespec deadline = five_seconds_time(); |
|
|
|
gpr_timespec deadline = five_seconds_time(); |
|
|
|
|
|
|
|
grpc_end2end_test_fixture f; |
|
|
|
grpc_end2end_test_fixture f = begin_test(config, test_name, NULL, NULL); |
|
|
|
cq_verifier *cqv; |
|
|
|
cq_verifier *cqv = cq_verifier_create(f.cq); |
|
|
|
|
|
|
|
grpc_op ops[6]; |
|
|
|
grpc_op ops[6]; |
|
|
|
grpc_op *op; |
|
|
|
grpc_op *op; |
|
|
|
grpc_metadata_array initial_metadata_recv; |
|
|
|
grpc_metadata_array initial_metadata_recv; |
|
|
@ -174,6 +181,10 @@ static void request_response_with_payload_and_call_creds( |
|
|
|
int was_cancelled = 2; |
|
|
|
int was_cancelled = 2; |
|
|
|
grpc_credentials *creds = NULL; |
|
|
|
grpc_credentials *creds = NULL; |
|
|
|
grpc_auth_context *s_auth_context = NULL; |
|
|
|
grpc_auth_context *s_auth_context = NULL; |
|
|
|
|
|
|
|
grpc_auth_context *c_auth_context = NULL; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
f = begin_test(config, test_name, 0); |
|
|
|
|
|
|
|
cqv = cq_verifier_create(f.cq); |
|
|
|
|
|
|
|
|
|
|
|
c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, |
|
|
|
c = grpc_channel_create_call(f.client, NULL, GRPC_PROPAGATE_DEFAULTS, f.cq, |
|
|
|
"/foo", "foo.test.google.fr", deadline); |
|
|
|
"/foo", "foo.test.google.fr", deadline); |
|
|
@ -241,6 +252,11 @@ static void request_response_with_payload_and_call_creds( |
|
|
|
print_auth_context(0, s_auth_context); |
|
|
|
print_auth_context(0, s_auth_context); |
|
|
|
grpc_auth_context_release(s_auth_context); |
|
|
|
grpc_auth_context_release(s_auth_context); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
c_auth_context = grpc_call_auth_context(c); |
|
|
|
|
|
|
|
GPR_ASSERT(c_auth_context != NULL); |
|
|
|
|
|
|
|
print_auth_context(1, c_auth_context); |
|
|
|
|
|
|
|
grpc_auth_context_release(c_auth_context); |
|
|
|
|
|
|
|
|
|
|
|
/* Cannot set creds on the server call object. */ |
|
|
|
/* Cannot set creds on the server call object. */ |
|
|
|
GPR_ASSERT(grpc_call_set_credentials(s, NULL) != GRPC_CALL_OK); |
|
|
|
GPR_ASSERT(grpc_call_set_credentials(s, NULL) != GRPC_CALL_OK); |
|
|
|
|
|
|
|
|
|
|
@ -340,31 +356,120 @@ static void request_response_with_payload_and_call_creds( |
|
|
|
config.tear_down_data(&f); |
|
|
|
config.tear_down_data(&f); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void test_request_response_with_payload_and_call_creds( |
|
|
|
static void test_request_response_with_payload_and_call_creds( |
|
|
|
grpc_end2end_test_config config) { |
|
|
|
grpc_end2end_test_config config) { |
|
|
|
request_response_with_payload_and_call_creds( |
|
|
|
request_response_with_payload_and_call_creds( |
|
|
|
"test_request_response_with_payload_and_call_creds", config, NONE); |
|
|
|
"test_request_response_with_payload_and_call_creds", config, NONE); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void test_request_response_with_payload_and_overridden_call_creds( |
|
|
|
static void test_request_response_with_payload_and_overridden_call_creds( |
|
|
|
grpc_end2end_test_config config) { |
|
|
|
grpc_end2end_test_config config) { |
|
|
|
request_response_with_payload_and_call_creds( |
|
|
|
request_response_with_payload_and_call_creds( |
|
|
|
"test_request_response_with_payload_and_overridden_call_creds", config, |
|
|
|
"test_request_response_with_payload_and_overridden_call_creds", config, |
|
|
|
OVERRIDE); |
|
|
|
OVERRIDE); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void test_request_response_with_payload_and_deleted_call_creds( |
|
|
|
static void test_request_response_with_payload_and_deleted_call_creds( |
|
|
|
grpc_end2end_test_config config) { |
|
|
|
grpc_end2end_test_config config) { |
|
|
|
request_response_with_payload_and_call_creds( |
|
|
|
request_response_with_payload_and_call_creds( |
|
|
|
"test_request_response_with_payload_and_deleted_call_creds", config, |
|
|
|
"test_request_response_with_payload_and_deleted_call_creds", config, |
|
|
|
DESTROY); |
|
|
|
DESTROY); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void test_request_with_server_rejecting_client_creds( |
|
|
|
|
|
|
|
grpc_end2end_test_config config) { |
|
|
|
|
|
|
|
grpc_op ops[6]; |
|
|
|
|
|
|
|
grpc_op *op; |
|
|
|
|
|
|
|
grpc_call *c; |
|
|
|
|
|
|
|
grpc_end2end_test_fixture f; |
|
|
|
|
|
|
|
gpr_timespec deadline = five_seconds_time(); |
|
|
|
|
|
|
|
cq_verifier *cqv; |
|
|
|
|
|
|
|
grpc_metadata_array initial_metadata_recv; |
|
|
|
|
|
|
|
grpc_metadata_array trailing_metadata_recv; |
|
|
|
|
|
|
|
grpc_metadata_array request_metadata_recv; |
|
|
|
|
|
|
|
grpc_call_details call_details; |
|
|
|
|
|
|
|
grpc_status_code status; |
|
|
|
|
|
|
|
char *details = NULL; |
|
|
|
|
|
|
|
size_t details_capacity = 0; |
|
|
|
|
|
|
|
grpc_byte_buffer *response_payload_recv = NULL; |
|
|
|
|
|
|
|
gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world"); |
|
|
|
|
|
|
|
grpc_byte_buffer *request_payload = |
|
|
|
|
|
|
|
grpc_raw_byte_buffer_create(&request_payload_slice, 1); |
|
|
|
|
|
|
|
grpc_credentials *creds; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
f = begin_test(config, "test_request_with_server_rejecting_client_creds", 1); |
|
|
|
|
|
|
|
cqv = cq_verifier_create(f.cq); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
c = grpc_channel_create_call(f.client, f.cq, "/foo", "foo.test.google.fr", |
|
|
|
|
|
|
|
deadline); |
|
|
|
|
|
|
|
GPR_ASSERT(c); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
creds = grpc_iam_credentials_create(iam_token, iam_selector); |
|
|
|
|
|
|
|
GPR_ASSERT(creds != NULL); |
|
|
|
|
|
|
|
GPR_ASSERT(grpc_call_set_credentials(c, creds) == GRPC_CALL_OK); |
|
|
|
|
|
|
|
grpc_credentials_release(creds); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
grpc_metadata_array_init(&initial_metadata_recv); |
|
|
|
|
|
|
|
grpc_metadata_array_init(&trailing_metadata_recv); |
|
|
|
|
|
|
|
grpc_metadata_array_init(&request_metadata_recv); |
|
|
|
|
|
|
|
grpc_call_details_init(&call_details); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
op = ops; |
|
|
|
|
|
|
|
op->op = GRPC_OP_RECV_STATUS_ON_CLIENT; |
|
|
|
|
|
|
|
op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv; |
|
|
|
|
|
|
|
op->data.recv_status_on_client.status = &status; |
|
|
|
|
|
|
|
op->data.recv_status_on_client.status_details = &details; |
|
|
|
|
|
|
|
op->data.recv_status_on_client.status_details_capacity = &details_capacity; |
|
|
|
|
|
|
|
op->flags = 0; |
|
|
|
|
|
|
|
op++; |
|
|
|
|
|
|
|
op->op = GRPC_OP_SEND_INITIAL_METADATA; |
|
|
|
|
|
|
|
op->data.send_initial_metadata.count = 0; |
|
|
|
|
|
|
|
op->flags = 0; |
|
|
|
|
|
|
|
op++; |
|
|
|
|
|
|
|
op->op = GRPC_OP_SEND_MESSAGE; |
|
|
|
|
|
|
|
op->data.send_message = request_payload; |
|
|
|
|
|
|
|
op->flags = 0; |
|
|
|
|
|
|
|
op++; |
|
|
|
|
|
|
|
op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT; |
|
|
|
|
|
|
|
op->flags = 0; |
|
|
|
|
|
|
|
op++; |
|
|
|
|
|
|
|
op->op = GRPC_OP_RECV_INITIAL_METADATA; |
|
|
|
|
|
|
|
op->data.recv_initial_metadata = &initial_metadata_recv; |
|
|
|
|
|
|
|
op->flags = 0; |
|
|
|
|
|
|
|
op++; |
|
|
|
|
|
|
|
op->op = GRPC_OP_RECV_MESSAGE; |
|
|
|
|
|
|
|
op->data.recv_message = &response_payload_recv; |
|
|
|
|
|
|
|
op->flags = 0; |
|
|
|
|
|
|
|
op++; |
|
|
|
|
|
|
|
GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(c, ops, op - ops, tag(1))); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cq_expect_completion(cqv, tag(1), 1); |
|
|
|
|
|
|
|
cq_verify(cqv); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
GPR_ASSERT(status == GRPC_STATUS_UNAUTHENTICATED); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
grpc_metadata_array_destroy(&initial_metadata_recv); |
|
|
|
|
|
|
|
grpc_metadata_array_destroy(&trailing_metadata_recv); |
|
|
|
|
|
|
|
grpc_metadata_array_destroy(&request_metadata_recv); |
|
|
|
|
|
|
|
grpc_call_details_destroy(&call_details); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
grpc_byte_buffer_destroy(request_payload); |
|
|
|
|
|
|
|
grpc_byte_buffer_destroy(response_payload_recv); |
|
|
|
|
|
|
|
gpr_free(details); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
grpc_call_destroy(c); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cq_verifier_destroy(cqv); |
|
|
|
|
|
|
|
end_test(&f); |
|
|
|
|
|
|
|
config.tear_down_data(&f); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void grpc_end2end_tests(grpc_end2end_test_config config) { |
|
|
|
void grpc_end2end_tests(grpc_end2end_test_config config) { |
|
|
|
if (config.feature_mask & FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS) { |
|
|
|
if (config.feature_mask & FEATURE_MASK_SUPPORTS_PER_CALL_CREDENTIALS) { |
|
|
|
test_call_creds_failure(config); |
|
|
|
test_call_creds_failure(config); |
|
|
|
test_request_response_with_payload_and_call_creds(config); |
|
|
|
test_request_response_with_payload_and_call_creds(config); |
|
|
|
test_request_response_with_payload_and_overridden_call_creds(config); |
|
|
|
test_request_response_with_payload_and_overridden_call_creds(config); |
|
|
|
test_request_response_with_payload_and_deleted_call_creds(config); |
|
|
|
test_request_response_with_payload_and_deleted_call_creds(config); |
|
|
|
|
|
|
|
test_request_with_server_rejecting_client_creds(config); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|