aboutsummaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/core/bad_client/tests/head_of_line_blocking.c2
-rw-r--r--test/core/bad_client/tests/large_metadata.c4
-rw-r--r--test/core/bad_client/tests/server_registered_method.c4
-rw-r--r--test/core/bad_client/tests/simple_request.c2
-rw-r--r--test/core/bad_ssl/bad_ssl_test.c2
-rw-r--r--test/core/client_channel/lb_policies_test.c6
-rw-r--r--test/core/end2end/bad_server_response_test.c2
-rw-r--r--test/core/end2end/connection_refused_test.c2
-rw-r--r--test/core/end2end/dualstack_socket_test.c4
-rw-r--r--test/core/end2end/fixtures/h2_ssl_cert.c2
-rw-r--r--test/core/end2end/fixtures/http_proxy_fixture.c52
-rw-r--r--test/core/end2end/fixtures/proxy.c4
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer.c2
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-6462055064272896bin0 -> 51 bytes
-rw-r--r--test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-5175380371570688bin0 -> 48 bytes
-rw-r--r--test/core/end2end/fuzzers/client_fuzzer.c2
-rw-r--r--test/core/end2end/fuzzers/server_fuzzer.c2
-rwxr-xr-xtest/core/end2end/gen_build_yaml.py66
-rw-r--r--test/core/end2end/goaway_server_test.c8
-rw-r--r--test/core/end2end/invalid_call_argument_test.c4
-rw-r--r--test/core/end2end/no_server_test.c2
-rw-r--r--test/core/end2end/tests/authority_not_supported.c2
-rw-r--r--test/core/end2end/tests/bad_hostname.c2
-rw-r--r--test/core/end2end/tests/bad_ping.c4
-rw-r--r--test/core/end2end/tests/binary_metadata.c4
-rw-r--r--test/core/end2end/tests/call_creds.c6
-rw-r--r--test/core/end2end/tests/cancel_after_accept.c4
-rw-r--r--test/core/end2end/tests/cancel_after_client_done.c4
-rw-r--r--test/core/end2end/tests/cancel_after_invoke.c11
-rw-r--r--test/core/end2end/tests/cancel_before_invoke.c2
-rw-r--r--test/core/end2end/tests/cancel_in_a_vacuum.c2
-rw-r--r--test/core/end2end/tests/cancel_with_status.c2
-rw-r--r--test/core/end2end/tests/compressed_payload.c8
-rw-r--r--test/core/end2end/tests/default_host.c4
-rw-r--r--test/core/end2end/tests/disappearing_server.c4
-rw-r--r--test/core/end2end/tests/empty_batch.c2
-rw-r--r--test/core/end2end/tests/filter_call_init_fails.c8
-rw-r--r--test/core/end2end/tests/filter_causes_close.c2
-rw-r--r--test/core/end2end/tests/filter_latency.c4
-rw-r--r--test/core/end2end/tests/graceful_server_shutdown.c4
-rw-r--r--test/core/end2end/tests/high_initial_seqno.c4
-rw-r--r--test/core/end2end/tests/hpack_size.c4
-rw-r--r--test/core/end2end/tests/idempotent_request.c4
-rw-r--r--test/core/end2end/tests/invoke_large_request.c4
-rw-r--r--test/core/end2end/tests/keepalive_timeout.c4
-rw-r--r--test/core/end2end/tests/large_metadata.c4
-rw-r--r--test/core/end2end/tests/load_reporting_hook.c4
-rw-r--r--test/core/end2end/tests/max_concurrent_streams.c26
-rw-r--r--test/core/end2end/tests/max_connection_age.c8
-rw-r--r--test/core/end2end/tests/max_connection_idle.c4
-rw-r--r--test/core/end2end/tests/max_message_length.c8
-rw-r--r--test/core/end2end/tests/negative_deadline.c2
-rw-r--r--test/core/end2end/tests/network_status_change.c4
-rw-r--r--test/core/end2end/tests/no_logging.c4
-rw-r--r--test/core/end2end/tests/payload.c4
-rw-r--r--test/core/end2end/tests/ping_pong_streaming.c4
-rw-r--r--test/core/end2end/tests/registered_call.c4
-rw-r--r--test/core/end2end/tests/request_with_flags.c2
-rw-r--r--test/core/end2end/tests/request_with_payload.c4
-rw-r--r--test/core/end2end/tests/resource_quota_server.c12
-rw-r--r--test/core/end2end/tests/server_finishes_request.c4
-rw-r--r--test/core/end2end/tests/shutdown_finishes_calls.c4
-rw-r--r--test/core/end2end/tests/simple_cacheable_request.c4
-rw-r--r--test/core/end2end/tests/simple_delayed_request.c4
-rw-r--r--test/core/end2end/tests/simple_metadata.c4
-rw-r--r--test/core/end2end/tests/simple_request.c4
-rw-r--r--test/core/end2end/tests/streaming_error_response.c4
-rw-r--r--test/core/end2end/tests/trailing_metadata.c4
-rw-r--r--test/core/end2end/tests/write_buffering.c4
-rw-r--r--test/core/end2end/tests/write_buffering_at_end.c4
-rw-r--r--test/core/fling/client.c4
-rw-r--r--test/core/fling/server.c4
-rw-r--r--test/core/memory_usage/client.c4
-rw-r--r--test/core/memory_usage/server.c4
-rw-r--r--test/core/security/BUILD3
-rw-r--r--test/core/slice/BUILD23
-rw-r--r--test/core/slice/slice_buffer_test.c4
-rw-r--r--test/core/slice/slice_hash_table_test.c138
-rw-r--r--test/core/support/memory_test.cc89
-rw-r--r--test/core/support/mpscq_test.c2
-rw-r--r--test/core/support/time_test.c29
-rw-r--r--test/core/surface/lame_client_test.c2
-rw-r--r--test/core/transport/bdp_estimator_test.c15
-rw-r--r--test/core/tsi/transport_security_test.c2
-rw-r--r--test/core/util/passthru_endpoint.c5
-rw-r--r--test/core/util/port_server_client.c4
-rw-r--r--test/core/util/test_config.c10
-rw-r--r--test/core/util/trickle_endpoint.c8
-rw-r--r--test/cpp/codegen/BUILD2
-rw-r--r--test/cpp/codegen/compiler_test_golden144
-rw-r--r--test/cpp/codegen/compiler_test_mock_golden34
-rw-r--r--test/cpp/codegen/golden_file_test.cc31
-rw-r--r--test/cpp/end2end/BUILD1
-rw-r--r--test/cpp/end2end/async_end2end_test.cc28
-rw-r--r--test/cpp/end2end/mock_test.cc278
-rw-r--r--test/cpp/grpclb/grpclb_test.cc6
-rw-r--r--test/cpp/interop/BUILD90
-rw-r--r--test/cpp/interop/http2_client.cc2
-rw-r--r--test/cpp/microbenchmarks/bm_call_create.cc171
-rw-r--r--test/cpp/microbenchmarks/fullstack_fixtures.h26
-rw-r--r--test/cpp/microbenchmarks/helpers.cc4
-rw-r--r--test/cpp/microbenchmarks/helpers.h3
-rw-r--r--test/cpp/thread_manager/thread_manager_test.cc2
-rw-r--r--test/cpp/util/BUILD37
-rwxr-xr-xtest/distrib/cpp/run_distrib_test.sh9
105 files changed, 1238 insertions, 385 deletions
diff --git a/test/core/bad_client/tests/head_of_line_blocking.c b/test/core/bad_client/tests/head_of_line_blocking.c
index 64cb79d82f..b0d788bf22 100644
--- a/test/core/bad_client/tests/head_of_line_blocking.c
+++ b/test/core/bad_client/tests/head_of_line_blocking.c
@@ -103,7 +103,7 @@ static void verifier(grpc_server *server, grpc_completion_queue *cq,
GPR_ASSERT(payload != NULL);
grpc_metadata_array_destroy(&request_metadata_recv);
- grpc_call_destroy(s);
+ grpc_call_unref(s);
grpc_byte_buffer_destroy(payload);
cq_verifier_destroy(cqv);
}
diff --git a/test/core/bad_client/tests/large_metadata.c b/test/core/bad_client/tests/large_metadata.c
index f672776a9f..d7a3ce9461 100644
--- a/test/core/bad_client/tests/large_metadata.c
+++ b/test/core/bad_client/tests/large_metadata.c
@@ -131,7 +131,7 @@ static void server_verifier(grpc_server *server, grpc_completion_queue *cq,
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(s);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
}
@@ -177,7 +177,7 @@ static void server_verifier_sends_too_much_metadata(grpc_server *server,
grpc_slice_unref(meta.value);
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(s);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
}
diff --git a/test/core/bad_client/tests/server_registered_method.c b/test/core/bad_client/tests/server_registered_method.c
index e174af5931..c5af0bae76 100644
--- a/test/core/bad_client/tests/server_registered_method.c
+++ b/test/core/bad_client/tests/server_registered_method.c
@@ -76,7 +76,7 @@ static void verifier_succeeds(grpc_server *server, grpc_completion_queue *cq,
GPR_ASSERT(payload != NULL);
grpc_metadata_array_destroy(&request_metadata_recv);
- grpc_call_destroy(s);
+ grpc_call_unref(s);
grpc_byte_buffer_destroy(payload);
cq_verifier_destroy(cqv);
}
@@ -102,7 +102,7 @@ static void verifier_fails(grpc_server *server, grpc_completion_queue *cq,
GPR_ASSERT(payload == NULL);
grpc_metadata_array_destroy(&request_metadata_recv);
- grpc_call_destroy(s);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
}
diff --git a/test/core/bad_client/tests/simple_request.c b/test/core/bad_client/tests/simple_request.c
index 608b849d41..fb342f0881 100644
--- a/test/core/bad_client/tests/simple_request.c
+++ b/test/core/bad_client/tests/simple_request.c
@@ -122,7 +122,7 @@ static void verifier(grpc_server *server, grpc_completion_queue *cq,
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(s);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
}
diff --git a/test/core/bad_ssl/bad_ssl_test.c b/test/core/bad_ssl/bad_ssl_test.c
index b961ffacd7..ba5b52aa54 100644
--- a/test/core/bad_ssl/bad_ssl_test.c
+++ b/test/core/bad_ssl/bad_ssl_test.c
@@ -115,7 +115,7 @@ static void run_test(const char *target, size_t nops) {
GPR_ASSERT(status != GRPC_STATUS_OK);
- grpc_call_destroy(c);
+ grpc_call_unref(c);
grpc_slice_unref(details);
grpc_metadata_array_destroy(&initial_metadata_recv);
grpc_metadata_array_destroy(&trailing_metadata_recv);
diff --git a/test/core/client_channel/lb_policies_test.c b/test/core/client_channel/lb_policies_test.c
index 3c8e6dd5a2..4492e6f594 100644
--- a/test/core/client_channel/lb_policies_test.c
+++ b/test/core/client_channel/lb_policies_test.c
@@ -394,7 +394,7 @@ static request_sequences perform_request(servers_fixture *f,
"foo.test.google.fr"));
GPR_ASSERT(was_cancelled == 1);
- grpc_call_destroy(f->server_calls[s_idx]);
+ grpc_call_unref(f->server_calls[s_idx]);
/* ask for the next request on this server */
GPR_ASSERT(GRPC_CALL_OK == grpc_server_request_call(
@@ -420,7 +420,7 @@ static request_sequences perform_request(servers_fixture *f,
cq_verifier_destroy(cqv);
- grpc_call_destroy(c);
+ grpc_call_unref(c);
for (i = 0; i < f->num_servers; i++) {
grpc_call_details_destroy(&rdata->call_details[i]);
@@ -616,7 +616,7 @@ static void test_pending_calls(size_t concurrent_calls) {
/* destroy the calls after the channel so that they are still around for the
* LB's shutdown func to process */
for (i = 0; i < concurrent_calls; i++) {
- grpc_call_destroy(calls[i]);
+ grpc_call_unref(calls[i]);
}
gpr_free(calls);
teardown_servers(f);
diff --git a/test/core/end2end/bad_server_response_test.c b/test/core/end2end/bad_server_response_test.c
index 1537caf943..fe7e674d17 100644
--- a/test/core/end2end/bad_server_response_test.c
+++ b/test/core/end2end/bad_server_response_test.c
@@ -236,7 +236,7 @@ static void cleanup_rpc(grpc_exec_ctx *exec_ctx) {
grpc_event ev;
grpc_slice_buffer_destroy_internal(exec_ctx, &state.temp_incoming_buffer);
grpc_slice_buffer_destroy_internal(exec_ctx, &state.outgoing_buffer);
- grpc_call_destroy(state.call);
+ grpc_call_unref(state.call);
grpc_completion_queue_shutdown(state.cq);
do {
ev = grpc_completion_queue_next(state.cq, n_sec_deadline(1), NULL);
diff --git a/test/core/end2end/connection_refused_test.c b/test/core/end2end/connection_refused_test.c
index 7fecadbb86..db7a6c0a8e 100644
--- a/test/core/end2end/connection_refused_test.c
+++ b/test/core/end2end/connection_refused_test.c
@@ -138,7 +138,7 @@ static void run_test(bool wait_for_ready, bool use_service_config) {
.type != GRPC_QUEUE_SHUTDOWN)
;
grpc_completion_queue_destroy(cq);
- grpc_call_destroy(call);
+ grpc_call_unref(call);
grpc_channel_destroy(chan);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/dualstack_socket_test.c b/test/core/end2end/dualstack_socket_test.c
index c61ea6d260..caf7828691 100644
--- a/test/core/end2end/dualstack_socket_test.c
+++ b/test/core/end2end/dualstack_socket_test.c
@@ -243,7 +243,7 @@ void test_connect(const char *server_host, const char *client_host, int port,
grpc_slice_str_cmp(call_details.host, "foo.test.google.fr"));
GPR_ASSERT(was_cancelled == 1);
- grpc_call_destroy(s);
+ grpc_call_unref(s);
} else {
/* Check for a failed connection. */
CQ_EXPECT_COMPLETION(cqv, tag(1), 1);
@@ -252,7 +252,7 @@ void test_connect(const char *server_host, const char *client_host, int port,
GPR_ASSERT(status == GRPC_STATUS_UNAVAILABLE);
}
- grpc_call_destroy(c);
+ grpc_call_unref(c);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/fixtures/h2_ssl_cert.c b/test/core/end2end/fixtures/h2_ssl_cert.c
index 7aa0e16bf6..ba3956e8e3 100644
--- a/test/core/end2end/fixtures/h2_ssl_cert.c
+++ b/test/core/end2end/fixtures/h2_ssl_cert.c
@@ -343,7 +343,7 @@ static void simple_request_body(grpc_end2end_test_fixture f,
CQ_EXPECT_COMPLETION(cqv, tag(1), expected_result == SUCCESS);
cq_verify(cqv);
- grpc_call_destroy(c);
+ grpc_call_unref(c);
cq_verifier_destroy(cqv);
}
diff --git a/test/core/end2end/fixtures/http_proxy_fixture.c b/test/core/end2end/fixtures/http_proxy_fixture.c
index 451ed268d3..f0d09487c6 100644
--- a/test/core/end2end/fixtures/http_proxy_fixture.c
+++ b/test/core/end2end/fixtures/http_proxy_fixture.c
@@ -59,6 +59,7 @@
#include "src/core/lib/iomgr/sockaddr_utils.h"
#include "src/core/lib/iomgr/tcp_client.h"
#include "src/core/lib/iomgr/tcp_server.h"
+#include "src/core/lib/iomgr/timer.h"
#include "src/core/lib/slice/slice_internal.h"
#include "test/core/util/port.h"
@@ -69,7 +70,7 @@ struct grpc_end2end_http_proxy {
grpc_channel_args* channel_args;
gpr_mu* mu;
grpc_pollset* pollset;
- gpr_atm shutdown;
+ gpr_refcount users;
};
//
@@ -77,6 +78,8 @@ struct grpc_end2end_http_proxy {
//
typedef struct proxy_connection {
+ grpc_end2end_http_proxy* proxy;
+
grpc_endpoint* client_endpoint;
grpc_endpoint* server_endpoint;
@@ -103,13 +106,20 @@ typedef struct proxy_connection {
grpc_http_request http_request;
} proxy_connection;
+static void proxy_connection_ref(proxy_connection* conn, const char* reason) {
+ gpr_ref(&conn->refcount);
+}
+
// Helper function to destroy the proxy connection.
static void proxy_connection_unref(grpc_exec_ctx* exec_ctx,
- proxy_connection* conn) {
+ proxy_connection* conn, const char* reason) {
if (gpr_unref(&conn->refcount)) {
+ gpr_log(GPR_DEBUG, "endpoints: %p %p", conn->client_endpoint,
+ conn->server_endpoint);
grpc_endpoint_destroy(exec_ctx, conn->client_endpoint);
- if (conn->server_endpoint != NULL)
+ if (conn->server_endpoint != NULL) {
grpc_endpoint_destroy(exec_ctx, conn->server_endpoint);
+ }
grpc_pollset_set_destroy(exec_ctx, conn->pollset_set);
grpc_slice_buffer_destroy_internal(exec_ctx, &conn->client_read_buffer);
grpc_slice_buffer_destroy_internal(exec_ctx,
@@ -121,6 +131,7 @@ static void proxy_connection_unref(grpc_exec_ctx* exec_ctx,
grpc_slice_buffer_destroy_internal(exec_ctx, &conn->server_write_buffer);
grpc_http_parser_destroy(&conn->http_parser);
grpc_http_request_destroy(&conn->http_request);
+ gpr_unref(&conn->proxy->users);
gpr_free(conn);
}
}
@@ -139,7 +150,7 @@ static void proxy_connection_failed(grpc_exec_ctx* exec_ctx,
grpc_endpoint_shutdown(exec_ctx, conn->server_endpoint,
GRPC_ERROR_REF(error));
}
- proxy_connection_unref(exec_ctx, conn);
+ proxy_connection_unref(exec_ctx, conn, "conn_failed");
}
// Callback for writing proxy data to the client.
@@ -163,7 +174,7 @@ static void on_client_write_done(grpc_exec_ctx* exec_ctx, void* arg,
&conn->on_client_write_done);
} else {
// No more writes. Unref the connection.
- proxy_connection_unref(exec_ctx, conn);
+ proxy_connection_unref(exec_ctx, conn, "write_done");
}
}
@@ -188,7 +199,7 @@ static void on_server_write_done(grpc_exec_ctx* exec_ctx, void* arg,
&conn->on_server_write_done);
} else {
// No more writes. Unref the connection.
- proxy_connection_unref(exec_ctx, conn);
+ proxy_connection_unref(exec_ctx, conn, "server_write");
}
}
@@ -214,7 +225,7 @@ static void on_client_read_done(grpc_exec_ctx* exec_ctx, void* arg,
} else {
grpc_slice_buffer_move_into(&conn->client_read_buffer,
&conn->server_write_buffer);
- gpr_ref(&conn->refcount);
+ proxy_connection_ref(conn, "client_read");
grpc_endpoint_write(exec_ctx, conn->server_endpoint,
&conn->server_write_buffer,
&conn->on_server_write_done);
@@ -246,7 +257,7 @@ static void on_server_read_done(grpc_exec_ctx* exec_ctx, void* arg,
} else {
grpc_slice_buffer_move_into(&conn->server_read_buffer,
&conn->client_write_buffer);
- gpr_ref(&conn->refcount);
+ proxy_connection_ref(conn, "server_read");
grpc_endpoint_write(exec_ctx, conn->client_endpoint,
&conn->client_write_buffer,
&conn->on_client_write_done);
@@ -270,7 +281,9 @@ static void on_write_response_done(grpc_exec_ctx* exec_ctx, void* arg,
// Start reading from both client and server. One of the read
// requests inherits our ref to conn, but we need to take a new ref
// for the other one.
- gpr_ref(&conn->refcount);
+ proxy_connection_ref(conn, "client_read");
+ proxy_connection_ref(conn, "server_read");
+ proxy_connection_unref(exec_ctx, conn, "write_response");
grpc_endpoint_read(exec_ctx, conn->client_endpoint, &conn->client_read_buffer,
&conn->on_client_read_done);
grpc_endpoint_read(exec_ctx, conn->server_endpoint, &conn->server_read_buffer,
@@ -312,6 +325,8 @@ static void on_server_connect_done(grpc_exec_ctx* exec_ctx, void* arg,
static void on_read_request_done(grpc_exec_ctx* exec_ctx, void* arg,
grpc_error* error) {
proxy_connection* conn = arg;
+ gpr_log(GPR_DEBUG, "on_read_request_done: %p %s", conn,
+ grpc_error_string(error));
if (error != GRPC_ERROR_NONE) {
proxy_connection_failed(exec_ctx, conn, true /* is_client */,
"HTTP proxy read request", error);
@@ -376,12 +391,14 @@ static void on_accept(grpc_exec_ctx* exec_ctx, void* arg,
gpr_free(acceptor);
grpc_end2end_http_proxy* proxy = arg;
// Instantiate proxy_connection.
- proxy_connection* conn = gpr_malloc(sizeof(*conn));
- memset(conn, 0, sizeof(*conn));
+ proxy_connection* conn = gpr_zalloc(sizeof(*conn));
+ gpr_ref(&proxy->users);
conn->client_endpoint = endpoint;
+ conn->proxy = proxy;
gpr_ref_init(&conn->refcount, 1);
conn->pollset_set = grpc_pollset_set_create();
grpc_pollset_set_add_pollset(exec_ctx, conn->pollset_set, proxy->pollset);
+ grpc_endpoint_add_to_pollset_set(exec_ctx, endpoint, conn->pollset_set);
grpc_closure_init(&conn->on_read_request_done, on_read_request_done, conn,
grpc_schedule_on_exec_ctx);
grpc_closure_init(&conn->on_server_connect_done, on_server_connect_done, conn,
@@ -416,6 +433,7 @@ static void thread_main(void* arg) {
grpc_end2end_http_proxy* proxy = arg;
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
do {
+ gpr_ref(&proxy->users);
const gpr_timespec now = gpr_now(GPR_CLOCK_MONOTONIC);
const gpr_timespec deadline =
gpr_time_add(now, gpr_time_from_seconds(1, GPR_TIMESPAN));
@@ -426,7 +444,7 @@ static void thread_main(void* arg) {
grpc_pollset_work(&exec_ctx, proxy->pollset, &worker, now, deadline));
gpr_mu_unlock(proxy->mu);
grpc_exec_ctx_flush(&exec_ctx);
- } while (!gpr_atm_acq_load(&proxy->shutdown));
+ } while (!gpr_unref(&proxy->users));
grpc_exec_ctx_finish(&exec_ctx);
}
@@ -434,6 +452,7 @@ grpc_end2end_http_proxy* grpc_end2end_http_proxy_create(void) {
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
grpc_end2end_http_proxy* proxy = gpr_malloc(sizeof(*proxy));
memset(proxy, 0, sizeof(*proxy));
+ gpr_ref_init(&proxy->users, 1);
// Construct proxy address.
const int proxy_port = grpc_pick_unused_port_or_die();
gpr_join_host_port(&proxy->proxy_name, "localhost", proxy_port);
@@ -474,17 +493,16 @@ static void destroy_pollset(grpc_exec_ctx* exec_ctx, void* arg,
}
void grpc_end2end_http_proxy_destroy(grpc_end2end_http_proxy* proxy) {
- gpr_atm_rel_store(&proxy->shutdown, 1); // Signal proxy thread to shutdown.
+ gpr_unref(&proxy->users); // Signal proxy thread to shutdown.
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
gpr_thd_join(proxy->thd);
grpc_tcp_server_shutdown_listeners(&exec_ctx, proxy->server);
grpc_tcp_server_unref(&exec_ctx, proxy->server);
gpr_free(proxy->proxy_name);
grpc_channel_args_destroy(&exec_ctx, proxy->channel_args);
- grpc_closure destroyed;
- grpc_closure_init(&destroyed, destroy_pollset, proxy->pollset,
- grpc_schedule_on_exec_ctx);
- grpc_pollset_shutdown(&exec_ctx, proxy->pollset, &destroyed);
+ grpc_pollset_shutdown(&exec_ctx, proxy->pollset,
+ grpc_closure_create(destroy_pollset, proxy->pollset,
+ grpc_schedule_on_exec_ctx));
gpr_free(proxy);
grpc_exec_ctx_finish(&exec_ctx);
}
diff --git a/test/core/end2end/fixtures/proxy.c b/test/core/end2end/fixtures/proxy.c
index b8b1e5c6c9..d660073ce6 100644
--- a/test/core/end2end/fixtures/proxy.c
+++ b/test/core/end2end/fixtures/proxy.c
@@ -148,8 +148,8 @@ void grpc_end2end_proxy_destroy(grpc_end2end_proxy *proxy) {
static void unrefpc(proxy_call *pc, const char *reason) {
if (gpr_unref(&pc->refs)) {
- grpc_call_destroy(pc->c2p);
- grpc_call_destroy(pc->p2s);
+ grpc_call_unref(pc->c2p);
+ grpc_call_unref(pc->p2s);
grpc_metadata_array_destroy(&pc->c2p_initial_metadata);
grpc_metadata_array_destroy(&pc->p2s_initial_metadata);
grpc_metadata_array_destroy(&pc->p2s_trailing_metadata);
diff --git a/test/core/end2end/fuzzers/api_fuzzer.c b/test/core/end2end/fuzzers/api_fuzzer.c
index 83c82ba5c0..88a0e301da 100644
--- a/test/core/end2end/fuzzers/api_fuzzer.c
+++ b/test/core/end2end/fuzzers/api_fuzzer.c
@@ -661,7 +661,7 @@ static void read_metadata(input_stream *inp, size_t *count,
}
static call_state *destroy_call(call_state *call) {
- grpc_call_destroy(call->call);
+ grpc_call_unref(call->call);
call->call = NULL;
return maybe_delete_call_state(call);
}
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-6462055064272896 b/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-6462055064272896
new file mode 100644
index 0000000000..c121283242
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-6462055064272896
Binary files differ
diff --git a/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-5175380371570688 b/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-5175380371570688
new file mode 100644
index 0000000000..9c7aebc63a
--- /dev/null
+++ b/test/core/end2end/fuzzers/api_fuzzer_corpus/clusterfuzz-testcase-minimized-5175380371570688
Binary files differ
diff --git a/test/core/end2end/fuzzers/client_fuzzer.c b/test/core/end2end/fuzzers/client_fuzzer.c
index bc322e45a3..6f49baffd2 100644
--- a/test/core/end2end/fuzzers/client_fuzzer.c
+++ b/test/core/end2end/fuzzers/client_fuzzer.c
@@ -151,7 +151,7 @@ done:
ev = grpc_completion_queue_next(cq, gpr_inf_past(GPR_CLOCK_REALTIME), NULL);
GPR_ASSERT(ev.type == GRPC_QUEUE_SHUTDOWN);
}
- grpc_call_destroy(call);
+ grpc_call_unref(call);
grpc_completion_queue_destroy(cq);
grpc_metadata_array_destroy(&initial_metadata_recv);
grpc_metadata_array_destroy(&trailing_metadata_recv);
diff --git a/test/core/end2end/fuzzers/server_fuzzer.c b/test/core/end2end/fuzzers/server_fuzzer.c
index 97b436cdf9..6d65fe1847 100644
--- a/test/core/end2end/fuzzers/server_fuzzer.c
+++ b/test/core/end2end/fuzzers/server_fuzzer.c
@@ -109,7 +109,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
}
done:
- if (call1 != NULL) grpc_call_destroy(call1);
+ if (call1 != NULL) grpc_call_unref(call1);
grpc_call_details_destroy(&call_details1);
grpc_metadata_array_destroy(&request_metadata1);
grpc_server_shutdown_and_notify(server, cq, tag(0xdead));
diff --git a/test/core/end2end/gen_build_yaml.py b/test/core/end2end/gen_build_yaml.py
index d1e510d636..48e5720539 100755
--- a/test/core/end2end/gen_build_yaml.py
+++ b/test/core/end2end/gen_build_yaml.py
@@ -39,9 +39,9 @@ import hashlib
FixtureOptions = collections.namedtuple(
'FixtureOptions',
- 'fullstack includes_proxy dns_resolver secure platforms ci_mac tracing exclude_configs exclude_iomgrs large_writes')
+ 'fullstack includes_proxy dns_resolver secure platforms ci_mac tracing exclude_configs exclude_iomgrs large_writes enables_compression')
default_unsecure_fixture_options = FixtureOptions(
- True, False, True, False, ['windows', 'linux', 'mac', 'posix'], True, False, [], [], True)
+ True, False, True, False, ['windows', 'linux', 'mac', 'posix'], True, False, [], [], True, False)
socketpair_unsecure_fixture_options = default_unsecure_fixture_options._replace(fullstack=False, dns_resolver=False)
default_secure_fixture_options = default_unsecure_fixture_options._replace(secure=True)
uds_fixture_options = default_unsecure_fixture_options._replace(dns_resolver=False, platforms=['linux', 'mac', 'posix'], exclude_iomgrs=['uv'])
@@ -51,8 +51,7 @@ fd_unsecure_fixture_options = default_unsecure_fixture_options._replace(
# maps fixture name to whether it requires the security library
END2END_FIXTURES = {
- 'h2_compress': default_unsecure_fixture_options,
-
+ 'h2_compress': default_unsecure_fixture_options._replace(enables_compression=True),
'h2_census': default_unsecure_fixture_options,
'h2_load_reporting': default_unsecure_fixture_options,
'h2_fakesec': default_secure_fixture_options._replace(ci_mac=False),
@@ -83,8 +82,8 @@ END2END_FIXTURES = {
TestOptions = collections.namedtuple(
'TestOptions',
- 'needs_fullstack needs_dns proxyable secure traceable cpu_cost exclude_iomgrs large_writes flaky')
-default_test_options = TestOptions(False, False, True, False, True, 1.0, [], False, False)
+ 'needs_fullstack needs_dns proxyable secure traceable cpu_cost exclude_iomgrs large_writes flaky allow_compression')
+default_test_options = TestOptions(False, False, True, False, True, 1.0, [], False, False, True)
connectivity_test_options = default_test_options._replace(needs_fullstack=True)
LOWCPU = 0.1
@@ -94,12 +93,13 @@ END2END_TESTS = {
'authority_not_supported': default_test_options,
'bad_hostname': default_test_options,
'bad_ping': connectivity_test_options._replace(proxyable=False),
- 'binary_metadata': default_test_options,
+ 'binary_metadata': default_test_options._replace(cpu_cost=LOWCPU),
'resource_quota_server': default_test_options._replace(large_writes=True,
- proxyable=False),
+ proxyable=False,
+ allow_compression=False),
'call_creds': default_test_options._replace(secure=True),
'cancel_after_accept': default_test_options._replace(cpu_cost=LOWCPU),
- 'cancel_after_client_done': default_test_options,
+ 'cancel_after_client_done': default_test_options._replace(cpu_cost=LOWCPU),
'cancel_after_invoke': default_test_options._replace(cpu_cost=LOWCPU),
'cancel_before_invoke': default_test_options._replace(cpu_cost=LOWCPU),
'cancel_in_a_vacuum': default_test_options._replace(cpu_cost=LOWCPU),
@@ -110,46 +110,49 @@ END2END_TESTS = {
'default_host': default_test_options._replace(needs_fullstack=True,
needs_dns=True),
'disappearing_server': connectivity_test_options._replace(flaky=True),
- 'empty_batch': default_test_options,
- 'filter_causes_close': default_test_options,
+ 'empty_batch': default_test_options._replace(cpu_cost=LOWCPU),
+ 'filter_causes_close': default_test_options._replace(cpu_cost=LOWCPU),
'filter_call_init_fails': default_test_options,
- 'filter_latency': default_test_options,
+ 'filter_latency': default_test_options._replace(cpu_cost=LOWCPU),
'graceful_server_shutdown': default_test_options._replace(cpu_cost=LOWCPU),
'hpack_size': default_test_options._replace(proxyable=False,
- traceable=False),
- 'high_initial_seqno': default_test_options,
+ traceable=False,
+ cpu_cost=LOWCPU),
+ 'high_initial_seqno': default_test_options._replace(cpu_cost=LOWCPU),
'idempotent_request': default_test_options,
'invoke_large_request': default_test_options,
- 'keepalive_timeout': default_test_options._replace(proxyable=False),
+ 'keepalive_timeout': default_test_options._replace(proxyable=False,
+ cpu_cost=LOWCPU),
'large_metadata': default_test_options,
- 'max_concurrent_streams': default_test_options._replace(proxyable=False),
- 'max_connection_age': default_test_options,
+ 'max_concurrent_streams': default_test_options._replace(
+ proxyable=False, cpu_cost=LOWCPU),
+ 'max_connection_age': default_test_options._replace(cpu_cost=LOWCPU),
'max_connection_idle': connectivity_test_options._replace(
- proxyable=False, exclude_iomgrs=['uv']),
- 'max_message_length': default_test_options,
+ proxyable=False, exclude_iomgrs=['uv'], cpu_cost=LOWCPU),
+ 'max_message_length': default_test_options._replace(cpu_cost=LOWCPU),
'negative_deadline': default_test_options,
- 'network_status_change': default_test_options,
+ 'network_status_change': default_test_options._replace(cpu_cost=LOWCPU),
'no_logging': default_test_options._replace(traceable=False),
'no_op': default_test_options,
'payload': default_test_options,
'load_reporting_hook': default_test_options,
- 'ping_pong_streaming': default_test_options,
- 'ping': connectivity_test_options._replace(proxyable=False),
+ 'ping_pong_streaming': default_test_options._replace(cpu_cost=LOWCPU),
+ 'ping': connectivity_test_options._replace(proxyable=False, cpu_cost=LOWCPU),
'registered_call': default_test_options,
'request_with_flags': default_test_options._replace(
proxyable=False, cpu_cost=LOWCPU),
- 'request_with_payload': default_test_options,
- 'server_finishes_request': default_test_options,
- 'shutdown_finishes_calls': default_test_options,
- 'shutdown_finishes_tags': default_test_options,
- 'simple_cacheable_request': default_test_options,
+ 'request_with_payload': default_test_options._replace(cpu_cost=LOWCPU),
+ 'server_finishes_request': default_test_options._replace(cpu_cost=LOWCPU),
+ 'shutdown_finishes_calls': default_test_options._replace(cpu_cost=LOWCPU),
+ 'shutdown_finishes_tags': default_test_options._replace(cpu_cost=LOWCPU),
+ 'simple_cacheable_request': default_test_options._replace(cpu_cost=LOWCPU),
'simple_delayed_request': connectivity_test_options,
'simple_metadata': default_test_options,
'simple_request': default_test_options,
- 'streaming_error_response': default_test_options,
+ 'streaming_error_response': default_test_options._replace(cpu_cost=LOWCPU),
'trailing_metadata': default_test_options,
- 'write_buffering': default_test_options,
- 'write_buffering_at_end': default_test_options,
+ 'write_buffering': default_test_options._replace(cpu_cost=LOWCPU),
+ 'write_buffering_at_end': default_test_options._replace(cpu_cost=LOWCPU),
}
@@ -169,6 +172,9 @@ def compatible(f, t):
if END2END_TESTS[t].large_writes:
if not END2END_FIXTURES[f].large_writes:
return False
+ if not END2END_TESTS[t].allow_compression:
+ if END2END_FIXTURES[f].enables_compression:
+ return False
return True
diff --git a/test/core/end2end/goaway_server_test.c b/test/core/end2end/goaway_server_test.c
index a028fb7f5c..ababdb70a8 100644
--- a/test/core/end2end/goaway_server_test.c
+++ b/test/core/end2end/goaway_server_test.c
@@ -302,10 +302,10 @@ int main(int argc, char **argv) {
CQ_EXPECT_COMPLETION(cqv, tag(0xdead2), 1);
cq_verify(cqv);
- grpc_call_destroy(call1);
- grpc_call_destroy(call2);
- grpc_call_destroy(server_call1);
- grpc_call_destroy(server_call2);
+ grpc_call_unref(call1);
+ grpc_call_unref(call2);
+ grpc_call_unref(server_call1);
+ grpc_call_unref(server_call2);
grpc_server_destroy(server1);
grpc_server_destroy(server2);
grpc_channel_destroy(chan);
diff --git a/test/core/end2end/invalid_call_argument_test.c b/test/core/end2end/invalid_call_argument_test.c
index e89e59767f..e9a31f278c 100644
--- a/test/core/end2end/invalid_call_argument_test.c
+++ b/test/core/end2end/invalid_call_argument_test.c
@@ -126,7 +126,7 @@ static void prepare_test(int is_client) {
static void cleanup_test() {
grpc_completion_queue *shutdown_cq;
- grpc_call_destroy(g_state.call);
+ grpc_call_unref(g_state.call);
cq_verifier_destroy(g_state.cqv);
grpc_channel_destroy(g_state.chan);
grpc_slice_unref(g_state.details);
@@ -135,7 +135,7 @@ static void cleanup_test() {
if (!g_state.is_client) {
shutdown_cq = grpc_completion_queue_create_for_pluck(NULL);
- grpc_call_destroy(g_state.server_call);
+ grpc_call_unref(g_state.server_call);
grpc_server_shutdown_and_notify(g_state.server, shutdown_cq, tag(1000));
GPR_ASSERT(grpc_completion_queue_pluck(shutdown_cq, tag(1000),
grpc_timeout_seconds_to_deadline(5),
diff --git a/test/core/end2end/no_server_test.c b/test/core/end2end/no_server_test.c
index dd18b0c692..a479d5c868 100644
--- a/test/core/end2end/no_server_test.c
+++ b/test/core/end2end/no_server_test.c
@@ -97,7 +97,7 @@ int main(int argc, char **argv) {
.type != GRPC_QUEUE_SHUTDOWN)
;
grpc_completion_queue_destroy(cq);
- grpc_call_destroy(call);
+ grpc_call_unref(call);
grpc_channel_destroy(chan);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/authority_not_supported.c b/test/core/end2end/tests/authority_not_supported.c
index f9298f1fa7..13cda08617 100644
--- a/test/core/end2end/tests/authority_not_supported.c
+++ b/test/core/end2end/tests/authority_not_supported.c
@@ -182,7 +182,7 @@ static void test_with_authority_header(grpc_end2end_test_config config) {
grpc_metadata_array_destroy(&initial_metadata_recv);
grpc_metadata_array_destroy(&trailing_metadata_recv);
- grpc_call_destroy(c);
+ grpc_call_unref(c);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/bad_hostname.c b/test/core/end2end/tests/bad_hostname.c
index 72a44d0de5..35a531cf78 100644
--- a/test/core/end2end/tests/bad_hostname.c
+++ b/test/core/end2end/tests/bad_hostname.c
@@ -163,7 +163,7 @@ static void simple_request_body(grpc_end2end_test_fixture f) {
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
+ grpc_call_unref(c);
cq_verifier_destroy(cqv);
}
diff --git a/test/core/end2end/tests/bad_ping.c b/test/core/end2end/tests/bad_ping.c
index 38cd1dfa84..0928ba60cf 100644
--- a/test/core/end2end/tests/bad_ping.c
+++ b/test/core/end2end/tests/bad_ping.c
@@ -208,7 +208,7 @@ static void test_bad_ping(grpc_end2end_test_config config) {
CQ_EXPECT_COMPLETION(cqv, tag(0xdead), 1);
cq_verify(cqv);
- grpc_call_destroy(s);
+ grpc_call_unref(s);
// The connection should be closed immediately after the misbehaved pings,
// the in-progress RPC should fail.
@@ -224,7 +224,7 @@ static void test_bad_ping(grpc_end2end_test_config config) {
grpc_metadata_array_destroy(&trailing_metadata_recv);
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
+ grpc_call_unref(c);
cq_verifier_destroy(cqv);
end_test(&f);
config.tear_down_data(&f);
diff --git a/test/core/end2end/tests/binary_metadata.c b/test/core/end2end/tests/binary_metadata.c
index 2bddd053d6..3d36849400 100644
--- a/test/core/end2end/tests/binary_metadata.c
+++ b/test/core/end2end/tests/binary_metadata.c
@@ -314,8 +314,8 @@ static void test_request_response_with_metadata_and_payload(
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/call_creds.c b/test/core/end2end/tests/call_creds.c
index 9ec9701f9c..bc430e56b3 100644
--- a/test/core/end2end/tests/call_creds.c
+++ b/test/core/end2end/tests/call_creds.c
@@ -347,8 +347,8 @@ static void request_response_with_payload_and_call_creds(
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
@@ -473,7 +473,7 @@ static void test_request_with_server_rejecting_client_creds(
grpc_byte_buffer_destroy(response_payload_recv);
grpc_slice_unref(details);
- grpc_call_destroy(c);
+ grpc_call_unref(c);
cq_verifier_destroy(cqv);
end_test(&f);
diff --git a/test/core/end2end/tests/cancel_after_accept.c b/test/core/end2end/tests/cancel_after_accept.c
index 7946865a83..e6bcd9d6a3 100644
--- a/test/core/end2end/tests/cancel_after_accept.c
+++ b/test/core/end2end/tests/cancel_after_accept.c
@@ -252,8 +252,8 @@ static void test_cancel_after_accept(grpc_end2end_test_config config,
grpc_byte_buffer_destroy(response_payload_recv);
grpc_slice_unref(details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
if (args != NULL) {
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
diff --git a/test/core/end2end/tests/cancel_after_client_done.c b/test/core/end2end/tests/cancel_after_client_done.c
index 7089f3f557..d0e68354d9 100644
--- a/test/core/end2end/tests/cancel_after_client_done.c
+++ b/test/core/end2end/tests/cancel_after_client_done.c
@@ -229,8 +229,8 @@ static void test_cancel_after_accept_and_writes_closed(
grpc_byte_buffer_destroy(response_payload_recv);
grpc_slice_unref(details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
end_test(&f);
diff --git a/test/core/end2end/tests/cancel_after_invoke.c b/test/core/end2end/tests/cancel_after_invoke.c
index f29012b86d..5bc9ed283b 100644
--- a/test/core/end2end/tests/cancel_after_invoke.c
+++ b/test/core/end2end/tests/cancel_after_invoke.c
@@ -49,11 +49,12 @@ static void *tag(intptr_t t) { return (void *)t; }
static grpc_end2end_test_fixture begin_test(grpc_end2end_test_config config,
const char *test_name,
cancellation_mode mode,
+ size_t test_ops,
grpc_channel_args *client_args,
grpc_channel_args *server_args) {
grpc_end2end_test_fixture f;
- gpr_log(GPR_INFO, "Running test: %s/%s/%s", test_name, config.name,
- mode.name);
+ gpr_log(GPR_INFO, "Running test: %s/%s/%s [%" PRIdPTR " ops]", test_name,
+ config.name, mode.name, test_ops);
f = config.create_fixture(client_args, server_args);
config.init_server(&f, server_args);
config.init_client(&f, client_args);
@@ -108,8 +109,8 @@ static void test_cancel_after_invoke(grpc_end2end_test_config config,
grpc_op ops[6];
grpc_op *op;
grpc_call *c;
- grpc_end2end_test_fixture f =
- begin_test(config, "test_cancel_after_invoke", mode, NULL, NULL);
+ grpc_end2end_test_fixture f = begin_test(config, "test_cancel_after_invoke",
+ mode, test_ops, NULL, NULL);
cq_verifier *cqv = cq_verifier_create(f.cq);
grpc_metadata_array initial_metadata_recv;
grpc_metadata_array trailing_metadata_recv;
@@ -189,7 +190,7 @@ static void test_cancel_after_invoke(grpc_end2end_test_config config,
grpc_byte_buffer_destroy(response_payload_recv);
grpc_slice_unref(details);
- grpc_call_destroy(c);
+ grpc_call_unref(c);
cq_verifier_destroy(cqv);
end_test(&f);
diff --git a/test/core/end2end/tests/cancel_before_invoke.c b/test/core/end2end/tests/cancel_before_invoke.c
index 1b1296dc2a..67d2e9b8ab 100644
--- a/test/core/end2end/tests/cancel_before_invoke.c
+++ b/test/core/end2end/tests/cancel_before_invoke.c
@@ -186,7 +186,7 @@ static void test_cancel_before_invoke(grpc_end2end_test_config config,
grpc_byte_buffer_destroy(response_payload_recv);
grpc_slice_unref(details);
- grpc_call_destroy(c);
+ grpc_call_unref(c);
cq_verifier_destroy(cqv);
end_test(&f);
diff --git a/test/core/end2end/tests/cancel_in_a_vacuum.c b/test/core/end2end/tests/cancel_in_a_vacuum.c
index 4f5e496432..1235cef2dc 100644
--- a/test/core/end2end/tests/cancel_in_a_vacuum.c
+++ b/test/core/end2end/tests/cancel_in_a_vacuum.c
@@ -118,7 +118,7 @@ static void test_cancel_in_a_vacuum(grpc_end2end_test_config config,
GPR_ASSERT(GRPC_CALL_OK == mode.initiate_cancel(c, NULL));
- grpc_call_destroy(c);
+ grpc_call_unref(c);
cq_verifier_destroy(v_client);
end_test(&f);
diff --git a/test/core/end2end/tests/cancel_with_status.c b/test/core/end2end/tests/cancel_with_status.c
index 180748c2ae..e8259f99f1 100644
--- a/test/core/end2end/tests/cancel_with_status.c
+++ b/test/core/end2end/tests/cancel_with_status.c
@@ -165,7 +165,7 @@ static void simple_request_body(grpc_end2end_test_config config,
grpc_metadata_array_destroy(&initial_metadata_recv);
grpc_metadata_array_destroy(&trailing_metadata_recv);
- grpc_call_destroy(c);
+ grpc_call_unref(c);
cq_verifier_destroy(cqv);
}
diff --git a/test/core/end2end/tests/compressed_payload.c b/test/core/end2end/tests/compressed_payload.c
index 1671ce5564..1fe8613adb 100644
--- a/test/core/end2end/tests/compressed_payload.c
+++ b/test/core/end2end/tests/compressed_payload.c
@@ -261,8 +261,8 @@ static void request_for_disabled_algorithm(
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
@@ -519,8 +519,8 @@ static void request_with_payload_template(
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/default_host.c b/test/core/end2end/tests/default_host.c
index c0ae50ec62..efd2682932 100644
--- a/test/core/end2end/tests/default_host.c
+++ b/test/core/end2end/tests/default_host.c
@@ -214,8 +214,8 @@ static void simple_request_body(grpc_end2end_test_fixture f) {
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
}
diff --git a/test/core/end2end/tests/disappearing_server.c b/test/core/end2end/tests/disappearing_server.c
index 22492c0bfc..23016f9ee5 100644
--- a/test/core/end2end/tests/disappearing_server.c
+++ b/test/core/end2end/tests/disappearing_server.c
@@ -191,8 +191,8 @@ static void do_request_and_shutdown_server(grpc_end2end_test_config config,
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
}
static void disappearing_server_test(grpc_end2end_test_config config) {
diff --git a/test/core/end2end/tests/empty_batch.c b/test/core/end2end/tests/empty_batch.c
index fe57a6e514..d0971367a6 100644
--- a/test/core/end2end/tests/empty_batch.c
+++ b/test/core/end2end/tests/empty_batch.c
@@ -121,7 +121,7 @@ static void empty_batch_body(grpc_end2end_test_config config,
CQ_EXPECT_COMPLETION(cqv, tag(1), 1);
cq_verify(cqv);
- grpc_call_destroy(c);
+ grpc_call_unref(c);
cq_verifier_destroy(cqv);
}
diff --git a/test/core/end2end/tests/filter_call_init_fails.c b/test/core/end2end/tests/filter_call_init_fails.c
index 8d654d7587..3402584fd9 100644
--- a/test/core/end2end/tests/filter_call_init_fails.c
+++ b/test/core/end2end/tests/filter_call_init_fails.c
@@ -194,7 +194,7 @@ static void test_server_channel_filter(grpc_end2end_test_config config) {
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
+ grpc_call_unref(c);
cq_verifier_destroy(cqv);
@@ -284,7 +284,7 @@ static void test_client_channel_filter(grpc_end2end_test_config config) {
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
+ grpc_call_unref(c);
cq_verifier_destroy(cqv);
@@ -372,7 +372,7 @@ static void test_client_subchannel_filter(grpc_end2end_test_config config) {
// Reset and create a new call. (The first call uses a different code
// path in client_channel.c than subsequent calls on the same channel,
// and we need to test both.)
- grpc_call_destroy(c);
+ grpc_call_unref(c);
status = GRPC_STATUS_OK;
grpc_slice_unref(details);
details = grpc_empty_slice();
@@ -399,7 +399,7 @@ static void test_client_subchannel_filter(grpc_end2end_test_config config) {
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
+ grpc_call_unref(c);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/filter_causes_close.c b/test/core/end2end/tests/filter_causes_close.c
index decfff3429..ede8fb49df 100644
--- a/test/core/end2end/tests/filter_causes_close.c
+++ b/test/core/end2end/tests/filter_causes_close.c
@@ -189,7 +189,7 @@ static void test_request(grpc_end2end_test_config config) {
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
+ grpc_call_unref(c);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/filter_latency.c b/test/core/end2end/tests/filter_latency.c
index e87e7339b8..7d2614a067 100644
--- a/test/core/end2end/tests/filter_latency.c
+++ b/test/core/end2end/tests/filter_latency.c
@@ -228,8 +228,8 @@ static void test_request(grpc_end2end_test_config config) {
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(s);
- grpc_call_destroy(c);
+ grpc_call_unref(s);
+ grpc_call_unref(c);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/graceful_server_shutdown.c b/test/core/end2end/tests/graceful_server_shutdown.c
index efb54a4a1d..37ac33818f 100644
--- a/test/core/end2end/tests/graceful_server_shutdown.c
+++ b/test/core/end2end/tests/graceful_server_shutdown.c
@@ -192,7 +192,7 @@ static void test_early_server_shutdown_finishes_inflight_calls(
CQ_EXPECT_COMPLETION(cqv, tag(1), 1);
cq_verify(cqv);
- grpc_call_destroy(s);
+ grpc_call_unref(s);
GPR_ASSERT(status == GRPC_STATUS_UNIMPLEMENTED);
GPR_ASSERT(0 == grpc_slice_str_cmp(call_details.method, "/foo"));
@@ -206,7 +206,7 @@ static void test_early_server_shutdown_finishes_inflight_calls(
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
+ grpc_call_unref(c);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/high_initial_seqno.c b/test/core/end2end/tests/high_initial_seqno.c
index ae364fd293..893fdd6862 100644
--- a/test/core/end2end/tests/high_initial_seqno.c
+++ b/test/core/end2end/tests/high_initial_seqno.c
@@ -205,8 +205,8 @@ static void simple_request_body(grpc_end2end_test_config config,
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
/* TODO(ctiller): this rate limits the test, and it should be removed when
retry has been implemented; until then cross-thread chatter
diff --git a/test/core/end2end/tests/hpack_size.c b/test/core/end2end/tests/hpack_size.c
index 15f5bb0240..b1db58271e 100644
--- a/test/core/end2end/tests/hpack_size.c
+++ b/test/core/end2end/tests/hpack_size.c
@@ -358,8 +358,8 @@ static void simple_request_body(grpc_end2end_test_config config,
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
}
diff --git a/test/core/end2end/tests/idempotent_request.c b/test/core/end2end/tests/idempotent_request.c
index 9c1ec25855..1ea2ac4774 100644
--- a/test/core/end2end/tests/idempotent_request.c
+++ b/test/core/end2end/tests/idempotent_request.c
@@ -219,8 +219,8 @@ static void simple_request_body(grpc_end2end_test_config config,
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
}
diff --git a/test/core/end2end/tests/invoke_large_request.c b/test/core/end2end/tests/invoke_large_request.c
index a437fd7fb7..a49cf4f3d7 100644
--- a/test/core/end2end/tests/invoke_large_request.c
+++ b/test/core/end2end/tests/invoke_large_request.c
@@ -258,8 +258,8 @@ static void test_invoke_large_request(grpc_end2end_test_config config,
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/keepalive_timeout.c b/test/core/end2end/tests/keepalive_timeout.c
index 33a409b7bc..ceefe5db8e 100644
--- a/test/core/end2end/tests/keepalive_timeout.c
+++ b/test/core/end2end/tests/keepalive_timeout.c
@@ -223,8 +223,8 @@ static void test_keepalive_timeout(grpc_end2end_test_config config) {
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/large_metadata.c b/test/core/end2end/tests/large_metadata.c
index cef03b69df..dd796889db 100644
--- a/test/core/end2end/tests/large_metadata.c
+++ b/test/core/end2end/tests/large_metadata.c
@@ -246,8 +246,8 @@ static void test_request_with_large_metadata(grpc_end2end_test_config config) {
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/load_reporting_hook.c b/test/core/end2end/tests/load_reporting_hook.c
index c021bc07ff..5f671405c2 100644
--- a/test/core/end2end/tests/load_reporting_hook.c
+++ b/test/core/end2end/tests/load_reporting_hook.c
@@ -266,8 +266,8 @@ static void request_response_with_payload(
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/max_concurrent_streams.c b/test/core/end2end/tests/max_concurrent_streams.c
index 645701613b..8ec92e476a 100644
--- a/test/core/end2end/tests/max_concurrent_streams.c
+++ b/test/core/end2end/tests/max_concurrent_streams.c
@@ -201,8 +201,8 @@ static void simple_request_body(grpc_end2end_test_config config,
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
}
@@ -433,10 +433,10 @@ static void test_max_concurrent_streams(grpc_end2end_test_config config) {
cq_verifier_destroy(cqv);
- grpc_call_destroy(c1);
- grpc_call_destroy(s1);
- grpc_call_destroy(c2);
- grpc_call_destroy(s2);
+ grpc_call_unref(c1);
+ grpc_call_unref(s1);
+ grpc_call_unref(c2);
+ grpc_call_unref(s2);
grpc_slice_unref(details1);
grpc_slice_unref(details2);
@@ -628,10 +628,10 @@ static void test_max_concurrent_streams_with_timeout_on_first(
cq_verifier_destroy(cqv);
- grpc_call_destroy(c1);
- grpc_call_destroy(s1);
- grpc_call_destroy(c2);
- grpc_call_destroy(s2);
+ grpc_call_unref(c1);
+ grpc_call_unref(s1);
+ grpc_call_unref(c2);
+ grpc_call_unref(s2);
grpc_slice_unref(details1);
grpc_slice_unref(details2);
@@ -789,7 +789,7 @@ static void test_max_concurrent_streams_with_timeout_on_second(
/* second request is finished because of time out, so destroy the second call
*/
- grpc_call_destroy(c2);
+ grpc_call_unref(c2);
/* now reply the first call */
memset(ops, 0, sizeof(ops));
@@ -821,8 +821,8 @@ static void test_max_concurrent_streams_with_timeout_on_second(
cq_verifier_destroy(cqv);
- grpc_call_destroy(c1);
- grpc_call_destroy(s1);
+ grpc_call_unref(c1);
+ grpc_call_unref(s1);
grpc_slice_unref(details1);
grpc_slice_unref(details2);
diff --git a/test/core/end2end/tests/max_connection_age.c b/test/core/end2end/tests/max_connection_age.c
index 7b41fa597b..c470dcda69 100644
--- a/test/core/end2end/tests/max_connection_age.c
+++ b/test/core/end2end/tests/max_connection_age.c
@@ -214,7 +214,7 @@ static void test_max_age_forcibly_close(grpc_end2end_test_config config) {
CQ_EXPECT_COMPLETION(cqv, tag(0xdead), true);
cq_verify(cqv);
- grpc_call_destroy(s);
+ grpc_call_unref(s);
/* The connection should be closed immediately after the max age grace period,
the in-progress RPC should fail. */
@@ -230,7 +230,7 @@ static void test_max_age_forcibly_close(grpc_end2end_test_config config) {
grpc_metadata_array_destroy(&trailing_metadata_recv);
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
+ grpc_call_unref(c);
cq_verifier_destroy(cqv);
end_test(&f);
config.tear_down_data(&f);
@@ -352,7 +352,7 @@ static void test_max_age_gracefully_close(grpc_end2end_test_config config) {
CQ_EXPECT_COMPLETION(cqv, tag(0xdead), true);
cq_verify(cqv);
- grpc_call_destroy(s);
+ grpc_call_unref(s);
/* The connection is closed gracefully with goaway, the rpc should still be
completed. */
@@ -368,7 +368,7 @@ static void test_max_age_gracefully_close(grpc_end2end_test_config config) {
grpc_metadata_array_destroy(&trailing_metadata_recv);
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
+ grpc_call_unref(c);
cq_verifier_destroy(cqv);
end_test(&f);
config.tear_down_data(&f);
diff --git a/test/core/end2end/tests/max_connection_idle.c b/test/core/end2end/tests/max_connection_idle.c
index ceb02947fe..488d945123 100644
--- a/test/core/end2end/tests/max_connection_idle.c
+++ b/test/core/end2end/tests/max_connection_idle.c
@@ -175,8 +175,8 @@ static void simple_request_body(grpc_end2end_test_config config,
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
}
diff --git a/test/core/end2end/tests/max_message_length.c b/test/core/end2end/tests/max_message_length.c
index 224c1cd833..f65edab865 100644
--- a/test/core/end2end/tests/max_message_length.c
+++ b/test/core/end2end/tests/max_message_length.c
@@ -289,8 +289,8 @@ done:
grpc_byte_buffer_destroy(request_payload);
grpc_byte_buffer_destroy(recv_payload);
- grpc_call_destroy(c);
- if (s != NULL) grpc_call_destroy(s);
+ grpc_call_unref(c);
+ if (s != NULL) grpc_call_unref(s);
cq_verifier_destroy(cqv);
@@ -483,8 +483,8 @@ static void test_max_message_length_on_response(grpc_end2end_test_config config,
grpc_byte_buffer_destroy(response_payload);
grpc_byte_buffer_destroy(recv_payload);
- grpc_call_destroy(c);
- if (s != NULL) grpc_call_destroy(s);
+ grpc_call_unref(c);
+ if (s != NULL) grpc_call_unref(s);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/negative_deadline.c b/test/core/end2end/tests/negative_deadline.c
index 52c1a72bbf..113b650a97 100644
--- a/test/core/end2end/tests/negative_deadline.c
+++ b/test/core/end2end/tests/negative_deadline.c
@@ -162,7 +162,7 @@ static void simple_request_body(grpc_end2end_test_config config,
grpc_metadata_array_destroy(&initial_metadata_recv);
grpc_metadata_array_destroy(&trailing_metadata_recv);
- grpc_call_destroy(c);
+ grpc_call_unref(c);
cq_verifier_destroy(cqv);
}
diff --git a/test/core/end2end/tests/network_status_change.c b/test/core/end2end/tests/network_status_change.c
index a810489bf2..1ea4be81b1 100644
--- a/test/core/end2end/tests/network_status_change.c
+++ b/test/core/end2end/tests/network_status_change.c
@@ -231,8 +231,8 @@ static void test_invoke_network_status_change(grpc_end2end_test_config config) {
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/no_logging.c b/test/core/end2end/tests/no_logging.c
index 44e8188059..17b6886f2c 100644
--- a/test/core/end2end/tests/no_logging.c
+++ b/test/core/end2end/tests/no_logging.c
@@ -244,8 +244,8 @@ static void simple_request_body(grpc_end2end_test_config config,
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
}
diff --git a/test/core/end2end/tests/payload.c b/test/core/end2end/tests/payload.c
index df9004fb55..3f25ecb8ff 100644
--- a/test/core/end2end/tests/payload.c
+++ b/test/core/end2end/tests/payload.c
@@ -261,8 +261,8 @@ static void request_response_with_payload(grpc_end2end_test_config config,
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/ping_pong_streaming.c b/test/core/end2end/tests/ping_pong_streaming.c
index fc5a0a5ec3..598e45ee33 100644
--- a/test/core/end2end/tests/ping_pong_streaming.c
+++ b/test/core/end2end/tests/ping_pong_streaming.c
@@ -265,8 +265,8 @@ static void test_pingpong_streaming(grpc_end2end_test_config config,
CQ_EXPECT_COMPLETION(cqv, tag(104), 1);
cq_verify(cqv);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/registered_call.c b/test/core/end2end/tests/registered_call.c
index 258040371f..7e07a7129c 100644
--- a/test/core/end2end/tests/registered_call.c
+++ b/test/core/end2end/tests/registered_call.c
@@ -200,8 +200,8 @@ static void simple_request_body(grpc_end2end_test_config config,
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
}
diff --git a/test/core/end2end/tests/request_with_flags.c b/test/core/end2end/tests/request_with_flags.c
index e913fa46c3..daf15fa5f7 100644
--- a/test/core/end2end/tests/request_with_flags.c
+++ b/test/core/end2end/tests/request_with_flags.c
@@ -179,7 +179,7 @@ static void test_invoke_request_with_flags(
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
+ grpc_call_unref(c);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/request_with_payload.c b/test/core/end2end/tests/request_with_payload.c
index 17c0761090..43686d58ab 100644
--- a/test/core/end2end/tests/request_with_payload.c
+++ b/test/core/end2end/tests/request_with_payload.c
@@ -226,8 +226,8 @@ static void test_invoke_request_with_payload(grpc_end2end_test_config config) {
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/resource_quota_server.c b/test/core/end2end/tests/resource_quota_server.c
index b5bc39915a..6418f5d01a 100644
--- a/test/core/end2end/tests/resource_quota_server.c
+++ b/test/core/end2end/tests/resource_quota_server.c
@@ -169,6 +169,7 @@ void resource_quota_server(grpc_end2end_test_config config) {
int cancelled_calls_on_client = 0;
int cancelled_calls_on_server = 0;
int deadline_exceeded = 0;
+ int unavailable = 0;
grpc_byte_buffer *request_payload =
grpc_raw_byte_buffer_create(&request_payload_slice, 1);
@@ -260,6 +261,9 @@ void resource_quota_server(grpc_end2end_test_config config) {
case GRPC_STATUS_DEADLINE_EXCEEDED:
deadline_exceeded++;
break;
+ case GRPC_STATUS_UNAVAILABLE:
+ unavailable++;
+ break;
case GRPC_STATUS_OK:
break;
default:
@@ -270,7 +274,7 @@ void resource_quota_server(grpc_end2end_test_config config) {
grpc_metadata_array_destroy(&initial_metadata_recv[call_id]);
grpc_metadata_array_destroy(&trailing_metadata_recv[call_id]);
- grpc_call_destroy(client_calls[call_id]);
+ grpc_call_unref(client_calls[call_id]);
grpc_slice_unref(details[call_id]);
pending_client_calls--;
@@ -352,15 +356,15 @@ void resource_quota_server(grpc_end2end_test_config config) {
GPR_ASSERT(pending_server_end_calls > 0);
pending_server_end_calls--;
- grpc_call_destroy(server_calls[call_id]);
+ grpc_call_unref(server_calls[call_id]);
}
}
gpr_log(GPR_INFO,
"Done. %d total calls: %d cancelled at server, %d cancelled at "
- "client, %d timed out.",
+ "client, %d timed out, %d unavailable.",
NUM_CALLS, cancelled_calls_on_server, cancelled_calls_on_client,
- deadline_exceeded);
+ deadline_exceeded, unavailable);
grpc_byte_buffer_destroy(request_payload);
grpc_slice_unref(request_payload_slice);
diff --git a/test/core/end2end/tests/server_finishes_request.c b/test/core/end2end/tests/server_finishes_request.c
index 990f063090..be0901bfdd 100644
--- a/test/core/end2end/tests/server_finishes_request.c
+++ b/test/core/end2end/tests/server_finishes_request.c
@@ -199,8 +199,8 @@ static void simple_request_body(grpc_end2end_test_config config,
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
}
diff --git a/test/core/end2end/tests/shutdown_finishes_calls.c b/test/core/end2end/tests/shutdown_finishes_calls.c
index 2385423538..d19af1a74d 100644
--- a/test/core/end2end/tests/shutdown_finishes_calls.c
+++ b/test/core/end2end/tests/shutdown_finishes_calls.c
@@ -186,8 +186,8 @@ static void test_early_server_shutdown_finishes_inflight_calls(
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/simple_cacheable_request.c b/test/core/end2end/tests/simple_cacheable_request.c
index d0c292c338..cc0f89c422 100644
--- a/test/core/end2end/tests/simple_cacheable_request.c
+++ b/test/core/end2end/tests/simple_cacheable_request.c
@@ -274,8 +274,8 @@ static void test_cacheable_request_response_with_metadata_and_payload(
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/simple_delayed_request.c b/test/core/end2end/tests/simple_delayed_request.c
index c8b88def1f..9e938f86a6 100644
--- a/test/core/end2end/tests/simple_delayed_request.c
+++ b/test/core/end2end/tests/simple_delayed_request.c
@@ -195,8 +195,8 @@ static void simple_delayed_request_body(grpc_end2end_test_config config,
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
}
diff --git a/test/core/end2end/tests/simple_metadata.c b/test/core/end2end/tests/simple_metadata.c
index 367f0b7696..08679a588a 100644
--- a/test/core/end2end/tests/simple_metadata.c
+++ b/test/core/end2end/tests/simple_metadata.c
@@ -266,8 +266,8 @@ static void test_request_response_with_metadata_and_payload(
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/simple_request.c b/test/core/end2end/tests/simple_request.c
index 0f19fd0b0f..45c717363b 100644
--- a/test/core/end2end/tests/simple_request.c
+++ b/test/core/end2end/tests/simple_request.c
@@ -219,8 +219,8 @@ static void simple_request_body(grpc_end2end_test_config config,
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
}
diff --git a/test/core/end2end/tests/streaming_error_response.c b/test/core/end2end/tests/streaming_error_response.c
index 0946552271..e59675a655 100644
--- a/test/core/end2end/tests/streaming_error_response.c
+++ b/test/core/end2end/tests/streaming_error_response.c
@@ -263,8 +263,8 @@ static void test(grpc_end2end_test_config config, bool request_status_early) {
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/trailing_metadata.c b/test/core/end2end/tests/trailing_metadata.c
index 78046261c3..ca8eb6389e 100644
--- a/test/core/end2end/tests/trailing_metadata.c
+++ b/test/core/end2end/tests/trailing_metadata.c
@@ -276,8 +276,8 @@ static void test_request_response_with_metadata_and_payload(
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/write_buffering.c b/test/core/end2end/tests/write_buffering.c
index e937912d5f..f8f2102e67 100644
--- a/test/core/end2end/tests/write_buffering.c
+++ b/test/core/end2end/tests/write_buffering.c
@@ -274,8 +274,8 @@ static void test_invoke_request_with_payload(grpc_end2end_test_config config) {
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
diff --git a/test/core/end2end/tests/write_buffering_at_end.c b/test/core/end2end/tests/write_buffering_at_end.c
index 42024cfa9b..2facd9c1a4 100644
--- a/test/core/end2end/tests/write_buffering_at_end.c
+++ b/test/core/end2end/tests/write_buffering_at_end.c
@@ -265,8 +265,8 @@ static void test_invoke_request_with_payload(grpc_end2end_test_config config) {
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
- grpc_call_destroy(c);
- grpc_call_destroy(s);
+ grpc_call_unref(c);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
diff --git a/test/core/fling/client.c b/test/core/fling/client.c
index ecb73cfbdb..3c43f4311c 100644
--- a/test/core/fling/client.c
+++ b/test/core/fling/client.c
@@ -99,7 +99,7 @@ static void step_ping_pong_request(void) {
(size_t)(op - ops),
(void *)1, NULL));
grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
- grpc_call_destroy(call);
+ grpc_call_unref(call);
grpc_byte_buffer_destroy(response_payload_recv);
call = NULL;
GPR_TIMER_END("ping_pong", 1);
@@ -233,7 +233,7 @@ int main(int argc, char **argv) {
grpc_profiler_stop();
if (call) {
- grpc_call_destroy(call);
+ grpc_call_unref(call);
}
grpc_channel_destroy(channel);
diff --git a/test/core/fling/server.c b/test/core/fling/server.c
index 7edff3d132..a927e9014a 100644
--- a/test/core/fling/server.c
+++ b/test/core/fling/server.c
@@ -301,7 +301,7 @@ int main(int argc, char **argv) {
break;
case FLING_SERVER_SEND_STATUS_FOR_STREAMING:
/* Send status and close completed at server */
- grpc_call_destroy(call);
+ grpc_call_unref(call);
if (!shutdown_started) request_call();
break;
case FLING_SERVER_READ_FOR_UNARY:
@@ -314,7 +314,7 @@ int main(int argc, char **argv) {
/* Finished unary call. */
grpc_byte_buffer_destroy(payload_buffer);
payload_buffer = NULL;
- grpc_call_destroy(call);
+ grpc_call_unref(call);
if (!shutdown_started) request_call();
break;
}
diff --git a/test/core/memory_usage/client.c b/test/core/memory_usage/client.c
index fcdc161ac9..ee68399988 100644
--- a/test/core/memory_usage/client.c
+++ b/test/core/memory_usage/client.c
@@ -120,7 +120,7 @@ static void finish_ping_pong_request(int call_idx) {
grpc_metadata_array_destroy(&calls[call_idx].initial_metadata_recv);
grpc_metadata_array_destroy(&calls[call_idx].trailing_metadata_recv);
grpc_slice_unref(calls[call_idx].details);
- grpc_call_destroy(calls[call_idx].call);
+ grpc_call_unref(calls[call_idx].call);
calls[call_idx].call = NULL;
}
@@ -187,7 +187,7 @@ static struct grpc_memory_counters send_snapshot_request(int call_idx,
grpc_byte_buffer_destroy(response_payload_recv);
grpc_slice_unref(calls[call_idx].details);
calls[call_idx].details = grpc_empty_slice();
- grpc_call_destroy(calls[call_idx].call);
+ grpc_call_unref(calls[call_idx].call);
calls[call_idx].call = NULL;
return snapshot;
diff --git a/test/core/memory_usage/server.c b/test/core/memory_usage/server.c
index 44c5488014..1c70f5eac0 100644
--- a/test/core/memory_usage/server.c
+++ b/test/core/memory_usage/server.c
@@ -286,7 +286,7 @@ int main(int argc, char **argv) {
case FLING_SERVER_WAIT_FOR_DESTROY:
break;
case FLING_SERVER_SEND_STATUS_FLING_CALL:
- grpc_call_destroy(s->call);
+ grpc_call_unref(s->call);
grpc_call_details_destroy(&s->call_details);
grpc_metadata_array_destroy(&s->initial_metadata_send);
grpc_metadata_array_destroy(&s->request_metadata_recv);
@@ -304,7 +304,7 @@ int main(int argc, char **argv) {
case FLING_SERVER_SEND_STATUS_SNAPSHOT:
grpc_byte_buffer_destroy(payload_buffer);
grpc_byte_buffer_destroy(terminal_buffer);
- grpc_call_destroy(s->call);
+ grpc_call_unref(s->call);
grpc_call_details_destroy(&s->call_details);
grpc_metadata_array_destroy(&s->initial_metadata_send);
grpc_metadata_array_destroy(&s->request_metadata_recv);
diff --git a/test/core/security/BUILD b/test/core/security/BUILD
index 8c63f9143d..a81e1d366b 100644
--- a/test/core/security/BUILD
+++ b/test/core/security/BUILD
@@ -44,7 +44,8 @@ cc_library(
srcs = ["oauth2_utils.c"],
hdrs = ["oauth2_utils.h"],
deps = ["//:grpc"],
- copts = ['-std=c99']
+ copts = ['-std=c99'],
+ visibility = ["//test/cpp:__subpackages__"],
)
cc_test(
diff --git a/test/core/slice/BUILD b/test/core/slice/BUILD
index 4d64d0a818..18cf6f60af 100644
--- a/test/core/slice/BUILD
+++ b/test/core/slice/BUILD
@@ -47,13 +47,34 @@ cc_test(
)
cc_test(
- name = "slice_buffer_test",
+ name = "slice_test",
+ srcs = ["slice_test.c"],
+ deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
+ copts = ['-std=c99']
+)
+
+cc_test(
+ name = "slice_string_helpers_test",
srcs = ["slice_string_helpers_test.c"],
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
copts = ['-std=c99']
)
cc_test(
+ name = "slice_buffer_test",
+ srcs = ["slice_buffer_test.c"],
+ deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
+ copts = ['-std=c99']
+)
+
+cc_test(
+ name = "slice_hash_table_test",
+ srcs = ["slice_hash_table_test.c"],
+ deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
+ copts = ['-std=c99']
+)
+
+cc_test(
name = "b64_test",
srcs = ["b64_test.c"],
deps = ["//:grpc", "//test/core/util:grpc_test_util", "//:gpr", "//test/core/util:gpr_test_util"],
diff --git a/test/core/slice/slice_buffer_test.c b/test/core/slice/slice_buffer_test.c
index bf9ae197d2..41cff3d4d2 100644
--- a/test/core/slice/slice_buffer_test.c
+++ b/test/core/slice/slice_buffer_test.c
@@ -115,8 +115,8 @@ void test_slice_buffer_move_first() {
grpc_slice_buffer_move_first(&src, 2, &dst);
src_len -= 2;
dst_len += 2;
- GPR_ASSERT(src.length == src.length);
- GPR_ASSERT(dst.length == dst.length);
+ GPR_ASSERT(src.length == src_len);
+ GPR_ASSERT(dst.length == dst_len);
}
int main(int argc, char **argv) {
diff --git a/test/core/slice/slice_hash_table_test.c b/test/core/slice/slice_hash_table_test.c
new file mode 100644
index 0000000000..67041b2d5c
--- /dev/null
+++ b/test/core/slice/slice_hash_table_test.c
@@ -0,0 +1,138 @@
+/*
+ *
+ * Copyright 2017, 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 "src/core/lib/slice/slice_hash_table.h"
+
+#include <string.h>
+
+#include <grpc/support/alloc.h>
+#include <grpc/support/log.h>
+#include <grpc/support/string_util.h>
+
+#include "src/core/lib/slice/slice_internal.h"
+#include "test/core/util/test_config.h"
+
+typedef struct {
+ char* key;
+ char* value;
+} test_entry;
+
+static void populate_entries(const test_entry* input, size_t num_entries,
+ grpc_slice_hash_table_entry* output) {
+ for (size_t i = 0; i < num_entries; ++i) {
+ output[i].key = grpc_slice_from_copied_string(input[i].key);
+ output[i].value = gpr_strdup(input[i].value);
+ }
+}
+
+static void check_values(const test_entry* input, size_t num_entries,
+ grpc_slice_hash_table* table) {
+ for (size_t i = 0; i < num_entries; ++i) {
+ grpc_slice key = grpc_slice_from_static_string(input[i].key);
+ char* actual = grpc_slice_hash_table_get(table, key);
+ GPR_ASSERT(actual != NULL);
+ GPR_ASSERT(strcmp(actual, input[i].value) == 0);
+ grpc_slice_unref(key);
+ }
+}
+
+static void check_non_existent_value(const char* key_string,
+ grpc_slice_hash_table* table) {
+ grpc_slice key = grpc_slice_from_static_string(key_string);
+ GPR_ASSERT(grpc_slice_hash_table_get(table, key) == NULL);
+ grpc_slice_unref(key);
+}
+
+static void destroy_string(grpc_exec_ctx* exec_ctx, void* value) {
+ gpr_free(value);
+}
+
+static void test_slice_hash_table() {
+ const test_entry test_entries[] = {
+ {"key_0", "value_0"}, {"key_1", "value_1"}, {"key_2", "value_2"},
+ {"key_3", "value_3"}, {"key_4", "value_4"}, {"key_5", "value_5"},
+ {"key_6", "value_6"}, {"key_7", "value_7"}, {"key_8", "value_8"},
+ {"key_9", "value_9"}, {"key_10", "value_10"}, {"key_11", "value_11"},
+ {"key_12", "value_12"}, {"key_13", "value_13"}, {"key_14", "value_14"},
+ {"key_15", "value_15"}, {"key_16", "value_16"}, {"key_17", "value_17"},
+ {"key_18", "value_18"}, {"key_19", "value_19"}, {"key_20", "value_20"},
+ {"key_21", "value_21"}, {"key_22", "value_22"}, {"key_23", "value_23"},
+ {"key_24", "value_24"}, {"key_25", "value_25"}, {"key_26", "value_26"},
+ {"key_27", "value_27"}, {"key_28", "value_28"}, {"key_29", "value_29"},
+ {"key_30", "value_30"}, {"key_31", "value_31"}, {"key_32", "value_32"},
+ {"key_33", "value_33"}, {"key_34", "value_34"}, {"key_35", "value_35"},
+ {"key_36", "value_36"}, {"key_37", "value_37"}, {"key_38", "value_38"},
+ {"key_39", "value_39"}, {"key_40", "value_40"}, {"key_41", "value_41"},
+ {"key_42", "value_42"}, {"key_43", "value_43"}, {"key_44", "value_44"},
+ {"key_45", "value_45"}, {"key_46", "value_46"}, {"key_47", "value_47"},
+ {"key_48", "value_48"}, {"key_49", "value_49"}, {"key_50", "value_50"},
+ {"key_51", "value_51"}, {"key_52", "value_52"}, {"key_53", "value_53"},
+ {"key_54", "value_54"}, {"key_55", "value_55"}, {"key_56", "value_56"},
+ {"key_57", "value_57"}, {"key_58", "value_58"}, {"key_59", "value_59"},
+ {"key_60", "value_60"}, {"key_61", "value_61"}, {"key_62", "value_62"},
+ {"key_63", "value_63"}, {"key_64", "value_64"}, {"key_65", "value_65"},
+ {"key_66", "value_66"}, {"key_67", "value_67"}, {"key_68", "value_68"},
+ {"key_69", "value_69"}, {"key_70", "value_70"}, {"key_71", "value_71"},
+ {"key_72", "value_72"}, {"key_73", "value_73"}, {"key_74", "value_74"},
+ {"key_75", "value_75"}, {"key_76", "value_76"}, {"key_77", "value_77"},
+ {"key_78", "value_78"}, {"key_79", "value_79"}, {"key_80", "value_80"},
+ {"key_81", "value_81"}, {"key_82", "value_82"}, {"key_83", "value_83"},
+ {"key_84", "value_84"}, {"key_85", "value_85"}, {"key_86", "value_86"},
+ {"key_87", "value_87"}, {"key_88", "value_88"}, {"key_89", "value_89"},
+ {"key_90", "value_90"}, {"key_91", "value_91"}, {"key_92", "value_92"},
+ {"key_93", "value_93"}, {"key_94", "value_94"}, {"key_95", "value_95"},
+ {"key_96", "value_96"}, {"key_97", "value_97"}, {"key_98", "value_98"},
+ {"key_99", "value_99"},
+ };
+ const size_t num_entries = GPR_ARRAY_SIZE(test_entries);
+ // Construct table.
+ grpc_slice_hash_table_entry* entries =
+ gpr_zalloc(sizeof(*entries) * num_entries);
+ populate_entries(test_entries, num_entries, entries);
+ grpc_slice_hash_table* table =
+ grpc_slice_hash_table_create(num_entries, entries, destroy_string);
+ gpr_free(entries);
+ // Check contents of table.
+ check_values(test_entries, num_entries, table);
+ check_non_existent_value("XX", table);
+ // Clean up.
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_slice_hash_table_unref(&exec_ctx, table);
+ grpc_exec_ctx_finish(&exec_ctx);
+}
+
+int main(int argc, char** argv) {
+ grpc_test_init(argc, argv);
+ test_slice_hash_table();
+ return 0;
+}
diff --git a/test/core/support/memory_test.cc b/test/core/support/memory_test.cc
new file mode 100644
index 0000000000..8db316a423
--- /dev/null
+++ b/test/core/support/memory_test.cc
@@ -0,0 +1,89 @@
+/*
+ *
+ * Copyright 2017, 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 "src/core/lib/support/memory.h"
+#include <gtest/gtest.h>
+#include "test/core/util/test_config.h"
+
+namespace grpc_core {
+namespace testing {
+
+struct Foo {
+ Foo(int p, int q) : a(p), b(q) {}
+ int a;
+ int b;
+};
+
+TEST(MemoryTest, NewDeleteTest) { Delete(New<int>()); }
+
+TEST(MemoryTest, NewDeleteWithArgTest) {
+ int* i = New<int>(42);
+ EXPECT_EQ(42, *i);
+ Delete(i);
+}
+
+TEST(MemoryTest, NewDeleteWithArgsTest) {
+ Foo* p = New<Foo>(1, 2);
+ EXPECT_EQ(1, p->a);
+ EXPECT_EQ(2, p->b);
+ Delete(p);
+}
+
+TEST(MemoryTest, MakeUniqueTest) { MakeUnique<int>(); }
+
+TEST(MemoryTest, MakeUniqueWithArgTest) {
+ auto i = MakeUnique<int>(42);
+ EXPECT_EQ(42, *i);
+}
+
+TEST(MemoryTest, UniquePtrWithCustomDeleter) {
+ int n = 0;
+ class IncrementingDeleter {
+ public:
+ void operator()(int* p) { ++*p; }
+ };
+ {
+ UniquePtr<int, IncrementingDeleter> p(&n);
+ EXPECT_EQ(0, n);
+ }
+ EXPECT_EQ(1, n);
+}
+
+} // namespace testing
+} // namespace grpc_core
+
+int main(int argc, char** argv) {
+ grpc_test_init(argc, argv);
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/test/core/support/mpscq_test.c b/test/core/support/mpscq_test.c
index 491eb9148b..695066c68e 100644
--- a/test/core/support/mpscq_test.c
+++ b/test/core/support/mpscq_test.c
@@ -76,7 +76,7 @@ typedef struct {
gpr_event *start;
} thd_args;
-#define THREAD_ITERATIONS 100000
+#define THREAD_ITERATIONS 10000
static void test_thread(void *args) {
thd_args *a = args;
diff --git a/test/core/support/time_test.c b/test/core/support/time_test.c
index 4cb36a788c..00d0b76503 100644
--- a/test/core/support/time_test.c
+++ b/test/core/support/time_test.c
@@ -47,32 +47,17 @@ static void to_fp(void *arg, const char *buf, size_t len) {
fwrite(buf, 1, len, (FILE *)arg);
}
-/* Convert gpr_uintmax x to ascii base b (2..16), and write with
- (*writer)(arg, ...), zero padding to "chars" digits). */
-static void u_to_s(uintmax_t x, unsigned base, int chars,
- void (*writer)(void *arg, const char *buf, size_t len),
- void *arg) {
- char buf[64];
- char *p = buf + sizeof(buf);
- do {
- *--p = "0123456789abcdef"[x % base];
- x /= base;
- chars--;
- } while (x != 0 || chars > 0);
- (*writer)(arg, p, (size_t)(buf + sizeof(buf) - p));
-}
-
/* Convert gpr_intmax x to ascii base b (2..16), and write with
(*writer)(arg, ...), zero padding to "chars" digits). */
-static void i_to_s(intmax_t x, unsigned base, int chars,
+static void i_to_s(intmax_t x, int base, int chars,
void (*writer)(void *arg, const char *buf, size_t len),
void *arg) {
- if (x < 0) {
- (*writer)(arg, "-", 1);
- u_to_s((uintmax_t)-x, base, chars - 1, writer, arg);
- } else {
- u_to_s((uintmax_t)x, base, chars, writer, arg);
- }
+ char buf[64];
+ char fmt[32];
+ GPR_ASSERT(base == 16 || base == 10);
+ sprintf(fmt, "%%0%d%s", chars, base == 16 ? PRIxMAX : PRIdMAX);
+ sprintf(buf, fmt, x);
+ (*writer)(arg, buf, strlen(buf));
}
/* Convert ts to ascii, and write with (*writer)(arg, ...). */
diff --git a/test/core/surface/lame_client_test.c b/test/core/surface/lame_client_test.c
index 6c14a5dcdf..ba0cee07d3 100644
--- a/test/core/surface/lame_client_test.c
+++ b/test/core/surface/lame_client_test.c
@@ -156,7 +156,7 @@ int main(int argc, char **argv) {
GPR_ASSERT(strcmp(peer, "lampoon:national") == 0);
gpr_free(peer);
- grpc_call_destroy(call);
+ grpc_call_unref(call);
grpc_channel_destroy(chan);
cq_verifier_destroy(cqv);
grpc_completion_queue_destroy(cq);
diff --git a/test/core/transport/bdp_estimator_test.c b/test/core/transport/bdp_estimator_test.c
index f55a3ca643..a6f1a55363 100644
--- a/test/core/transport/bdp_estimator_test.c
+++ b/test/core/transport/bdp_estimator_test.c
@@ -33,6 +33,7 @@
#include "src/core/lib/transport/bdp_estimator.h"
+#include <grpc/grpc.h>
#include <grpc/support/alloc.h>
#include <grpc/support/log.h>
#include <grpc/support/string_util.h>
@@ -64,6 +65,8 @@ static void add_samples(grpc_bdp_estimator *estimator, int64_t *samples,
GPR_ASSERT(grpc_bdp_estimator_add_incoming_bytes(estimator, samples[i]) ==
false);
}
+ gpr_sleep_until(gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
+ gpr_time_from_millis(1, GPR_TIMESPAN)));
grpc_bdp_estimator_complete_ping(estimator);
}
@@ -123,24 +126,25 @@ static void test_get_estimate_random_values(size_t n) {
gpr_log(GPR_INFO, "test_get_estimate_random_values(%" PRIdPTR ")", n);
grpc_bdp_estimator est;
grpc_bdp_estimator_init(&est, "test");
- int min = INT_MAX;
- int max = 65535; // Windows rand() has limited range, make sure the ASSERT
- // passes
+ const int kMaxSample = 65535;
+ int min = kMaxSample;
+ int max = 0;
for (size_t i = 0; i < n; i++) {
- int sample = rand();
+ int sample = rand() % (kMaxSample + 1);
if (sample < min) min = sample;
if (sample > max) max = sample;
add_sample(&est, sample);
if (i >= 3) {
gpr_log(GPR_DEBUG, "est:%" PRId64 " min:%d max:%d", get_estimate(&est),
min, max);
- GPR_ASSERT(get_estimate(&est) <= 2 * next_pow_2(max));
+ GPR_ASSERT(get_estimate(&est) <= GPR_MAX(65536, 2 * next_pow_2(max)));
}
}
}
int main(int argc, char **argv) {
grpc_test_init(argc, argv);
+ grpc_init();
test_noop();
test_get_estimate_no_samples();
test_get_estimate_1_sample();
@@ -149,5 +153,6 @@ int main(int argc, char **argv) {
for (size_t i = 3; i < 1000; i = i * 3 / 2) {
test_get_estimate_random_values(i);
}
+ grpc_shutdown();
return 0;
}
diff --git a/test/core/tsi/transport_security_test.c b/test/core/tsi/transport_security_test.c
index ee4a37c314..4214407823 100644
--- a/test/core/tsi/transport_security_test.c
+++ b/test/core/tsi/transport_security_test.c
@@ -376,6 +376,8 @@ static void test_handshaker_invalid_args(void) {
TSI_INVALID_ARGUMENT);
GPR_ASSERT(tsi_handshaker_get_bytes_to_send_to_peer(NULL, NULL, NULL) ==
TSI_INVALID_ARGUMENT);
+ GPR_ASSERT(tsi_handshaker_next(NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL) ==
+ TSI_INVALID_ARGUMENT);
}
static void test_handshaker_invalid_state(void) {
diff --git a/test/core/util/passthru_endpoint.c b/test/core/util/passthru_endpoint.c
index 121567fc0d..6400845d23 100644
--- a/test/core/util/passthru_endpoint.c
+++ b/test/core/util/passthru_endpoint.c
@@ -102,13 +102,14 @@ static void me_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("Endpoint already shutdown");
} else if (m->on_read != NULL) {
for (size_t i = 0; i < slices->count; i++) {
- grpc_slice_buffer_add(m->on_read_out, grpc_slice_ref(slices->slices[i]));
+ grpc_slice_buffer_add(m->on_read_out, grpc_slice_copy(slices->slices[i]));
}
grpc_closure_sched(exec_ctx, m->on_read, GRPC_ERROR_NONE);
m->on_read = NULL;
} else {
for (size_t i = 0; i < slices->count; i++) {
- grpc_slice_buffer_add(&m->read_buffer, grpc_slice_ref(slices->slices[i]));
+ grpc_slice_buffer_add(&m->read_buffer,
+ grpc_slice_copy(slices->slices[i]));
}
}
gpr_mu_unlock(&m->parent->mu);
diff --git a/test/core/util/port_server_client.c b/test/core/util/port_server_client.c
index 38054dd1e7..254c3a6b61 100644
--- a/test/core/util/port_server_client.c
+++ b/test/core/util/port_server_client.c
@@ -103,7 +103,7 @@ void grpc_free_port_using_server(int port) {
grpc_resource_quota *resource_quota =
grpc_resource_quota_create("port_server_client/free");
grpc_httpcli_get(&exec_ctx, &context, &pr.pops, resource_quota, &req,
- grpc_timeout_seconds_to_deadline(10),
+ grpc_timeout_seconds_to_deadline(30),
grpc_closure_create(freed_port_from_server, &pr,
grpc_schedule_on_exec_ctx),
&rsp);
@@ -235,7 +235,7 @@ int grpc_pick_port_using_server(void) {
grpc_resource_quota_create("port_server_client/pick");
grpc_httpcli_get(
&exec_ctx, &context, &pr.pops, resource_quota, &req,
- grpc_timeout_seconds_to_deadline(10),
+ grpc_timeout_seconds_to_deadline(30),
grpc_closure_create(got_port_from_server, &pr, grpc_schedule_on_exec_ctx),
&pr.response);
grpc_resource_quota_unref_internal(&exec_ctx, resource_quota);
diff --git a/test/core/util/test_config.c b/test/core/util/test_config.c
index 0180d6f08d..9a400c54ca 100644
--- a/test/core/util/test_config.c
+++ b/test/core/util/test_config.c
@@ -348,6 +348,14 @@ bool BuiltUnderMsan() {
#endif
}
+bool BuiltUnderUbsan() {
+#ifdef GRPC_UBSAN
+ return true;
+#else
+ return false;
+#endif
+}
+
int64_t grpc_test_sanitizer_slowdown_factor() {
int64_t sanitizer_multiplier = 1;
if (BuiltUnderValgrind()) {
@@ -358,6 +366,8 @@ int64_t grpc_test_sanitizer_slowdown_factor() {
sanitizer_multiplier = 3;
} else if (BuiltUnderMsan()) {
sanitizer_multiplier = 4;
+ } else if (BuiltUnderUbsan()) {
+ sanitizer_multiplier = 5;
}
return sanitizer_multiplier;
}
diff --git a/test/core/util/trickle_endpoint.c b/test/core/util/trickle_endpoint.c
index 02ba257abe..69386a0718 100644
--- a/test/core/util/trickle_endpoint.c
+++ b/test/core/util/trickle_endpoint.c
@@ -78,15 +78,15 @@ static void maybe_call_write_cb_locked(grpc_exec_ctx *exec_ctx,
static void te_write(grpc_exec_ctx *exec_ctx, grpc_endpoint *ep,
grpc_slice_buffer *slices, grpc_closure *cb) {
trickle_endpoint *te = (trickle_endpoint *)ep;
- for (size_t i = 0; i < slices->count; i++) {
- grpc_slice_ref_internal(slices->slices[i]);
- }
gpr_mu_lock(&te->mu);
GPR_ASSERT(te->write_cb == NULL);
if (te->write_buffer.length == 0) {
te->last_write = gpr_now(GPR_CLOCK_MONOTONIC);
}
- grpc_slice_buffer_addn(&te->write_buffer, slices->slices, slices->count);
+ for (size_t i = 0; i < slices->count; i++) {
+ grpc_slice_buffer_add(&te->write_buffer,
+ grpc_slice_copy(slices->slices[i]));
+ }
te->write_cb = cb;
maybe_call_write_cb_locked(exec_ctx, te);
gpr_mu_unlock(&te->mu);
diff --git a/test/cpp/codegen/BUILD b/test/cpp/codegen/BUILD
index 14d5733da2..43d133fc34 100644
--- a/test/cpp/codegen/BUILD
+++ b/test/cpp/codegen/BUILD
@@ -62,7 +62,7 @@ cc_test(
cc_test(
name = "golden_file_test",
srcs = ["golden_file_test.cc"],
- args = ["--generated_file_path=$(GENDIR)/src/proto/grpc/testing/compiler_test.grpc.pb.h"],
+ args = ["--generated_file_path=$(GENDIR)/src/proto/grpc/testing/"],
data = [
":compiler_test_golden",
"//src/proto/grpc/testing:_compiler_test_proto_grpc_codegen",
diff --git a/test/cpp/codegen/compiler_test_golden b/test/cpp/codegen/compiler_test_golden
index fd26a17ac1..8e3ae32a49 100644
--- a/test/cpp/codegen/compiler_test_golden
+++ b/test/cpp/codegen/compiler_test_golden
@@ -89,10 +89,30 @@ class ServiceA final {
return std::unique_ptr< ::grpc::ClientAsyncWriterInterface< ::grpc::testing::Request>>(AsyncMethodA2Raw(context, response, cq, tag));
}
// MethodA2 trailing comment 1
+ // Method A3 leading comment 1
+ std::unique_ptr< ::grpc::ClientReaderInterface< ::grpc::testing::Response>> MethodA3(::grpc::ClientContext* context, const ::grpc::testing::Request& request) {
+ return std::unique_ptr< ::grpc::ClientReaderInterface< ::grpc::testing::Response>>(MethodA3Raw(context, request));
+ }
+ std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::grpc::testing::Response>> AsyncMethodA3(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::CompletionQueue* cq, void* tag) {
+ return std::unique_ptr< ::grpc::ClientAsyncReaderInterface< ::grpc::testing::Response>>(AsyncMethodA3Raw(context, request, cq, tag));
+ }
+ // Method A3 trailing comment 1
+ // Method A4 leading comment 1
+ std::unique_ptr< ::grpc::ClientReaderWriterInterface< ::grpc::testing::Request, ::grpc::testing::Response>> MethodA4(::grpc::ClientContext* context) {
+ return std::unique_ptr< ::grpc::ClientReaderWriterInterface< ::grpc::testing::Request, ::grpc::testing::Response>>(MethodA4Raw(context));
+ }
+ std::unique_ptr< ::grpc::ClientAsyncReaderWriterInterface< ::grpc::testing::Request, ::grpc::testing::Response>> AsyncMethodA4(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) {
+ return std::unique_ptr< ::grpc::ClientAsyncReaderWriterInterface< ::grpc::testing::Request, ::grpc::testing::Response>>(AsyncMethodA4Raw(context, cq, tag));
+ }
+ // Method A4 trailing comment 1
private:
virtual ::grpc::ClientAsyncResponseReaderInterface< ::grpc::testing::Response>* AsyncMethodA1Raw(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::CompletionQueue* cq) = 0;
virtual ::grpc::ClientWriterInterface< ::grpc::testing::Request>* MethodA2Raw(::grpc::ClientContext* context, ::grpc::testing::Response* response) = 0;
virtual ::grpc::ClientAsyncWriterInterface< ::grpc::testing::Request>* AsyncMethodA2Raw(::grpc::ClientContext* context, ::grpc::testing::Response* response, ::grpc::CompletionQueue* cq, void* tag) = 0;
+ virtual ::grpc::ClientReaderInterface< ::grpc::testing::Response>* MethodA3Raw(::grpc::ClientContext* context, const ::grpc::testing::Request& request) = 0;
+ virtual ::grpc::ClientAsyncReaderInterface< ::grpc::testing::Response>* AsyncMethodA3Raw(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::CompletionQueue* cq, void* tag) = 0;
+ virtual ::grpc::ClientReaderWriterInterface< ::grpc::testing::Request, ::grpc::testing::Response>* MethodA4Raw(::grpc::ClientContext* context) = 0;
+ virtual ::grpc::ClientAsyncReaderWriterInterface< ::grpc::testing::Request, ::grpc::testing::Response>* AsyncMethodA4Raw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) = 0;
};
class Stub final : public StubInterface {
public:
@@ -107,14 +127,32 @@ class ServiceA final {
std::unique_ptr< ::grpc::ClientAsyncWriter< ::grpc::testing::Request>> AsyncMethodA2(::grpc::ClientContext* context, ::grpc::testing::Response* response, ::grpc::CompletionQueue* cq, void* tag) {
return std::unique_ptr< ::grpc::ClientAsyncWriter< ::grpc::testing::Request>>(AsyncMethodA2Raw(context, response, cq, tag));
}
+ std::unique_ptr< ::grpc::ClientReader< ::grpc::testing::Response>> MethodA3(::grpc::ClientContext* context, const ::grpc::testing::Request& request) {
+ return std::unique_ptr< ::grpc::ClientReader< ::grpc::testing::Response>>(MethodA3Raw(context, request));
+ }
+ std::unique_ptr< ::grpc::ClientAsyncReader< ::grpc::testing::Response>> AsyncMethodA3(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::CompletionQueue* cq, void* tag) {
+ return std::unique_ptr< ::grpc::ClientAsyncReader< ::grpc::testing::Response>>(AsyncMethodA3Raw(context, request, cq, tag));
+ }
+ std::unique_ptr< ::grpc::ClientReaderWriter< ::grpc::testing::Request, ::grpc::testing::Response>> MethodA4(::grpc::ClientContext* context) {
+ return std::unique_ptr< ::grpc::ClientReaderWriter< ::grpc::testing::Request, ::grpc::testing::Response>>(MethodA4Raw(context));
+ }
+ std::unique_ptr< ::grpc::ClientAsyncReaderWriter< ::grpc::testing::Request, ::grpc::testing::Response>> AsyncMethodA4(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) {
+ return std::unique_ptr< ::grpc::ClientAsyncReaderWriter< ::grpc::testing::Request, ::grpc::testing::Response>>(AsyncMethodA4Raw(context, cq, tag));
+ }
private:
std::shared_ptr< ::grpc::ChannelInterface> channel_;
::grpc::ClientAsyncResponseReader< ::grpc::testing::Response>* AsyncMethodA1Raw(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::CompletionQueue* cq) override;
::grpc::ClientWriter< ::grpc::testing::Request>* MethodA2Raw(::grpc::ClientContext* context, ::grpc::testing::Response* response) override;
::grpc::ClientAsyncWriter< ::grpc::testing::Request>* AsyncMethodA2Raw(::grpc::ClientContext* context, ::grpc::testing::Response* response, ::grpc::CompletionQueue* cq, void* tag) override;
+ ::grpc::ClientReader< ::grpc::testing::Response>* MethodA3Raw(::grpc::ClientContext* context, const ::grpc::testing::Request& request) override;
+ ::grpc::ClientAsyncReader< ::grpc::testing::Response>* AsyncMethodA3Raw(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::CompletionQueue* cq, void* tag) override;
+ ::grpc::ClientReaderWriter< ::grpc::testing::Request, ::grpc::testing::Response>* MethodA4Raw(::grpc::ClientContext* context) override;
+ ::grpc::ClientAsyncReaderWriter< ::grpc::testing::Request, ::grpc::testing::Response>* AsyncMethodA4Raw(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag) override;
const ::grpc::RpcMethod rpcmethod_MethodA1_;
const ::grpc::RpcMethod rpcmethod_MethodA2_;
+ const ::grpc::RpcMethod rpcmethod_MethodA3_;
+ const ::grpc::RpcMethod rpcmethod_MethodA4_;
};
static std::unique_ptr<Stub> NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());
@@ -131,6 +169,12 @@ class ServiceA final {
// Method A2 leading comment 2
virtual ::grpc::Status MethodA2(::grpc::ServerContext* context, ::grpc::ServerReader< ::grpc::testing::Request>* reader, ::grpc::testing::Response* response);
// MethodA2 trailing comment 1
+ // Method A3 leading comment 1
+ virtual ::grpc::Status MethodA3(::grpc::ServerContext* context, const ::grpc::testing::Request* request, ::grpc::ServerWriter< ::grpc::testing::Response>* writer);
+ // Method A3 trailing comment 1
+ // Method A4 leading comment 1
+ virtual ::grpc::Status MethodA4(::grpc::ServerContext* context, ::grpc::ServerReaderWriter< ::grpc::testing::Response, ::grpc::testing::Request>* stream);
+ // Method A4 trailing comment 1
};
template <class BaseClass>
class WithAsyncMethod_MethodA1 : public BaseClass {
@@ -172,7 +216,47 @@ class ServiceA final {
::grpc::Service::RequestAsyncClientStreaming(1, context, reader, new_call_cq, notification_cq, tag);
}
};
- typedef WithAsyncMethod_MethodA1<WithAsyncMethod_MethodA2<Service > > AsyncService;
+ template <class BaseClass>
+ class WithAsyncMethod_MethodA3 : public BaseClass {
+ private:
+ void BaseClassMustBeDerivedFromService(const Service *service) {}
+ public:
+ WithAsyncMethod_MethodA3() {
+ ::grpc::Service::MarkMethodAsync(2);
+ }
+ ~WithAsyncMethod_MethodA3() override {
+ BaseClassMustBeDerivedFromService(this);
+ }
+ // disable synchronous version of this method
+ ::grpc::Status MethodA3(::grpc::ServerContext* context, const ::grpc::testing::Request* request, ::grpc::ServerWriter< ::grpc::testing::Response>* writer) final override {
+ abort();
+ return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+ }
+ void RequestMethodA3(::grpc::ServerContext* context, ::grpc::testing::Request* request, ::grpc::ServerAsyncWriter< ::grpc::testing::Response>* writer, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+ ::grpc::Service::RequestAsyncServerStreaming(2, context, request, writer, new_call_cq, notification_cq, tag);
+ }
+ };
+ template <class BaseClass>
+ class WithAsyncMethod_MethodA4 : public BaseClass {
+ private:
+ void BaseClassMustBeDerivedFromService(const Service *service) {}
+ public:
+ WithAsyncMethod_MethodA4() {
+ ::grpc::Service::MarkMethodAsync(3);
+ }
+ ~WithAsyncMethod_MethodA4() override {
+ BaseClassMustBeDerivedFromService(this);
+ }
+ // disable synchronous version of this method
+ ::grpc::Status MethodA4(::grpc::ServerContext* context, ::grpc::ServerReaderWriter< ::grpc::testing::Response, ::grpc::testing::Request>* stream) final override {
+ abort();
+ return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+ }
+ void RequestMethodA4(::grpc::ServerContext* context, ::grpc::ServerAsyncReaderWriter< ::grpc::testing::Response, ::grpc::testing::Request>* stream, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+ ::grpc::Service::RequestAsyncBidiStreaming(3, context, stream, new_call_cq, notification_cq, tag);
+ }
+ };
+ typedef WithAsyncMethod_MethodA1<WithAsyncMethod_MethodA2<WithAsyncMethod_MethodA3<WithAsyncMethod_MethodA4<Service > > > > AsyncService;
template <class BaseClass>
class WithGenericMethod_MethodA1 : public BaseClass {
private:
@@ -208,6 +292,40 @@ class ServiceA final {
}
};
template <class BaseClass>
+ class WithGenericMethod_MethodA3 : public BaseClass {
+ private:
+ void BaseClassMustBeDerivedFromService(const Service *service) {}
+ public:
+ WithGenericMethod_MethodA3() {
+ ::grpc::Service::MarkMethodGeneric(2);
+ }
+ ~WithGenericMethod_MethodA3() override {
+ BaseClassMustBeDerivedFromService(this);
+ }
+ // disable synchronous version of this method
+ ::grpc::Status MethodA3(::grpc::ServerContext* context, const ::grpc::testing::Request* request, ::grpc::ServerWriter< ::grpc::testing::Response>* writer) final override {
+ abort();
+ return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+ }
+ };
+ template <class BaseClass>
+ class WithGenericMethod_MethodA4 : public BaseClass {
+ private:
+ void BaseClassMustBeDerivedFromService(const Service *service) {}
+ public:
+ WithGenericMethod_MethodA4() {
+ ::grpc::Service::MarkMethodGeneric(3);
+ }
+ ~WithGenericMethod_MethodA4() override {
+ BaseClassMustBeDerivedFromService(this);
+ }
+ // disable synchronous version of this method
+ ::grpc::Status MethodA4(::grpc::ServerContext* context, ::grpc::ServerReaderWriter< ::grpc::testing::Response, ::grpc::testing::Request>* stream) final override {
+ abort();
+ return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+ }
+ };
+ template <class BaseClass>
class WithStreamedUnaryMethod_MethodA1 : public BaseClass {
private:
void BaseClassMustBeDerivedFromService(const Service *service) {}
@@ -228,8 +346,28 @@ class ServiceA final {
virtual ::grpc::Status StreamedMethodA1(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::grpc::testing::Request,::grpc::testing::Response>* server_unary_streamer) = 0;
};
typedef WithStreamedUnaryMethod_MethodA1<Service > StreamedUnaryService;
- typedef Service SplitStreamedService;
- typedef WithStreamedUnaryMethod_MethodA1<Service > StreamedService;
+ template <class BaseClass>
+ class WithSplitStreamingMethod_MethodA3 : public BaseClass {
+ private:
+ void BaseClassMustBeDerivedFromService(const Service *service) {}
+ public:
+ WithSplitStreamingMethod_MethodA3() {
+ ::grpc::Service::MarkMethodStreamed(2,
+ new ::grpc::SplitServerStreamingHandler< ::grpc::testing::Request, ::grpc::testing::Response>(std::bind(&WithSplitStreamingMethod_MethodA3<BaseClass>::StreamedMethodA3, this, std::placeholders::_1, std::placeholders::_2)));
+ }
+ ~WithSplitStreamingMethod_MethodA3() override {
+ BaseClassMustBeDerivedFromService(this);
+ }
+ // disable regular version of this method
+ ::grpc::Status MethodA3(::grpc::ServerContext* context, const ::grpc::testing::Request* request, ::grpc::ServerWriter< ::grpc::testing::Response>* writer) final override {
+ abort();
+ return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+ }
+ // replace default version of method with split streamed
+ virtual ::grpc::Status StreamedMethodA3(::grpc::ServerContext* context, ::grpc::ServerSplitStreamer< ::grpc::testing::Request,::grpc::testing::Response>* server_split_streamer) = 0;
+ };
+ typedef WithSplitStreamingMethod_MethodA3<Service > SplitStreamedService;
+ typedef WithStreamedUnaryMethod_MethodA1<WithSplitStreamingMethod_MethodA3<Service > > StreamedService;
};
// ServiceB leading comment 1
diff --git a/test/cpp/codegen/compiler_test_mock_golden b/test/cpp/codegen/compiler_test_mock_golden
new file mode 100644
index 0000000000..8e4b4d5911
--- /dev/null
+++ b/test/cpp/codegen/compiler_test_mock_golden
@@ -0,0 +1,34 @@
+// Generated by the gRPC C++ plugin.
+// If you make any local change, they will be lost.
+// source: src/proto/grpc/testing/compiler_test.proto
+
+#include "src/proto/grpc/testing/compiler_test.pb.h"
+#include "src/proto/grpc/testing/compiler_test.grpc.pb.h"
+
+#include <grpc++/impl/codegen/async_stream.h>
+#include <grpc++/impl/codegen/sync_stream.h>
+#include <gmock/gmock.h>
+namespace grpc {
+namespace testing {
+
+class MockServiceAStub : public ServiceA::StubInterface {
+ public:
+ MOCK_METHOD3(MethodA1, ::grpc::Status(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::testing::Response* response));
+ MOCK_METHOD3(AsyncMethodA1Raw, ::grpc::ClientAsyncResponseReaderInterface< ::grpc::testing::Response>*(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::CompletionQueue* cq));
+ MOCK_METHOD2(MethodA2Raw, ::grpc::ClientWriterInterface< ::grpc::testing::Request>*(::grpc::ClientContext* context, ::grpc::testing::Response* response));
+ MOCK_METHOD4(AsyncMethodA2Raw, ::grpc::ClientAsyncWriterInterface< ::grpc::testing::Request>*(::grpc::ClientContext* context, ::grpc::testing::Response* response, ::grpc::CompletionQueue* cq, void* tag));
+ MOCK_METHOD2(MethodA3Raw, ::grpc::ClientReaderInterface< ::grpc::testing::Response>*(::grpc::ClientContext* context, const ::grpc::testing::Request& request));
+ MOCK_METHOD4(AsyncMethodA3Raw, ::grpc::ClientAsyncReaderInterface< ::grpc::testing::Response>*(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::CompletionQueue* cq, void* tag));
+ MOCK_METHOD1(MethodA4Raw, ::grpc::ClientReaderWriterInterface< ::grpc::testing::Request, ::grpc::testing::Response>*(::grpc::ClientContext* context));
+ MOCK_METHOD3(AsyncMethodA4Raw, ::grpc::ClientAsyncReaderWriterInterface<::grpc::testing::Request, ::grpc::testing::Response>*(::grpc::ClientContext* context, ::grpc::CompletionQueue* cq, void* tag));
+};
+
+class MockServiceBStub : public ServiceB::StubInterface {
+ public:
+ MOCK_METHOD3(MethodB1, ::grpc::Status(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::testing::Response* response));
+ MOCK_METHOD3(AsyncMethodB1Raw, ::grpc::ClientAsyncResponseReaderInterface< ::grpc::testing::Response>*(::grpc::ClientContext* context, const ::grpc::testing::Request& request, ::grpc::CompletionQueue* cq));
+};
+
+} // namespace grpc
+} // namespace testing
+
diff --git a/test/cpp/codegen/golden_file_test.cc b/test/cpp/codegen/golden_file_test.cc
index 158a4d933c..7789ac738b 100644
--- a/test/cpp/codegen/golden_file_test.cc
+++ b/test/cpp/codegen/golden_file_test.cc
@@ -37,16 +37,18 @@
#include <gflags/gflags.h>
#include <gtest/gtest.h>
-DEFINE_string(generated_file_path, "",
- "path to the generated compiler_test.grpc.pb.h file");
+DEFINE_string(
+ generated_file_path, "",
+ "path to the directory containing generated files compiler_test.grpc.pb.h"
+ "and compiler_test_mock.grpc.pb.h");
const char kGoldenFilePath[] = "test/cpp/codegen/compiler_test_golden";
+const char kMockGoldenFilePath[] = "test/cpp/codegen/compiler_test_mock_golden";
-TEST(GoldenFileTest, TestGeneratedFile) {
- ASSERT_FALSE(FLAGS_generated_file_path.empty());
-
- std::ifstream generated(FLAGS_generated_file_path);
- std::ifstream golden(kGoldenFilePath);
+void run_test(std::basic_string<char> generated_file,
+ std::basic_string<char> golden_file) {
+ std::ifstream generated(generated_file);
+ std::ifstream golden(golden_file);
ASSERT_TRUE(generated.good());
ASSERT_TRUE(golden.good());
@@ -61,8 +63,23 @@ TEST(GoldenFileTest, TestGeneratedFile) {
golden.close();
}
+TEST(GoldenFileTest, TestGeneratedFile) {
+ run_test(FLAGS_generated_file_path + "compiler_test.grpc.pb.h",
+ kGoldenFilePath);
+}
+
+TEST(GoldenMockFileTest, TestGeneratedMockFile) {
+ run_test(FLAGS_generated_file_path + "compiler_test_mock.grpc.pb.h",
+ kMockGoldenFilePath);
+}
+
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
::google::ParseCommandLineFlags(&argc, &argv, true);
+ if (FLAGS_generated_file_path.empty()) {
+ FLAGS_generated_file_path = "gens/src/proto/grpc/testing/";
+ }
+ if (FLAGS_generated_file_path.back() != '/')
+ FLAGS_generated_file_path.append("/");
return RUN_ALL_TESTS();
}
diff --git a/test/cpp/end2end/BUILD b/test/cpp/end2end/BUILD
index 0bf7948fcf..f1212e15c7 100644
--- a/test/cpp/end2end/BUILD
+++ b/test/cpp/end2end/BUILD
@@ -51,6 +51,7 @@ cc_test(
"//src/proto/grpc/testing:echo_messages_proto",
"//src/proto/grpc/testing:echo_proto",
"//src/proto/grpc/testing/duplicate:echo_duplicate_proto",
+ "//src/proto/grpc/health/v1:health_proto",
"//test/core/util:gpr_test_util",
"//test/core/util:grpc_test_util",
"//test/cpp/util:test_util",
diff --git a/test/cpp/end2end/async_end2end_test.cc b/test/cpp/end2end/async_end2end_test.cc
index 0b5215ef8e..cc3958bf13 100644
--- a/test/cpp/end2end/async_end2end_test.cc
+++ b/test/cpp/end2end/async_end2end_test.cc
@@ -38,6 +38,7 @@
#include <grpc++/channel.h>
#include <grpc++/client_context.h>
#include <grpc++/create_channel.h>
+#include <grpc++/ext/health_check_service_server_builder_option.h>
#include <grpc++/server.h>
#include <grpc++/server_builder.h>
#include <grpc++/server_context.h>
@@ -49,6 +50,7 @@
#include <gtest/gtest.h>
#include "src/core/lib/iomgr/port.h"
+#include "src/proto/grpc/health/v1/health.grpc.pb.h"
#include "src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h"
#include "src/proto/grpc/testing/echo.grpc.pb.h"
#include "test/core/util/port.h"
@@ -224,13 +226,15 @@ class ServerBuilderSyncPluginDisabler : public ::grpc::ServerBuilderOption {
class TestScenario {
public:
- TestScenario(bool non_block, const grpc::string& creds_type,
+ TestScenario(bool non_block, const grpc::string& creds_type, bool hcs,
const grpc::string& content)
: disable_blocking(non_block),
+ health_check_service(hcs),
credentials_type(creds_type),
message_content(content) {}
void Log() const;
bool disable_blocking;
+ bool health_check_service;
// Although the below grpc::string's are logically const, we can't declare
// them const because of a limitation in the way old compilers (e.g., gcc-4.4)
// manage vector insertion using a copy constructor
@@ -243,6 +247,8 @@ static std::ostream& operator<<(std::ostream& out,
return out << "TestScenario{disable_blocking="
<< (scenario.disable_blocking ? "true" : "false")
<< ", credentials='" << scenario.credentials_type
+ << ", health_check_service="
+ << (scenario.health_check_service ? "true" : "false")
<< "', message_size=" << scenario.message_content.size() << "}";
}
@@ -252,6 +258,8 @@ void TestScenario::Log() const {
gpr_log(GPR_DEBUG, "%s", out.str().c_str());
}
+class HealthCheck : public health::v1::Health::Service {};
+
class AsyncEnd2endTest : public ::testing::TestWithParam<TestScenario> {
protected:
AsyncEnd2endTest() { GetParam().Log(); }
@@ -268,6 +276,9 @@ class AsyncEnd2endTest : public ::testing::TestWithParam<TestScenario> {
GetParam().credentials_type);
builder.AddListeningPort(server_address_.str(), server_creds);
builder.RegisterService(&service_);
+ if (GetParam().health_check_service) {
+ builder.RegisterService(&health_check_);
+ }
cq_ = builder.AddCompletionQueue();
// TODO(zyc): make a test option to choose wheather sync plugins should be
@@ -340,6 +351,7 @@ class AsyncEnd2endTest : public ::testing::TestWithParam<TestScenario> {
std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
std::unique_ptr<Server> server_;
grpc::testing::EchoTestService::AsyncService service_;
+ HealthCheck health_check_;
std::ostringstream server_address_;
int port_;
@@ -1754,12 +1766,14 @@ std::vector<TestScenario> CreateTestScenarios(bool test_disable_blocking,
messages.push_back(big_msg);
}
- for (auto cred = credentials_types.begin(); cred != credentials_types.end();
- ++cred) {
- for (auto msg = messages.begin(); msg != messages.end(); msg++) {
- scenarios.emplace_back(false, *cred, *msg);
- if (test_disable_blocking) {
- scenarios.emplace_back(true, *cred, *msg);
+ for (auto health_check_service : {false, true}) {
+ for (auto cred = credentials_types.begin(); cred != credentials_types.end();
+ ++cred) {
+ for (auto msg = messages.begin(); msg != messages.end(); msg++) {
+ scenarios.emplace_back(false, *cred, health_check_service, *msg);
+ if (test_disable_blocking) {
+ scenarios.emplace_back(true, *cred, health_check_service, *msg);
+ }
}
}
}
diff --git a/test/cpp/end2end/mock_test.cc b/test/cpp/end2end/mock_test.cc
index fdb2732e50..7e330063ed 100644
--- a/test/cpp/end2end/mock_test.cc
+++ b/test/cpp/end2end/mock_test.cc
@@ -34,6 +34,7 @@
#include <climits>
#include <thread>
+#include <gmock/gmock.h>
#include <grpc++/channel.h>
#include <grpc++/client_context.h>
#include <grpc++/create_channel.h>
@@ -46,120 +47,35 @@
#include <grpc/support/time.h>
#include <gtest/gtest.h>
+#include <grpc++/test/mock_stream.h>
+
#include "src/proto/grpc/testing/duplicate/echo_duplicate.grpc.pb.h"
#include "src/proto/grpc/testing/echo.grpc.pb.h"
+#include "src/proto/grpc/testing/echo_mock.grpc.pb.h"
#include "test/core/util/port.h"
#include "test/core/util/test_config.h"
+#include <iostream>
+
+using namespace std;
using grpc::testing::EchoRequest;
using grpc::testing::EchoResponse;
using grpc::testing::EchoTestService;
+using grpc::testing::MockClientReaderWriter;
using std::chrono::system_clock;
+using ::testing::AtLeast;
+using ::testing::SetArgPointee;
+using ::testing::SaveArg;
+using ::testing::_;
+using ::testing::Return;
+using ::testing::Invoke;
+using ::testing::WithArg;
+using ::testing::DoAll;
namespace grpc {
namespace testing {
namespace {
-template <class W, class R>
-class MockClientReaderWriter final : public ClientReaderWriterInterface<W, R> {
- public:
- void WaitForInitialMetadata() override {}
- bool NextMessageSize(uint32_t* sz) override {
- *sz = UINT_MAX;
- return true;
- }
- bool Read(R* msg) override { return true; }
- bool Write(const W& msg) override { return true; }
- bool WritesDone() override { return true; }
- Status Finish() override { return Status::OK; }
-};
-template <>
-class MockClientReaderWriter<EchoRequest, EchoResponse> final
- : public ClientReaderWriterInterface<EchoRequest, EchoResponse> {
- public:
- MockClientReaderWriter() : writes_done_(false) {}
- void WaitForInitialMetadata() override {}
- bool NextMessageSize(uint32_t* sz) override {
- *sz = UINT_MAX;
- return true;
- }
- bool Read(EchoResponse* msg) override {
- if (writes_done_) return false;
- msg->set_message(last_message_);
- return true;
- }
-
- bool Write(const EchoRequest& msg, WriteOptions options) override {
- gpr_log(GPR_INFO, "mock recv msg %s", msg.message().c_str());
- last_message_ = msg.message();
- return true;
- }
- bool WritesDone() override {
- writes_done_ = true;
- return true;
- }
- Status Finish() override { return Status::OK; }
-
- private:
- bool writes_done_;
- grpc::string last_message_;
-};
-
-// Mocked stub.
-class MockStub : public EchoTestService::StubInterface {
- public:
- MockStub() {}
- ~MockStub() {}
- Status Echo(ClientContext* context, const EchoRequest& request,
- EchoResponse* response) override {
- response->set_message(request.message());
- return Status::OK;
- }
- Status Unimplemented(ClientContext* context, const EchoRequest& request,
- EchoResponse* response) override {
- return Status::OK;
- }
-
- private:
- ClientAsyncResponseReaderInterface<EchoResponse>* AsyncEchoRaw(
- ClientContext* context, const EchoRequest& request,
- CompletionQueue* cq) override {
- return nullptr;
- }
- ClientWriterInterface<EchoRequest>* RequestStreamRaw(
- ClientContext* context, EchoResponse* response) override {
- return nullptr;
- }
- ClientAsyncWriterInterface<EchoRequest>* AsyncRequestStreamRaw(
- ClientContext* context, EchoResponse* response, CompletionQueue* cq,
- void* tag) override {
- return nullptr;
- }
- ClientReaderInterface<EchoResponse>* ResponseStreamRaw(
- ClientContext* context, const EchoRequest& request) override {
- return nullptr;
- }
- ClientAsyncReaderInterface<EchoResponse>* AsyncResponseStreamRaw(
- ClientContext* context, const EchoRequest& request, CompletionQueue* cq,
- void* tag) override {
- return nullptr;
- }
- ClientReaderWriterInterface<EchoRequest, EchoResponse>* BidiStreamRaw(
- ClientContext* context) override {
- return new MockClientReaderWriter<EchoRequest, EchoResponse>();
- }
- ClientAsyncReaderWriterInterface<EchoRequest, EchoResponse>*
- AsyncBidiStreamRaw(ClientContext* context, CompletionQueue* cq,
- void* tag) override {
- return nullptr;
- }
- ClientAsyncResponseReaderInterface<EchoResponse>* AsyncUnimplementedRaw(
- ClientContext* context, const EchoRequest& request,
- CompletionQueue* cq) override {
- return nullptr;
- }
-};
-
class FakeClient {
public:
explicit FakeClient(EchoTestService::StubInterface* stub) : stub_(stub) {}
@@ -174,6 +90,55 @@ class FakeClient {
EXPECT_TRUE(s.ok());
}
+ void DoRequestStream() {
+ EchoRequest request;
+ EchoResponse response;
+
+ ClientContext context;
+ grpc::string msg("hello");
+ grpc::string exp(msg);
+
+ std::unique_ptr<ClientWriterInterface<EchoRequest>> cstream =
+ stub_->RequestStream(&context, &response);
+
+ request.set_message(msg);
+ EXPECT_TRUE(cstream->Write(request));
+
+ msg = ", world";
+ request.set_message(msg);
+ exp.append(msg);
+ EXPECT_TRUE(cstream->Write(request));
+
+ cstream->WritesDone();
+ Status s = cstream->Finish();
+
+ EXPECT_EQ(exp, response.message());
+ EXPECT_TRUE(s.ok());
+ }
+
+ void DoResponseStream() {
+ EchoRequest request;
+ EchoResponse response;
+ request.set_message("hello world");
+
+ ClientContext context;
+ std::unique_ptr<ClientReaderInterface<EchoResponse>> cstream =
+ stub_->ResponseStream(&context, request);
+
+ grpc::string exp = "";
+ EXPECT_TRUE(cstream->Read(&response));
+ exp.append(response.message() + " ");
+
+ EXPECT_TRUE(cstream->Read(&response));
+ exp.append(response.message());
+
+ EXPECT_FALSE(cstream->Read(&response));
+ EXPECT_EQ(request.message(), exp);
+
+ Status s = cstream->Finish();
+ EXPECT_TRUE(s.ok());
+ }
+
void DoBidiStream() {
EchoRequest request;
EchoResponse response;
@@ -219,6 +184,30 @@ class TestServiceImpl : public EchoTestService::Service {
return Status::OK;
}
+ Status RequestStream(ServerContext* context,
+ ServerReader<EchoRequest>* reader,
+ EchoResponse* response) override {
+ EchoRequest request;
+ grpc::string resp("");
+ while (reader->Read(&request)) {
+ gpr_log(GPR_INFO, "recv msg %s", request.message().c_str());
+ resp.append(request.message());
+ }
+ response->set_message(resp);
+ return Status::OK;
+ }
+
+ Status ResponseStream(ServerContext* context, const EchoRequest* request,
+ ServerWriter<EchoResponse>* writer) override {
+ EchoResponse response;
+ vector<grpc::string> tokens = split(request->message());
+ for (grpc::string token : tokens) {
+ response.set_message(token);
+ writer->Write(response);
+ }
+ return Status::OK;
+ }
+
Status BidiStream(
ServerContext* context,
ServerReaderWriter<EchoResponse, EchoRequest>* stream) override {
@@ -231,6 +220,25 @@ class TestServiceImpl : public EchoTestService::Service {
}
return Status::OK;
}
+
+ private:
+ const vector<grpc::string> split(const grpc::string& input) {
+ grpc::string buff("");
+ vector<grpc::string> result;
+
+ for (auto n : input) {
+ if (n != ' ') {
+ buff += n;
+ continue;
+ }
+ if (buff == "") continue;
+ result.push_back(buff);
+ buff = "";
+ }
+ if (buff != "") result.push_back(buff);
+
+ return result;
+ }
};
class MockTest : public ::testing::Test {
@@ -267,16 +275,82 @@ TEST_F(MockTest, SimpleRpc) {
ResetStub();
FakeClient client(stub_.get());
client.DoEcho();
- MockStub stub;
+ MockEchoTestServiceStub stub;
+ EchoResponse resp;
+ resp.set_message("hello world");
+ EXPECT_CALL(stub, Echo(_, _, _))
+ .Times(AtLeast(1))
+ .WillOnce(DoAll(SetArgPointee<2>(resp), Return(Status::OK)));
client.ResetStub(&stub);
client.DoEcho();
}
+TEST_F(MockTest, ClientStream) {
+ ResetStub();
+ FakeClient client(stub_.get());
+ client.DoRequestStream();
+
+ MockEchoTestServiceStub stub;
+ auto w = new MockClientWriter<EchoRequest>();
+ EchoResponse resp;
+ resp.set_message("hello, world");
+
+ EXPECT_CALL(*w, Write(_, _)).Times(2).WillRepeatedly(Return(true));
+ EXPECT_CALL(*w, WritesDone());
+ EXPECT_CALL(*w, Finish()).WillOnce(Return(Status::OK));
+
+ EXPECT_CALL(stub, RequestStreamRaw(_, _))
+ .WillOnce(DoAll(SetArgPointee<1>(resp), Return(w)));
+ client.ResetStub(&stub);
+ client.DoRequestStream();
+}
+
+TEST_F(MockTest, ServerStream) {
+ ResetStub();
+ FakeClient client(stub_.get());
+ client.DoResponseStream();
+
+ MockEchoTestServiceStub stub;
+ auto r = new MockClientReader<EchoResponse>();
+ EchoResponse resp1;
+ resp1.set_message("hello");
+ EchoResponse resp2;
+ resp2.set_message("world");
+
+ EXPECT_CALL(*r, Read(_))
+ .WillOnce(DoAll(SetArgPointee<0>(resp1), Return(true)))
+ .WillOnce(DoAll(SetArgPointee<0>(resp2), Return(true)))
+ .WillOnce(Return(false));
+ EXPECT_CALL(*r, Finish()).WillOnce(Return(Status::OK));
+
+ EXPECT_CALL(stub, ResponseStreamRaw(_, _)).WillOnce(Return(r));
+
+ client.ResetStub(&stub);
+ client.DoResponseStream();
+}
+
+ACTION_P(copy, msg) { arg0->set_message(msg->message()); }
+
TEST_F(MockTest, BidiStream) {
ResetStub();
FakeClient client(stub_.get());
client.DoBidiStream();
- MockStub stub;
+ MockEchoTestServiceStub stub;
+ auto rw = new MockClientReaderWriter<EchoRequest, EchoResponse>();
+ EchoRequest msg;
+
+ EXPECT_CALL(*rw, Write(_, _))
+ .Times(3)
+ .WillRepeatedly(DoAll(SaveArg<0>(&msg), Return(true)));
+ EXPECT_CALL(*rw, Read(_))
+ .WillOnce(DoAll(WithArg<0>(copy(&msg)), Return(true)))
+ .WillOnce(DoAll(WithArg<0>(copy(&msg)), Return(true)))
+ .WillOnce(DoAll(WithArg<0>(copy(&msg)), Return(true)))
+ .WillOnce(Return(false));
+ EXPECT_CALL(*rw, WritesDone());
+ EXPECT_CALL(*rw, Finish()).WillOnce(Return(Status::OK));
+
+ EXPECT_CALL(stub, BidiStreamRaw(_)).WillOnce(Return(rw));
client.ResetStub(&stub);
client.DoBidiStream();
}
diff --git a/test/cpp/grpclb/grpclb_test.cc b/test/cpp/grpclb/grpclb_test.cc
index 997a8391eb..a002c7f77d 100644
--- a/test/cpp/grpclb/grpclb_test.cc
+++ b/test/cpp/grpclb/grpclb_test.cc
@@ -310,7 +310,7 @@ static void start_lb_server(server_fixture *sf, int *ports, size_t nports,
gpr_log(GPR_INFO, "LB Server[%s](%s) after tag 204. All done. LB server out",
sf->servers_hostport, sf->balancer_name);
- grpc_call_destroy(s);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
@@ -457,7 +457,7 @@ static void start_backend_server(server_fixture *sf) {
gpr_log(GPR_INFO, "Server[%s] DONE. After servicing %d calls",
sf->servers_hostport, sf->num_calls_serviced);
- grpc_call_destroy(s);
+ grpc_call_unref(s);
cq_verifier_destroy(cqv);
grpc_metadata_array_destroy(&request_metadata_recv);
grpc_call_details_destroy(&call_details);
@@ -557,7 +557,7 @@ static void perform_request(client_fixture *cf) {
peer = grpc_call_get_peer(c);
gpr_log(GPR_INFO, "Client DONE WITH SERVER %s ", peer);
- grpc_call_destroy(c);
+ grpc_call_unref(c);
cq_verify_empty_timeout(cqv, 1 /* seconds */);
cq_verifier_destroy(cqv);
diff --git a/test/cpp/interop/BUILD b/test/cpp/interop/BUILD
new file mode 100644
index 0000000000..1a3e8d916f
--- /dev/null
+++ b/test/cpp/interop/BUILD
@@ -0,0 +1,90 @@
+# Copyright 2017, 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.
+
+licenses(["notice"]) # 3-clause BSD
+
+cc_library(
+ name = "server_helper_lib",
+ srcs = [
+ "server_helper.cc",
+ ],
+ hdrs = [
+ "server_helper.h",
+ ],
+ deps = [
+ "//test/cpp/util:test_util",
+ "//external:gflags",
+ ],
+)
+
+cc_binary(
+ name = "interop_server",
+ srcs = [
+ "interop_server.cc",
+ "interop_server_bootstrap.cc",
+ ],
+ deps = [
+ ":server_helper_lib",
+ "//:grpc++",
+ "//src/proto/grpc/testing:empty_proto",
+ "//src/proto/grpc/testing:messages_proto",
+ "//src/proto/grpc/testing:test_proto",
+ "//test/cpp/util:test_config",
+ ],
+)
+
+cc_library(
+ name = "client_helper_lib",
+ srcs = [
+ "client_helper.cc",
+ "interop_client.cc",
+ ],
+ hdrs = [
+ "client_helper.h",
+ "interop_client.h",
+ ],
+ deps = [
+ "//test/cpp/util:test_util",
+ "//src/proto/grpc/testing:empty_proto",
+ "//src/proto/grpc/testing:messages_proto",
+ "//src/proto/grpc/testing:test_proto",
+ "//test/core/security:oauth2_utils",
+ "//test/cpp/util:test_config",
+ ],
+)
+
+cc_binary(
+ name = "interop_client",
+ srcs = [
+ "client.cc",
+ ],
+ deps = [
+ ":client_helper_lib",
+ ],
+)
diff --git a/test/cpp/interop/http2_client.cc b/test/cpp/interop/http2_client.cc
index 38a437f39f..2109e34616 100644
--- a/test/cpp/interop/http2_client.cc
+++ b/test/cpp/interop/http2_client.cc
@@ -108,7 +108,7 @@ bool Http2Client::DoRstAfterData() {
SimpleResponse response;
AssertStatusCode(SendUnaryCall(&response), grpc::StatusCode::INTERNAL);
- GPR_ASSERT(response.has_payload()); // data should be received
+ // There is no guarantee that data would be received.
gpr_log(GPR_DEBUG, "Done testing reset stream after data");
return true;
diff --git a/test/cpp/microbenchmarks/bm_call_create.cc b/test/cpp/microbenchmarks/bm_call_create.cc
index 8373eead61..c91219e98c 100644
--- a/test/cpp/microbenchmarks/bm_call_create.cc
+++ b/test/cpp/microbenchmarks/bm_call_create.cc
@@ -68,10 +68,12 @@ auto &force_library_initialization = Library::get();
void BM_Zalloc(benchmark::State &state) {
// speed of light for call creation is zalloc, so benchmark a few interesting
// sizes
+ TrackCounters track_counters;
size_t sz = state.range(0);
while (state.KeepRunning()) {
gpr_free(gpr_zalloc(sz));
}
+ track_counters.Finish(state);
}
BENCHMARK(BM_Zalloc)
->Arg(64)
@@ -124,7 +126,7 @@ static void BM_CallCreateDestroy(benchmark::State &state) {
void *method_hdl =
grpc_channel_register_call(fixture.channel(), "/foo/bar", NULL, NULL);
while (state.KeepRunning()) {
- grpc_call_destroy(grpc_channel_create_registered_call(
+ grpc_call_unref(grpc_channel_create_registered_call(
fixture.channel(), NULL, GRPC_PROPAGATE_DEFAULTS, cq, method_hdl,
deadline, NULL));
}
@@ -166,6 +168,165 @@ static void BM_LameChannelCallCreateCpp(benchmark::State &state) {
}
BENCHMARK(BM_LameChannelCallCreateCpp);
+static void do_nothing(void *ignored) {}
+
+static void BM_LameChannelCallCreateCore(benchmark::State &state) {
+ TrackCounters track_counters;
+
+ grpc_channel *channel;
+ grpc_completion_queue *cq;
+ grpc_metadata_array initial_metadata_recv;
+ grpc_metadata_array trailing_metadata_recv;
+ grpc_byte_buffer *response_payload_recv = NULL;
+ grpc_status_code status;
+ grpc_slice details;
+ grpc::testing::EchoRequest send_request;
+ grpc_slice send_request_slice =
+ grpc_slice_new(&send_request, sizeof(send_request), do_nothing);
+
+ channel = grpc_lame_client_channel_create(
+ "localhost:1234", GRPC_STATUS_UNAUTHENTICATED, "blah");
+ cq = grpc_completion_queue_create_for_next(NULL);
+ void *rc = grpc_channel_register_call(
+ channel, "/grpc.testing.EchoTestService/Echo", NULL, NULL);
+ while (state.KeepRunning()) {
+ GPR_TIMER_SCOPE("BenchmarkCycle", 0);
+ grpc_call *call = grpc_channel_create_registered_call(
+ channel, NULL, GRPC_PROPAGATE_DEFAULTS, cq, rc,
+ gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
+ grpc_metadata_array_init(&initial_metadata_recv);
+ grpc_metadata_array_init(&trailing_metadata_recv);
+ grpc_byte_buffer *request_payload_send =
+ grpc_raw_byte_buffer_create(&send_request_slice, 1);
+
+ // Fill in call ops
+ grpc_op ops[6];
+ memset(ops, 0, sizeof(ops));
+ grpc_op *op = ops;
+ op->op = GRPC_OP_SEND_INITIAL_METADATA;
+ op->data.send_initial_metadata.count = 0;
+ op++;
+ op->op = GRPC_OP_SEND_MESSAGE;
+ op->data.send_message.send_message = request_payload_send;
+ op++;
+ op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
+ op++;
+ op->op = GRPC_OP_RECV_INITIAL_METADATA;
+ op->data.recv_initial_metadata.recv_initial_metadata =
+ &initial_metadata_recv;
+ op++;
+ op->op = GRPC_OP_RECV_MESSAGE;
+ op->data.recv_message.recv_message = &response_payload_recv;
+ op++;
+ 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++;
+
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(call, ops,
+ (size_t)(op - ops),
+ (void *)1, NULL));
+ grpc_event ev = grpc_completion_queue_next(
+ cq, gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
+ GPR_ASSERT(ev.type != GRPC_QUEUE_SHUTDOWN);
+ GPR_ASSERT(ev.success != 0);
+ grpc_call_unref(call);
+ grpc_byte_buffer_destroy(request_payload_send);
+ grpc_byte_buffer_destroy(response_payload_recv);
+ grpc_metadata_array_destroy(&initial_metadata_recv);
+ grpc_metadata_array_destroy(&trailing_metadata_recv);
+ }
+ grpc_channel_destroy(channel);
+ grpc_completion_queue_destroy(cq);
+ grpc_slice_unref(send_request_slice);
+ track_counters.Finish(state);
+}
+BENCHMARK(BM_LameChannelCallCreateCore);
+
+static void BM_LameChannelCallCreateCoreSeparateBatch(benchmark::State &state) {
+ TrackCounters track_counters;
+
+ grpc_channel *channel;
+ grpc_completion_queue *cq;
+ grpc_metadata_array initial_metadata_recv;
+ grpc_metadata_array trailing_metadata_recv;
+ grpc_byte_buffer *response_payload_recv = NULL;
+ grpc_status_code status;
+ grpc_slice details;
+ grpc::testing::EchoRequest send_request;
+ grpc_slice send_request_slice =
+ grpc_slice_new(&send_request, sizeof(send_request), do_nothing);
+
+ channel = grpc_lame_client_channel_create(
+ "localhost:1234", GRPC_STATUS_UNAUTHENTICATED, "blah");
+ cq = grpc_completion_queue_create_for_next(NULL);
+ void *rc = grpc_channel_register_call(
+ channel, "/grpc.testing.EchoTestService/Echo", NULL, NULL);
+ while (state.KeepRunning()) {
+ GPR_TIMER_SCOPE("BenchmarkCycle", 0);
+ grpc_call *call = grpc_channel_create_registered_call(
+ channel, NULL, GRPC_PROPAGATE_DEFAULTS, cq, rc,
+ gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
+ grpc_metadata_array_init(&initial_metadata_recv);
+ grpc_metadata_array_init(&trailing_metadata_recv);
+ grpc_byte_buffer *request_payload_send =
+ grpc_raw_byte_buffer_create(&send_request_slice, 1);
+
+ // Fill in call ops
+ grpc_op ops[3];
+ memset(ops, 0, sizeof(ops));
+ grpc_op *op = ops;
+ op->op = GRPC_OP_SEND_INITIAL_METADATA;
+ op->data.send_initial_metadata.count = 0;
+ op++;
+ op->op = GRPC_OP_SEND_MESSAGE;
+ op->data.send_message.send_message = request_payload_send;
+ op++;
+ op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT;
+ op++;
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(call, ops,
+ (size_t)(op - ops),
+ (void *)0, NULL));
+ memset(ops, 0, sizeof(ops));
+ op = ops;
+ op->op = GRPC_OP_RECV_INITIAL_METADATA;
+ op->data.recv_initial_metadata.recv_initial_metadata =
+ &initial_metadata_recv;
+ op++;
+ op->op = GRPC_OP_RECV_MESSAGE;
+ op->data.recv_message.recv_message = &response_payload_recv;
+ op++;
+ 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++;
+
+ GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(call, ops,
+ (size_t)(op - ops),
+ (void *)1, NULL));
+ grpc_event ev = grpc_completion_queue_next(
+ cq, gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
+ GPR_ASSERT(ev.type != GRPC_QUEUE_SHUTDOWN);
+ GPR_ASSERT(ev.success == 0);
+ ev = grpc_completion_queue_next(cq, gpr_inf_future(GPR_CLOCK_REALTIME),
+ NULL);
+ GPR_ASSERT(ev.type != GRPC_QUEUE_SHUTDOWN);
+ GPR_ASSERT(ev.success != 0);
+ grpc_call_unref(call);
+ grpc_byte_buffer_destroy(request_payload_send);
+ grpc_byte_buffer_destroy(response_payload_recv);
+ grpc_metadata_array_destroy(&initial_metadata_recv);
+ grpc_metadata_array_destroy(&trailing_metadata_recv);
+ }
+ grpc_channel_destroy(channel);
+ grpc_completion_queue_destroy(cq);
+ grpc_slice_unref(send_request_slice);
+ track_counters.Finish(state);
+}
+BENCHMARK(BM_LameChannelCallCreateCoreSeparateBatch);
+
static void FilterDestroy(grpc_exec_ctx *exec_ctx, void *arg,
grpc_error *error) {
gpr_free(arg);
@@ -560,7 +721,7 @@ static const grpc_channel_filter isolated_call_filter = {
GetPeer,
GetChannelInfo,
"isolated_call_filter"};
-}
+} // namespace isolated_call_filter
class IsolatedCallFixture : public TrackCounters {
public:
@@ -600,7 +761,7 @@ static void BM_IsolatedCall_NoOp(benchmark::State &state) {
grpc_channel_register_call(fixture.channel(), "/foo/bar", NULL, NULL);
while (state.KeepRunning()) {
GPR_TIMER_SCOPE("BenchmarkCycle", 0);
- grpc_call_destroy(grpc_channel_create_registered_call(
+ grpc_call_unref(grpc_channel_create_registered_call(
fixture.channel(), nullptr, GRPC_PROPAGATE_DEFAULTS, fixture.cq(),
method_hdl, deadline, NULL));
}
@@ -645,7 +806,7 @@ static void BM_IsolatedCall_Unary(benchmark::State &state) {
grpc_call_start_batch(call, ops, 6, tag(1), NULL);
grpc_completion_queue_next(fixture.cq(),
gpr_inf_future(GPR_CLOCK_MONOTONIC), NULL);
- grpc_call_destroy(call);
+ grpc_call_unref(call);
}
fixture.Finish(state);
grpc_metadata_array_destroy(&recv_initial_metadata);
@@ -686,7 +847,7 @@ static void BM_IsolatedCall_StreamingSend(benchmark::State &state) {
grpc_completion_queue_next(fixture.cq(),
gpr_inf_future(GPR_CLOCK_MONOTONIC), NULL);
}
- grpc_call_destroy(call);
+ grpc_call_unref(call);
fixture.Finish(state);
grpc_metadata_array_destroy(&recv_initial_metadata);
grpc_metadata_array_destroy(&recv_trailing_metadata);
diff --git a/test/cpp/microbenchmarks/fullstack_fixtures.h b/test/cpp/microbenchmarks/fullstack_fixtures.h
index f129ede26a..98aca1c346 100644
--- a/test/cpp/microbenchmarks/fullstack_fixtures.h
+++ b/test/cpp/microbenchmarks/fullstack_fixtures.h
@@ -113,13 +113,17 @@ class TCP : public FullstackFixture {
public:
TCP(Service* service, const FixtureConfiguration& fixture_configuration =
FixtureConfiguration())
- : FullstackFixture(service, fixture_configuration, MakeAddress()) {}
+ : FullstackFixture(service, fixture_configuration, MakeAddress(&port_)) {}
+
+ ~TCP() { grpc_recycle_unused_port(port_); }
private:
- static grpc::string MakeAddress() {
- int port = grpc_pick_unused_port_or_die();
+ int port_;
+
+ static grpc::string MakeAddress(int* port) {
+ *port = grpc_pick_unused_port_or_die();
std::stringstream addr;
- addr << "localhost:" << port;
+ addr << "localhost:" << *port;
return addr.str();
}
};
@@ -128,14 +132,18 @@ class UDS : public FullstackFixture {
public:
UDS(Service* service, const FixtureConfiguration& fixture_configuration =
FixtureConfiguration())
- : FullstackFixture(service, fixture_configuration, MakeAddress()) {}
+ : FullstackFixture(service, fixture_configuration, MakeAddress(&port_)) {}
+
+ ~UDS() { grpc_recycle_unused_port(port_); }
private:
- static grpc::string MakeAddress() {
- int port = grpc_pick_unused_port_or_die(); // just for a unique id - not a
- // real port
+ int port_;
+
+ static grpc::string MakeAddress(int* port) {
+ *port = grpc_pick_unused_port_or_die(); // just for a unique id - not a
+ // real port
std::stringstream addr;
- addr << "unix:/tmp/bm_fullstack." << port;
+ addr << "unix:/tmp/bm_fullstack." << *port;
return addr.str();
}
};
diff --git a/test/cpp/microbenchmarks/helpers.cc b/test/cpp/microbenchmarks/helpers.cc
index d277c5984c..6550742453 100644
--- a/test/cpp/microbenchmarks/helpers.cc
+++ b/test/cpp/microbenchmarks/helpers.cc
@@ -57,6 +57,10 @@ void TrackCounters::AddToLabel(std::ostream &out, benchmark::State &state) {
<< ((double)(gpr_atm_no_barrier_load(&gpr_counter_atm_add) -
atm_add_at_start_) /
(double)state.iterations())
+ << " nows/iter:"
+ << ((double)(gpr_atm_no_barrier_load(&gpr_now_call_count) -
+ now_calls_at_start_) /
+ (double)state.iterations())
<< " allocs/iter:"
<< ((double)(counters_at_end.total_allocs_absolute -
counters_at_start_.total_allocs_absolute) /
diff --git a/test/cpp/microbenchmarks/helpers.h b/test/cpp/microbenchmarks/helpers.h
index 49ed517b1d..7360a1c9f2 100644
--- a/test/cpp/microbenchmarks/helpers.h
+++ b/test/cpp/microbenchmarks/helpers.h
@@ -72,6 +72,7 @@ class Library {
extern "C" gpr_atm gpr_mu_locks;
extern "C" gpr_atm gpr_counter_atm_cas;
extern "C" gpr_atm gpr_counter_atm_add;
+extern "C" gpr_atm gpr_now_call_count;
#endif
class TrackCounters {
@@ -86,6 +87,8 @@ class TrackCounters {
gpr_atm_no_barrier_load(&gpr_counter_atm_cas);
const size_t atm_add_at_start_ =
gpr_atm_no_barrier_load(&gpr_counter_atm_add);
+ const size_t now_calls_at_start_ =
+ gpr_atm_no_barrier_load(&gpr_now_call_count);
grpc_memory_counters counters_at_start_ = grpc_memory_counters_snapshot();
#endif
};
diff --git a/test/cpp/thread_manager/thread_manager_test.cc b/test/cpp/thread_manager/thread_manager_test.cc
index 35c8d5d088..e1a03666f0 100644
--- a/test/cpp/thread_manager/thread_manager_test.cc
+++ b/test/cpp/thread_manager/thread_manager_test.cc
@@ -118,7 +118,7 @@ void ThreadManagerTest::PerformTest() {
// The number of times DoWork() was called is equal to the number of times
// WORK_FOUND was returned
- gpr_log(GPR_DEBUG, "DoWork() called %ld times",
+ gpr_log(GPR_DEBUG, "DoWork() called %" PRIdPTR " times",
gpr_atm_no_barrier_load(&num_do_work_));
GPR_ASSERT(gpr_atm_no_barrier_load(&num_do_work_) ==
gpr_atm_no_barrier_load(&num_work_found_));
diff --git a/test/cpp/util/BUILD b/test/cpp/util/BUILD
index 38f804ffd4..9dde22b4d1 100644
--- a/test/cpp/util/BUILD
+++ b/test/cpp/util/BUILD
@@ -29,6 +29,15 @@
licenses(["notice"]) # 3-clause BSD
+# The following builds a shared-object to confirm that grpc++_unsecure
+# builds properly. Build-only is sufficient here
+cc_binary(
+ name = "testso.so",
+ srcs = [],
+ linkshared = 1,
+ deps = ["//:grpc++_unsecure"],
+)
+
cc_library(
name = "test_config",
srcs = [
@@ -95,5 +104,29 @@ cc_test(
],
)
-
-
+cc_binary(
+ name = "grpc_cli",
+ srcs = [
+ "cli_call.cc",
+ "cli_call.h",
+ "cli_credentials.cc",
+ "cli_credentials.h",
+ "config_grpc_cli.h",
+ "grpc_cli.cc",
+ "grpc_tool.cc",
+ "grpc_tool.h",
+ "proto_file_parser.cc",
+ "proto_file_parser.h",
+ "proto_reflection_descriptor_database.cc",
+ "proto_reflection_descriptor_database.h",
+ "service_describer.cc",
+ "service_describer.h",
+ "test_config.h",
+ "test_config_cc.cc",
+ ],
+ deps = [
+ "//:grpc++",
+ "//external:gflags",
+ "//src/proto/grpc/reflection/v1alpha:reflection_proto",
+ ],
+)
diff --git a/test/distrib/cpp/run_distrib_test.sh b/test/distrib/cpp/run_distrib_test.sh
index 15fbf28107..4728e32f06 100755
--- a/test/distrib/cpp/run_distrib_test.sh
+++ b/test/distrib/cpp/run_distrib_test.sh
@@ -30,13 +30,8 @@
set -ex
-git clone $EXTERNAL_GIT_ROOT
-# clone gRPC submodules, use data from locally cloned submodules where possible
-(cd ${EXTERNAL_GIT_ROOT} && git submodule foreach 'cd /var/local/git/grpc \
-&& git submodule update --init --reference ${EXTERNAL_GIT_ROOT}/${name} \
-${name}')
-
-cd grpc
+# change to grpc repo root
+cd $(dirname $0)/../../..
cd third_party/protobuf && ./autogen.sh && \
./configure && make -j4 && make check && make install && ldconfig