diff options
author | 2017-04-03 09:44:35 -0700 | |
---|---|---|
committer | 2017-04-03 09:44:35 -0700 | |
commit | 988ef83446a5b2b3a8517d1648394f97796dda4f (patch) | |
tree | f1ca916f032e0bb58602fd5305189c8e4a77e90c /test/core/channel/minimal_stack_is_minimal_test.c | |
parent | 494e72d6b4ad057bcbcf67d808fc0639c2a8724b (diff) |
Minimal stack test
Diffstat (limited to 'test/core/channel/minimal_stack_is_minimal_test.c')
-rw-r--r-- | test/core/channel/minimal_stack_is_minimal_test.c | 103 |
1 files changed, 99 insertions, 4 deletions
diff --git a/test/core/channel/minimal_stack_is_minimal_test.c b/test/core/channel/minimal_stack_is_minimal_test.c index 1c12c9ebde..622ca0ee03 100644 --- a/test/core/channel/minimal_stack_is_minimal_test.c +++ b/test/core/channel/minimal_stack_is_minimal_test.c @@ -31,15 +31,110 @@ * */ +#include <grpc/grpc.h> +#include <grpc/support/alloc.h> +#include <grpc/support/string_util.h> +#include <string.h> + +#include "src/core/lib/channel/channel_stack_builder.h" +#include "src/core/lib/support/string.h" +#include "src/core/lib/surface/channel_init.h" #include "src/core/lib/surface/channel_stack_type.h" +#include "src/core/lib/transport/transport_impl.h" +#include "test/core/util/test_config.h" + +static int check_stack(const char *transport_name, grpc_channel_args *init_args, + grpc_channel_stack_type channel_stack_type, ...) { + // create dummy channel stack + grpc_channel_stack_builder *builder = grpc_channel_stack_builder_create(); + grpc_transport_vtable fake_transport_vtable = {.name = transport_name}; + grpc_transport fake_transport = {.vtable = &fake_transport_vtable}; + grpc_arg arg = {.type = GRPC_ARG_INTEGER, + .key = GRPC_ARG_MINIMAL_STACK, + .value.integer = 1}; + grpc_channel_stack_builder_set_target(builder, "foo.test.google.fr"); + grpc_channel_args *channel_args = + grpc_channel_args_copy_and_add(init_args, &arg, 1); + if (transport_name != NULL) { + grpc_channel_stack_builder_set_transport(builder, &fake_transport); + } + { + grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; + grpc_channel_stack_builder_set_channel_arguments(&exec_ctx, builder, + channel_args); + GPR_ASSERT( + grpc_channel_init_create_stack(&exec_ctx, builder, channel_stack_type)); + grpc_exec_ctx_finish(&exec_ctx); + } + + // build up our expectation list + gpr_strvec v; + gpr_strvec_init(&v); + va_list args; + va_start(args, channel_stack_type); + for (;;) { + char *a = va_arg(args, char *); + if (a == NULL) break; + if (v.count != 0) gpr_strvec_add(&v, gpr_strdup(", ")); + gpr_strvec_add(&v, gpr_strdup(a)); + } + va_end(args); + char *expect = gpr_strvec_flatten(&v, NULL); + gpr_strvec_destroy(&v); + + // build up our "got" list + gpr_strvec_init(&v); + grpc_channel_stack_builder_iterator *it = + grpc_channel_stack_builder_create_iterator_at_first(builder); + while (grpc_channel_stack_builder_move_next(it)) { + const char *name = grpc_channel_stack_builder_iterator_filter_name(it); + if (name == NULL) continue; + if (v.count != 0) gpr_strvec_add(&v, gpr_strdup(", ")); + gpr_strvec_add(&v, gpr_strdup(name)); + } + char *got = gpr_strvec_flatten(&v, NULL); + gpr_strvec_destroy(&v); + + // figure out result, log if there's an error + int result = 0; + if (0 != strcmp(got, expect)) { + gpr_log(GPR_ERROR, + "FAILED transport=%s; stack_type=%d: expected '%s'; got '%s'", + transport_name, channel_stack_type, expect, got); + result = 1; + } + + gpr_free(got); + gpr_free(expect); + + { + grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; + grpc_channel_stack_builder_destroy(&exec_ctx, builder); + grpc_exec_ctx_finish(&exec_ctx); + } + + return result; +} int main(int argc, char **argv) { grpc_test_init(argc, argv); grpc_init(); - check_stack(GRPC_CLIENT_CHANNEL, "client_channel", NULL); - check_stack(GRPC_CLIENT_DIRECT_CHANNEL, "connected_channel", NULL); - check_stack(GRPC_CLIENT_SUBCHANNEL, "connected_channel", NULL); - check_stack(GRPC_SERVER_CHANNEL, "server", "connected_channel", NULL); + int errors = 0; + errors += check_stack("unknown", NULL, GRPC_CLIENT_DIRECT_CHANNEL, + "connected", NULL); + errors += + check_stack("unknown", NULL, GRPC_CLIENT_SUBCHANNEL, "connected", NULL); + errors += check_stack("unknown", NULL, GRPC_SERVER_CHANNEL, "server", + "connected", NULL); + errors += check_stack("chttp2", NULL, GRPC_CLIENT_DIRECT_CHANNEL, + "http-client", "connected", NULL); + errors += + check_stack("chttp2", NULL, GRPC_CLIENT_SUBCHANNEL, "connected", NULL); + errors += check_stack("chttp2", NULL, GRPC_SERVER_CHANNEL, "server", + "http-server", "connected", NULL); + errors += + check_stack(NULL, NULL, GRPC_CLIENT_CHANNEL, "client-channel", NULL); + GPR_ASSERT(errors == 0); grpc_shutdown(); return 0; } |