Trailing metadata support.
Actually exposing it from the C API.
Also removing grpc_status, since it's mostly useless.
Change on 2014/12/15 by ctiller <ctiller@google.com>
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=82180546
diff --git a/test/core/echo/server.c b/test/core/echo/server.c
index d80b55e..e70743a 100644
--- a/test/core/echo/server.c
+++ b/test/core/echo/server.c
@@ -51,8 +51,6 @@
static grpc_server *server;
static int got_sigint = 0;
-static const grpc_status status_ok = {GRPC_STATUS_OK, NULL};
-
typedef struct {
gpr_refcount pending_ops;
gpr_intmax bytes_read;
@@ -145,8 +143,8 @@
GRPC_WRITE_BUFFER_HINT) ==
GRPC_CALL_OK);
} else {
- GPR_ASSERT(grpc_call_start_write_status(ev->call, status_ok, s) ==
- GRPC_CALL_OK);
+ GPR_ASSERT(grpc_call_start_write_status(ev->call, GRPC_STATUS_OK,
+ NULL, s) == GRPC_CALL_OK);
}
break;
case GRPC_FINISH_ACCEPTED:
diff --git a/test/core/end2end/cq_verifier.c b/test/core/end2end/cq_verifier.c
index 4d57fdc..1181f1b 100644
--- a/test/core/end2end/cq_verifier.c
+++ b/test/core/end2end/cq_verifier.c
@@ -80,7 +80,8 @@
} server_rpc_new;
metadata *client_metadata_read;
struct {
- grpc_status status;
+ grpc_status_code status;
+ const char *details;
metadata *metadata;
} finished;
gpr_slice *read;
@@ -201,12 +202,14 @@
ev->data.client_metadata_read.count);
break;
case GRPC_FINISHED:
- if (e->data.finished.status.code != GRPC_STATUS__DO_NOT_USE) {
- GPR_ASSERT(e->data.finished.status.code == ev->data.finished.code);
- GPR_ASSERT(string_equivalent(e->data.finished.status.details,
+ if (e->data.finished.status != GRPC_STATUS__DO_NOT_USE) {
+ GPR_ASSERT(e->data.finished.status == ev->data.finished.status);
+ GPR_ASSERT(string_equivalent(e->data.finished.details,
ev->data.finished.details));
}
- verify_and_destroy_metadata(e->data.finished.metadata, NULL, 0);
+ verify_and_destroy_metadata(e->data.finished.metadata,
+ ev->data.finished.metadata_elements,
+ ev->data.finished.metadata_count);
break;
case GRPC_QUEUE_SHUTDOWN:
gpr_log(GPR_ERROR, "premature queue shutdown");
@@ -279,9 +282,8 @@
return len;
case GRPC_FINISHED:
str = metadata_expectation_string(e->data.finished.metadata);
- len = sprintf(out, "GRPC_FINISHED code=%d details=%s %s",
- e->data.finished.status.code,
- e->data.finished.status.details, str);
+ len = sprintf(out, "GRPC_FINISHED status=%d details=%s %s",
+ e->data.finished.status, e->data.finished.details, str);
gpr_free(str);
return len;
case GRPC_READ:
@@ -456,25 +458,27 @@
va_end(args);
}
-static void finished_internal(cq_verifier *v, void *tag, grpc_status status,
+static void finished_internal(cq_verifier *v, void *tag,
+ grpc_status_code status, const char *details,
va_list args) {
expectation *e = add(v, GRPC_FINISHED, tag);
e->data.finished.status = status;
+ e->data.finished.details = details;
e->data.finished.metadata = metadata_from_args(args);
}
void cq_expect_finished_with_status(cq_verifier *v, void *tag,
- grpc_status status, ...) {
+ grpc_status_code status,
+ const char *details, ...) {
va_list args;
- va_start(args, status);
- finished_internal(v, tag, status, args);
+ va_start(args, details);
+ finished_internal(v, tag, status, details, args);
va_end(args);
}
void cq_expect_finished(cq_verifier *v, void *tag, ...) {
va_list args;
- grpc_status status = {GRPC_STATUS__DO_NOT_USE, NULL};
va_start(args, tag);
- finished_internal(v, tag, status, args);
+ finished_internal(v, tag, GRPC_STATUS__DO_NOT_USE, NULL, args);
va_end(args);
}
diff --git a/test/core/end2end/cq_verifier.h b/test/core/end2end/cq_verifier.h
index 60f56bd..9711e00 100644
--- a/test/core/end2end/cq_verifier.h
+++ b/test/core/end2end/cq_verifier.h
@@ -67,7 +67,8 @@
gpr_timespec deadline, ...);
void cq_expect_client_metadata_read(cq_verifier *v, void *tag, ...);
void cq_expect_finished_with_status(cq_verifier *v, void *tag,
- grpc_status status, ...);
+ grpc_status_code status_code,
+ const char *details, ...);
void cq_expect_finished(cq_verifier *v, void *tag, ...);
#endif /* __GRPC_TEST_END2END_CQ_VERIFIER_H__ */
diff --git a/test/core/end2end/dualstack_socket_test.c b/test/core/end2end/dualstack_socket_test.c
index 55c4bb2..808fcbd 100644
--- a/test/core/end2end/dualstack_socket_test.c
+++ b/test/core/end2end/dualstack_socket_test.c
@@ -63,8 +63,6 @@
void test_connect(const char *server_host, const char *client_host, int port,
int expect_ok) {
- const grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
- const grpc_status cancelled_status = {GRPC_STATUS_CANCELLED, NULL};
char *client_hostport;
char *server_hostport;
grpc_channel *client;
@@ -130,8 +128,10 @@
cq_verify(v_client);
GPR_ASSERT(GRPC_CALL_OK ==
- grpc_call_start_write_status(s, send_status, tag(5)));
- cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
+ grpc_call_start_write_status(s, GRPC_STATUS_UNIMPLEMENTED, "xyz",
+ tag(5)));
+ cq_expect_finished_with_status(v_client, tag(3), GRPC_STATUS_UNIMPLEMENTED,
+ "xyz", NULL);
cq_verify(v_client);
cq_expect_finish_accepted(v_server, tag(5), GRPC_OP_OK);
@@ -145,7 +145,8 @@
/* Check for a failed connection. */
cq_expect_invoke_accepted(v_client, tag(1), GRPC_OP_ERROR);
cq_expect_client_metadata_read(v_client, tag(2), NULL);
- cq_expect_finished_with_status(v_client, tag(3), cancelled_status, NULL);
+ cq_expect_finished_with_status(v_client, tag(3), GRPC_STATUS_CANCELLED,
+ NULL, NULL);
cq_verify(v_client);
grpc_call_destroy(c);
diff --git a/test/core/end2end/gen_build_json.py b/test/core/end2end/gen_build_json.py
index a6b5a0c..4412556 100755
--- a/test/core/end2end/gen_build_json.py
+++ b/test/core/end2end/gen_build_json.py
@@ -31,6 +31,7 @@
'request_response_with_binary_metadata_and_payload',
'request_response_with_metadata_and_payload',
'request_response_with_payload',
+ 'request_response_with_trailing_metadata_and_payload',
'simple_delayed_request',
'simple_request',
'thread_stress',
diff --git a/test/core/end2end/no_server_test.c b/test/core/end2end/no_server_test.c
index f081056..f506b8b 100644
--- a/test/core/end2end/no_server_test.c
+++ b/test/core/end2end/no_server_test.c
@@ -47,7 +47,6 @@
cq_verifier *cqv;
grpc_event *ev;
int done;
- grpc_status expect_status = {GRPC_STATUS_CANCELLED, NULL};
grpc_test_init(argc, argv);
grpc_init();
@@ -63,7 +62,8 @@
/* verify that all tags get completed */
cq_expect_invoke_accepted(cqv, tag(1), GRPC_OP_ERROR);
cq_expect_client_metadata_read(cqv, tag(2), NULL);
- cq_expect_finished_with_status(cqv, tag(3), expect_status, NULL);
+ cq_expect_finished_with_status(cqv, tag(3), GRPC_STATUS_CANCELLED, NULL,
+ NULL);
cq_verify(cqv);
grpc_completion_queue_shutdown(cq);
diff --git a/test/core/end2end/tests/cancel_after_accept.c b/test/core/end2end/tests/cancel_after_accept.c
index c9c3a18..3b57040 100644
--- a/test/core/end2end/tests/cancel_after_accept.c
+++ b/test/core/end2end/tests/cancel_after_accept.c
@@ -119,7 +119,6 @@
gpr_timespec deadline = five_seconds_time();
cq_verifier *v_client = cq_verifier_create(f.client_cq);
cq_verifier *v_server = cq_verifier_create(f.server_cq);
- grpc_status chk_status = {GRPC_STATUS_CANCELLED, NULL};
c = grpc_channel_create_call(f.client, "/foo", "test.google.com", deadline);
GPR_ASSERT(c);
@@ -140,10 +139,12 @@
GPR_ASSERT(GRPC_CALL_OK == call_cancel(c));
- cq_expect_finished_with_status(v_client, tag(3), chk_status, NULL);
+ cq_expect_finished_with_status(v_client, tag(3), GRPC_STATUS_CANCELLED, NULL,
+ NULL);
cq_verify(v_client);
- cq_expect_finished_with_status(v_server, tag(102), chk_status, NULL);
+ cq_expect_finished_with_status(v_server, tag(102), GRPC_STATUS_CANCELLED,
+ NULL, NULL);
cq_verify(v_server);
grpc_call_destroy(c);
diff --git a/test/core/end2end/tests/cancel_after_accept_and_writes_closed.c b/test/core/end2end/tests/cancel_after_accept_and_writes_closed.c
index 904dabe..e20b0ec 100644
--- a/test/core/end2end/tests/cancel_after_accept_and_writes_closed.c
+++ b/test/core/end2end/tests/cancel_after_accept_and_writes_closed.c
@@ -119,7 +119,6 @@
gpr_timespec deadline = five_seconds_time();
cq_verifier *v_client = cq_verifier_create(f.client_cq);
cq_verifier *v_server = cq_verifier_create(f.server_cq);
- grpc_status chk_status = {GRPC_STATUS_CANCELLED, NULL};
c = grpc_channel_create_call(f.client, "/foo", "test.google.com", deadline);
GPR_ASSERT(c);
@@ -148,10 +147,12 @@
GPR_ASSERT(GRPC_CALL_OK == call_cancel(c));
- cq_expect_finished_with_status(v_client, tag(3), chk_status, NULL);
+ cq_expect_finished_with_status(v_client, tag(3), GRPC_STATUS_CANCELLED, NULL,
+ NULL);
cq_verify(v_client);
- cq_expect_finished_with_status(v_server, tag(102), chk_status, NULL);
+ cq_expect_finished_with_status(v_server, tag(102), GRPC_STATUS_CANCELLED,
+ NULL, NULL);
cq_verify(v_server);
grpc_call_destroy(c);
diff --git a/test/core/end2end/tests/cancel_after_invoke.c b/test/core/end2end/tests/cancel_after_invoke.c
index 5920813..4fab9f7 100644
--- a/test/core/end2end/tests/cancel_after_invoke.c
+++ b/test/core/end2end/tests/cancel_after_invoke.c
@@ -117,7 +117,6 @@
grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
gpr_timespec deadline = five_seconds_time();
cq_verifier *v_client = cq_verifier_create(f.client_cq);
- grpc_status chk_status = {GRPC_STATUS_CANCELLED, NULL};
c = grpc_channel_create_call(f.client, "/foo", "test.google.com", deadline);
GPR_ASSERT(c);
@@ -130,7 +129,8 @@
GPR_ASSERT(GRPC_CALL_OK == call_cancel(c));
cq_expect_client_metadata_read(v_client, tag(2), NULL);
- cq_expect_finished_with_status(v_client, tag(3), chk_status, NULL);
+ cq_expect_finished_with_status(v_client, tag(3), GRPC_STATUS_CANCELLED, NULL,
+ NULL);
cq_verify(v_client);
grpc_call_destroy(c);
diff --git a/test/core/end2end/tests/cancel_before_invoke.c b/test/core/end2end/tests/cancel_before_invoke.c
index afffc2f..2d8d465 100644
--- a/test/core/end2end/tests/cancel_before_invoke.c
+++ b/test/core/end2end/tests/cancel_before_invoke.c
@@ -112,7 +112,6 @@
grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
gpr_timespec deadline = five_seconds_time();
cq_verifier *v_client = cq_verifier_create(f.client_cq);
- grpc_status chk_status = {GRPC_STATUS_CANCELLED, NULL};
c = grpc_channel_create_call(f.client, "/foo", "test.google.com", deadline);
GPR_ASSERT(c);
@@ -123,7 +122,8 @@
grpc_call_start_invoke(c, f.client_cq, tag(1), tag(2), tag(3), 0));
cq_expect_invoke_accepted(v_client, tag(1), GRPC_OP_ERROR);
cq_expect_client_metadata_read(v_client, tag(2), NULL);
- cq_expect_finished_with_status(v_client, tag(3), chk_status, NULL);
+ cq_expect_finished_with_status(v_client, tag(3), GRPC_STATUS_CANCELLED, NULL,
+ NULL);
cq_verify(v_client);
grpc_call_destroy(c);
diff --git a/test/core/end2end/tests/disappearing_server.c b/test/core/end2end/tests/disappearing_server.c
index 4d3738a..c421798 100644
--- a/test/core/end2end/tests/disappearing_server.c
+++ b/test/core/end2end/tests/disappearing_server.c
@@ -95,7 +95,6 @@
cq_verifier *v_server) {
grpc_call *c;
grpc_call *s;
- grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
gpr_timespec deadline = five_seconds_time();
c = grpc_channel_create_call(f->client, "/foo", "test.google.com", deadline);
@@ -124,9 +123,10 @@
- and still complete the request */
grpc_server_shutdown(f->server);
- GPR_ASSERT(GRPC_CALL_OK ==
- grpc_call_start_write_status(s, send_status, tag(5)));
- cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_write_status(
+ s, GRPC_STATUS_UNIMPLEMENTED, "xyz", tag(5)));
+ cq_expect_finished_with_status(v_client, tag(3), GRPC_STATUS_UNIMPLEMENTED,
+ "xyz", NULL);
cq_verify(v_client);
cq_expect_finish_accepted(v_server, tag(5), GRPC_OP_OK);
diff --git a/test/core/end2end/tests/early_server_shutdown_finishes_inflight_calls.c b/test/core/end2end/tests/early_server_shutdown_finishes_inflight_calls.c
index 8d73e2c..3855a7a 100644
--- a/test/core/end2end/tests/early_server_shutdown_finishes_inflight_calls.c
+++ b/test/core/end2end/tests/early_server_shutdown_finishes_inflight_calls.c
@@ -107,7 +107,6 @@
grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
grpc_call *c;
grpc_call *s;
- grpc_status expect_status = {GRPC_STATUS_UNAVAILABLE, NULL};
gpr_timespec deadline = five_seconds_time();
cq_verifier *v_client = cq_verifier_create(f.client_cq);
cq_verifier *v_server = cq_verifier_create(f.server_cq);
@@ -141,7 +140,8 @@
grpc_call_destroy(s);
- cq_expect_finished_with_status(v_client, tag(3), expect_status, NULL);
+ cq_expect_finished_with_status(v_client, tag(3), GRPC_STATUS_UNAVAILABLE,
+ NULL, NULL);
cq_verify(v_client);
grpc_call_destroy(c);
diff --git a/test/core/end2end/tests/invoke_large_request.c b/test/core/end2end/tests/invoke_large_request.c
index 5721424..d15fef6 100644
--- a/test/core/end2end/tests/invoke_large_request.c
+++ b/test/core/end2end/tests/invoke_large_request.c
@@ -109,7 +109,6 @@
static void test_invoke_large_request(grpc_end2end_test_config config) {
grpc_call *c;
grpc_call *s;
- grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
gpr_slice request_payload_slice = large_slice();
grpc_byte_buffer *request_payload =
grpc_byte_buffer_create(&request_payload_slice, 1);
@@ -156,11 +155,12 @@
cq_verify(v_server);
GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c, tag(8)));
- GPR_ASSERT(GRPC_CALL_OK ==
- grpc_call_start_write_status(s, send_status, tag(9)));
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_write_status(
+ s, GRPC_STATUS_UNIMPLEMENTED, "xyz", tag(9)));
cq_expect_finish_accepted(v_client, tag(8), GRPC_OP_OK);
- cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
+ cq_expect_finished_with_status(v_client, tag(3), GRPC_STATUS_UNIMPLEMENTED,
+ "xyz", NULL);
cq_verify(v_client);
cq_expect_finish_accepted(v_server, tag(9), GRPC_OP_OK);
diff --git a/test/core/end2end/tests/max_concurrent_streams.c b/test/core/end2end/tests/max_concurrent_streams.c
index 6b331a5..08198d4 100644
--- a/test/core/end2end/tests/max_concurrent_streams.c
+++ b/test/core/end2end/tests/max_concurrent_streams.c
@@ -105,7 +105,6 @@
static void simple_request_body(grpc_end2end_test_fixture f) {
grpc_call *c;
grpc_call *s;
- grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
gpr_timespec deadline = five_seconds_time();
cq_verifier *v_client = cq_verifier_create(f.client_cq);
cq_verifier *v_server = cq_verifier_create(f.server_cq);
@@ -131,9 +130,10 @@
cq_expect_client_metadata_read(v_client, tag(2), NULL);
cq_verify(v_client);
- GPR_ASSERT(GRPC_CALL_OK ==
- grpc_call_start_write_status(s, send_status, tag(5)));
- cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_write_status(
+ s, GRPC_STATUS_UNIMPLEMENTED, "xyz", tag(5)));
+ cq_expect_finished_with_status(v_client, tag(3), GRPC_STATUS_UNIMPLEMENTED,
+ "xyz", NULL);
cq_verify(v_client);
cq_expect_finish_accepted(v_server, tag(5), GRPC_OP_OK);
@@ -157,7 +157,6 @@
grpc_call *s1;
grpc_call *s2;
gpr_timespec deadline;
- grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
cq_verifier *v_client;
cq_verifier *v_server;
@@ -208,13 +207,15 @@
cq_verify(v_client);
GPR_ASSERT(GRPC_CALL_OK ==
- grpc_call_start_write_status(s1, send_status, tag(103)));
+ grpc_call_start_write_status(s1, GRPC_STATUS_UNIMPLEMENTED, "xyz",
+ tag(103)));
cq_expect_finish_accepted(v_server, tag(103), GRPC_OP_OK);
cq_expect_finished(v_server, tag(102), NULL);
cq_verify(v_server);
/* first request is finished, we should be able to start the second */
- cq_expect_finished_with_status(v_client, tag(302), send_status, NULL);
+ cq_expect_finished_with_status(v_client, tag(302), GRPC_STATUS_UNIMPLEMENTED,
+ "xyz", NULL);
cq_expect_invoke_accepted(v_client, tag(400), GRPC_OP_OK);
cq_verify(v_client);
@@ -232,12 +233,14 @@
cq_verify(v_client);
GPR_ASSERT(GRPC_CALL_OK ==
- grpc_call_start_write_status(s2, send_status, tag(203)));
+ grpc_call_start_write_status(s2, GRPC_STATUS_UNIMPLEMENTED, "xyz",
+ tag(203)));
cq_expect_finish_accepted(v_server, tag(203), GRPC_OP_OK);
cq_expect_finished(v_server, tag(202), NULL);
cq_verify(v_server);
- cq_expect_finished_with_status(v_client, tag(402), send_status, NULL);
+ cq_expect_finished_with_status(v_client, tag(402), GRPC_STATUS_UNIMPLEMENTED,
+ "xyz", NULL);
cq_verify(v_client);
cq_verifier_destroy(v_client);
diff --git a/test/core/end2end/tests/ping_pong_streaming.c b/test/core/end2end/tests/ping_pong_streaming.c
index 84e7bb4..02a05e8 100644
--- a/test/core/end2end/tests/ping_pong_streaming.c
+++ b/test/core/end2end/tests/ping_pong_streaming.c
@@ -108,7 +108,6 @@
int i;
grpc_call *c;
grpc_call *s = NULL;
- grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
gpr_slice response_payload_slice = gpr_slice_from_copied_string("hello you");
grpc_byte_buffer *request_payload = NULL;
@@ -171,11 +170,12 @@
gpr_slice_unref(response_payload_slice);
GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c, tag(6)));
- GPR_ASSERT(GRPC_CALL_OK ==
- grpc_call_start_write_status(s, send_status, tag(7)));
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_write_status(
+ s, GRPC_STATUS_UNIMPLEMENTED, "xyz", tag(7)));
cq_expect_finish_accepted(v_client, tag(6), GRPC_OP_OK);
- cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
+ cq_expect_finished_with_status(v_client, tag(3), GRPC_STATUS_UNIMPLEMENTED,
+ "xyz", NULL);
cq_verify(v_client);
cq_expect_finish_accepted(v_server, tag(7), GRPC_OP_OK);
diff --git a/test/core/end2end/tests/request_response_with_binary_metadata_and_payload.c b/test/core/end2end/tests/request_response_with_binary_metadata_and_payload.c
index 7be6558..8a0eea8 100644
--- a/test/core/end2end/tests/request_response_with_binary_metadata_and_payload.c
+++ b/test/core/end2end/tests/request_response_with_binary_metadata_and_payload.c
@@ -107,7 +107,6 @@
grpc_end2end_test_config config) {
grpc_call *c;
grpc_call *s;
- grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
gpr_slice response_payload_slice = gpr_slice_from_copied_string("hello you");
grpc_byte_buffer *request_payload =
@@ -197,11 +196,12 @@
cq_verify(v_client);
GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c, tag(8)));
- GPR_ASSERT(GRPC_CALL_OK ==
- grpc_call_start_write_status(s, send_status, tag(9)));
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_write_status(
+ s, GRPC_STATUS_UNIMPLEMENTED, "xyz", tag(9)));
cq_expect_finish_accepted(v_client, tag(8), GRPC_OP_OK);
- cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
+ cq_expect_finished_with_status(v_client, tag(3), GRPC_STATUS_UNIMPLEMENTED,
+ "xyz", NULL);
cq_verify(v_client);
cq_expect_finish_accepted(v_server, tag(9), GRPC_OP_OK);
diff --git a/test/core/end2end/tests/request_response_with_metadata_and_payload.c b/test/core/end2end/tests/request_response_with_metadata_and_payload.c
index f828ebb..77e4907 100644
--- a/test/core/end2end/tests/request_response_with_metadata_and_payload.c
+++ b/test/core/end2end/tests/request_response_with_metadata_and_payload.c
@@ -107,7 +107,6 @@
grpc_end2end_test_config config) {
grpc_call *c;
grpc_call *s;
- grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
gpr_slice response_payload_slice = gpr_slice_from_copied_string("hello you");
grpc_byte_buffer *request_payload =
@@ -183,11 +182,12 @@
cq_verify(v_client);
GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c, tag(8)));
- GPR_ASSERT(GRPC_CALL_OK ==
- grpc_call_start_write_status(s, send_status, tag(9)));
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_write_status(
+ s, GRPC_STATUS_UNIMPLEMENTED, "xyz", tag(9)));
cq_expect_finish_accepted(v_client, tag(8), GRPC_OP_OK);
- cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
+ cq_expect_finished_with_status(v_client, tag(3), GRPC_STATUS_UNIMPLEMENTED,
+ "xyz", NULL);
cq_verify(v_client);
cq_expect_finish_accepted(v_server, tag(9), GRPC_OP_OK);
diff --git a/test/core/end2end/tests/request_response_with_payload.c b/test/core/end2end/tests/request_response_with_payload.c
index fb9b59a..deb61a7 100644
--- a/test/core/end2end/tests/request_response_with_payload.c
+++ b/test/core/end2end/tests/request_response_with_payload.c
@@ -105,7 +105,6 @@
static void request_response_with_payload(grpc_end2end_test_fixture f) {
grpc_call *c;
grpc_call *s;
- grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
gpr_slice response_payload_slice = gpr_slice_from_copied_string("hello you");
grpc_byte_buffer *request_payload =
@@ -162,11 +161,12 @@
cq_expect_read(v_client, tag(7), gpr_slice_from_copied_string("hello you"));
GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c, tag(8)));
- GPR_ASSERT(GRPC_CALL_OK ==
- grpc_call_start_write_status(s, send_status, tag(9)));
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_write_status(
+ s, GRPC_STATUS_UNIMPLEMENTED, "xyz", tag(9)));
cq_expect_finish_accepted(v_client, tag(8), GRPC_OP_OK);
- cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
+ cq_expect_finished_with_status(v_client, tag(3), GRPC_STATUS_UNIMPLEMENTED,
+ "xyz", NULL);
cq_verify(v_client);
cq_expect_finish_accepted(v_server, tag(9), GRPC_OP_OK);
diff --git a/test/core/end2end/tests/request_response_with_trailing_metadata_and_payload.c b/test/core/end2end/tests/request_response_with_trailing_metadata_and_payload.c
new file mode 100644
index 0000000..95e2684
--- /dev/null
+++ b/test/core/end2end/tests/request_response_with_trailing_metadata_and_payload.c
@@ -0,0 +1,214 @@
+/*
+ *
+ * Copyright 2014, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "test/core/end2end/end2end_tests.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <grpc/byte_buffer.h>
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+#include <grpc/support/time.h>
+#include <grpc/support/useful.h>
+#include "test/core/end2end/cq_verifier.h"
+
+enum { TIMEOUT = 200000 };
+
+static void *tag(gpr_intptr t) { return (void *)t; }
+
+static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
+ const char *test_name,
+ grpc_channel_args *client_args,
+ grpc_channel_args *server_args) {
+ grpc_end2end_test_fixture f;
+ gpr_log(GPR_INFO, "%s/%s", test_name, config.name);
+ f = config.create_fixture(client_args, server_args);
+ config.init_client(&f, client_args);
+ config.init_server(&f, server_args);
+ return f;
+}
+
+static gpr_timespec n_seconds_time(int n) {
+ return gpr_time_add(gpr_now(), gpr_time_from_micros(GPR_US_PER_SEC * n));
+}
+
+static gpr_timespec five_seconds_time() { return n_seconds_time(5); }
+
+static void drain_cq(grpc_completion_queue *cq) {
+ grpc_event *ev;
+ grpc_completion_type type;
+ do {
+ ev = grpc_completion_queue_next(cq, five_seconds_time());
+ GPR_ASSERT(ev);
+ type = ev->type;
+ grpc_event_finish(ev);
+ } while (type != GRPC_QUEUE_SHUTDOWN);
+}
+
+static void shutdown_server(grpc_end2end_test_fixture *f) {
+ if (!f->server) return;
+ grpc_server_shutdown(f->server);
+ grpc_server_destroy(f->server);
+ f->server = NULL;
+}
+
+static void shutdown_client(grpc_end2end_test_fixture *f) {
+ if (!f->client) return;
+ grpc_channel_destroy(f->client);
+ f->client = NULL;
+}
+
+static void end_test(grpc_end2end_test_fixture *f) {
+ shutdown_server(f);
+ shutdown_client(f);
+
+ grpc_completion_queue_shutdown(f->server_cq);
+ drain_cq(f->server_cq);
+ grpc_completion_queue_destroy(f->server_cq);
+ grpc_completion_queue_shutdown(f->client_cq);
+ drain_cq(f->client_cq);
+ grpc_completion_queue_destroy(f->client_cq);
+}
+
+/* Request/response with metadata and payload.*/
+static void test_request_response_with_metadata_and_payload(
+ grpc_end2end_test_config config) {
+ grpc_call *c;
+ grpc_call *s;
+ gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
+ gpr_slice response_payload_slice = gpr_slice_from_copied_string("hello you");
+ grpc_byte_buffer *request_payload =
+ grpc_byte_buffer_create(&request_payload_slice, 1);
+ grpc_byte_buffer *response_payload =
+ grpc_byte_buffer_create(&response_payload_slice, 1);
+ gpr_timespec deadline = five_seconds_time();
+ grpc_metadata meta1 = {"key1", "val1", 4};
+ grpc_metadata meta2 = {"key2", "val2", 4};
+ grpc_metadata meta3 = {"key3", "val3", 4};
+ grpc_metadata meta4 = {"key4", "val4", 4};
+ grpc_metadata meta5 = {"key5", "val5", 4};
+ grpc_metadata meta6 = {"key6", "val6", 4};
+ grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
+ cq_verifier *v_client = cq_verifier_create(f.client_cq);
+ cq_verifier *v_server = cq_verifier_create(f.server_cq);
+
+ GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(f.server, tag(100)));
+
+ /* byte buffer holds the slice, we can unref it already */
+ gpr_slice_unref(request_payload_slice);
+ gpr_slice_unref(response_payload_slice);
+
+ c = grpc_channel_create_call(f.client, "/foo", "test.google.com", deadline);
+ GPR_ASSERT(c);
+
+ /* add multiple metadata */
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_add_metadata(c, &meta1, 0));
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_add_metadata(c, &meta2, 0));
+
+ GPR_ASSERT(GRPC_CALL_OK ==
+ grpc_call_start_invoke(c, f.client_cq, tag(1), tag(2), tag(3), 0));
+ cq_expect_invoke_accepted(v_client, tag(1), GRPC_OP_OK);
+ cq_verify(v_client);
+
+ GPR_ASSERT(GRPC_CALL_OK ==
+ grpc_call_start_write(c, request_payload, tag(4), 0));
+ /* destroy byte buffer early to ensure async code keeps track of its contents
+ correctly */
+ grpc_byte_buffer_destroy(request_payload);
+ cq_expect_write_accepted(v_client, tag(4), GRPC_OP_OK);
+ cq_verify(v_client);
+
+ cq_expect_server_rpc_new(v_server, &s, tag(100), "/foo", "test.google.com",
+ deadline, "key1", "val1", "key2", "val2", NULL);
+ cq_verify(v_server);
+
+ grpc_call_server_accept(s, f.server_cq, tag(102));
+
+ /* add multiple metadata */
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_add_metadata(s, &meta3, 0));
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_add_metadata(s, &meta4, 0));
+
+ grpc_call_server_end_initial_metadata(s, 0);
+
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_add_metadata(s, &meta5, 0));
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_add_metadata(s, &meta6, 0));
+
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_read(s, tag(5)));
+ cq_expect_read(v_server, tag(5), gpr_slice_from_copied_string("hello world"));
+ cq_verify(v_server);
+
+ GPR_ASSERT(GRPC_CALL_OK ==
+ grpc_call_start_write(s, response_payload, tag(6), 0));
+ /* destroy byte buffer early to ensure async code keeps track of its contents
+ correctly */
+ grpc_byte_buffer_destroy(response_payload);
+ cq_expect_write_accepted(v_server, tag(6), GRPC_OP_OK);
+ cq_verify(v_server);
+
+ /* fetch metadata.. */
+ cq_expect_client_metadata_read(v_client, tag(2), "key3", "val3", "key4",
+ "val4", NULL);
+ cq_verify(v_client);
+
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_read(c, tag(7)));
+ cq_expect_read(v_client, tag(7), gpr_slice_from_copied_string("hello you"));
+ cq_verify(v_client);
+
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c, tag(8)));
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_write_status(
+ s, GRPC_STATUS_UNIMPLEMENTED, "xyz", tag(9)));
+
+ cq_expect_finish_accepted(v_client, tag(8), GRPC_OP_OK);
+ cq_expect_finished_with_status(v_client, tag(3), GRPC_STATUS_UNIMPLEMENTED,
+ "xyz", "key5", "val5", "key6", "val6", NULL);
+ cq_verify(v_client);
+
+ cq_expect_finish_accepted(v_server, tag(9), GRPC_OP_OK);
+ cq_expect_finished(v_server, tag(102), NULL);
+ cq_verify(v_server);
+
+ grpc_call_destroy(c);
+ grpc_call_destroy(s);
+
+ end_test(&f);
+ config.tear_down_data(&f);
+
+ cq_verifier_destroy(v_client);
+ cq_verifier_destroy(v_server);
+}
+
+void grpc_end2end_tests(grpc_end2end_test_config config) {
+ test_request_response_with_metadata_and_payload(config);
+}
diff --git a/test/core/end2end/tests/request_with_large_metadata.c b/test/core/end2end/tests/request_with_large_metadata.c
index ccdee40..26b1656 100644
--- a/test/core/end2end/tests/request_with_large_metadata.c
+++ b/test/core/end2end/tests/request_with_large_metadata.c
@@ -106,7 +106,6 @@
static void test_request_with_large_metadata(grpc_end2end_test_config config) {
grpc_call *c;
grpc_call *s;
- grpc_status send_status = {GRPC_STATUS_OK, NULL};
gpr_timespec deadline = five_seconds_time();
grpc_metadata meta;
grpc_end2end_test_fixture f = begin_test(config, __FUNCTION__, NULL, NULL);
@@ -145,10 +144,10 @@
GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c, tag(8)));
GPR_ASSERT(GRPC_CALL_OK ==
- grpc_call_start_write_status(s, send_status, tag(9)));
+ grpc_call_start_write_status(s, GRPC_STATUS_OK, NULL, tag(9)));
cq_expect_finish_accepted(v_client, tag(8), GRPC_OP_OK);
- cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
+ cq_expect_finished_with_status(v_client, tag(3), GRPC_STATUS_OK, NULL, NULL);
cq_verify(v_client);
cq_expect_finish_accepted(v_server, tag(9), GRPC_OP_OK);
diff --git a/test/core/end2end/tests/request_with_payload.c b/test/core/end2end/tests/request_with_payload.c
index 38a29e3..602ade6 100644
--- a/test/core/end2end/tests/request_with_payload.c
+++ b/test/core/end2end/tests/request_with_payload.c
@@ -106,7 +106,6 @@
static void test_invoke_request_with_payload(grpc_end2end_test_config config) {
grpc_call *c;
grpc_call *s;
- grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
gpr_slice payload_slice = gpr_slice_from_copied_string("hello world");
grpc_byte_buffer *payload = grpc_byte_buffer_create(&payload_slice, 1);
gpr_timespec deadline = five_seconds_time();
@@ -146,10 +145,11 @@
cq_expect_read(v_server, tag(4), gpr_slice_from_copied_string("hello world"));
GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c, tag(5)));
- GPR_ASSERT(GRPC_CALL_OK ==
- grpc_call_start_write_status(s, send_status, tag(6)));
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_write_status(
+ s, GRPC_STATUS_UNIMPLEMENTED, "xyz", tag(6)));
cq_expect_finish_accepted(v_client, tag(5), GRPC_OP_OK);
- cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
+ cq_expect_finished_with_status(v_client, tag(3), GRPC_STATUS_UNIMPLEMENTED,
+ "xyz", NULL);
cq_verify(v_client);
cq_expect_finish_accepted(v_server, tag(6), GRPC_OP_OK);
diff --git a/test/core/end2end/tests/simple_delayed_request.c b/test/core/end2end/tests/simple_delayed_request.c
index dde6eb6..b90316c 100644
--- a/test/core/end2end/tests/simple_delayed_request.c
+++ b/test/core/end2end/tests/simple_delayed_request.c
@@ -97,7 +97,6 @@
long delay_us) {
grpc_call *c;
grpc_call *s;
- grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
gpr_timespec deadline = five_seconds_time();
cq_verifier *v_client = cq_verifier_create(f->client_cq);
cq_verifier *v_server = cq_verifier_create(f->server_cq);
@@ -129,9 +128,10 @@
cq_expect_client_metadata_read(v_client, tag(2), NULL);
cq_verify(v_client);
- GPR_ASSERT(GRPC_CALL_OK ==
- grpc_call_start_write_status(s, send_status, tag(5)));
- cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_write_status(
+ s, GRPC_STATUS_UNIMPLEMENTED, "xyz", tag(5)));
+ cq_expect_finished_with_status(v_client, tag(3), GRPC_STATUS_UNIMPLEMENTED,
+ "xyz", NULL);
cq_verify(v_client);
cq_expect_finish_accepted(v_server, tag(5), GRPC_OP_OK);
diff --git a/test/core/end2end/tests/simple_request.c b/test/core/end2end/tests/simple_request.c
index 15214ff..3511f27 100644
--- a/test/core/end2end/tests/simple_request.c
+++ b/test/core/end2end/tests/simple_request.c
@@ -105,7 +105,6 @@
static void simple_request_body(grpc_end2end_test_fixture f) {
grpc_call *c;
grpc_call *s;
- grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
gpr_timespec deadline = five_seconds_time();
cq_verifier *v_client = cq_verifier_create(f.client_cq);
cq_verifier *v_server = cq_verifier_create(f.server_cq);
@@ -131,9 +130,10 @@
cq_expect_client_metadata_read(v_client, tag(2), NULL);
cq_verify(v_client);
- GPR_ASSERT(GRPC_CALL_OK ==
- grpc_call_start_write_status(s, send_status, tag(5)));
- cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_write_status(
+ s, GRPC_STATUS_UNIMPLEMENTED, "xyz", tag(5)));
+ cq_expect_finished_with_status(v_client, tag(3), GRPC_STATUS_UNIMPLEMENTED,
+ "xyz", NULL);
cq_verify(v_client);
cq_expect_finish_accepted(v_server, tag(5), GRPC_OP_OK);
@@ -152,7 +152,6 @@
static void simple_request_body2(grpc_end2end_test_fixture f) {
grpc_call *c;
grpc_call *s;
- grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
gpr_timespec deadline = five_seconds_time();
cq_verifier *v_client = cq_verifier_create(f.client_cq);
cq_verifier *v_server = cq_verifier_create(f.server_cq);
@@ -176,15 +175,16 @@
GPR_ASSERT(GRPC_CALL_OK == grpc_call_accept(s, f.server_cq, tag(102), 0));
- GPR_ASSERT(GRPC_CALL_OK ==
- grpc_call_start_write_status(s, send_status, tag(5)));
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_write_status(
+ s, GRPC_STATUS_UNIMPLEMENTED, "xyz", tag(5)));
cq_expect_finish_accepted(v_server, tag(5), GRPC_OP_OK);
cq_verify(v_server);
cq_expect_client_metadata_read(v_client, tag(2), NULL);
cq_verify(v_client);
- cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
+ cq_expect_finished_with_status(v_client, tag(3), GRPC_STATUS_UNIMPLEMENTED,
+ "xyz", NULL);
cq_verify(v_client);
cq_expect_finished(v_server, tag(102), NULL);
diff --git a/test/core/end2end/tests/thread_stress.c b/test/core/end2end/tests/thread_stress.c
index 29944d8..4100b0e 100644
--- a/test/core/end2end/tests/thread_stress.c
+++ b/test/core/end2end/tests/thread_stress.c
@@ -187,10 +187,9 @@
}
static void maybe_end_server_call(grpc_call *call, gpr_refcount *rc) {
- grpc_status ok_status = {GRPC_STATUS_OK, NULL};
if (gpr_unref(rc)) {
GPR_ASSERT(GRPC_CALL_OK ==
- grpc_call_start_write_status(call, ok_status, NULL));
+ grpc_call_start_write_status(call, GRPC_STATUS_OK, NULL, NULL));
gpr_free(rc);
}
}
diff --git a/test/core/end2end/tests/writes_done_hangs_with_pending_read.c b/test/core/end2end/tests/writes_done_hangs_with_pending_read.c
index 555d7b9..2241519 100644
--- a/test/core/end2end/tests/writes_done_hangs_with_pending_read.c
+++ b/test/core/end2end/tests/writes_done_hangs_with_pending_read.c
@@ -109,7 +109,6 @@
grpc_end2end_test_config config) {
grpc_call *c;
grpc_call *s;
- grpc_status send_status = {GRPC_STATUS_UNIMPLEMENTED, "xyz"};
gpr_slice request_payload_slice = gpr_slice_from_copied_string("hello world");
gpr_slice response_payload_slice = gpr_slice_from_copied_string("hello you");
grpc_byte_buffer *request_payload =
@@ -163,8 +162,8 @@
cq_verify(v_server);
GPR_ASSERT(GRPC_CALL_OK == grpc_call_writes_done(c, tag(6)));
- GPR_ASSERT(GRPC_CALL_OK ==
- grpc_call_start_write_status(s, send_status, tag(7)));
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_write_status(
+ s, GRPC_STATUS_UNIMPLEMENTED, "xyz", tag(7)));
cq_expect_finish_accepted(v_client, tag(6), GRPC_OP_OK);
cq_verify(v_client);
@@ -176,7 +175,8 @@
cq_expect_read(v_client, tag(8), gpr_slice_from_copied_string("hello you"));
cq_verify(v_client);
- cq_expect_finished_with_status(v_client, tag(3), send_status, NULL);
+ cq_expect_finished_with_status(v_client, tag(3), GRPC_STATUS_UNIMPLEMENTED,
+ "xyz", NULL);
cq_verify(v_client);
cq_expect_finish_accepted(v_server, tag(7), GRPC_OP_OK);
diff --git a/test/core/fling/server.c b/test/core/fling/server.c
index c35bab5..44dc33a 100644
--- a/test/core/fling/server.c
+++ b/test/core/fling/server.c
@@ -52,8 +52,6 @@
static grpc_server *server;
static int got_sigint = 0;
-static const grpc_status status_ok = {GRPC_STATUS_OK, NULL};
-
typedef struct {
gpr_refcount pending_ops;
gpr_uint32 flags;
@@ -149,8 +147,8 @@
GPR_ASSERT(grpc_call_start_write(ev->call, ev->data.read, s,
s->flags) == GRPC_CALL_OK);
} else {
- GPR_ASSERT(grpc_call_start_write_status(ev->call, status_ok, s) ==
- GRPC_CALL_OK);
+ GPR_ASSERT(grpc_call_start_write_status(ev->call, GRPC_STATUS_OK,
+ NULL, s) == GRPC_CALL_OK);
}
break;
case GRPC_FINISH_ACCEPTED: