aboutsummaryrefslogtreecommitdiffhomepage
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/core/client_config/resolvers/sockaddr_resolver_test.c84
-rw-r--r--test/core/end2end/fake_resolver.c49
-rw-r--r--test/cpp/end2end/client_crash_test.cc4
-rw-r--r--test/cpp/end2end/hybrid_end2end_test.cc10
-rw-r--r--test/cpp/end2end/server_crash_test_client.cc2
-rw-r--r--test/cpp/qps/driver.cc6
6 files changed, 142 insertions, 13 deletions
diff --git a/test/core/client_config/resolvers/sockaddr_resolver_test.c b/test/core/client_config/resolvers/sockaddr_resolver_test.c
index b5d96efa1d..3fc074adf3 100644
--- a/test/core/client_config/resolvers/sockaddr_resolver_test.c
+++ b/test/core/client_config/resolvers/sockaddr_resolver_test.c
@@ -37,13 +37,21 @@
#include <grpc/support/log.h>
#include <grpc/support/string_util.h>
+#include "src/core/ext/client_config/method_config.h"
#include "src/core/ext/client_config/resolver_registry.h"
#include "src/core/ext/client_config/resolver_result.h"
+#include "src/core/lib/channel/channel_args.h"
+#include "src/core/lib/transport/metadata.h"
#include "test/core/util/test_config.h"
typedef struct on_resolution_arg {
char *expected_server_name;
+ const char *expected_method_name;
+ bool expected_wait_for_ready;
+ gpr_timespec expected_timeout;
+ int32_t expected_max_request_message_bytes;
+ int32_t expected_max_response_message_bytes;
grpc_resolver_result *resolver_result;
} on_resolution_arg;
@@ -52,6 +60,40 @@ void on_resolution_cb(grpc_exec_ctx *exec_ctx, void *arg, grpc_error *error) {
const char *server_name =
grpc_resolver_result_get_server_name(res->resolver_result);
GPR_ASSERT(strcmp(res->expected_server_name, server_name) == 0);
+ const grpc_channel_args *lb_policy_args =
+ grpc_resolver_result_get_lb_policy_args(res->resolver_result);
+ if (res->expected_method_name == NULL) {
+ GPR_ASSERT(lb_policy_args == NULL);
+ } else {
+ const grpc_arg *channel_arg =
+ grpc_channel_args_find(lb_policy_args, GRPC_ARG_SERVICE_CONFIG);
+ GPR_ASSERT(channel_arg != NULL);
+ GPR_ASSERT(channel_arg->type == GRPC_ARG_POINTER);
+ grpc_method_config_table *method_config_table =
+ (grpc_method_config_table *)channel_arg->value.pointer.p;
+ GPR_ASSERT(method_config_table != NULL);
+ grpc_mdstr *path = grpc_mdstr_from_string(res->expected_method_name);
+ grpc_method_config *method_config =
+ grpc_method_config_table_get_method_config(method_config_table, path);
+ GRPC_MDSTR_UNREF(path);
+ GPR_ASSERT(method_config != NULL);
+ bool *wait_for_ready = grpc_method_config_get_wait_for_ready(method_config);
+ GPR_ASSERT(wait_for_ready != NULL);
+ GPR_ASSERT(*wait_for_ready == res->expected_wait_for_ready);
+ gpr_timespec *timeout = grpc_method_config_get_timeout(method_config);
+ GPR_ASSERT(timeout != NULL);
+ GPR_ASSERT(gpr_time_cmp(*timeout, res->expected_timeout) == 0);
+ int32_t *max_request_message_bytes =
+ grpc_method_config_get_max_request_message_bytes(method_config);
+ GPR_ASSERT(max_request_message_bytes != NULL);
+ GPR_ASSERT(*max_request_message_bytes ==
+ res->expected_max_request_message_bytes);
+ int32_t *max_response_message_bytes =
+ grpc_method_config_get_max_response_message_bytes(method_config);
+ GPR_ASSERT(max_response_message_bytes != NULL);
+ GPR_ASSERT(*max_response_message_bytes ==
+ res->expected_max_response_message_bytes);
+ }
grpc_resolver_result_unref(exec_ctx, res->resolver_result);
}
@@ -67,13 +109,43 @@ static void test_succeeds(grpc_resolver_factory *factory, const char *string) {
args.uri = uri;
resolver = grpc_resolver_factory_create_resolver(factory, &args);
GPR_ASSERT(resolver != NULL);
-
on_resolution_arg on_res_arg;
memset(&on_res_arg, 0, sizeof(on_res_arg));
on_res_arg.expected_server_name = uri->path;
grpc_closure *on_resolution =
grpc_closure_create(on_resolution_cb, &on_res_arg);
+ grpc_resolver_next(&exec_ctx, resolver, &on_res_arg.resolver_result,
+ on_resolution);
+ GRPC_RESOLVER_UNREF(&exec_ctx, resolver, "test_succeeds");
+ grpc_exec_ctx_finish(&exec_ctx);
+ grpc_uri_destroy(uri);
+}
+static void test_succeeds_with_service_config(
+ grpc_resolver_factory *factory, const char *string, const char *method_name,
+ bool wait_for_ready, gpr_timespec timeout,
+ int32_t max_request_message_bytes, int32_t max_response_message_bytes) {
+ grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT;
+ grpc_uri *uri = grpc_uri_parse(string, 0);
+ grpc_resolver_args args;
+ grpc_resolver *resolver;
+ gpr_log(GPR_DEBUG, "test: '%s' should be valid for '%s'", string,
+ factory->vtable->scheme);
+ GPR_ASSERT(uri);
+ memset(&args, 0, sizeof(args));
+ args.uri = uri;
+ resolver = grpc_resolver_factory_create_resolver(factory, &args);
+ GPR_ASSERT(resolver != NULL);
+ on_resolution_arg on_res_arg;
+ memset(&on_res_arg, 0, sizeof(on_res_arg));
+ on_res_arg.expected_server_name = uri->path;
+ on_res_arg.expected_method_name = method_name;
+ on_res_arg.expected_wait_for_ready = wait_for_ready;
+ on_res_arg.expected_timeout = timeout;
+ on_res_arg.expected_max_request_message_bytes = max_request_message_bytes;
+ on_res_arg.expected_max_response_message_bytes = max_response_message_bytes;
+ grpc_closure *on_resolution =
+ grpc_closure_create(on_resolution_cb, &on_res_arg);
grpc_resolver_next(&exec_ctx, resolver, &on_res_arg.resolver_result,
on_resolution);
GRPC_RESOLVER_UNREF(&exec_ctx, resolver, "test_succeeds");
@@ -119,6 +191,16 @@ int main(int argc, char **argv) {
test_fails(ipv6, "ipv6:[::]:123456");
test_fails(ipv6, "ipv6:www.google.com");
+ test_succeeds_with_service_config(
+ ipv4,
+ "ipv4:127.0.0.1:1234?method_name=/service/method"
+ "&wait_for_ready=1"
+ "&timeout_seconds=7"
+ "&max_request_message_bytes=456"
+ "&max_response_message_bytes=789",
+ "/service/method", true /* wait_for_ready */,
+ (gpr_timespec){7, 0, GPR_CLOCK_MONOTONIC}, 456, 789);
+
grpc_resolver_factory_unref(ipv4);
grpc_resolver_factory_unref(ipv6);
grpc_shutdown();
diff --git a/test/core/end2end/fake_resolver.c b/test/core/end2end/fake_resolver.c
index 9b5e01b2a8..3878952f21 100644
--- a/test/core/end2end/fake_resolver.c
+++ b/test/core/end2end/fake_resolver.c
@@ -42,6 +42,7 @@
#include <grpc/support/port_platform.h>
#include <grpc/support/string_util.h>
+#include "src/core/ext/client_config/method_config.h"
#include "src/core/ext/client_config/parse_address.h"
#include "src/core/ext/client_config/resolver_registry.h"
#include "src/core/lib/channel/channel_args.h"
@@ -63,6 +64,7 @@ typedef struct {
char* target_name; // the path component of the uri passed in
grpc_lb_addresses* addresses;
char* lb_policy_name;
+ grpc_method_config_table* method_config_table;
// mutex guarding the rest of the state
gpr_mu mu;
@@ -80,6 +82,7 @@ static void fake_resolver_destroy(grpc_exec_ctx* exec_ctx, grpc_resolver* gr) {
gpr_free(r->target_name);
grpc_lb_addresses_destroy(r->addresses, NULL /* user_data_destroy */);
gpr_free(r->lb_policy_name);
+ grpc_method_config_table_unref(r->method_config_table);
gpr_free(r);
}
@@ -99,10 +102,16 @@ static void fake_resolver_maybe_finish_next_locked(grpc_exec_ctx* exec_ctx,
fake_resolver* r) {
if (r->next_completion != NULL && !r->published) {
r->published = true;
+ grpc_channel_args* lb_policy_args = NULL;
+ if (r->method_config_table != NULL) {
+ const grpc_arg arg =
+ grpc_method_config_table_create_channel_arg(r->method_config_table);
+ lb_policy_args = grpc_channel_args_copy_and_add(NULL /* src */, &arg, 1);
+ }
*r->target_result = grpc_resolver_result_create(
r->target_name,
grpc_lb_addresses_copy(r->addresses, NULL /* user_data_copy */),
- r->lb_policy_name, NULL /* lb_policy_args */);
+ r->lb_policy_name, lb_policy_args);
grpc_exec_ctx_sched(exec_ctx, r->next_completion, GRPC_ERROR_NONE, NULL);
r->next_completion = NULL;
}
@@ -204,6 +213,44 @@ static grpc_resolver* fake_resolver_create(grpc_resolver_factory* factory,
gpr_free(r);
return NULL;
}
+ // Construct method config table.
+ // We only support parameters for a single method.
+ const char* method_name = grpc_uri_get_query_arg(args->uri, "method_name");
+ if (method_name != NULL) {
+ const char* wait_for_ready_str =
+ grpc_uri_get_query_arg(args->uri, "wait_for_ready");
+ // Anything other than "0" is interpreted as true.
+ bool wait_for_ready =
+ wait_for_ready_str != NULL && strcmp("0", wait_for_ready_str) != 0;
+ const char* timeout_str =
+ grpc_uri_get_query_arg(args->uri, "timeout_seconds");
+ gpr_timespec timeout = {timeout_str == NULL ? 0 : atoi(timeout_str), 0,
+ GPR_CLOCK_MONOTONIC};
+ const char* max_request_message_bytes_str =
+ grpc_uri_get_query_arg(args->uri, "max_request_message_bytes");
+ int32_t max_request_message_bytes =
+ max_request_message_bytes_str == NULL
+ ? 0
+ : atoi(max_request_message_bytes_str);
+ const char* max_response_message_bytes_str =
+ grpc_uri_get_query_arg(args->uri, "max_response_message_bytes");
+ int32_t max_response_message_bytes =
+ max_response_message_bytes_str == NULL
+ ? 0
+ : atoi(max_response_message_bytes_str);
+ grpc_method_config* method_config = grpc_method_config_create(
+ wait_for_ready_str == NULL ? NULL : &wait_for_ready,
+ timeout_str == NULL ? NULL : &timeout,
+ max_request_message_bytes_str == NULL ? NULL
+ : &max_request_message_bytes,
+ max_response_message_bytes_str == NULL ? NULL
+ : &max_response_message_bytes);
+ grpc_method_config_table_entry entry = {grpc_mdstr_from_string(method_name),
+ method_config};
+ r->method_config_table = grpc_method_config_table_create(1, &entry);
+ GRPC_MDSTR_UNREF(entry.method_name);
+ grpc_method_config_unref(method_config);
+ }
gpr_ref_init(&r->refs, 1);
gpr_mu_init(&r->mu);
grpc_resolver_init(&r->base, &fake_resolver_vtable);
diff --git a/test/cpp/end2end/client_crash_test.cc b/test/cpp/end2end/client_crash_test.cc
index c452ad2beb..966c04b0e3 100644
--- a/test/cpp/end2end/client_crash_test.cc
+++ b/test/cpp/end2end/client_crash_test.cc
@@ -89,7 +89,7 @@ TEST_F(CrashTest, KillBeforeWrite) {
EchoRequest request;
EchoResponse response;
ClientContext context;
- context.set_fail_fast(false);
+ context.set_wait_for_ready(true);
auto stream = stub->BidiStream(&context);
@@ -115,7 +115,7 @@ TEST_F(CrashTest, KillAfterWrite) {
EchoRequest request;
EchoResponse response;
ClientContext context;
- context.set_fail_fast(false);
+ context.set_wait_for_ready(true);
auto stream = stub->BidiStream(&context);
diff --git a/test/cpp/end2end/hybrid_end2end_test.cc b/test/cpp/end2end/hybrid_end2end_test.cc
index 82361d0e90..8cd2e66347 100644
--- a/test/cpp/end2end/hybrid_end2end_test.cc
+++ b/test/cpp/end2end/hybrid_end2end_test.cc
@@ -261,7 +261,7 @@ class HybridEnd2endTest : public ::testing::Test {
EchoRequest send_request;
EchoResponse recv_response;
ClientContext cli_ctx;
- cli_ctx.set_fail_fast(false);
+ cli_ctx.set_wait_for_ready(true);
send_request.set_message("Hello");
Status recv_status = stub_->Echo(&cli_ctx, send_request, &recv_response);
EXPECT_EQ(send_request.message(), recv_response.message());
@@ -275,7 +275,7 @@ class HybridEnd2endTest : public ::testing::Test {
EchoRequest send_request;
EchoResponse recv_response;
ClientContext cli_ctx;
- cli_ctx.set_fail_fast(false);
+ cli_ctx.set_wait_for_ready(true);
send_request.set_message("Hello");
Status recv_status = stub->Echo(&cli_ctx, send_request, &recv_response);
EXPECT_EQ(send_request.message() + "_dup", recv_response.message());
@@ -287,7 +287,7 @@ class HybridEnd2endTest : public ::testing::Test {
EchoResponse recv_response;
grpc::string expected_message;
ClientContext cli_ctx;
- cli_ctx.set_fail_fast(false);
+ cli_ctx.set_wait_for_ready(true);
send_request.set_message("Hello");
auto stream = stub_->RequestStream(&cli_ctx, &recv_response);
for (int i = 0; i < 5; i++) {
@@ -304,7 +304,7 @@ class HybridEnd2endTest : public ::testing::Test {
EchoRequest request;
EchoResponse response;
ClientContext context;
- context.set_fail_fast(false);
+ context.set_wait_for_ready(true);
request.set_message("hello");
auto stream = stub_->ResponseStream(&context, request);
@@ -324,7 +324,7 @@ class HybridEnd2endTest : public ::testing::Test {
EchoRequest request;
EchoResponse response;
ClientContext context;
- context.set_fail_fast(false);
+ context.set_wait_for_ready(true);
grpc::string msg("hello");
auto stream = stub_->BidiStream(&context);
diff --git a/test/cpp/end2end/server_crash_test_client.cc b/test/cpp/end2end/server_crash_test_client.cc
index 10a251c952..5df09cd853 100644
--- a/test/cpp/end2end/server_crash_test_client.cc
+++ b/test/cpp/end2end/server_crash_test_client.cc
@@ -65,7 +65,7 @@ int main(int argc, char** argv) {
EchoRequest request;
EchoResponse response;
grpc::ClientContext context;
- context.set_fail_fast(false);
+ context.set_wait_for_ready(true);
if (FLAGS_mode == "bidi") {
auto stream = stub->BidiStream(&context);
diff --git a/test/cpp/qps/driver.cc b/test/cpp/qps/driver.cc
index b4c18bcb46..7460bb526a 100644
--- a/test/cpp/qps/driver.cc
+++ b/test/cpp/qps/driver.cc
@@ -83,7 +83,7 @@ static std::unordered_map<string, std::deque<int>> get_hosts_and_cores(
auto stub = WorkerService::NewStub(
CreateChannel(*it, InsecureChannelCredentials()));
grpc::ClientContext ctx;
- ctx.set_fail_fast(false);
+ ctx.set_wait_for_ready(true);
CoreRequest dummy;
CoreResponse cores;
grpc::Status s = stub->CoreCount(&ctx, dummy, &cores);
@@ -167,7 +167,7 @@ namespace runsc {
static ClientContext* AllocContext(list<ClientContext>* contexts) {
contexts->emplace_back();
auto context = &contexts->back();
- context->set_fail_fast(false);
+ context->set_wait_for_ready(true);
return context;
}
@@ -527,7 +527,7 @@ bool RunQuit() {
CreateChannel(workers[i], InsecureChannelCredentials()));
Void dummy;
grpc::ClientContext ctx;
- ctx.set_fail_fast(false);
+ ctx.set_wait_for_ready(true);
Status s = stub->QuitWorker(&ctx, dummy, &dummy);
if (!s.ok()) {
gpr_log(GPR_ERROR, "Worker %zu could not be properly quit because %s", i,