diff options
475 files changed, 11290 insertions, 1050 deletions
@@ -198,6 +198,7 @@ cc_library( "src/core/lib/channel/http_client_filter.h", "src/core/lib/channel/http_server_filter.h", "src/core/lib/channel/subchannel_call_holder.h", + "src/core/lib/client_config/client_channel_factory.h", "src/core/lib/client_config/client_config.h", "src/core/lib/client_config/connector.h", "src/core/lib/client_config/initial_connect_string.h", @@ -208,7 +209,6 @@ cc_library( "src/core/lib/client_config/resolver_factory.h", "src/core/lib/client_config/resolver_registry.h", "src/core/lib/client_config/subchannel.h", - "src/core/lib/client_config/subchannel_factory.h", "src/core/lib/client_config/subchannel_index.h", "src/core/lib/client_config/uri_parser.h", "src/core/lib/compression/algorithm_metadata.h", @@ -340,6 +340,7 @@ cc_library( "src/core/lib/channel/http_client_filter.c", "src/core/lib/channel/http_server_filter.c", "src/core/lib/channel/subchannel_call_holder.c", + "src/core/lib/client_config/client_channel_factory.c", "src/core/lib/client_config/client_config.c", "src/core/lib/client_config/connector.c", "src/core/lib/client_config/default_initial_connect_string.c", @@ -351,7 +352,6 @@ cc_library( "src/core/lib/client_config/resolver_factory.c", "src/core/lib/client_config/resolver_registry.c", "src/core/lib/client_config/subchannel.c", - "src/core/lib/client_config/subchannel_factory.c", "src/core/lib/client_config/subchannel_index.c", "src/core/lib/client_config/uri_parser.c", "src/core/lib/compression/compression_algorithm.c", @@ -563,6 +563,7 @@ cc_library( "src/core/lib/channel/http_client_filter.h", "src/core/lib/channel/http_server_filter.h", "src/core/lib/channel/subchannel_call_holder.h", + "src/core/lib/client_config/client_channel_factory.h", "src/core/lib/client_config/client_config.h", "src/core/lib/client_config/connector.h", "src/core/lib/client_config/initial_connect_string.h", @@ -573,7 +574,6 @@ cc_library( "src/core/lib/client_config/resolver_factory.h", "src/core/lib/client_config/resolver_registry.h", "src/core/lib/client_config/subchannel.h", - "src/core/lib/client_config/subchannel_factory.h", "src/core/lib/client_config/subchannel_index.h", "src/core/lib/client_config/uri_parser.h", "src/core/lib/compression/algorithm_metadata.h", @@ -689,6 +689,7 @@ cc_library( "src/core/lib/channel/http_client_filter.c", "src/core/lib/channel/http_server_filter.c", "src/core/lib/channel/subchannel_call_holder.c", + "src/core/lib/client_config/client_channel_factory.c", "src/core/lib/client_config/client_config.c", "src/core/lib/client_config/connector.c", "src/core/lib/client_config/default_initial_connect_string.c", @@ -700,7 +701,6 @@ cc_library( "src/core/lib/client_config/resolver_factory.c", "src/core/lib/client_config/resolver_registry.c", "src/core/lib/client_config/subchannel.c", - "src/core/lib/client_config/subchannel_factory.c", "src/core/lib/client_config/subchannel_index.c", "src/core/lib/client_config/uri_parser.c", "src/core/lib/compression/compression_algorithm.c", @@ -1397,6 +1397,7 @@ objc_library( "src/core/lib/channel/http_client_filter.c", "src/core/lib/channel/http_server_filter.c", "src/core/lib/channel/subchannel_call_holder.c", + "src/core/lib/client_config/client_channel_factory.c", "src/core/lib/client_config/client_config.c", "src/core/lib/client_config/connector.c", "src/core/lib/client_config/default_initial_connect_string.c", @@ -1408,7 +1409,6 @@ objc_library( "src/core/lib/client_config/resolver_factory.c", "src/core/lib/client_config/resolver_registry.c", "src/core/lib/client_config/subchannel.c", - "src/core/lib/client_config/subchannel_factory.c", "src/core/lib/client_config/subchannel_index.c", "src/core/lib/client_config/uri_parser.c", "src/core/lib/compression/compression_algorithm.c", @@ -1562,6 +1562,7 @@ objc_library( "src/core/lib/channel/http_client_filter.h", "src/core/lib/channel/http_server_filter.h", "src/core/lib/channel/subchannel_call_holder.h", + "src/core/lib/client_config/client_channel_factory.h", "src/core/lib/client_config/client_config.h", "src/core/lib/client_config/connector.h", "src/core/lib/client_config/initial_connect_string.h", @@ -1572,7 +1573,6 @@ objc_library( "src/core/lib/client_config/resolver_factory.h", "src/core/lib/client_config/resolver_registry.h", "src/core/lib/client_config/subchannel.h", - "src/core/lib/client_config/subchannel_factory.h", "src/core/lib/client_config/subchannel_index.h", "src/core/lib/client_config/uri_parser.h", "src/core/lib/compression/algorithm_metadata.h", @@ -961,6 +961,8 @@ message_compress_test: $(BINDIR)/$(CONFIG)/message_compress_test mlog_test: $(BINDIR)/$(CONFIG)/mlog_test multiple_server_queues_test: $(BINDIR)/$(CONFIG)/multiple_server_queues_test murmur_hash_test: $(BINDIR)/$(CONFIG)/murmur_hash_test +nanopb_fuzzer_response_test: $(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test +nanopb_fuzzer_serverlist_test: $(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test no_server_test: $(BINDIR)/$(CONFIG)/no_server_test resolve_address_test: $(BINDIR)/$(CONFIG)/resolve_address_test secure_channel_create_test: $(BINDIR)/$(CONFIG)/secure_channel_create_test @@ -1076,6 +1078,7 @@ boringssl_pqueue_test: $(BINDIR)/$(CONFIG)/boringssl_pqueue_test boringssl_ssl_test: $(BINDIR)/$(CONFIG)/boringssl_ssl_test badreq_bad_client_test: $(BINDIR)/$(CONFIG)/badreq_bad_client_test connection_prefix_bad_client_test: $(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test +head_of_line_blocking_bad_client_test: $(BINDIR)/$(CONFIG)/head_of_line_blocking_bad_client_test headers_bad_client_test: $(BINDIR)/$(CONFIG)/headers_bad_client_test initial_settings_frame_bad_client_test: $(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test server_registered_method_bad_client_test: $(BINDIR)/$(CONFIG)/server_registered_method_bad_client_test @@ -1113,6 +1116,8 @@ h2_uds_nosec_test: $(BINDIR)/$(CONFIG)/h2_uds_nosec_test hpack_parser_fuzzer_test_one_entry: $(BINDIR)/$(CONFIG)/hpack_parser_fuzzer_test_one_entry http_fuzzer_test_one_entry: $(BINDIR)/$(CONFIG)/http_fuzzer_test_one_entry json_fuzzer_test_one_entry: $(BINDIR)/$(CONFIG)/json_fuzzer_test_one_entry +nanopb_fuzzer_response_test_one_entry: $(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test_one_entry +nanopb_fuzzer_serverlist_test_one_entry: $(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test_one_entry uri_fuzzer_test_one_entry: $(BINDIR)/$(CONFIG)/uri_fuzzer_test_one_entry run_dep_checks: @@ -1298,6 +1303,7 @@ buildtests_c: privatelibs_c \ $(BINDIR)/$(CONFIG)/public_headers_must_be_c89 \ $(BINDIR)/$(CONFIG)/badreq_bad_client_test \ $(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test \ + $(BINDIR)/$(CONFIG)/head_of_line_blocking_bad_client_test \ $(BINDIR)/$(CONFIG)/headers_bad_client_test \ $(BINDIR)/$(CONFIG)/initial_settings_frame_bad_client_test \ $(BINDIR)/$(CONFIG)/server_registered_method_bad_client_test \ @@ -1335,6 +1341,8 @@ buildtests_c: privatelibs_c \ $(BINDIR)/$(CONFIG)/hpack_parser_fuzzer_test_one_entry \ $(BINDIR)/$(CONFIG)/http_fuzzer_test_one_entry \ $(BINDIR)/$(CONFIG)/json_fuzzer_test_one_entry \ + $(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test_one_entry \ + $(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test_one_entry \ $(BINDIR)/$(CONFIG)/uri_fuzzer_test_one_entry \ @@ -1620,6 +1628,8 @@ test_c: buildtests_c $(Q) $(BINDIR)/$(CONFIG)/badreq_bad_client_test || ( echo test badreq_bad_client_test failed ; exit 1 ) $(E) "[RUN] Testing connection_prefix_bad_client_test" $(Q) $(BINDIR)/$(CONFIG)/connection_prefix_bad_client_test || ( echo test connection_prefix_bad_client_test failed ; exit 1 ) + $(E) "[RUN] Testing head_of_line_blocking_bad_client_test" + $(Q) $(BINDIR)/$(CONFIG)/head_of_line_blocking_bad_client_test || ( echo test head_of_line_blocking_bad_client_test failed ; exit 1 ) $(E) "[RUN] Testing headers_bad_client_test" $(Q) $(BINDIR)/$(CONFIG)/headers_bad_client_test || ( echo test headers_bad_client_test failed ; exit 1 ) $(E) "[RUN] Testing initial_settings_frame_bad_client_test" @@ -2487,6 +2497,7 @@ LIBGRPC_SRC = \ src/core/lib/channel/http_client_filter.c \ src/core/lib/channel/http_server_filter.c \ src/core/lib/channel/subchannel_call_holder.c \ + src/core/lib/client_config/client_channel_factory.c \ src/core/lib/client_config/client_config.c \ src/core/lib/client_config/connector.c \ src/core/lib/client_config/default_initial_connect_string.c \ @@ -2498,7 +2509,6 @@ LIBGRPC_SRC = \ src/core/lib/client_config/resolver_factory.c \ src/core/lib/client_config/resolver_registry.c \ src/core/lib/client_config/subchannel.c \ - src/core/lib/client_config/subchannel_factory.c \ src/core/lib/client_config/subchannel_index.c \ src/core/lib/client_config/uri_parser.c \ src/core/lib/compression/compression_algorithm.c \ @@ -2845,6 +2855,7 @@ LIBGRPC_UNSECURE_SRC = \ src/core/lib/channel/http_client_filter.c \ src/core/lib/channel/http_server_filter.c \ src/core/lib/channel/subchannel_call_holder.c \ + src/core/lib/client_config/client_channel_factory.c \ src/core/lib/client_config/client_config.c \ src/core/lib/client_config/connector.c \ src/core/lib/client_config/default_initial_connect_string.c \ @@ -2856,7 +2867,6 @@ LIBGRPC_UNSECURE_SRC = \ src/core/lib/client_config/resolver_factory.c \ src/core/lib/client_config/resolver_registry.c \ src/core/lib/client_config/subchannel.c \ - src/core/lib/client_config/subchannel_factory.c \ src/core/lib/client_config/subchannel_index.c \ src/core/lib/client_config/uri_parser.c \ src/core/lib/compression/compression_algorithm.c \ @@ -8661,6 +8671,70 @@ endif endif +NANOPB_FUZZER_RESPONSE_TEST_SRC = \ + test/core/nanopb/fuzzer_response.c \ + +NANOPB_FUZZER_RESPONSE_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(NANOPB_FUZZER_RESPONSE_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test: $(NANOPB_FUZZER_RESPONSE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(NANOPB_FUZZER_RESPONSE_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -lFuzzer -o $(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/nanopb/fuzzer_response.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + +deps_nanopb_fuzzer_response_test: $(NANOPB_FUZZER_RESPONSE_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(NANOPB_FUZZER_RESPONSE_TEST_OBJS:.o=.dep) +endif +endif + + +NANOPB_FUZZER_SERVERLIST_TEST_SRC = \ + test/core/nanopb/fuzzer_serverlist.c \ + +NANOPB_FUZZER_SERVERLIST_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(NANOPB_FUZZER_SERVERLIST_TEST_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test: $(NANOPB_FUZZER_SERVERLIST_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LDXX) $(LDFLAGS) $(NANOPB_FUZZER_SERVERLIST_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -lFuzzer -o $(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test + +endif + +$(OBJDIR)/$(CONFIG)/test/core/nanopb/fuzzer_serverlist.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + +deps_nanopb_fuzzer_serverlist_test: $(NANOPB_FUZZER_SERVERLIST_TEST_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(NANOPB_FUZZER_SERVERLIST_TEST_OBJS:.o=.dep) +endif +endif + + NO_SERVER_TEST_SRC = \ test/core/end2end/no_server_test.c \ @@ -12678,6 +12752,26 @@ ifneq ($(NO_DEPS),true) endif +HEAD_OF_LINE_BLOCKING_BAD_CLIENT_TEST_SRC = \ + test/core/bad_client/tests/head_of_line_blocking.c \ + +HEAD_OF_LINE_BLOCKING_BAD_CLIENT_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HEAD_OF_LINE_BLOCKING_BAD_CLIENT_TEST_SRC)))) + + +$(BINDIR)/$(CONFIG)/head_of_line_blocking_bad_client_test: $(HEAD_OF_LINE_BLOCKING_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libbad_client_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(HEAD_OF_LINE_BLOCKING_BAD_CLIENT_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libbad_client_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) -o $(BINDIR)/$(CONFIG)/head_of_line_blocking_bad_client_test + +$(OBJDIR)/$(CONFIG)/test/core/bad_client/tests/head_of_line_blocking.o: $(LIBDIR)/$(CONFIG)/libbad_client_test.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libgrpc_unsecure.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + +deps_head_of_line_blocking_bad_client_test: $(HEAD_OF_LINE_BLOCKING_BAD_CLIENT_TEST_OBJS:.o=.dep) + +ifneq ($(NO_DEPS),true) +-include $(HEAD_OF_LINE_BLOCKING_BAD_CLIENT_TEST_OBJS:.o=.dep) +endif + + HEADERS_BAD_CLIENT_TEST_SRC = \ test/core/bad_client/tests/headers.c \ @@ -13670,6 +13764,70 @@ endif endif +NANOPB_FUZZER_RESPONSE_TEST_ONE_ENTRY_SRC = \ + test/core/nanopb/fuzzer_response.c \ + +NANOPB_FUZZER_RESPONSE_TEST_ONE_ENTRY_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(NANOPB_FUZZER_RESPONSE_TEST_ONE_ENTRY_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test_one_entry: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test_one_entry: $(NANOPB_FUZZER_RESPONSE_TEST_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libone_input_fuzzer.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(NANOPB_FUZZER_RESPONSE_TEST_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libone_input_fuzzer.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/nanopb_fuzzer_response_test_one_entry + +endif + +$(OBJDIR)/$(CONFIG)/test/core/nanopb/fuzzer_response.o: $(LIBDIR)/$(CONFIG)/libone_input_fuzzer.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + +deps_nanopb_fuzzer_response_test_one_entry: $(NANOPB_FUZZER_RESPONSE_TEST_ONE_ENTRY_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(NANOPB_FUZZER_RESPONSE_TEST_ONE_ENTRY_OBJS:.o=.dep) +endif +endif + + +NANOPB_FUZZER_SERVERLIST_TEST_ONE_ENTRY_SRC = \ + test/core/nanopb/fuzzer_serverlist.c \ + +NANOPB_FUZZER_SERVERLIST_TEST_ONE_ENTRY_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(NANOPB_FUZZER_SERVERLIST_TEST_ONE_ENTRY_SRC)))) +ifeq ($(NO_SECURE),true) + +# You can't build secure targets if you don't have OpenSSL. + +$(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test_one_entry: openssl_dep_error + +else + + + +$(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test_one_entry: $(NANOPB_FUZZER_SERVERLIST_TEST_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libone_input_fuzzer.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + $(E) "[LD] Linking $@" + $(Q) mkdir -p `dirname $@` + $(Q) $(LD) $(LDFLAGS) $(NANOPB_FUZZER_SERVERLIST_TEST_ONE_ENTRY_OBJS) $(LIBDIR)/$(CONFIG)/libone_input_fuzzer.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a $(LDLIBS) $(LDLIBS_SECURE) -o $(BINDIR)/$(CONFIG)/nanopb_fuzzer_serverlist_test_one_entry + +endif + +$(OBJDIR)/$(CONFIG)/test/core/nanopb/fuzzer_serverlist.o: $(LIBDIR)/$(CONFIG)/libone_input_fuzzer.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a + +deps_nanopb_fuzzer_serverlist_test_one_entry: $(NANOPB_FUZZER_SERVERLIST_TEST_ONE_ENTRY_OBJS:.o=.dep) + +ifneq ($(NO_SECURE),true) +ifneq ($(NO_DEPS),true) +-include $(NANOPB_FUZZER_SERVERLIST_TEST_ONE_ENTRY_OBJS:.o=.dep) +endif +endif + + URI_FUZZER_TEST_ONE_ENTRY_SRC = \ test/core/client_config/uri_fuzzer_test.c \ @@ -5,7 +5,7 @@ [![Join the chat at https://gitter.im/grpc/grpc](https://badges.gitter.im/grpc/grpc.svg)](https://gitter.im/grpc/grpc?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -Copyright 2015-2016 Google Inc. +Copyright 2015 Google Inc. #Documentation diff --git a/binding.gyp b/binding.gyp index 0240da9226..09cf177857 100644 --- a/binding.gyp +++ b/binding.gyp @@ -607,6 +607,7 @@ 'src/core/lib/channel/http_client_filter.c', 'src/core/lib/channel/http_server_filter.c', 'src/core/lib/channel/subchannel_call_holder.c', + 'src/core/lib/client_config/client_channel_factory.c', 'src/core/lib/client_config/client_config.c', 'src/core/lib/client_config/connector.c', 'src/core/lib/client_config/default_initial_connect_string.c', @@ -618,7 +619,6 @@ 'src/core/lib/client_config/resolver_factory.c', 'src/core/lib/client_config/resolver_registry.c', 'src/core/lib/client_config/subchannel.c', - 'src/core/lib/client_config/subchannel_factory.c', 'src/core/lib/client_config/subchannel_index.c', 'src/core/lib/client_config/uri_parser.c', 'src/core/lib/compression/compression_algorithm.c', diff --git a/build.yaml b/build.yaml index 06c803ea2b..76d89a9549 100644 --- a/build.yaml +++ b/build.yaml @@ -264,6 +264,7 @@ filegroups: - src/core/lib/channel/http_client_filter.h - src/core/lib/channel/http_server_filter.h - src/core/lib/channel/subchannel_call_holder.h + - src/core/lib/client_config/client_channel_factory.h - src/core/lib/client_config/client_config.h - src/core/lib/client_config/connector.h - src/core/lib/client_config/initial_connect_string.h @@ -274,7 +275,6 @@ filegroups: - src/core/lib/client_config/resolver_factory.h - src/core/lib/client_config/resolver_registry.h - src/core/lib/client_config/subchannel.h - - src/core/lib/client_config/subchannel_factory.h - src/core/lib/client_config/subchannel_index.h - src/core/lib/client_config/uri_parser.h - src/core/lib/compression/algorithm_metadata.h @@ -353,6 +353,7 @@ filegroups: - src/core/lib/channel/http_client_filter.c - src/core/lib/channel/http_server_filter.c - src/core/lib/channel/subchannel_call_holder.c + - src/core/lib/client_config/client_channel_factory.c - src/core/lib/client_config/client_config.c - src/core/lib/client_config/connector.c - src/core/lib/client_config/default_initial_connect_string.c @@ -364,7 +365,6 @@ filegroups: - src/core/lib/client_config/resolver_factory.c - src/core/lib/client_config/resolver_registry.c - src/core/lib/client_config/subchannel.c - - src/core/lib/client_config/subchannel_factory.c - src/core/lib/client_config/subchannel_index.c - src/core/lib/client_config/uri_parser.c - src/core/lib/compression/compression_algorithm.c @@ -1897,6 +1897,30 @@ targets: deps: - gpr_test_util - gpr +- name: nanopb_fuzzer_response_test + build: fuzzer + language: c + src: + - test/core/nanopb/fuzzer_response.c + deps: + - grpc_test_util + - grpc + - gpr_test_util + - gpr + corpus_dirs: + - test/core/nanopb/corpus_response +- name: nanopb_fuzzer_serverlist_test + build: fuzzer + language: c + src: + - test/core/nanopb/fuzzer_serverlist.c + deps: + - grpc_test_util + - grpc + - gpr_test_util + - gpr + corpus_dirs: + - test/core/nanopb/corpus_serverlist - name: no_server_test cpu_cost: 0.1 build: test @@ -129,6 +129,7 @@ if test "$PHP_GRPC" != "no"; then src/core/lib/channel/http_client_filter.c \ src/core/lib/channel/http_server_filter.c \ src/core/lib/channel/subchannel_call_holder.c \ + src/core/lib/client_config/client_channel_factory.c \ src/core/lib/client_config/client_config.c \ src/core/lib/client_config/connector.c \ src/core/lib/client_config/default_initial_connect_string.c \ @@ -140,7 +141,6 @@ if test "$PHP_GRPC" != "no"; then src/core/lib/client_config/resolver_factory.c \ src/core/lib/client_config/resolver_registry.c \ src/core/lib/client_config/subchannel.c \ - src/core/lib/client_config/subchannel_factory.c \ src/core/lib/client_config/subchannel_index.c \ src/core/lib/client_config/uri_parser.c \ src/core/lib/compression/compression_algorithm.c \ diff --git a/gRPC.podspec b/gRPC.podspec index f6f1c82491..d7503a4169 100644 --- a/gRPC.podspec +++ b/gRPC.podspec @@ -200,6 +200,7 @@ Pod::Spec.new do |s| 'src/core/lib/channel/http_client_filter.h', 'src/core/lib/channel/http_server_filter.h', 'src/core/lib/channel/subchannel_call_holder.h', + 'src/core/lib/client_config/client_channel_factory.h', 'src/core/lib/client_config/client_config.h', 'src/core/lib/client_config/connector.h', 'src/core/lib/client_config/initial_connect_string.h', @@ -210,7 +211,6 @@ Pod::Spec.new do |s| 'src/core/lib/client_config/resolver_factory.h', 'src/core/lib/client_config/resolver_registry.h', 'src/core/lib/client_config/subchannel.h', - 'src/core/lib/client_config/subchannel_factory.h', 'src/core/lib/client_config/subchannel_index.h', 'src/core/lib/client_config/uri_parser.h', 'src/core/lib/compression/algorithm_metadata.h', @@ -359,6 +359,7 @@ Pod::Spec.new do |s| 'src/core/lib/channel/http_client_filter.c', 'src/core/lib/channel/http_server_filter.c', 'src/core/lib/channel/subchannel_call_holder.c', + 'src/core/lib/client_config/client_channel_factory.c', 'src/core/lib/client_config/client_config.c', 'src/core/lib/client_config/connector.c', 'src/core/lib/client_config/default_initial_connect_string.c', @@ -370,7 +371,6 @@ Pod::Spec.new do |s| 'src/core/lib/client_config/resolver_factory.c', 'src/core/lib/client_config/resolver_registry.c', 'src/core/lib/client_config/subchannel.c', - 'src/core/lib/client_config/subchannel_factory.c', 'src/core/lib/client_config/subchannel_index.c', 'src/core/lib/client_config/uri_parser.c', 'src/core/lib/compression/compression_algorithm.c', @@ -525,6 +525,7 @@ Pod::Spec.new do |s| 'src/core/lib/channel/http_client_filter.h', 'src/core/lib/channel/http_server_filter.h', 'src/core/lib/channel/subchannel_call_holder.h', + 'src/core/lib/client_config/client_channel_factory.h', 'src/core/lib/client_config/client_config.h', 'src/core/lib/client_config/connector.h', 'src/core/lib/client_config/initial_connect_string.h', @@ -535,7 +536,6 @@ Pod::Spec.new do |s| 'src/core/lib/client_config/resolver_factory.h', 'src/core/lib/client_config/resolver_registry.h', 'src/core/lib/client_config/subchannel.h', - 'src/core/lib/client_config/subchannel_factory.h', 'src/core/lib/client_config/subchannel_index.h', 'src/core/lib/client_config/uri_parser.h', 'src/core/lib/compression/algorithm_metadata.h', diff --git a/grpc.gemspec b/grpc.gemspec index c4c1e97b93..89c35a8b06 100755 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -196,6 +196,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/channel/http_client_filter.h ) s.files += %w( src/core/lib/channel/http_server_filter.h ) s.files += %w( src/core/lib/channel/subchannel_call_holder.h ) + s.files += %w( src/core/lib/client_config/client_channel_factory.h ) s.files += %w( src/core/lib/client_config/client_config.h ) s.files += %w( src/core/lib/client_config/connector.h ) s.files += %w( src/core/lib/client_config/initial_connect_string.h ) @@ -206,7 +207,6 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/client_config/resolver_factory.h ) s.files += %w( src/core/lib/client_config/resolver_registry.h ) s.files += %w( src/core/lib/client_config/subchannel.h ) - s.files += %w( src/core/lib/client_config/subchannel_factory.h ) s.files += %w( src/core/lib/client_config/subchannel_index.h ) s.files += %w( src/core/lib/client_config/uri_parser.h ) s.files += %w( src/core/lib/compression/algorithm_metadata.h ) @@ -342,6 +342,7 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/channel/http_client_filter.c ) s.files += %w( src/core/lib/channel/http_server_filter.c ) s.files += %w( src/core/lib/channel/subchannel_call_holder.c ) + s.files += %w( src/core/lib/client_config/client_channel_factory.c ) s.files += %w( src/core/lib/client_config/client_config.c ) s.files += %w( src/core/lib/client_config/connector.c ) s.files += %w( src/core/lib/client_config/default_initial_connect_string.c ) @@ -353,7 +354,6 @@ Gem::Specification.new do |s| s.files += %w( src/core/lib/client_config/resolver_factory.c ) s.files += %w( src/core/lib/client_config/resolver_registry.c ) s.files += %w( src/core/lib/client_config/subchannel.c ) - s.files += %w( src/core/lib/client_config/subchannel_factory.c ) s.files += %w( src/core/lib/client_config/subchannel_index.c ) s.files += %w( src/core/lib/client_config/uri_parser.c ) s.files += %w( src/core/lib/compression/compression_algorithm.c ) diff --git a/include/grpc++/impl/codegen/async_stream.h b/include/grpc++/impl/codegen/async_stream.h index 78fb7274e2..a607a47106 100644 --- a/include/grpc++/impl/codegen/async_stream.h +++ b/include/grpc++/impl/codegen/async_stream.h @@ -108,7 +108,8 @@ class ClientAsyncReader GRPC_FINAL : public ClientAsyncReaderInterface<R> { const W& request, void* tag) : context_(context), call_(channel->CreateCall(method, context, cq)) { init_ops_.set_output_tag(tag); - init_ops_.SendInitialMetadata(context->send_initial_metadata_); + init_ops_.SendInitialMetadata(context->send_initial_metadata_, + context->initial_metadata_flags()); // TODO(ctiller): don't assert GPR_CODEGEN_ASSERT(init_ops_.SendMessage(request).ok()); init_ops_.ClientSendClose(); @@ -173,7 +174,8 @@ class ClientAsyncWriter GRPC_FINAL : public ClientAsyncWriterInterface<W> { finish_ops_.RecvMessage(response); init_ops_.set_output_tag(tag); - init_ops_.SendInitialMetadata(context->send_initial_metadata_); + init_ops_.SendInitialMetadata(context->send_initial_metadata_, + context->initial_metadata_flags()); call_.PerformOps(&init_ops_); } @@ -240,7 +242,8 @@ class ClientAsyncReaderWriter GRPC_FINAL void* tag) : context_(context), call_(channel->CreateCall(method, context, cq)) { init_ops_.set_output_tag(tag); - init_ops_.SendInitialMetadata(context->send_initial_metadata_); + init_ops_.SendInitialMetadata(context->send_initial_metadata_, + context->initial_metadata_flags()); call_.PerformOps(&init_ops_); } @@ -305,7 +308,8 @@ class ServerAsyncReader GRPC_FINAL : public ServerAsyncStreamingInterface, GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); meta_ops_.set_output_tag(tag); - meta_ops_.SendInitialMetadata(ctx_->initial_metadata_); + meta_ops_.SendInitialMetadata(ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); ctx_->sent_initial_metadata_ = true; call_.PerformOps(&meta_ops_); } @@ -319,7 +323,8 @@ class ServerAsyncReader GRPC_FINAL : public ServerAsyncStreamingInterface, void Finish(const W& msg, const Status& status, void* tag) { finish_ops_.set_output_tag(tag); if (!ctx_->sent_initial_metadata_) { - finish_ops_.SendInitialMetadata(ctx_->initial_metadata_); + finish_ops_.SendInitialMetadata(ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); ctx_->sent_initial_metadata_ = true; } // The response is dropped if the status is not OK. @@ -336,7 +341,8 @@ class ServerAsyncReader GRPC_FINAL : public ServerAsyncStreamingInterface, GPR_CODEGEN_ASSERT(!status.ok()); finish_ops_.set_output_tag(tag); if (!ctx_->sent_initial_metadata_) { - finish_ops_.SendInitialMetadata(ctx_->initial_metadata_); + finish_ops_.SendInitialMetadata(ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); ctx_->sent_initial_metadata_ = true; } finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status); @@ -366,7 +372,8 @@ class ServerAsyncWriter GRPC_FINAL : public ServerAsyncStreamingInterface, GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); meta_ops_.set_output_tag(tag); - meta_ops_.SendInitialMetadata(ctx_->initial_metadata_); + meta_ops_.SendInitialMetadata(ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); ctx_->sent_initial_metadata_ = true; call_.PerformOps(&meta_ops_); } @@ -374,7 +381,8 @@ class ServerAsyncWriter GRPC_FINAL : public ServerAsyncStreamingInterface, void Write(const W& msg, void* tag) GRPC_OVERRIDE { write_ops_.set_output_tag(tag); if (!ctx_->sent_initial_metadata_) { - write_ops_.SendInitialMetadata(ctx_->initial_metadata_); + write_ops_.SendInitialMetadata(ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); ctx_->sent_initial_metadata_ = true; } // TODO(ctiller): don't assert @@ -385,7 +393,8 @@ class ServerAsyncWriter GRPC_FINAL : public ServerAsyncStreamingInterface, void Finish(const Status& status, void* tag) { finish_ops_.set_output_tag(tag); if (!ctx_->sent_initial_metadata_) { - finish_ops_.SendInitialMetadata(ctx_->initial_metadata_); + finish_ops_.SendInitialMetadata(ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); ctx_->sent_initial_metadata_ = true; } finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status); @@ -415,7 +424,8 @@ class ServerAsyncReaderWriter GRPC_FINAL : public ServerAsyncStreamingInterface, GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); meta_ops_.set_output_tag(tag); - meta_ops_.SendInitialMetadata(ctx_->initial_metadata_); + meta_ops_.SendInitialMetadata(ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); ctx_->sent_initial_metadata_ = true; call_.PerformOps(&meta_ops_); } @@ -429,7 +439,8 @@ class ServerAsyncReaderWriter GRPC_FINAL : public ServerAsyncStreamingInterface, void Write(const W& msg, void* tag) GRPC_OVERRIDE { write_ops_.set_output_tag(tag); if (!ctx_->sent_initial_metadata_) { - write_ops_.SendInitialMetadata(ctx_->initial_metadata_); + write_ops_.SendInitialMetadata(ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); ctx_->sent_initial_metadata_ = true; } // TODO(ctiller): don't assert @@ -440,7 +451,8 @@ class ServerAsyncReaderWriter GRPC_FINAL : public ServerAsyncStreamingInterface, void Finish(const Status& status, void* tag) { finish_ops_.set_output_tag(tag); if (!ctx_->sent_initial_metadata_) { - finish_ops_.SendInitialMetadata(ctx_->initial_metadata_); + finish_ops_.SendInitialMetadata(ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); ctx_->sent_initial_metadata_ = true; } finish_ops_.ServerSendStatus(ctx_->trailing_metadata_, status); diff --git a/include/grpc++/impl/codegen/async_unary_call.h b/include/grpc++/impl/codegen/async_unary_call.h index 52b34770a8..55c9788fbd 100644 --- a/include/grpc++/impl/codegen/async_unary_call.h +++ b/include/grpc++/impl/codegen/async_unary_call.h @@ -67,7 +67,8 @@ class ClientAsyncResponseReader GRPC_FINAL call_(channel->CreateCall(method, context, cq)), collection_(new CallOpSetCollection) { collection_->init_buf_.SetCollection(collection_); - collection_->init_buf_.SendInitialMetadata(context->send_initial_metadata_); + collection_->init_buf_.SendInitialMetadata( + context->send_initial_metadata_, context->initial_metadata_flags()); // TODO(ctiller): don't assert GPR_CODEGEN_ASSERT(collection_->init_buf_.SendMessage(request).ok()); collection_->init_buf_.ClientSendClose(); @@ -122,7 +123,8 @@ class ServerAsyncResponseWriter GRPC_FINAL GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); meta_buf_.set_output_tag(tag); - meta_buf_.SendInitialMetadata(ctx_->initial_metadata_); + meta_buf_.SendInitialMetadata(ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); ctx_->sent_initial_metadata_ = true; call_.PerformOps(&meta_buf_); } @@ -130,7 +132,8 @@ class ServerAsyncResponseWriter GRPC_FINAL void Finish(const W& msg, const Status& status, void* tag) { finish_buf_.set_output_tag(tag); if (!ctx_->sent_initial_metadata_) { - finish_buf_.SendInitialMetadata(ctx_->initial_metadata_); + finish_buf_.SendInitialMetadata(ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); ctx_->sent_initial_metadata_ = true; } // The response is dropped if the status is not OK. @@ -147,7 +150,8 @@ class ServerAsyncResponseWriter GRPC_FINAL GPR_CODEGEN_ASSERT(!status.ok()); finish_buf_.set_output_tag(tag); if (!ctx_->sent_initial_metadata_) { - finish_buf_.SendInitialMetadata(ctx_->initial_metadata_); + finish_buf_.SendInitialMetadata(ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); ctx_->sent_initial_metadata_ = true; } finish_buf_.ServerSendStatus(ctx_->trailing_metadata_, status); diff --git a/include/grpc++/impl/codegen/call.h b/include/grpc++/impl/codegen/call.h index f76d7c23ed..aea1a6acec 100644 --- a/include/grpc++/impl/codegen/call.h +++ b/include/grpc++/impl/codegen/call.h @@ -181,8 +181,10 @@ class CallOpSendInitialMetadata { CallOpSendInitialMetadata() : send_(false) {} void SendInitialMetadata( - const std::multimap<grpc::string, grpc::string>& metadata) { + const std::multimap<grpc::string, grpc::string>& metadata, + uint32_t flags) { send_ = true; + flags_ = flags; initial_metadata_count_ = metadata.size(); initial_metadata_ = FillMetadataArray(metadata); } @@ -192,7 +194,7 @@ class CallOpSendInitialMetadata { if (!send_) return; grpc_op* op = &ops[(*nops)++]; op->op = GRPC_OP_SEND_INITIAL_METADATA; - op->flags = 0; + op->flags = flags_; op->reserved = NULL; op->data.send_initial_metadata.count = initial_metadata_count_; op->data.send_initial_metadata.metadata = initial_metadata_; @@ -204,6 +206,7 @@ class CallOpSendInitialMetadata { } bool send_; + uint32_t flags_; size_t initial_metadata_count_; grpc_metadata* initial_metadata_; }; diff --git a/include/grpc++/impl/codegen/client_context.h b/include/grpc++/impl/codegen/client_context.h index 5201808600..aed12767a7 100644 --- a/include/grpc++/impl/codegen/client_context.h +++ b/include/grpc++/impl/codegen/client_context.h @@ -221,6 +221,12 @@ class ClientContext { deadline_ = deadline_tp.raw_time(); } + /// EXPERIMENTAL: Set this request to be idempotent + void set_idempotent(bool idempotent) { idempotent_ = idempotent; } + + /// EXPERIMENTAL: Trigger fail-fast or not on this request + void set_fail_fast(bool fail_fast) { fail_fast_ = fail_fast; } + #ifndef GRPC_CXX0X_NO_CHRONO /// Return the deadline for the client call. std::chrono::system_clock::time_point deadline() { @@ -328,9 +334,16 @@ class ClientContext { grpc_call* call() { return call_; } void set_call(grpc_call* call, const std::shared_ptr<Channel>& channel); + uint32_t initial_metadata_flags() const { + return (idempotent_ ? GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST : 0) | + (fail_fast_ ? 0 : GRPC_INITIAL_METADATA_IGNORE_CONNECTIVITY); + } + grpc::string authority() { return authority_; } bool initial_metadata_received_; + bool fail_fast_; + bool idempotent_; std::shared_ptr<Channel> channel_; grpc::mutex mu_; grpc_call* call_; diff --git a/include/grpc++/impl/codegen/client_unary_call.h b/include/grpc++/impl/codegen/client_unary_call.h index 0ee5b198d2..70d65549c8 100644 --- a/include/grpc++/impl/codegen/client_unary_call.h +++ b/include/grpc++/impl/codegen/client_unary_call.h @@ -62,7 +62,8 @@ Status BlockingUnaryCall(ChannelInterface* channel, const RpcMethod& method, if (!status.ok()) { return status; } - ops.SendInitialMetadata(context->send_initial_metadata_); + ops.SendInitialMetadata(context->send_initial_metadata_, + context->initial_metadata_flags()); ops.RecvInitialMetadata(context); ops.RecvMessage(result); ops.ClientSendClose(); diff --git a/include/grpc++/impl/codegen/method_handler_impl.h b/include/grpc++/impl/codegen/method_handler_impl.h index 436b4d819b..ad74efabc4 100644 --- a/include/grpc++/impl/codegen/method_handler_impl.h +++ b/include/grpc++/impl/codegen/method_handler_impl.h @@ -63,7 +63,8 @@ class RpcMethodHandler : public MethodHandler { CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, CallOpServerSendStatus> ops; - ops.SendInitialMetadata(param.server_context->initial_metadata_); + ops.SendInitialMetadata(param.server_context->initial_metadata_, + param.server_context->initial_metadata_flags()); if (status.ok()) { status = ops.SendMessage(rsp); } @@ -100,7 +101,8 @@ class ClientStreamingHandler : public MethodHandler { CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, CallOpServerSendStatus> ops; - ops.SendInitialMetadata(param.server_context->initial_metadata_); + ops.SendInitialMetadata(param.server_context->initial_metadata_, + param.server_context->initial_metadata_flags()); if (status.ok()) { status = ops.SendMessage(rsp); } @@ -138,7 +140,8 @@ class ServerStreamingHandler : public MethodHandler { CallOpSet<CallOpSendInitialMetadata, CallOpServerSendStatus> ops; if (!param.server_context->sent_initial_metadata_) { - ops.SendInitialMetadata(param.server_context->initial_metadata_); + ops.SendInitialMetadata(param.server_context->initial_metadata_, + param.server_context->initial_metadata_flags()); } ops.ServerSendStatus(param.server_context->trailing_metadata_, status); param.call->PerformOps(&ops); @@ -170,7 +173,8 @@ class BidiStreamingHandler : public MethodHandler { CallOpSet<CallOpSendInitialMetadata, CallOpServerSendStatus> ops; if (!param.server_context->sent_initial_metadata_) { - ops.SendInitialMetadata(param.server_context->initial_metadata_); + ops.SendInitialMetadata(param.server_context->initial_metadata_, + param.server_context->initial_metadata_flags()); } ops.ServerSendStatus(param.server_context->trailing_metadata_, status); param.call->PerformOps(&ops); @@ -191,7 +195,8 @@ class UnknownMethodHandler : public MethodHandler { static void FillOps(ServerContext* context, T* ops) { Status status(StatusCode::UNIMPLEMENTED, ""); if (!context->sent_initial_metadata_) { - ops->SendInitialMetadata(context->initial_metadata_); + ops->SendInitialMetadata(context->initial_metadata_, + context->initial_metadata_flags()); context->sent_initial_metadata_ = true; } ops->ServerSendStatus(context->trailing_metadata_, status); diff --git a/include/grpc++/impl/codegen/server_context.h b/include/grpc++/impl/codegen/server_context.h index 44d340aa45..7fa0235ca9 100644 --- a/include/grpc++/impl/codegen/server_context.h +++ b/include/grpc++/impl/codegen/server_context.h @@ -195,6 +195,8 @@ class ServerContext { void set_call(grpc_call* call); + uint32_t initial_metadata_flags() const { return 0; } + CompletionOp* completion_op_; bool has_notify_when_done_tag_; void* async_notify_when_done_tag_; diff --git a/include/grpc++/impl/codegen/sync_stream.h b/include/grpc++/impl/codegen/sync_stream.h index d0ad05169f..9100ce09a2 100644 --- a/include/grpc++/impl/codegen/sync_stream.h +++ b/include/grpc++/impl/codegen/sync_stream.h @@ -125,7 +125,8 @@ class ClientReader GRPC_FINAL : public ClientReaderInterface<R> { CallOpSet<CallOpSendInitialMetadata, CallOpSendMessage, CallOpClientSendClose> ops; - ops.SendInitialMetadata(context->send_initial_metadata_); + ops.SendInitialMetadata(context->send_initial_metadata_, + context->initial_metadata_flags()); // TODO(ctiller): don't assert GPR_CODEGEN_ASSERT(ops.SendMessage(request).ok()); ops.ClientSendClose(); @@ -190,7 +191,8 @@ class ClientWriter : public ClientWriterInterface<W> { finish_ops_.RecvMessage(response); CallOpSet<CallOpSendInitialMetadata> ops; - ops.SendInitialMetadata(context->send_initial_metadata_); + ops.SendInitialMetadata(context->send_initial_metadata_, + context->initial_metadata_flags()); call_.PerformOps(&ops); cq_.Pluck(&ops); } @@ -268,7 +270,8 @@ class ClientReaderWriter GRPC_FINAL : public ClientReaderWriterInterface<W, R> { ClientContext* context) : context_(context), call_(channel->CreateCall(method, context, &cq_)) { CallOpSet<CallOpSendInitialMetadata> ops; - ops.SendInitialMetadata(context->send_initial_metadata_); + ops.SendInitialMetadata(context->send_initial_metadata_, + context->initial_metadata_flags()); call_.PerformOps(&ops); cq_.Pluck(&ops); } @@ -334,7 +337,8 @@ class ServerReader GRPC_FINAL : public ReaderInterface<R> { GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); CallOpSet<CallOpSendInitialMetadata> ops; - ops.SendInitialMetadata(ctx_->initial_metadata_); + ops.SendInitialMetadata(ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); ctx_->sent_initial_metadata_ = true; call_->PerformOps(&ops); call_->cq()->Pluck(&ops); @@ -361,7 +365,8 @@ class ServerWriter GRPC_FINAL : public WriterInterface<W> { GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); CallOpSet<CallOpSendInitialMetadata> ops; - ops.SendInitialMetadata(ctx_->initial_metadata_); + ops.SendInitialMetadata(ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); ctx_->sent_initial_metadata_ = true; call_->PerformOps(&ops); call_->cq()->Pluck(&ops); @@ -374,7 +379,8 @@ class ServerWriter GRPC_FINAL : public WriterInterface<W> { return false; } if (!ctx_->sent_initial_metadata_) { - ops.SendInitialMetadata(ctx_->initial_metadata_); + ops.SendInitialMetadata(ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); ctx_->sent_initial_metadata_ = true; } call_->PerformOps(&ops); @@ -397,7 +403,8 @@ class ServerReaderWriter GRPC_FINAL : public WriterInterface<W>, GPR_CODEGEN_ASSERT(!ctx_->sent_initial_metadata_); CallOpSet<CallOpSendInitialMetadata> ops; - ops.SendInitialMetadata(ctx_->initial_metadata_); + ops.SendInitialMetadata(ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); ctx_->sent_initial_metadata_ = true; call_->PerformOps(&ops); call_->cq()->Pluck(&ops); @@ -417,7 +424,8 @@ class ServerReaderWriter GRPC_FINAL : public WriterInterface<W>, return false; } if (!ctx_->sent_initial_metadata_) { - ops.SendInitialMetadata(ctx_->initial_metadata_); + ops.SendInitialMetadata(ctx_->initial_metadata_, + ctx_->initial_metadata_flags()); ctx_->sent_initial_metadata_ = true; } call_->PerformOps(&ops); diff --git a/include/grpc/grpc.h b/include/grpc/grpc.h index 8b460722e2..5c868aece3 100644 --- a/include/grpc/grpc.h +++ b/include/grpc/grpc.h @@ -289,6 +289,14 @@ GRPCAPI grpc_call_error grpc_server_request_call( grpc_completion_queue *cq_bound_to_call, grpc_completion_queue *cq_for_notification, void *tag_new); +/** How to handle payloads for a registered method */ +typedef enum { + /** Don't try to read the payload */ + GRPC_SRM_PAYLOAD_NONE, + /** Read the initial payload as a byte buffer */ + GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER +} grpc_server_register_method_payload_handling; + /** Registers a method in the server. Methods to this (host, method) pair will not be reported by grpc_server_request_call, but instead be reported by @@ -296,9 +304,10 @@ GRPCAPI grpc_call_error grpc_server_request_call( registered_method (as returned by this function). Must be called before grpc_server_start. Returns NULL on failure. */ -GRPCAPI void *grpc_server_register_method(grpc_server *server, - const char *method, const char *host, - uint32_t flags); +GRPCAPI void *grpc_server_register_method( + grpc_server *server, const char *method, const char *host, + grpc_server_register_method_payload_handling payload_handling, + uint32_t flags); /** Request notification of a new pre-registered call. 'cq_for_notification' must have been registered to the server via diff --git a/include/grpc/impl/codegen/grpc_types.h b/include/grpc/impl/codegen/grpc_types.h index b09b1cdf44..4c7373006b 100644 --- a/include/grpc/impl/codegen/grpc_types.h +++ b/include/grpc/impl/codegen/grpc_types.h @@ -142,6 +142,8 @@ typedef struct { /** Secondary user agent: goes at the end of the user-agent metadata sent on each request */ #define GRPC_ARG_SECONDARY_USER_AGENT_STRING "grpc.secondary_user_agent" +/** The maximum time between subsequent connection attempts, in ms */ +#define GRPC_ARG_MAX_RECONNECT_BACKOFF_MS "grpc.max_reconnect_backoff_ms" /* The caller of the secure_channel_create functions may override the target name used for SSL host name checking using this channel argument which is of type GRPC_ARG_STRING. This *should* be used for testing only. @@ -185,7 +187,9 @@ typedef enum grpc_call_error { server */ GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE, /** this batch of operations leads to more operations than allowed */ - GRPC_CALL_ERROR_BATCH_TOO_BIG + GRPC_CALL_ERROR_BATCH_TOO_BIG, + /** payload type requested is not the type registered */ + GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH } grpc_call_error; /* Write Flags: */ @@ -202,8 +206,12 @@ typedef enum grpc_call_error { /* Initial metadata flags */ /** Signal that the call is idempotent */ #define GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST (0x00000010u) +/** Signal that the call should not return UNAVAILABLE before it has started */ +#define GRPC_INITIAL_METADATA_IGNORE_CONNECTIVITY (0x00000020u) /** Mask of all valid flags */ -#define GRPC_INITIAL_METADATA_USED_MASK GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST +#define GRPC_INITIAL_METADATA_USED_MASK \ + (GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST | \ + GRPC_INITIAL_METADATA_IGNORE_CONNECTIVITY) /** A single metadata element */ typedef struct grpc_metadata { diff --git a/package.json b/package.json index eddf4341a8..d9740a419e 100644 --- a/package.json +++ b/package.json @@ -139,6 +139,7 @@ "src/core/lib/channel/http_client_filter.h", "src/core/lib/channel/http_server_filter.h", "src/core/lib/channel/subchannel_call_holder.h", + "src/core/lib/client_config/client_channel_factory.h", "src/core/lib/client_config/client_config.h", "src/core/lib/client_config/connector.h", "src/core/lib/client_config/initial_connect_string.h", @@ -149,7 +150,6 @@ "src/core/lib/client_config/resolver_factory.h", "src/core/lib/client_config/resolver_registry.h", "src/core/lib/client_config/subchannel.h", - "src/core/lib/client_config/subchannel_factory.h", "src/core/lib/client_config/subchannel_index.h", "src/core/lib/client_config/uri_parser.h", "src/core/lib/compression/algorithm_metadata.h", @@ -285,6 +285,7 @@ "src/core/lib/channel/http_client_filter.c", "src/core/lib/channel/http_server_filter.c", "src/core/lib/channel/subchannel_call_holder.c", + "src/core/lib/client_config/client_channel_factory.c", "src/core/lib/client_config/client_config.c", "src/core/lib/client_config/connector.c", "src/core/lib/client_config/default_initial_connect_string.c", @@ -296,7 +297,6 @@ "src/core/lib/client_config/resolver_factory.c", "src/core/lib/client_config/resolver_registry.c", "src/core/lib/client_config/subchannel.c", - "src/core/lib/client_config/subchannel_factory.c", "src/core/lib/client_config/subchannel_index.c", "src/core/lib/client_config/uri_parser.c", "src/core/lib/compression/compression_algorithm.c", diff --git a/package.xml b/package.xml index 76b246eaaa..3415ff3093 100644 --- a/package.xml +++ b/package.xml @@ -200,6 +200,7 @@ <file baseinstalldir="/" name="src/core/lib/channel/http_client_filter.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/channel/http_server_filter.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/channel/subchannel_call_holder.h" role="src" /> + <file baseinstalldir="/" name="src/core/lib/client_config/client_channel_factory.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/client_config/client_config.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/client_config/connector.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/client_config/initial_connect_string.h" role="src" /> @@ -210,7 +211,6 @@ <file baseinstalldir="/" name="src/core/lib/client_config/resolver_factory.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/client_config/resolver_registry.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/client_config/subchannel.h" role="src" /> - <file baseinstalldir="/" name="src/core/lib/client_config/subchannel_factory.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/client_config/subchannel_index.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/client_config/uri_parser.h" role="src" /> <file baseinstalldir="/" name="src/core/lib/compression/algorithm_metadata.h" role="src" /> @@ -346,6 +346,7 @@ <file baseinstalldir="/" name="src/core/lib/channel/http_client_filter.c" role="src" /> <file baseinstalldir="/" name="src/core/lib/channel/http_server_filter.c" role="src" /> <file baseinstalldir="/" name="src/core/lib/channel/subchannel_call_holder.c" role="src" /> + <file baseinstalldir="/" name="src/core/lib/client_config/client_channel_factory.c" role="src" /> <file baseinstalldir="/" name="src/core/lib/client_config/client_config.c" role="src" /> <file baseinstalldir="/" name="src/core/lib/client_config/connector.c" role="src" /> <file baseinstalldir="/" name="src/core/lib/client_config/default_initial_connect_string.c" role="src" /> @@ -357,7 +358,6 @@ <file baseinstalldir="/" name="src/core/lib/client_config/resolver_factory.c" role="src" /> <file baseinstalldir="/" name="src/core/lib/client_config/resolver_registry.c" role="src" /> <file baseinstalldir="/" name="src/core/lib/client_config/subchannel.c" role="src" /> - <file baseinstalldir="/" name="src/core/lib/client_config/subchannel_factory.c" role="src" /> <file baseinstalldir="/" name="src/core/lib/client_config/subchannel_index.c" role="src" /> <file baseinstalldir="/" name="src/core/lib/client_config/uri_parser.c" role="src" /> <file baseinstalldir="/" name="src/core/lib/compression/compression_algorithm.c" role="src" /> diff --git a/src/compiler/csharp_generator.cc b/src/compiler/csharp_generator.cc index 5a8746df8d..69e2738d53 100644 --- a/src/compiler/csharp_generator.cc +++ b/src/compiler/csharp_generator.cc @@ -81,6 +81,10 @@ std::string GetServerInterfaceName(const ServiceDescriptor* service) { return "I" + service->name(); } +std::string GetServerClassName(const ServiceDescriptor* service) { + return service->name() + "Base"; +} + std::string GetCSharpMethodType(MethodType method_type) { switch (method_type) { case METHODTYPE_NO_STREAMING: @@ -108,10 +112,14 @@ std::string GetMethodFieldName(const MethodDescriptor *method) { return "__Method_" + method->name(); } -std::string GetMethodRequestParamMaybe(const MethodDescriptor *method) { +std::string GetMethodRequestParamMaybe(const MethodDescriptor *method, + bool invocation_param=false) { if (method->client_streaming()) { return ""; } + if (invocation_param) { + return "request, "; + } return GetClassName(method->input_type()) + " request, "; } @@ -242,6 +250,8 @@ void GenerateServiceDescriptorProperty(Printer* out, const ServiceDescriptor *se void GenerateClientInterface(Printer* out, const ServiceDescriptor *service) { out->Print("// client interface\n"); + out->Print("[System.Obsolete(\"Client side interfaced will be removed " + "in the next release. Use client class directly.\")]\n"); out->Print("public interface $name$\n", "name", GetClientInterfaceName(service)); out->Print("{\n"); @@ -290,6 +300,8 @@ void GenerateClientInterface(Printer* out, const ServiceDescriptor *service) { void GenerateServerInterface(Printer* out, const ServiceDescriptor *service) { out->Print("// server-side interface\n"); + out->Print("[System.Obsolete(\"Service implementations should inherit" + " from the generated abstract base class instead.\")]\n"); out->Print("public interface $name$\n", "name", GetServerInterfaceName(service)); out->Print("{\n"); @@ -309,21 +321,64 @@ void GenerateServerInterface(Printer* out, const ServiceDescriptor *service) { out->Print("\n"); } +void GenerateServerClass(Printer* out, const ServiceDescriptor *service) { + out->Print("// server-side abstract class\n"); + out->Print("public abstract class $name$\n", "name", + GetServerClassName(service)); + out->Print("{\n"); + out->Indent(); + for (int i = 0; i < service->method_count(); i++) { + const MethodDescriptor *method = service->method(i); + out->Print( + "public virtual $returntype$ $methodname$($request$$response_stream_maybe$, " + "ServerCallContext context)\n", + "methodname", method->name(), "returntype", + GetMethodReturnTypeServer(method), "request", + GetMethodRequestParamServer(method), "response_stream_maybe", + GetMethodResponseStreamMaybe(method)); + out->Print("{\n"); + out->Indent(); + out->Print("throw new RpcException(" + "new Status(StatusCode.Unimplemented, \"\"));\n"); + out->Outdent(); + out->Print("}\n\n"); + } + out->Outdent(); + out->Print("}\n"); + out->Print("\n"); +} + void GenerateClientStub(Printer* out, const ServiceDescriptor *service) { out->Print("// client stub\n"); out->Print( - "public class $name$ : ClientBase, $interface$\n", - "name", GetClientClassName(service), "interface", - GetClientInterfaceName(service)); + "public class $name$ : ClientBase<$name$>, $interface$\n", + "name", GetClientClassName(service), + "interface", GetClientInterfaceName(service)); out->Print("{\n"); out->Indent(); // constructors - out->Print( - "public $name$(Channel channel) : base(channel)\n", - "name", GetClientClassName(service)); + out->Print("public $name$(Channel channel) : base(channel)\n", + "name", GetClientClassName(service)); + out->Print("{\n"); + out->Print("}\n"); + out->Print("public $name$(CallInvoker callInvoker) : base(callInvoker)\n", + "name", GetClientClassName(service)); out->Print("{\n"); out->Print("}\n"); + out->Print("///<summary>Protected parameterless constructor to allow creation" + " of test doubles.</summary>\n"); + out->Print("protected $name$() : base()\n", + "name", GetClientClassName(service)); + out->Print("{\n"); + out->Print("}\n"); + out->Print("///<summary>Protected constructor to allow creation of configured" + " clients.</summary>\n"); + out->Print("protected $name$(ClientBaseConfiguration configuration)" + " : base(configuration)\n", + "name", GetClientClassName(service)); + out->Print("{\n"); + out->Print("}\n\n"); for (int i = 0; i < service->method_count(); i++) { const MethodDescriptor *method = service->method(i); @@ -331,30 +386,26 @@ void GenerateClientStub(Printer* out, const ServiceDescriptor *service) { if (method_type == METHODTYPE_NO_STREAMING) { // unary calls have an extra synchronous stub method - out->Print( - "public $response$ $methodname$($request$ request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))\n", + out->Print("public virtual $response$ $methodname$($request$ request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))\n", "methodname", method->name(), "request", GetClassName(method->input_type()), "response", GetClassName(method->output_type())); out->Print("{\n"); out->Indent(); - out->Print("var call = CreateCall($methodfield$, new CallOptions(headers, deadline, cancellationToken));\n", - "methodfield", GetMethodFieldName(method)); - out->Print("return Calls.BlockingUnaryCall(call, request);\n"); + out->Print("return $methodname$(request, new CallOptions(headers, deadline, cancellationToken));\n", + "methodname", method->name()); out->Outdent(); out->Print("}\n"); // overload taking CallOptions as a param - out->Print( - "public $response$ $methodname$($request$ request, CallOptions options)\n", - "methodname", method->name(), "request", - GetClassName(method->input_type()), "response", - GetClassName(method->output_type())); + out->Print("public virtual $response$ $methodname$($request$ request, CallOptions options)\n", + "methodname", method->name(), "request", + GetClassName(method->input_type()), "response", + GetClassName(method->output_type())); out->Print("{\n"); out->Indent(); - out->Print("var call = CreateCall($methodfield$, options);\n", + out->Print("return CallInvoker.BlockingUnaryCall($methodfield$, null, options, request);\n", "methodfield", GetMethodFieldName(method)); - out->Print("return Calls.BlockingUnaryCall(call, request);\n"); out->Outdent(); out->Print("}\n"); } @@ -364,57 +415,44 @@ void GenerateClientStub(Printer* out, const ServiceDescriptor *service) { method_name += "Async"; // prevent name clash with synchronous method. } out->Print( - "public $returntype$ $methodname$($request_maybe$Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))\n", - "methodname", method_name, "request_maybe", - GetMethodRequestParamMaybe(method), "returntype", - GetMethodReturnTypeClient(method)); + "public virtual $returntype$ $methodname$($request_maybe$Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))\n", + "methodname", method_name, "request_maybe", + GetMethodRequestParamMaybe(method), "returntype", + GetMethodReturnTypeClient(method)); out->Print("{\n"); out->Indent(); - out->Print("var call = CreateCall($methodfield$, new CallOptions(headers, deadline, cancellationToken));\n", - "methodfield", GetMethodFieldName(method)); - switch (GetMethodType(method)) { - case METHODTYPE_NO_STREAMING: - out->Print("return Calls.AsyncUnaryCall(call, request);\n"); - break; - case METHODTYPE_CLIENT_STREAMING: - out->Print("return Calls.AsyncClientStreamingCall(call);\n"); - break; - case METHODTYPE_SERVER_STREAMING: - out->Print( - "return Calls.AsyncServerStreamingCall(call, request);\n"); - break; - case METHODTYPE_BIDI_STREAMING: - out->Print("return Calls.AsyncDuplexStreamingCall(call);\n"); - break; - default: - GOOGLE_LOG(FATAL)<< "Can't get here."; - } + + out->Print("return $methodname$($request_maybe$new CallOptions(headers, deadline, cancellationToken));\n", + "methodname", method_name, + "request_maybe", GetMethodRequestParamMaybe(method, true)); out->Outdent(); out->Print("}\n"); // overload taking CallOptions as a param out->Print( - "public $returntype$ $methodname$($request_maybe$CallOptions options)\n", + "public virtual $returntype$ $methodname$($request_maybe$CallOptions options)\n", "methodname", method_name, "request_maybe", GetMethodRequestParamMaybe(method), "returntype", GetMethodReturnTypeClient(method)); out->Print("{\n"); out->Indent(); - out->Print("var call = CreateCall($methodfield$, options);\n", - "methodfield", GetMethodFieldName(method)); switch (GetMethodType(method)) { case METHODTYPE_NO_STREAMING: - out->Print("return Calls.AsyncUnaryCall(call, request);\n"); + out->Print("return CallInvoker.AsyncUnaryCall($methodfield$, null, options, request);\n", + "methodfield", GetMethodFieldName(method)); break; case METHODTYPE_CLIENT_STREAMING: - out->Print("return Calls.AsyncClientStreamingCall(call);\n"); + out->Print("return CallInvoker.AsyncClientStreamingCall($methodfield$, null, options);\n", + "methodfield", GetMethodFieldName(method)); break; case METHODTYPE_SERVER_STREAMING: out->Print( - "return Calls.AsyncServerStreamingCall(call, request);\n"); + "return CallInvoker.AsyncServerStreamingCall($methodfield$, null, options, request);\n", + "methodfield", GetMethodFieldName(method)); break; case METHODTYPE_BIDI_STREAMING: - out->Print("return Calls.AsyncDuplexStreamingCall(call);\n"); + out->Print("return CallInvoker.AsyncDuplexStreamingCall($methodfield$, null, options);\n", + "methodfield", GetMethodFieldName(method)); break; default: GOOGLE_LOG(FATAL)<< "Can't get here."; @@ -422,17 +460,30 @@ void GenerateClientStub(Printer* out, const ServiceDescriptor *service) { out->Outdent(); out->Print("}\n"); } + + // override NewInstance method + out->Print("protected override $name$ NewInstance(ClientBaseConfiguration configuration)\n", + "name", GetClientClassName(service)); + out->Print("{\n"); + out->Indent(); + out->Print("return new $name$(configuration);\n", + "name", GetClientClassName(service)); + out->Outdent(); + out->Print("}\n"); + out->Outdent(); out->Print("}\n"); out->Print("\n"); } -void GenerateBindServiceMethod(Printer* out, const ServiceDescriptor *service) { +void GenerateBindServiceMethod(Printer* out, const ServiceDescriptor *service, + bool use_server_class) { out->Print( "// creates service definition that can be registered with a server\n"); out->Print( "public static ServerServiceDefinition BindService($interface$ serviceImpl)\n", - "interface", GetServerInterfaceName(service)); + "interface", use_server_class ? GetServerClassName(service) : + GetServerInterfaceName(service)); out->Print("{\n"); out->Indent(); @@ -489,8 +540,10 @@ void GenerateService(Printer* out, const ServiceDescriptor *service) { GenerateServiceDescriptorProperty(out, service); GenerateClientInterface(out, service); GenerateServerInterface(out, service); + GenerateServerClass(out, service); GenerateClientStub(out, service); - GenerateBindServiceMethod(out, service); + GenerateBindServiceMethod(out, service, false); + GenerateBindServiceMethod(out, service, true); GenerateNewStubMethods(out, service); out->Outdent(); diff --git a/src/core/ext/lb_policy/grpclb/load_balancer_api.c b/src/core/ext/lb_policy/grpclb/load_balancer_api.c index d8af644870..459d6d9954 100644 --- a/src/core/ext/lb_policy/grpclb/load_balancer_api.c +++ b/src/core/ext/lb_policy/grpclb/load_balancer_api.c @@ -110,13 +110,15 @@ grpc_grpclb_response *grpc_grpclb_response_parse(gpr_slice encoded_response) { grpc_grpclb_response *res = gpr_malloc(sizeof(grpc_grpclb_response)); memset(res, 0, sizeof(*res)); status = pb_decode(&stream, grpc_lb_v0_LoadBalanceResponse_fields, res); - GPR_ASSERT(status == true); + if (!status) { + grpc_grpclb_response_destroy(res); + return NULL; + } return res; } grpc_grpclb_serverlist *grpc_grpclb_response_parse_serverlist( gpr_slice encoded_response) { - grpc_grpclb_serverlist *sl = gpr_malloc(sizeof(grpc_grpclb_serverlist)); bool status; decode_serverlist_arg arg; pb_istream_t stream = @@ -131,15 +133,20 @@ grpc_grpclb_serverlist *grpc_grpclb_response_parse_serverlist( res->server_list.servers.arg = &arg; arg.first_pass = 1; status = pb_decode(&stream, grpc_lb_v0_LoadBalanceResponse_fields, res); - GPR_ASSERT(status == true); - GPR_ASSERT(arg.num_servers > 0); + if (!status) { + grpc_grpclb_response_destroy(res); + return NULL; + } arg.first_pass = 0; status = pb_decode(&stream_at_start, grpc_lb_v0_LoadBalanceResponse_fields, res); - GPR_ASSERT(status == true); - GPR_ASSERT(arg.servers != NULL); + if (!status) { + grpc_grpclb_response_destroy(res); + return NULL; + } + grpc_grpclb_serverlist *sl = gpr_malloc(sizeof(grpc_grpclb_serverlist)); sl->num_servers = arg.num_servers; sl->servers = arg.servers; if (res->server_list.has_expiration_interval) { @@ -150,8 +157,10 @@ grpc_grpclb_serverlist *grpc_grpclb_response_parse_serverlist( } void grpc_grpclb_destroy_serverlist(grpc_grpclb_serverlist *serverlist) { - size_t i; - for (i = 0; i < serverlist->num_servers; i++) { + if (serverlist == NULL) { + return; + } + for (size_t i = 0; i < serverlist->num_servers; i++) { gpr_free(serverlist->servers[i]); } gpr_free(serverlist->servers); diff --git a/src/core/ext/lb_policy/pick_first/pick_first.c b/src/core/ext/lb_policy/pick_first/pick_first.c index cb5c40501e..43197c1191 100644 --- a/src/core/ext/lb_policy/pick_first/pick_first.c +++ b/src/core/ext/lb_policy/pick_first/pick_first.c @@ -40,6 +40,7 @@ typedef struct pending_pick { struct pending_pick *next; grpc_pollset *pollset; + uint32_t initial_metadata_flags; grpc_connected_subchannel **target; grpc_closure *on_complete; } pending_pick; @@ -149,6 +150,31 @@ static void pf_cancel_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol, gpr_mu_unlock(&p->mu); } +static void pf_cancel_picks(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol, + uint32_t initial_metadata_flags_mask, + uint32_t initial_metadata_flags_eq) { + pick_first_lb_policy *p = (pick_first_lb_policy *)pol; + pending_pick *pp; + gpr_mu_lock(&p->mu); + pp = p->pending_picks; + p->pending_picks = NULL; + while (pp != NULL) { + pending_pick *next = pp->next; + if ((pp->initial_metadata_flags & initial_metadata_flags_mask) == + initial_metadata_flags_eq) { + grpc_pollset_set_del_pollset(exec_ctx, p->base.interested_parties, + pp->pollset); + grpc_exec_ctx_enqueue(exec_ctx, pp->on_complete, false, NULL); + gpr_free(pp); + } else { + pp->next = p->pending_picks; + p->pending_picks = pp; + } + pp = next; + } + gpr_mu_unlock(&p->mu); +} + static void start_picking(grpc_exec_ctx *exec_ctx, pick_first_lb_policy *p) { p->started_picking = 1; p->checking_subchannel = 0; @@ -171,6 +197,7 @@ static void pf_exit_idle(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) { static int pf_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol, grpc_pollset *pollset, grpc_metadata_batch *initial_metadata, + uint32_t initial_metadata_flags, grpc_connected_subchannel **target, grpc_closure *on_complete) { pick_first_lb_policy *p = (pick_first_lb_policy *)pol; @@ -199,6 +226,7 @@ static int pf_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol, pp->next = p->pending_picks; pp->pollset = pollset; pp->target = target; + pp->initial_metadata_flags = initial_metadata_flags; pp->on_complete = on_complete; p->pending_picks = pp; gpr_mu_unlock(&p->mu); @@ -286,11 +314,14 @@ static void pf_connectivity_changed(grpc_exec_ctx *exec_ctx, void *arg, &p->checking_connectivity, &p->connectivity_changed); break; case GRPC_CHANNEL_TRANSIENT_FAILURE: - grpc_connectivity_state_set(exec_ctx, &p->state_tracker, - GRPC_CHANNEL_TRANSIENT_FAILURE, - "connecting_transient_failure"); p->checking_subchannel = (p->checking_subchannel + 1) % p->num_subchannels; + if (p->checking_subchannel == 0) { + /* only trigger transient failure when we've tried all alternatives */ + grpc_connectivity_state_set(exec_ctx, &p->state_tracker, + GRPC_CHANNEL_TRANSIENT_FAILURE, + "connecting_transient_failure"); + } p->checking_connectivity = grpc_subchannel_check_connectivity( p->subchannels[p->checking_subchannel]); if (p->checking_connectivity == GRPC_CHANNEL_TRANSIENT_FAILURE) { @@ -378,14 +409,9 @@ static void pf_ping_one(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol, } static const grpc_lb_policy_vtable pick_first_lb_policy_vtable = { - pf_destroy, - pf_shutdown, - pf_pick, - pf_cancel_pick, - pf_ping_one, - pf_exit_idle, - pf_check_connectivity, - pf_notify_on_state_change}; + pf_destroy, pf_shutdown, pf_pick, + pf_cancel_pick, pf_cancel_picks, pf_ping_one, + pf_exit_idle, pf_check_connectivity, pf_notify_on_state_change}; static void pick_first_factory_ref(grpc_lb_policy_factory *factory) {} @@ -395,7 +421,7 @@ static grpc_lb_policy *create_pick_first(grpc_exec_ctx *exec_ctx, grpc_lb_policy_factory *factory, grpc_lb_policy_args *args) { GPR_ASSERT(args->addresses != NULL); - GPR_ASSERT(args->subchannel_factory != NULL); + GPR_ASSERT(args->client_channel_factory != NULL); if (args->addresses->naddrs == 0) return NULL; @@ -412,8 +438,8 @@ static grpc_lb_policy *create_pick_first(grpc_exec_ctx *exec_ctx, sc_args.addr = (struct sockaddr *)(args->addresses->addrs[i].addr); sc_args.addr_len = (size_t)args->addresses->addrs[i].len; - grpc_subchannel *subchannel = grpc_subchannel_factory_create_subchannel( - exec_ctx, args->subchannel_factory, &sc_args); + grpc_subchannel *subchannel = grpc_client_channel_factory_create_subchannel( + exec_ctx, args->client_channel_factory, &sc_args); if (subchannel != NULL) { p->subchannels[subchannel_idx++] = subchannel; diff --git a/src/core/ext/lb_policy/round_robin/round_robin.c b/src/core/ext/lb_policy/round_robin/round_robin.c index d94c081494..eac6971099 100644 --- a/src/core/ext/lb_policy/round_robin/round_robin.c +++ b/src/core/ext/lb_policy/round_robin/round_robin.c @@ -49,6 +49,7 @@ int grpc_lb_round_robin_trace = 0; typedef struct pending_pick { struct pending_pick *next; grpc_pollset *pollset; + uint32_t initial_metadata_flags; grpc_connected_subchannel **target; grpc_closure *on_complete; } pending_pick; @@ -275,6 +276,32 @@ static void rr_cancel_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol, gpr_mu_unlock(&p->mu); } +static void rr_cancel_picks(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol, + uint32_t initial_metadata_flags_mask, + uint32_t initial_metadata_flags_eq) { + round_robin_lb_policy *p = (round_robin_lb_policy *)pol; + pending_pick *pp; + gpr_mu_lock(&p->mu); + pp = p->pending_picks; + p->pending_picks = NULL; + while (pp != NULL) { + pending_pick *next = pp->next; + if ((pp->initial_metadata_flags & initial_metadata_flags_mask) == + initial_metadata_flags_eq) { + grpc_pollset_set_del_pollset(exec_ctx, p->base.interested_parties, + pp->pollset); + *pp->target = NULL; + grpc_exec_ctx_enqueue(exec_ctx, pp->on_complete, false, NULL); + gpr_free(pp); + } else { + pp->next = p->pending_picks; + p->pending_picks = pp; + } + pp = next; + } + gpr_mu_unlock(&p->mu); +} + static void start_picking(grpc_exec_ctx *exec_ctx, round_robin_lb_policy *p) { size_t i; p->started_picking = 1; @@ -303,6 +330,7 @@ static void rr_exit_idle(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) { static int rr_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol, grpc_pollset *pollset, grpc_metadata_batch *initial_metadata, + uint32_t initial_metadata_flags, grpc_connected_subchannel **target, grpc_closure *on_complete) { round_robin_lb_policy *p = (round_robin_lb_policy *)pol; @@ -330,6 +358,7 @@ static int rr_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol, pp->pollset = pollset; pp->target = target; pp->on_complete = on_complete; + pp->initial_metadata_flags = initial_metadata_flags; p->pending_picks = pp; gpr_mu_unlock(&p->mu); return 0; @@ -485,14 +514,9 @@ static void rr_ping_one(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol, } static const grpc_lb_policy_vtable round_robin_lb_policy_vtable = { - rr_destroy, - rr_shutdown, - rr_pick, - rr_cancel_pick, - rr_ping_one, - rr_exit_idle, - rr_check_connectivity, - rr_notify_on_state_change}; + rr_destroy, rr_shutdown, rr_pick, + rr_cancel_pick, rr_cancel_picks, rr_ping_one, + rr_exit_idle, rr_check_connectivity, rr_notify_on_state_change}; static void round_robin_factory_ref(grpc_lb_policy_factory *factory) {} @@ -502,7 +526,7 @@ static grpc_lb_policy *create_round_robin(grpc_exec_ctx *exec_ctx, grpc_lb_policy_factory *factory, grpc_lb_policy_args *args) { GPR_ASSERT(args->addresses != NULL); - GPR_ASSERT(args->subchannel_factory != NULL); + GPR_ASSERT(args->client_channel_factory != NULL); round_robin_lb_policy *p = gpr_malloc(sizeof(*p)); memset(p, 0, sizeof(*p)); @@ -518,8 +542,8 @@ static grpc_lb_policy *create_round_robin(grpc_exec_ctx *exec_ctx, sc_args.addr = (struct sockaddr *)(args->addresses->addrs[i].addr); sc_args.addr_len = (size_t)args->addresses->addrs[i].len; - grpc_subchannel *subchannel = grpc_subchannel_factory_create_subchannel( - exec_ctx, args->subchannel_factory, &sc_args); + grpc_subchannel *subchannel = grpc_client_channel_factory_create_subchannel( + exec_ctx, args->client_channel_factory, &sc_args); if (subchannel != NULL) { subchannel_data *sd = gpr_malloc(sizeof(*sd)); diff --git a/src/core/ext/resolver/dns/native/dns_resolver.c b/src/core/ext/resolver/dns/native/dns_resolver.c index 70d8a3fe2d..1a0bf305d6 100644 --- a/src/core/ext/resolver/dns/native/dns_resolver.c +++ b/src/core/ext/resolver/dns/native/dns_resolver.c @@ -59,7 +59,7 @@ typedef struct { /** default port to use */ char *default_port; /** subchannel factory */ - grpc_subchannel_factory *subchannel_factory; + grpc_client_channel_factory *client_channel_factory; /** load balancing policy name */ char *lb_policy_name; @@ -170,7 +170,7 @@ static void dns_on_resolved(grpc_exec_ctx *exec_ctx, void *arg, config = grpc_client_config_create(); memset(&lb_policy_args, 0, sizeof(lb_policy_args)); lb_policy_args.addresses = addresses; - lb_policy_args.subchannel_factory = r->subchannel_factory; + lb_policy_args.client_channel_factory = r->client_channel_factory; lb_policy = grpc_lb_policy_create(exec_ctx, r->lb_policy_name, &lb_policy_args); if (lb_policy != NULL) { @@ -228,7 +228,7 @@ static void dns_destroy(grpc_exec_ctx *exec_ctx, grpc_resolver *gr) { if (r->resolved_config) { grpc_client_config_unref(exec_ctx, r->resolved_config); } - grpc_subchannel_factory_unref(exec_ctx, r->subchannel_factory); + grpc_client_channel_factory_unref(exec_ctx, r->client_channel_factory); gpr_free(r->name); gpr_free(r->default_port); gpr_free(r->lb_policy_name); @@ -255,10 +255,10 @@ static grpc_resolver *dns_create(grpc_resolver_args *args, grpc_resolver_init(&r->base, &dns_resolver_vtable); r->name = gpr_strdup(path); r->default_port = gpr_strdup(default_port); - r->subchannel_factory = args->subchannel_factory; + r->client_channel_factory = args->client_channel_factory; gpr_backoff_init(&r->backoff_state, BACKOFF_MULTIPLIER, BACKOFF_JITTER, BACKOFF_MIN_SECONDS * 1000, BACKOFF_MAX_SECONDS * 1000); - grpc_subchannel_factory_ref(r->subchannel_factory); + grpc_client_channel_factory_ref(r->client_channel_factory); r->lb_policy_name = gpr_strdup(lb_policy_name); return &r->base; } diff --git a/src/core/ext/resolver/sockaddr/sockaddr_resolver.c b/src/core/ext/resolver/sockaddr/sockaddr_resolver.c index 69595ca3db..76c03c08b5 100644 --- a/src/core/ext/resolver/sockaddr/sockaddr_resolver.c +++ b/src/core/ext/resolver/sockaddr/sockaddr_resolver.c @@ -31,13 +31,13 @@ * */ -#include <grpc/support/port_platform.h> - +#include <stdbool.h> #include <stdio.h> #include <string.h> #include <grpc/support/alloc.h> #include <grpc/support/host_port.h> +#include <grpc/support/port_platform.h> #include <grpc/support/string_util.h> #include "src/core/lib/client_config/lb_policy_registry.h" @@ -52,7 +52,7 @@ typedef struct { /** refcount */ gpr_refcount refs; /** subchannel factory */ - grpc_subchannel_factory *subchannel_factory; + grpc_client_channel_factory *client_channel_factory; /** load balancing policy name */ char *lb_policy_name; @@ -125,7 +125,7 @@ static void sockaddr_maybe_finish_next_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy_args lb_policy_args; memset(&lb_policy_args, 0, sizeof(lb_policy_args)); lb_policy_args.addresses = r->addresses; - lb_policy_args.subchannel_factory = r->subchannel_factory; + lb_policy_args.client_channel_factory = r->client_channel_factory; grpc_lb_policy *lb_policy = grpc_lb_policy_create(exec_ctx, r->lb_policy_name, &lb_policy_args); grpc_client_config_set_lb_policy(cfg, lb_policy); @@ -140,7 +140,7 @@ static void sockaddr_maybe_finish_next_locked(grpc_exec_ctx *exec_ctx, static void sockaddr_destroy(grpc_exec_ctx *exec_ctx, grpc_resolver *gr) { sockaddr_resolver *r = (sockaddr_resolver *)gr; gpr_mu_destroy(&r->mu); - grpc_subchannel_factory_unref(exec_ctx, r->subchannel_factory); + grpc_client_channel_factory_unref(exec_ctx, r->client_channel_factory); grpc_resolved_addresses_destroy(r->addresses); gpr_free(r->lb_policy_name); gpr_free(r); @@ -263,22 +263,24 @@ static grpc_resolver *sockaddr_create( r = gpr_malloc(sizeof(sockaddr_resolver)); memset(r, 0, sizeof(*r)); - r->lb_policy_name = NULL; - if (0 != strcmp(args->uri->query, "")) { - gpr_slice query_slice; - gpr_slice_buffer query_parts; - - query_slice = - gpr_slice_new(args->uri->query, strlen(args->uri->query), do_nothing); - gpr_slice_buffer_init(&query_parts); - gpr_slice_split(query_slice, "=", &query_parts); - GPR_ASSERT(query_parts.count == 2); - if (0 == gpr_slice_str_cmp(query_parts.slices[0], "lb_policy")) { - r->lb_policy_name = gpr_dump_slice(query_parts.slices[1], GPR_DUMP_ASCII); - } - gpr_slice_buffer_destroy(&query_parts); - gpr_slice_unref(query_slice); + r->lb_policy_name = + gpr_strdup(grpc_uri_get_query_arg(args->uri, "lb_policy")); + const char *lb_enabled_qpart = + grpc_uri_get_query_arg(args->uri, "lb_enabled"); + /* anything other than "0" is interpreted as true */ + const bool lb_enabled = + (lb_enabled_qpart != NULL && (strcmp("0", lb_enabled_qpart) != 0)); + + if (r->lb_policy_name != NULL && strcmp("grpclb", r->lb_policy_name) == 0 && + !lb_enabled) { + /* we want grpclb but the "resolved" addresses aren't LB enabled. Bail + * out, as this is meant mostly for tests. */ + gpr_log(GPR_ERROR, + "Requested 'grpclb' LB policy but resolved addresses don't " + "support load balancing."); + abort(); } + if (r->lb_policy_name == NULL) { r->lb_policy_name = gpr_strdup(default_lb_policy_name); } @@ -318,8 +320,8 @@ static grpc_resolver *sockaddr_create( gpr_ref_init(&r->refs, 1); gpr_mu_init(&r->mu); grpc_resolver_init(&r->base, &sockaddr_resolver_vtable); - r->subchannel_factory = args->subchannel_factory; - grpc_subchannel_factory_ref(r->subchannel_factory); + r->client_channel_factory = args->client_channel_factory; + grpc_client_channel_factory_ref(r->client_channel_factory); return &r->base; } diff --git a/src/core/ext/resolver/zookeeper/zookeeper_resolver.c b/src/core/ext/resolver/zookeeper/zookeeper_resolver.c index 5acb0940c6..91153f14b5 100644 --- a/src/core/ext/resolver/zookeeper/zookeeper_resolver.c +++ b/src/core/ext/resolver/zookeeper/zookeeper_resolver.c @@ -57,7 +57,7 @@ typedef struct { /** name to resolve */ char *name; /** subchannel factory */ - grpc_subchannel_factory *subchannel_factory; + grpc_client_channel_factory *client_channel_factory; /** load balancing policy name */ char *lb_policy_name; @@ -187,9 +187,8 @@ static void zookeeper_on_resolved(grpc_exec_ctx *exec_ctx, void *arg, if (addresses != NULL) { grpc_lb_policy_args lb_policy_args; config = grpc_client_config_create(); - lb_policy_args.addresses = addresses; - lb_policy_args.subchannel_factory = r->subchannel_factory; + lb_policy_args.client_channel_factory = r->client_channel_factory; lb_policy = grpc_lb_policy_create(exec_ctx, r->lb_policy_name, &lb_policy_args); @@ -424,7 +423,7 @@ static void zookeeper_destroy(grpc_exec_ctx *exec_ctx, grpc_resolver *gr) { if (r->resolved_config != NULL) { grpc_client_config_unref(exec_ctx, r->resolved_config); } - grpc_subchannel_factory_unref(exec_ctx, r->subchannel_factory); + grpc_client_channel_factory_unref(exec_ctx, r->client_channel_factory); gpr_free(r->name); gpr_free(r->lb_policy_name); gpr_free(r); @@ -454,8 +453,8 @@ static grpc_resolver *zookeeper_create(grpc_resolver_args *args, grpc_resolver_init(&r->base, &zookeeper_resolver_vtable); r->name = gpr_strdup(path); - r->subchannel_factory = args->subchannel_factory; - grpc_subchannel_factory_ref(r->subchannel_factory); + r->client_channel_factory = args->client_channel_factory; + grpc_client_channel_factory_ref(r->client_channel_factory); r->lb_policy_name = gpr_strdup(lb_policy_name); diff --git a/src/core/ext/transport/chttp2/client/insecure/channel_create.c b/src/core/ext/transport/chttp2/client/insecure/channel_create.c index 606fff5fb4..ee2ac44978 100644 --- a/src/core/ext/transport/chttp2/client/insecure/channel_create.c +++ b/src/core/ext/transport/chttp2/client/insecure/channel_create.c @@ -136,31 +136,35 @@ static const grpc_connector_vtable connector_vtable = { connector_ref, connector_unref, connector_shutdown, connector_connect}; typedef struct { - grpc_subchannel_factory base; + grpc_client_channel_factory base; gpr_refcount refs; grpc_channel_args *merge_args; grpc_channel *master; -} subchannel_factory; +} client_channel_factory; -static void subchannel_factory_ref(grpc_subchannel_factory *scf) { - subchannel_factory *f = (subchannel_factory *)scf; +static void client_channel_factory_ref( + grpc_client_channel_factory *cc_factory) { + client_channel_factory *f = (client_channel_factory *)cc_factory; gpr_ref(&f->refs); } -static void subchannel_factory_unref(grpc_exec_ctx *exec_ctx, - grpc_subchannel_factory *scf) { - subchannel_factory *f = (subchannel_factory *)scf; +static void client_channel_factory_unref( + grpc_exec_ctx *exec_ctx, grpc_client_channel_factory *cc_factory) { + client_channel_factory *f = (client_channel_factory *)cc_factory; if (gpr_unref(&f->refs)) { - GRPC_CHANNEL_INTERNAL_UNREF(exec_ctx, f->master, "subchannel_factory"); + if (f->master != NULL) { + GRPC_CHANNEL_INTERNAL_UNREF(exec_ctx, f->master, + "client_channel_factory"); + } grpc_channel_args_destroy(f->merge_args); gpr_free(f); } } -static grpc_subchannel *subchannel_factory_create_subchannel( - grpc_exec_ctx *exec_ctx, grpc_subchannel_factory *scf, +static grpc_subchannel *client_channel_factory_create_subchannel( + grpc_exec_ctx *exec_ctx, grpc_client_channel_factory *cc_factory, grpc_subchannel_args *args) { - subchannel_factory *f = (subchannel_factory *)scf; + client_channel_factory *f = (client_channel_factory *)cc_factory; connector *c = gpr_malloc(sizeof(*c)); grpc_channel_args *final_args = grpc_channel_args_merge(args->args, f->merge_args); @@ -175,9 +179,33 @@ static grpc_subchannel *subchannel_factory_create_subchannel( return s; } -static const grpc_subchannel_factory_vtable subchannel_factory_vtable = { - subchannel_factory_ref, subchannel_factory_unref, - subchannel_factory_create_subchannel}; +static grpc_channel *client_channel_factory_create_channel( + grpc_exec_ctx *exec_ctx, grpc_client_channel_factory *cc_factory, + const char *target, grpc_client_channel_type type, + grpc_channel_args *args) { + client_channel_factory *f = (client_channel_factory *)cc_factory; + grpc_channel_args *final_args = grpc_channel_args_merge(args, f->merge_args); + grpc_channel *channel = grpc_channel_create(exec_ctx, target, final_args, + GRPC_CLIENT_CHANNEL, NULL); + grpc_channel_args_destroy(final_args); + grpc_resolver *resolver = grpc_resolver_create(target, &f->base); + if (!resolver) { + GRPC_CHANNEL_INTERNAL_UNREF(exec_ctx, channel, + "client_channel_factory_create_channel"); + return NULL; + } + + grpc_client_channel_set_resolver( + exec_ctx, grpc_channel_get_channel_stack(channel), resolver); + GRPC_RESOLVER_UNREF(exec_ctx, resolver, "create_channel"); + + return channel; +} + +static const grpc_client_channel_factory_vtable client_channel_factory_vtable = + {client_channel_factory_ref, client_channel_factory_unref, + client_channel_factory_create_subchannel, + client_channel_factory_create_channel}; /* Create a client channel: Asynchronously: - resolve target @@ -186,38 +214,27 @@ static const grpc_subchannel_factory_vtable subchannel_factory_vtable = { grpc_channel *grpc_insecure_channel_create(const char *target, const grpc_channel_args *args, void *reserved) { - grpc_channel *channel = NULL; - grpc_resolver *resolver; - subchannel_factory *f; grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; GRPC_API_TRACE( "grpc_insecure_channel_create(target=%p, args=%p, reserved=%p)", 3, (target, args, reserved)); GPR_ASSERT(!reserved); - channel = - grpc_channel_create(&exec_ctx, target, args, GRPC_CLIENT_CHANNEL, NULL); - - f = gpr_malloc(sizeof(*f)); - f->base.vtable = &subchannel_factory_vtable; + client_channel_factory *f = gpr_malloc(sizeof(*f)); + memset(f, 0, sizeof(*f)); + f->base.vtable = &client_channel_factory_vtable; gpr_ref_init(&f->refs, 1); f->merge_args = grpc_channel_args_copy(args); - f->master = channel; - GRPC_CHANNEL_INTERNAL_REF(f->master, "subchannel_factory"); - resolver = grpc_resolver_create(target, &f->base); - if (!resolver) { - GRPC_CHANNEL_INTERNAL_UNREF(&exec_ctx, f->master, "subchannel_factory"); - grpc_subchannel_factory_unref(&exec_ctx, &f->base); - grpc_exec_ctx_finish(&exec_ctx); - return NULL; - } - grpc_client_channel_set_resolver( - &exec_ctx, grpc_channel_get_channel_stack(channel), resolver); - GRPC_RESOLVER_UNREF(&exec_ctx, resolver, "create"); - grpc_subchannel_factory_unref(&exec_ctx, &f->base); + grpc_channel *channel = client_channel_factory_create_channel( + &exec_ctx, &f->base, target, GRPC_CLIENT_CHANNEL_TYPE_REGULAR, NULL); + if (channel != NULL) { + f->master = channel; + GRPC_CHANNEL_INTERNAL_REF(f->master, "grpc_insecure_channel_create"); + } + grpc_client_channel_factory_unref(&exec_ctx, &f->base); grpc_exec_ctx_finish(&exec_ctx); - return channel; + return channel; /* may be NULL */ } diff --git a/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c b/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c index 3465d2b6c4..5d30805639 100644 --- a/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c +++ b/src/core/ext/transport/chttp2/client/secure/secure_channel_create.c @@ -192,34 +192,38 @@ static const grpc_connector_vtable connector_vtable = { connector_ref, connector_unref, connector_shutdown, connector_connect}; typedef struct { - grpc_subchannel_factory base; + grpc_client_channel_factory base; gpr_refcount refs; grpc_channel_args *merge_args; grpc_channel_security_connector *security_connector; grpc_channel *master; -} subchannel_factory; +} client_channel_factory; -static void subchannel_factory_ref(grpc_subchannel_factory *scf) { - subchannel_factory *f = (subchannel_factory *)scf; +static void client_channel_factory_ref( + grpc_client_channel_factory *cc_factory) { + client_channel_factory *f = (client_channel_factory *)cc_factory; gpr_ref(&f->refs); } -static void subchannel_factory_unref(grpc_exec_ctx *exec_ctx, - grpc_subchannel_factory *scf) { - subchannel_factory *f = (subchannel_factory *)scf; +static void client_channel_factory_unref( + grpc_exec_ctx *exec_ctx, grpc_client_channel_factory *cc_factory) { + client_channel_factory *f = (client_channel_factory *)cc_factory; if (gpr_unref(&f->refs)) { GRPC_SECURITY_CONNECTOR_UNREF(&f->security_connector->base, - "subchannel_factory"); - GRPC_CHANNEL_INTERNAL_UNREF(exec_ctx, f->master, "subchannel_factory"); + "client_channel_factory"); + if (f->master != NULL) { + GRPC_CHANNEL_INTERNAL_UNREF(exec_ctx, f->master, + "client_channel_factory"); + } grpc_channel_args_destroy(f->merge_args); gpr_free(f); } } -static grpc_subchannel *subchannel_factory_create_subchannel( - grpc_exec_ctx *exec_ctx, grpc_subchannel_factory *scf, +static grpc_subchannel *client_channel_factory_create_subchannel( + grpc_exec_ctx *exec_ctx, grpc_client_channel_factory *cc_factory, grpc_subchannel_args *args) { - subchannel_factory *f = (subchannel_factory *)scf; + client_channel_factory *f = (client_channel_factory *)cc_factory; connector *c = gpr_malloc(sizeof(*c)); grpc_channel_args *final_args = grpc_channel_args_merge(args->args, f->merge_args); @@ -236,9 +240,37 @@ static grpc_subchannel *subchannel_factory_create_subchannel( return s; } -static const grpc_subchannel_factory_vtable subchannel_factory_vtable = { - subchannel_factory_ref, subchannel_factory_unref, - subchannel_factory_create_subchannel}; +static grpc_channel *client_channel_factory_create_channel( + grpc_exec_ctx *exec_ctx, grpc_client_channel_factory *cc_factory, + const char *target, grpc_client_channel_type type, + grpc_channel_args *args) { + client_channel_factory *f = (client_channel_factory *)cc_factory; + + grpc_channel_args *final_args = grpc_channel_args_merge(args, f->merge_args); + grpc_channel *channel = grpc_channel_create(exec_ctx, target, final_args, + GRPC_CLIENT_CHANNEL, NULL); + grpc_channel_args_destroy(final_args); + + grpc_resolver *resolver = grpc_resolver_create(target, &f->base); + if (resolver != NULL) { + grpc_client_channel_set_resolver( + exec_ctx, grpc_channel_get_channel_stack(channel), resolver); + GRPC_RESOLVER_UNREF(exec_ctx, resolver, "create"); + } else { + GRPC_CHANNEL_INTERNAL_UNREF(exec_ctx, channel, + "client_channel_factory_create_channel"); + channel = NULL; + } + + GRPC_SECURITY_CONNECTOR_UNREF(&f->security_connector->base, + "client_channel_factory_create_channel"); + return channel; +} + +static const grpc_client_channel_factory_vtable client_channel_factory_vtable = + {client_channel_factory_ref, client_channel_factory_unref, + client_channel_factory_create_subchannel, + client_channel_factory_create_channel}; /* Create a secure client channel: Asynchronously: - resolve target @@ -248,13 +280,11 @@ grpc_channel *grpc_secure_channel_create(grpc_channel_credentials *creds, const char *target, const grpc_channel_args *args, void *reserved) { - grpc_channel *channel; grpc_arg connector_arg; grpc_channel_args *args_copy; grpc_channel_args *new_args_from_connector; grpc_channel_security_connector *security_connector; - grpc_resolver *resolver; - subchannel_factory *f; + client_channel_factory *f; grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; GRPC_API_TRACE( @@ -284,35 +314,30 @@ grpc_channel *grpc_secure_channel_create(grpc_channel_credentials *creds, new_args_from_connector != NULL ? new_args_from_connector : args, &connector_arg, 1); - channel = grpc_channel_create(&exec_ctx, target, args_copy, - GRPC_CLIENT_CHANNEL, NULL); - f = gpr_malloc(sizeof(*f)); - f->base.vtable = &subchannel_factory_vtable; + memset(f, 0, sizeof(*f)); + f->base.vtable = &client_channel_factory_vtable; gpr_ref_init(&f->refs, 1); - GRPC_SECURITY_CONNECTOR_REF(&security_connector->base, "subchannel_factory"); - f->security_connector = security_connector; + f->merge_args = grpc_channel_args_copy(args_copy); - f->master = channel; - GRPC_CHANNEL_INTERNAL_REF(channel, "subchannel_factory"); - resolver = grpc_resolver_create(target, &f->base); - if (resolver) { - grpc_client_channel_set_resolver( - &exec_ctx, grpc_channel_get_channel_stack(channel), resolver); - GRPC_RESOLVER_UNREF(&exec_ctx, resolver, "create"); - } - grpc_subchannel_factory_unref(&exec_ctx, &f->base); - GRPC_SECURITY_CONNECTOR_UNREF(&security_connector->base, "channel_create"); grpc_channel_args_destroy(args_copy); if (new_args_from_connector != NULL) { grpc_channel_args_destroy(new_args_from_connector); } - if (!resolver) { - GRPC_CHANNEL_INTERNAL_UNREF(&exec_ctx, channel, "subchannel_factory"); - channel = NULL; + GRPC_SECURITY_CONNECTOR_REF(&security_connector->base, + "grpc_secure_channel_create"); + f->security_connector = security_connector; + + grpc_channel *channel = client_channel_factory_create_channel( + &exec_ctx, &f->base, target, GRPC_CLIENT_CHANNEL_TYPE_REGULAR, NULL); + if (channel != NULL) { + f->master = channel; + GRPC_CHANNEL_INTERNAL_REF(f->master, "grpc_secure_channel_create"); } + + grpc_client_channel_factory_unref(&exec_ctx, &f->base); grpc_exec_ctx_finish(&exec_ctx); - return channel; + return channel; /* may be NULL */ } diff --git a/src/core/lib/channel/client_channel.c b/src/core/lib/channel/client_channel.c index 3f7cf1cf97..55867ba80c 100644 --- a/src/core/lib/channel/client_channel.c +++ b/src/core/lib/channel/client_channel.c @@ -114,6 +114,22 @@ static void watch_lb_policy(grpc_exec_ctx *exec_ctx, channel_data *chand, grpc_lb_policy *lb_policy, grpc_connectivity_state current_state); +static void set_channel_connectivity_state_locked(grpc_exec_ctx *exec_ctx, + channel_data *chand, + grpc_connectivity_state state, + const char *reason) { + if ((state == GRPC_CHANNEL_TRANSIENT_FAILURE || + state == GRPC_CHANNEL_FATAL_FAILURE) && + chand->lb_policy != NULL) { + /* cancel fail-fast picks */ + grpc_lb_policy_cancel_picks( + exec_ctx, chand->lb_policy, + /* mask= */ GRPC_INITIAL_METADATA_IGNORE_CONNECTIVITY, + /* check= */ 0); + } + grpc_connectivity_state_set(exec_ctx, &chand->state_tracker, state, reason); +} + static void on_lb_policy_state_changed_locked( grpc_exec_ctx *exec_ctx, lb_policy_connectivity_watcher *w) { grpc_connectivity_state publish_state = w->state; @@ -127,8 +143,8 @@ static void on_lb_policy_state_changed_locked( GRPC_LB_POLICY_UNREF(exec_ctx, w->chand->lb_policy, "channel"); w->chand->lb_policy = NULL; } - grpc_connectivity_state_set(exec_ctx, &w->chand->state_tracker, publish_state, - "lb_changed"); + set_channel_connectivity_state_locked(exec_ctx, w->chand, publish_state, + "lb_changed"); if (w->state != GRPC_CHANNEL_FATAL_FAILURE) { watch_lb_policy(exec_ctx, w->chand, w->lb_policy, w->state); } @@ -200,8 +216,8 @@ static void cc_on_config_changed(grpc_exec_ctx *exec_ctx, void *arg, } if (iomgr_success && chand->resolver) { - grpc_connectivity_state_set(exec_ctx, &chand->state_tracker, state, - "new_lb+resolver"); + set_channel_connectivity_state_locked(exec_ctx, chand, state, + "new_lb+resolver"); if (lb_policy != NULL) { watch_lb_policy(exec_ctx, chand, lb_policy, state); } @@ -216,8 +232,8 @@ static void cc_on_config_changed(grpc_exec_ctx *exec_ctx, void *arg, GRPC_RESOLVER_UNREF(exec_ctx, chand->resolver, "channel"); chand->resolver = NULL; } - grpc_connectivity_state_set(exec_ctx, &chand->state_tracker, - GRPC_CHANNEL_FATAL_FAILURE, "resolver_gone"); + set_channel_connectivity_state_locked( + exec_ctx, chand, GRPC_CHANNEL_FATAL_FAILURE, "resolver_gone"); gpr_mu_unlock(&chand->mu_config); } @@ -272,8 +288,8 @@ static void cc_start_transport_op(grpc_exec_ctx *exec_ctx, } if (op->disconnect && chand->resolver != NULL) { - grpc_connectivity_state_set(exec_ctx, &chand->state_tracker, - GRPC_CHANNEL_FATAL_FAILURE, "disconnect"); + set_channel_connectivity_state_locked( + exec_ctx, chand, GRPC_CHANNEL_FATAL_FAILURE, "disconnect"); grpc_resolver_shutdown(exec_ctx, chand->resolver); GRPC_RESOLVER_UNREF(exec_ctx, chand->resolver, "channel"); chand->resolver = NULL; @@ -290,6 +306,7 @@ static void cc_start_transport_op(grpc_exec_ctx *exec_ctx, typedef struct { grpc_metadata_batch *initial_metadata; + uint32_t initial_metadata_flags; grpc_connected_subchannel **connected_subchannel; grpc_closure *on_ready; grpc_call_element *elem; @@ -298,6 +315,7 @@ typedef struct { static int cc_pick_subchannel(grpc_exec_ctx *exec_ctx, void *arg, grpc_metadata_batch *initial_metadata, + uint32_t initial_metadata_flags, grpc_connected_subchannel **connected_subchannel, grpc_closure *on_ready); @@ -308,6 +326,7 @@ static void continue_picking(grpc_exec_ctx *exec_ctx, void *arg, bool success) { } else if (cpa->connected_subchannel == NULL) { /* cancelled, do nothing */ } else if (cc_pick_subchannel(exec_ctx, cpa->elem, cpa->initial_metadata, + cpa->initial_metadata_flags, cpa->connected_subchannel, cpa->on_ready)) { grpc_exec_ctx_enqueue(exec_ctx, cpa->on_ready, true, NULL); } @@ -316,6 +335,7 @@ static void continue_picking(grpc_exec_ctx *exec_ctx, void *arg, bool success) { static int cc_pick_subchannel(grpc_exec_ctx *exec_ctx, void *elemp, grpc_metadata_batch *initial_metadata, + uint32_t initial_metadata_flags, grpc_connected_subchannel **connected_subchannel, grpc_closure *on_ready) { grpc_call_element *elem = elemp; @@ -349,7 +369,8 @@ static int cc_pick_subchannel(grpc_exec_ctx *exec_ctx, void *elemp, GRPC_LB_POLICY_REF(lb_policy, "cc_pick_subchannel"); gpr_mu_unlock(&chand->mu_config); r = grpc_lb_policy_pick(exec_ctx, lb_policy, calld->pollset, - initial_metadata, connected_subchannel, on_ready); + initial_metadata, initial_metadata_flags, + connected_subchannel, on_ready); GRPC_LB_POLICY_UNREF(exec_ctx, lb_policy, "cc_pick_subchannel"); return r; } @@ -362,6 +383,7 @@ static int cc_pick_subchannel(grpc_exec_ctx *exec_ctx, void *elemp, } cpa = gpr_malloc(sizeof(*cpa)); cpa->initial_metadata = initial_metadata; + cpa->initial_metadata_flags = initial_metadata_flags; cpa->connected_subchannel = connected_subchannel; cpa->on_ready = on_ready; cpa->elem = elem; diff --git a/src/core/lib/channel/http_client_filter.c b/src/core/lib/channel/http_client_filter.c index deba23e21f..211f537c69 100644 --- a/src/core/lib/channel/http_client_filter.c +++ b/src/core/lib/channel/http_client_filter.c @@ -111,10 +111,12 @@ static void hc_mutate_op(grpc_call_element *elem, elem); /* Send : prefixed headers, which have to be before any application layer headers. */ - grpc_metadata_batch_add_head(op->send_initial_metadata, &calld->method, - op->send_idempotent_request - ? GRPC_MDELEM_METHOD_PUT - : GRPC_MDELEM_METHOD_POST); + grpc_metadata_batch_add_head( + op->send_initial_metadata, &calld->method, + op->send_initial_metadata_flags & + GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST + ? GRPC_MDELEM_METHOD_PUT + : GRPC_MDELEM_METHOD_POST); grpc_metadata_batch_add_head(op->send_initial_metadata, &calld->scheme, channeld->static_scheme); grpc_metadata_batch_add_tail(op->send_initial_metadata, &calld->te_trailers, diff --git a/src/core/lib/channel/subchannel_call_holder.c b/src/core/lib/channel/subchannel_call_holder.c index 22f3679bf5..a2686a380a 100644 --- a/src/core/lib/channel/subchannel_call_holder.c +++ b/src/core/lib/channel/subchannel_call_holder.c @@ -127,7 +127,7 @@ retry: break; case GRPC_SUBCHANNEL_CALL_HOLDER_PICKING_SUBCHANNEL: holder->pick_subchannel(exec_ctx, holder->pick_subchannel_arg, NULL, - &holder->connected_subchannel, NULL); + 0, &holder->connected_subchannel, NULL); break; } gpr_mu_unlock(&holder->mu); @@ -145,7 +145,8 @@ retry: GRPC_CALL_STACK_REF(holder->owning_call, "pick_subchannel"); if (holder->pick_subchannel( exec_ctx, holder->pick_subchannel_arg, op->send_initial_metadata, - &holder->connected_subchannel, &holder->next_step)) { + op->send_initial_metadata_flags, &holder->connected_subchannel, + &holder->next_step)) { holder->creation_phase = GRPC_SUBCHANNEL_CALL_HOLDER_NOT_CREATING; GRPC_CALL_STACK_UNREF(exec_ctx, holder->owning_call, "pick_subchannel"); } diff --git a/src/core/lib/channel/subchannel_call_holder.h b/src/core/lib/channel/subchannel_call_holder.h index 5cf291a266..769e22b061 100644 --- a/src/core/lib/channel/subchannel_call_holder.h +++ b/src/core/lib/channel/subchannel_call_holder.h @@ -42,6 +42,7 @@ called when the subchannel is available) */ typedef int (*grpc_subchannel_call_holder_pick_subchannel)( grpc_exec_ctx *exec_ctx, void *arg, grpc_metadata_batch *initial_metadata, + uint32_t initial_metadata_flags, grpc_connected_subchannel **connected_subchannel, grpc_closure *on_ready); typedef enum { diff --git a/src/core/lib/client_config/README.md b/src/core/lib/client_config/README.md index fff7a5af5b..7024fd540d 100644 --- a/src/core/lib/client_config/README.md +++ b/src/core/lib/client_config/README.md @@ -40,7 +40,7 @@ decisions (for example, by avoiding disconnected backends). Configured sub-channels are fully setup to participate in the grpc data plane. Their behavior is specified by a set of grpc channel filters defined at their construction. To customize this behavior, resolvers build -grpc_subchannel_factory objects, which use the decorator pattern to customize +grpc_client_channel_factory objects, which use the decorator pattern to customize construction arguments for concrete grpc_subchannel instances. diff --git a/src/core/lib/client_config/subchannel_factory.h b/src/core/lib/client_config/client_channel_factory.c index 96d68a2079..d27b38d9f2 100644 --- a/src/core/lib/client_config/subchannel_factory.h +++ b/src/core/lib/client_config/client_channel_factory.c @@ -31,36 +31,27 @@ * */ -#ifndef GRPC_CORE_LIB_CLIENT_CONFIG_SUBCHANNEL_FACTORY_H -#define GRPC_CORE_LIB_CLIENT_CONFIG_SUBCHANNEL_FACTORY_H - -#include "src/core/lib/channel/channel_stack.h" -#include "src/core/lib/client_config/subchannel.h" - -typedef struct grpc_subchannel_factory grpc_subchannel_factory; -typedef struct grpc_subchannel_factory_vtable grpc_subchannel_factory_vtable; - -/** Constructor for new configured channels. - Creating decorators around this type is encouraged to adapt behavior. */ -struct grpc_subchannel_factory { - const grpc_subchannel_factory_vtable *vtable; -}; - -struct grpc_subchannel_factory_vtable { - void (*ref)(grpc_subchannel_factory *factory); - void (*unref)(grpc_exec_ctx *exec_ctx, grpc_subchannel_factory *factory); - grpc_subchannel *(*create_subchannel)(grpc_exec_ctx *exec_ctx, - grpc_subchannel_factory *factory, - grpc_subchannel_args *args); -}; - -void grpc_subchannel_factory_ref(grpc_subchannel_factory *factory); -void grpc_subchannel_factory_unref(grpc_exec_ctx *exec_ctx, - grpc_subchannel_factory *factory); - -/** Create a new grpc_subchannel */ -grpc_subchannel *grpc_subchannel_factory_create_subchannel( - grpc_exec_ctx *exec_ctx, grpc_subchannel_factory *factory, - grpc_subchannel_args *args); - -#endif /* GRPC_CORE_LIB_CLIENT_CONFIG_SUBCHANNEL_FACTORY_H */ +#include "src/core/lib/client_config/client_channel_factory.h" + +void grpc_client_channel_factory_ref(grpc_client_channel_factory* factory) { + factory->vtable->ref(factory); +} + +void grpc_client_channel_factory_unref(grpc_exec_ctx* exec_ctx, + grpc_client_channel_factory* factory) { + factory->vtable->unref(exec_ctx, factory); +} + +grpc_subchannel* grpc_client_channel_factory_create_subchannel( + grpc_exec_ctx* exec_ctx, grpc_client_channel_factory* factory, + grpc_subchannel_args* args) { + return factory->vtable->create_subchannel(exec_ctx, factory, args); +} + +grpc_channel* grpc_client_channel_factory_create_channel( + grpc_exec_ctx* exec_ctx, grpc_client_channel_factory* factory, + const char* target, grpc_client_channel_type type, + grpc_channel_args* args) { + return factory->vtable->create_client_channel(exec_ctx, factory, target, type, + args); +} diff --git a/src/core/lib/client_config/client_channel_factory.h b/src/core/lib/client_config/client_channel_factory.h new file mode 100644 index 0000000000..0b71cd9bdb --- /dev/null +++ b/src/core/lib/client_config/client_channel_factory.h @@ -0,0 +1,85 @@ +/* + * + * Copyright 2015, 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. + * + */ + +#ifndef GRPC_CORE_LIB_CLIENT_CONFIG_CLIENT_CHANNEL_FACTORY_H +#define GRPC_CORE_LIB_CLIENT_CONFIG_CLIENT_CHANNEL_FACTORY_H + +#include <grpc/impl/codegen/grpc_types.h> + +#include "src/core/lib/channel/channel_stack.h" +#include "src/core/lib/client_config/subchannel.h" + +typedef struct grpc_client_channel_factory grpc_client_channel_factory; +typedef struct grpc_client_channel_factory_vtable + grpc_client_channel_factory_vtable; + +typedef enum { + GRPC_CLIENT_CHANNEL_TYPE_REGULAR, /** for the user-level regular calls */ + GRPC_CLIENT_CHANNEL_TYPE_LOAD_BALANCING, /** for communication with a load + balancing service */ +} grpc_client_channel_type; + +/** Constructor for new configured channels. + Creating decorators around this type is encouraged to adapt behavior. */ +struct grpc_client_channel_factory { + const grpc_client_channel_factory_vtable *vtable; +}; + +struct grpc_client_channel_factory_vtable { + void (*ref)(grpc_client_channel_factory *factory); + void (*unref)(grpc_exec_ctx *exec_ctx, grpc_client_channel_factory *factory); + grpc_subchannel *(*create_subchannel)(grpc_exec_ctx *exec_ctx, + grpc_client_channel_factory *factory, + grpc_subchannel_args *args); + grpc_channel *(*create_client_channel)(grpc_exec_ctx *exec_ctx, + grpc_client_channel_factory *factory, + const char *target, + grpc_client_channel_type type, + grpc_channel_args *args); +}; + +void grpc_client_channel_factory_ref(grpc_client_channel_factory *factory); +void grpc_client_channel_factory_unref(grpc_exec_ctx *exec_ctx, + grpc_client_channel_factory *factory); + +/** Create a new grpc_subchannel */ +grpc_subchannel *grpc_client_channel_factory_create_subchannel( + grpc_exec_ctx *exec_ctx, grpc_client_channel_factory *factory, + grpc_subchannel_args *args); + +/** Create a new grpc_channel */ +grpc_channel *grpc_client_channel_factory_create_channel( + grpc_exec_ctx *exec_ctx, grpc_client_channel_factory *factory, + const char *target, grpc_client_channel_type type, grpc_channel_args *args); + +#endif /* GRPC_CORE_LIB_CLIENT_CONFIG_CLIENT_CHANNEL_FACTORY_H */ diff --git a/src/core/lib/client_config/lb_policy.c b/src/core/lib/client_config/lb_policy.c index 3d23669ec2..6174162d49 100644 --- a/src/core/lib/client_config/lb_policy.c +++ b/src/core/lib/client_config/lb_policy.c @@ -101,10 +101,11 @@ void grpc_lb_policy_weak_unref(grpc_exec_ctx *exec_ctx, int grpc_lb_policy_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *policy, grpc_pollset *pollset, grpc_metadata_batch *initial_metadata, + uint32_t initial_metadata_flags, grpc_connected_subchannel **target, grpc_closure *on_complete) { return policy->vtable->pick(exec_ctx, policy, pollset, initial_metadata, - target, on_complete); + initial_metadata_flags, target, on_complete); } void grpc_lb_policy_cancel_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *policy, @@ -112,6 +113,14 @@ void grpc_lb_policy_cancel_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *policy, policy->vtable->cancel_pick(exec_ctx, policy, target); } +void grpc_lb_policy_cancel_picks(grpc_exec_ctx *exec_ctx, + grpc_lb_policy *policy, + uint32_t initial_metadata_flags_mask, + uint32_t initial_metadata_flags_eq) { + policy->vtable->cancel_picks(exec_ctx, policy, initial_metadata_flags_mask, + initial_metadata_flags_eq); +} + void grpc_lb_policy_exit_idle(grpc_exec_ctx *exec_ctx, grpc_lb_policy *policy) { policy->vtable->exit_idle(exec_ctx, policy); } diff --git a/src/core/lib/client_config/lb_policy.h b/src/core/lib/client_config/lb_policy.h index a63e8e68df..60729ef8f9 100644 --- a/src/core/lib/client_config/lb_policy.h +++ b/src/core/lib/client_config/lb_policy.h @@ -60,9 +60,13 @@ struct grpc_lb_policy_vtable { /** implement grpc_lb_policy_pick */ int (*pick)(grpc_exec_ctx *exec_ctx, grpc_lb_policy *policy, grpc_pollset *pollset, grpc_metadata_batch *initial_metadata, + uint32_t initial_metadata_flags, grpc_connected_subchannel **target, grpc_closure *on_complete); void (*cancel_pick)(grpc_exec_ctx *exec_ctx, grpc_lb_policy *policy, grpc_connected_subchannel **target); + void (*cancel_picks)(grpc_exec_ctx *exec_ctx, grpc_lb_policy *policy, + uint32_t initial_metadata_flags_mask, + uint32_t initial_metadata_flags_eq); void (*ping_one)(grpc_exec_ctx *exec_ctx, grpc_lb_policy *policy, grpc_closure *closure); @@ -122,6 +126,7 @@ void grpc_lb_policy_init(grpc_lb_policy *policy, int grpc_lb_policy_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *policy, grpc_pollset *pollset, grpc_metadata_batch *initial_metadata, + uint32_t initial_metadata_flags, grpc_connected_subchannel **target, grpc_closure *on_complete); @@ -131,6 +136,14 @@ void grpc_lb_policy_ping_one(grpc_exec_ctx *exec_ctx, grpc_lb_policy *policy, void grpc_lb_policy_cancel_pick(grpc_exec_ctx *exec_ctx, grpc_lb_policy *policy, grpc_connected_subchannel **target); +/** Cancel all pending picks which have: + (initial_metadata_flags & initial_metadata_flags_mask) == + initial_metadata_flags_eq */ +void grpc_lb_policy_cancel_picks(grpc_exec_ctx *exec_ctx, + grpc_lb_policy *policy, + uint32_t initial_metadata_flags_mask, + uint32_t initial_metadata_flags_eq); + void grpc_lb_policy_exit_idle(grpc_exec_ctx *exec_ctx, grpc_lb_policy *policy); void grpc_lb_policy_notify_on_state_change(grpc_exec_ctx *exec_ctx, diff --git a/src/core/lib/client_config/lb_policy_factory.h b/src/core/lib/client_config/lb_policy_factory.h index 6f21912821..4931d4df58 100644 --- a/src/core/lib/client_config/lb_policy_factory.h +++ b/src/core/lib/client_config/lb_policy_factory.h @@ -34,8 +34,8 @@ #ifndef GRPC_CORE_LIB_CLIENT_CONFIG_LB_POLICY_FACTORY_H #define GRPC_CORE_LIB_CLIENT_CONFIG_LB_POLICY_FACTORY_H +#include "src/core/lib/client_config/client_channel_factory.h" #include "src/core/lib/client_config/lb_policy.h" -#include "src/core/lib/client_config/subchannel_factory.h" #include "src/core/lib/iomgr/resolve_address.h" #include "src/core/lib/iomgr/exec_ctx.h" @@ -51,7 +51,7 @@ struct grpc_lb_policy_factory { typedef struct grpc_lb_policy_args { grpc_resolved_addresses *addresses; - grpc_subchannel_factory *subchannel_factory; + grpc_client_channel_factory *client_channel_factory; } grpc_lb_policy_args; struct grpc_lb_policy_factory_vtable { diff --git a/src/core/lib/client_config/resolver_factory.h b/src/core/lib/client_config/resolver_factory.h index a5bca06475..18c7fd7d62 100644 --- a/src/core/lib/client_config/resolver_factory.h +++ b/src/core/lib/client_config/resolver_factory.h @@ -34,8 +34,8 @@ #ifndef GRPC_CORE_LIB_CLIENT_CONFIG_RESOLVER_FACTORY_H #define GRPC_CORE_LIB_CLIENT_CONFIG_RESOLVER_FACTORY_H +#include "src/core/lib/client_config/client_channel_factory.h" #include "src/core/lib/client_config/resolver.h" -#include "src/core/lib/client_config/subchannel_factory.h" #include "src/core/lib/client_config/uri_parser.h" typedef struct grpc_resolver_factory grpc_resolver_factory; @@ -49,7 +49,7 @@ struct grpc_resolver_factory { typedef struct grpc_resolver_args { grpc_uri *uri; - grpc_subchannel_factory *subchannel_factory; + grpc_client_channel_factory *client_channel_factory; } grpc_resolver_args; struct grpc_resolver_factory_vtable { diff --git a/src/core/lib/client_config/resolver_registry.c b/src/core/lib/client_config/resolver_registry.c index 5f3db273b5..5584f6692e 100644 --- a/src/core/lib/client_config/resolver_registry.c +++ b/src/core/lib/client_config/resolver_registry.c @@ -123,14 +123,14 @@ static grpc_resolver_factory *resolve_factory(const char *target, } grpc_resolver *grpc_resolver_create( - const char *target, grpc_subchannel_factory *subchannel_factory) { + const char *target, grpc_client_channel_factory *client_channel_factory) { grpc_uri *uri = NULL; grpc_resolver_factory *factory = resolve_factory(target, &uri); grpc_resolver *resolver; grpc_resolver_args args; memset(&args, 0, sizeof(args)); args.uri = uri; - args.subchannel_factory = subchannel_factory; + args.client_channel_factory = client_channel_factory; resolver = grpc_resolver_factory_create_resolver(factory, &args); grpc_uri_destroy(uri); return resolver; diff --git a/src/core/lib/client_config/resolver_registry.h b/src/core/lib/client_config/resolver_registry.h index 36c4f2fe03..b207313084 100644 --- a/src/core/lib/client_config/resolver_registry.h +++ b/src/core/lib/client_config/resolver_registry.h @@ -56,7 +56,7 @@ void grpc_register_resolver_type(grpc_resolver_factory *factory); return it. If a resolver factory was not found, return NULL. */ grpc_resolver *grpc_resolver_create( - const char *target, grpc_subchannel_factory *subchannel_factory); + const char *target, grpc_client_channel_factory *client_channel_factory); /** Find a resolver factory given a name and return an (owned-by-the-caller) * reference to it */ diff --git a/src/core/lib/client_config/subchannel.c b/src/core/lib/client_config/subchannel.c index 47c53a16ba..f44e2f7404 100644 --- a/src/core/lib/client_config/subchannel.c +++ b/src/core/lib/client_config/subchannel.c @@ -54,7 +54,7 @@ #define STRONG_REF_MASK (~(gpr_atm)((1 << INTERNAL_REF_BITS) - 1)) #define GRPC_SUBCHANNEL_MIN_CONNECT_TIMEOUT_SECONDS 20 -#define GRPC_SUBCHANNEL_INITIAL_CONNECT_BACKOFF_SECONDS 1 +#define GRPC_SUBCHANNEL_INITIAL_CONNECT_BACKOFF_SECONDS 2 #define GRPC_SUBCHANNEL_RECONNECT_BACKOFF_MULTIPLIER 1.6 #define GRPC_SUBCHANNEL_RECONNECT_MAX_BACKOFF_SECONDS 120 #define GRPC_SUBCHANNEL_RECONNECT_JITTER 0.2 @@ -352,6 +352,25 @@ grpc_subchannel *grpc_subchannel_create(grpc_exec_ctx *exec_ctx, c->args->args[i].value.integer, c->args->args[i].value.integer); } + if (0 == + strcmp(c->args->args[i].key, GRPC_ARG_MAX_RECONNECT_BACKOFF_MS)) { + if (c->args->args[i].type == GRPC_ARG_INTEGER) { + if (c->args->args[i].value.integer >= 0) { + gpr_backoff_init( + &c->backoff_state, GRPC_SUBCHANNEL_RECONNECT_BACKOFF_MULTIPLIER, + GRPC_SUBCHANNEL_RECONNECT_JITTER, + GPR_MIN(c->args->args[i].value.integer, + GRPC_SUBCHANNEL_INITIAL_CONNECT_BACKOFF_SECONDS * 1000), + c->args->args[i].value.integer); + } else { + gpr_log(GPR_ERROR, GRPC_ARG_MAX_RECONNECT_BACKOFF_MS + " : must be non-negative"); + } + } else { + gpr_log(GPR_ERROR, + GRPC_ARG_MAX_RECONNECT_BACKOFF_MS " : must be an integer"); + } + } } } gpr_mu_init(&c->mu); diff --git a/src/core/lib/iomgr/ev_poll_and_epoll_posix.c b/src/core/lib/iomgr/ev_poll_and_epoll_posix.c index 85e9521e1d..aeb6e28665 100644 --- a/src/core/lib/iomgr/ev_poll_and_epoll_posix.c +++ b/src/core/lib/iomgr/ev_poll_and_epoll_posix.c @@ -1,6 +1,6 @@ /* * - * Copyright 2015-2016, Google Inc. + * Copyright 2015, Google Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/core/lib/iomgr/ev_posix.c b/src/core/lib/iomgr/ev_posix.c index 952cf28345..973e40ca1e 100644 --- a/src/core/lib/iomgr/ev_posix.c +++ b/src/core/lib/iomgr/ev_posix.c @@ -1,6 +1,6 @@ /* * - * Copyright 2015-2016, Google Inc. + * Copyright 2015, Google Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/core/lib/iomgr/ev_posix.h b/src/core/lib/iomgr/ev_posix.h index 9d27b2bcda..1fa9f5ef2d 100644 --- a/src/core/lib/iomgr/ev_posix.h +++ b/src/core/lib/iomgr/ev_posix.h @@ -1,6 +1,6 @@ /* * - * Copyright 2015-2016, Google Inc. + * Copyright 2015, Google Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/src/core/lib/surface/call.c b/src/core/lib/surface/call.c index 37cc724b53..ba94852f9a 100644 --- a/src/core/lib/surface/call.c +++ b/src/core/lib/surface/call.c @@ -81,11 +81,11 @@ typedef enum { /* Status came from the application layer overriding whatever the wire says */ STATUS_FROM_API_OVERRIDE = 0, - /* Status was created by some internal channel stack operation */ - STATUS_FROM_CORE, /* Status came from 'the wire' - or somewhere below the surface layer */ STATUS_FROM_WIRE, + /* Status was created by some internal channel stack operation */ + STATUS_FROM_CORE, /* Status came from the server sending status */ STATUS_FROM_SERVER_STATUS, STATUS_SOURCE_COUNT @@ -1110,6 +1110,9 @@ static void finish_batch(grpc_exec_ctx *exec_ctx, void *bctlp, bool success) { gpr_mu_lock(&call->mu); if (bctl->send_initial_metadata) { + if (!success) { + set_status_code(call, STATUS_FROM_CORE, GRPC_STATUS_UNAVAILABLE); + } grpc_metadata_batch_destroy( &call->metadata_batch[0 /* is_receiving */][0 /* is_trailing */]); } @@ -1232,8 +1235,7 @@ static grpc_call_error call_start_batch(grpc_exec_ctx *exec_ctx, call->metadata_batch[0][0].deadline = call->send_deadline; stream_op.send_initial_metadata = &call->metadata_batch[0 /* is_receiving */][0 /* is_trailing */]; - stream_op.send_idempotent_request = - (op->flags & GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST) != 0; + stream_op.send_initial_metadata_flags = op->flags; break; case GRPC_OP_SEND_MESSAGE: if (!are_write_flags_valid(op->flags)) { diff --git a/src/core/lib/surface/channel.h b/src/core/lib/surface/channel.h index 640fd7e137..68afac6fac 100644 --- a/src/core/lib/surface/channel.h +++ b/src/core/lib/surface/channel.h @@ -35,7 +35,7 @@ #define GRPC_CORE_LIB_SURFACE_CHANNEL_H #include "src/core/lib/channel/channel_stack.h" -#include "src/core/lib/client_config/subchannel_factory.h" +#include "src/core/lib/client_config/client_channel_factory.h" #include "src/core/lib/surface/channel_stack_type.h" grpc_channel *grpc_channel_create(grpc_exec_ctx *exec_ctx, const char *target, diff --git a/src/core/lib/surface/server.c b/src/core/lib/surface/server.c index 1898bee1c1..37cc2bd101 100644 --- a/src/core/lib/surface/server.c +++ b/src/core/lib/surface/server.c @@ -95,7 +95,6 @@ typedef struct requested_call { grpc_byte_buffer **optional_payload; } registered; } data; - grpc_closure publish; } requested_call; typedef struct channel_registered_method { @@ -156,15 +155,21 @@ struct call_data { bool recv_idempotent_request; grpc_metadata_array initial_metadata; + request_matcher *request_matcher; + grpc_byte_buffer *payload; + grpc_closure got_initial_metadata; grpc_closure server_on_recv_initial_metadata; grpc_closure kill_zombie_closure; grpc_closure *on_done_recv_initial_metadata; + grpc_closure publish; + call_data *pending_next; }; struct request_matcher { + grpc_server *server; call_data *pending_head; call_data *pending_tail; gpr_stack_lockfree *requests; @@ -173,6 +178,7 @@ struct request_matcher { struct registered_method { char *method; char *host; + grpc_server_register_method_payload_handling payload_handling; uint32_t flags; request_matcher request_matcher; registered_method *next; @@ -226,8 +232,7 @@ struct grpc_server { #define SERVER_FROM_CALL_ELEM(elem) \ (((channel_data *)(elem)->channel_data)->server) -static void begin_call(grpc_exec_ctx *exec_ctx, grpc_server *server, - call_data *calld, requested_call *rc); +static void publish_new_rpc(grpc_exec_ctx *exec_ctx, void *calld, bool success); static void fail_call(grpc_exec_ctx *exec_ctx, grpc_server *server, requested_call *rc); /* Before calling maybe_finish_shutdown, we must hold mu_global and not @@ -303,8 +308,10 @@ static void channel_broadcaster_shutdown(grpc_exec_ctx *exec_ctx, * request_matcher */ -static void request_matcher_init(request_matcher *rm, size_t entries) { +static void request_matcher_init(request_matcher *rm, size_t entries, + grpc_server *server) { memset(rm, 0, sizeof(*rm)); + rm->server = server; rm->requests = gpr_stack_lockfree_create(entries); } @@ -417,21 +424,90 @@ static void destroy_channel(grpc_exec_ctx *exec_ctx, channel_data *chand) { &op); } -static void finish_start_new_rpc(grpc_exec_ctx *exec_ctx, grpc_server *server, - grpc_call_element *elem, request_matcher *rm) { - call_data *calld = elem->call_data; - int request_id; +static void cpstr(char **dest, size_t *capacity, grpc_mdstr *value) { + gpr_slice slice = value->slice; + size_t len = GPR_SLICE_LENGTH(slice); - if (gpr_atm_acq_load(&server->shutdown_flag)) { + if (len + 1 > *capacity) { + *capacity = GPR_MAX(len + 1, *capacity * 2); + *dest = gpr_realloc(*dest, *capacity); + } + memcpy(*dest, grpc_mdstr_as_c_string(value), len + 1); +} + +static void done_request_event(grpc_exec_ctx *exec_ctx, void *req, + grpc_cq_completion *c) { + requested_call *rc = req; + grpc_server *server = rc->server; + + if (rc >= server->requested_calls && + rc < server->requested_calls + server->max_requested_calls) { + GPR_ASSERT(rc - server->requested_calls <= INT_MAX); + gpr_stack_lockfree_push(server->request_freelist, + (int)(rc - server->requested_calls)); + } else { + gpr_free(req); + } + + server_unref(exec_ctx, server); +} + +static void publish_call(grpc_exec_ctx *exec_ctx, grpc_server *server, + call_data *calld, requested_call *rc) { + grpc_call_set_completion_queue(exec_ctx, calld->call, rc->cq_bound_to_call); + grpc_call *call = calld->call; + *rc->call = call; + calld->cq_new = rc->cq_for_notification; + GPR_SWAP(grpc_metadata_array, *rc->initial_metadata, calld->initial_metadata); + switch (rc->type) { + case BATCH_CALL: + GPR_ASSERT(calld->host != NULL); + GPR_ASSERT(calld->path != NULL); + cpstr(&rc->data.batch.details->host, + &rc->data.batch.details->host_capacity, calld->host); + cpstr(&rc->data.batch.details->method, + &rc->data.batch.details->method_capacity, calld->path); + rc->data.batch.details->deadline = calld->deadline; + rc->data.batch.details->flags = + 0 | (calld->recv_idempotent_request + ? GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST + : 0); + break; + case REGISTERED_CALL: + *rc->data.registered.deadline = calld->deadline; + if (rc->data.registered.optional_payload) { + *rc->data.registered.optional_payload = calld->payload; + } + break; + default: + GPR_UNREACHABLE_CODE(return ); + } + + grpc_call_element *elem = + grpc_call_stack_element(grpc_call_get_call_stack(call), 0); + channel_data *chand = elem->channel_data; + server_ref(chand->server); + grpc_cq_end_op(exec_ctx, calld->cq_new, rc->tag, true, done_request_event, rc, + &rc->completion); +} + +static void publish_new_rpc(grpc_exec_ctx *exec_ctx, void *arg, bool success) { + call_data *calld = arg; + request_matcher *rm = calld->request_matcher; + grpc_server *server = rm->server; + + if (!success || gpr_atm_acq_load(&server->shutdown_flag)) { gpr_mu_lock(&calld->mu_state); calld->state = ZOMBIED; gpr_mu_unlock(&calld->mu_state); - grpc_closure_init(&calld->kill_zombie_closure, kill_zombie, elem); + grpc_closure_init( + &calld->kill_zombie_closure, kill_zombie, + grpc_call_stack_element(grpc_call_get_call_stack(calld->call), 0)); grpc_exec_ctx_enqueue(exec_ctx, &calld->kill_zombie_closure, true, NULL); return; } - request_id = gpr_stack_lockfree_pop(rm->requests); + int request_id = gpr_stack_lockfree_pop(rm->requests); if (request_id == -1) { gpr_mu_lock(&server->mu_call); gpr_mu_lock(&calld->mu_state); @@ -449,7 +525,41 @@ static void finish_start_new_rpc(grpc_exec_ctx *exec_ctx, grpc_server *server, gpr_mu_lock(&calld->mu_state); calld->state = ACTIVATED; gpr_mu_unlock(&calld->mu_state); - begin_call(exec_ctx, server, calld, &server->requested_calls[request_id]); + publish_call(exec_ctx, server, calld, &server->requested_calls[request_id]); + } +} + +static void finish_start_new_rpc( + grpc_exec_ctx *exec_ctx, grpc_server *server, grpc_call_element *elem, + request_matcher *rm, + grpc_server_register_method_payload_handling payload_handling) { + call_data *calld = elem->call_data; + + if (gpr_atm_acq_load(&server->shutdown_flag)) { + gpr_mu_lock(&calld->mu_state); + calld->state = ZOMBIED; + gpr_mu_unlock(&calld->mu_state); + grpc_closure_init(&calld->kill_zombie_closure, kill_zombie, elem); + grpc_exec_ctx_enqueue(exec_ctx, &calld->kill_zombie_closure, true, NULL); + return; + } + + calld->request_matcher = rm; + + switch (payload_handling) { + case GRPC_SRM_PAYLOAD_NONE: + publish_new_rpc(exec_ctx, calld, true); + break; + case GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER: { + grpc_op op; + memset(&op, 0, sizeof(op)); + op.op = GRPC_OP_RECV_MESSAGE; + op.data.recv_message = &calld->payload; + grpc_closure_init(&calld->publish, publish_new_rpc, calld); + grpc_call_start_batch_and_execute(exec_ctx, calld->call, &op, 1, + &calld->publish); + break; + } } } @@ -475,7 +585,8 @@ static void start_new_rpc(grpc_exec_ctx *exec_ctx, grpc_call_element *elem) { !calld->recv_idempotent_request) continue; finish_start_new_rpc(exec_ctx, server, elem, - &rm->server_registered_method->request_matcher); + &rm->server_registered_method->request_matcher, + rm->server_registered_method->payload_handling); return; } /* check for a wildcard method definition (no host set) */ @@ -490,12 +601,14 @@ static void start_new_rpc(grpc_exec_ctx *exec_ctx, grpc_call_element *elem) { !calld->recv_idempotent_request) continue; finish_start_new_rpc(exec_ctx, server, elem, - &rm->server_registered_method->request_matcher); + &rm->server_registered_method->request_matcher, + rm->server_registered_method->payload_handling); return; } } finish_start_new_rpc(exec_ctx, server, elem, - &server->unregistered_request_matcher); + &server->unregistered_request_matcher, + GRPC_SRM_PAYLOAD_NONE); } static int num_listeners(grpc_server *server) { @@ -824,7 +937,7 @@ grpc_server *grpc_server_create(const grpc_channel_args *args, void *reserved) { gpr_stack_lockfree_push(server->request_freelist, (int)i); } request_matcher_init(&server->unregistered_request_matcher, - server->max_requested_calls); + server->max_requested_calls, server); server->requested_calls = gpr_malloc(server->max_requested_calls * sizeof(*server->requested_calls)); @@ -840,8 +953,10 @@ static int streq(const char *a, const char *b) { return 0 == strcmp(a, b); } -void *grpc_server_register_method(grpc_server *server, const char *method, - const char *host, uint32_t flags) { +void *grpc_server_register_method( + grpc_server *server, const char *method, const char *host, + grpc_server_register_method_payload_handling payload_handling, + uint32_t flags) { registered_method *m; GRPC_API_TRACE( "grpc_server_register_method(server=%p, method=%s, host=%s, " @@ -866,10 +981,12 @@ void *grpc_server_register_method(grpc_server *server, const char *method, } m = gpr_malloc(sizeof(registered_method)); memset(m, 0, sizeof(*m)); - request_matcher_init(&m->request_matcher, server->max_requested_calls); + request_matcher_init(&m->request_matcher, server->max_requested_calls, + server); m->method = gpr_strdup(method); m->host = gpr_strdup(host); m->next = server->registered_methods; + m->payload_handling = payload_handling; m->flags = flags; server->registered_methods = m; return m; @@ -1143,8 +1260,8 @@ static grpc_call_error queue_call_request(grpc_exec_ctx *exec_ctx, GPR_ASSERT(calld->state == PENDING); calld->state = ACTIVATED; gpr_mu_unlock(&calld->mu_state); - begin_call(exec_ctx, server, calld, - &server->requested_calls[request_id]); + publish_call(exec_ctx, server, calld, + &server->requested_calls[request_id]); } gpr_mu_lock(&server->mu_call); } @@ -1209,6 +1326,12 @@ grpc_call_error grpc_server_request_registered_call( error = GRPC_CALL_ERROR_NOT_SERVER_COMPLETION_QUEUE; goto done; } + if ((optional_payload == NULL) != + (rm->payload_handling == GRPC_SRM_PAYLOAD_NONE)) { + gpr_free(rc); + error = GRPC_CALL_ERROR_PAYLOAD_TYPE_MISMATCH; + goto done; + } grpc_cq_begin_op(cq_for_notification, tag); rc->type = REGISTERED_CALL; rc->server = server; @@ -1226,86 +1349,6 @@ done: return error; } -static void publish_registered_or_batch(grpc_exec_ctx *exec_ctx, - void *user_data, bool success); - -static void cpstr(char **dest, size_t *capacity, grpc_mdstr *value) { - gpr_slice slice = value->slice; - size_t len = GPR_SLICE_LENGTH(slice); - - if (len + 1 > *capacity) { - *capacity = GPR_MAX(len + 1, *capacity * 2); - *dest = gpr_realloc(*dest, *capacity); - } - memcpy(*dest, grpc_mdstr_as_c_string(value), len + 1); -} - -static void begin_call(grpc_exec_ctx *exec_ctx, grpc_server *server, - call_data *calld, requested_call *rc) { - grpc_op ops[1]; - grpc_op *op = ops; - - memset(ops, 0, sizeof(ops)); - - /* called once initial metadata has been read by the call, but BEFORE - the ioreq to fetch it out of the call has been executed. - This means metadata related fields can be relied on in calld, but to - fill in the metadata array passed by the client, we need to perform - an ioreq op, that should complete immediately. */ - - grpc_call_set_completion_queue(exec_ctx, calld->call, rc->cq_bound_to_call); - grpc_closure_init(&rc->publish, publish_registered_or_batch, rc); - *rc->call = calld->call; - calld->cq_new = rc->cq_for_notification; - GPR_SWAP(grpc_metadata_array, *rc->initial_metadata, calld->initial_metadata); - switch (rc->type) { - case BATCH_CALL: - GPR_ASSERT(calld->host != NULL); - GPR_ASSERT(calld->path != NULL); - cpstr(&rc->data.batch.details->host, - &rc->data.batch.details->host_capacity, calld->host); - cpstr(&rc->data.batch.details->method, - &rc->data.batch.details->method_capacity, calld->path); - rc->data.batch.details->deadline = calld->deadline; - rc->data.batch.details->flags = - 0 | (calld->recv_idempotent_request - ? GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST - : 0); - break; - case REGISTERED_CALL: - *rc->data.registered.deadline = calld->deadline; - if (rc->data.registered.optional_payload) { - op->op = GRPC_OP_RECV_MESSAGE; - op->data.recv_message = rc->data.registered.optional_payload; - op++; - } - break; - default: - GPR_UNREACHABLE_CODE(return ); - } - - GRPC_CALL_INTERNAL_REF(calld->call, "server"); - grpc_call_start_batch_and_execute(exec_ctx, calld->call, ops, - (size_t)(op - ops), &rc->publish); -} - -static void done_request_event(grpc_exec_ctx *exec_ctx, void *req, - grpc_cq_completion *c) { - requested_call *rc = req; - grpc_server *server = rc->server; - - if (rc >= server->requested_calls && - rc < server->requested_calls + server->max_requested_calls) { - GPR_ASSERT(rc - server->requested_calls <= INT_MAX); - gpr_stack_lockfree_push(server->request_freelist, - (int)(rc - server->requested_calls)); - } else { - gpr_free(req); - } - - server_unref(exec_ctx, server); -} - static void fail_call(grpc_exec_ctx *exec_ctx, grpc_server *server, requested_call *rc) { *rc->call = NULL; @@ -1316,20 +1359,6 @@ static void fail_call(grpc_exec_ctx *exec_ctx, grpc_server *server, done_request_event, rc, &rc->completion); } -static void publish_registered_or_batch(grpc_exec_ctx *exec_ctx, void *prc, - bool success) { - requested_call *rc = prc; - grpc_call *call = *rc->call; - grpc_call_element *elem = - grpc_call_stack_element(grpc_call_get_call_stack(call), 0); - call_data *calld = elem->call_data; - channel_data *chand = elem->channel_data; - server_ref(chand->server); - grpc_cq_end_op(exec_ctx, calld->cq_new, rc->tag, success, done_request_event, - rc, &rc->completion); - GRPC_CALL_INTERNAL_UNREF(exec_ctx, call, "server"); -} - const grpc_channel_args *grpc_server_get_channel_args(grpc_server *server) { return server->channel_args; } diff --git a/src/core/lib/transport/transport.h b/src/core/lib/transport/transport.h index 460e4dcedc..bb1120ee3a 100644 --- a/src/core/lib/transport/transport.h +++ b/src/core/lib/transport/transport.h @@ -101,9 +101,9 @@ typedef struct grpc_transport_stream_op { /** Send initial metadata to the peer, from the provided metadata batch. idempotent_request MUST be set if this is non-null */ grpc_metadata_batch *send_initial_metadata; - /** Iff send_initial_metadata != NULL, flags if this is an idempotent request - or not */ - bool send_idempotent_request; + /** Iff send_initial_metadata != NULL, flags associated with + send_initial_metadata: a bitfield of GRPC_INITIAL_METADATA_xxx */ + uint32_t send_initial_metadata_flags; /** Send trailing metadata to the peer, from the provided metadata batch. */ grpc_metadata_batch *send_trailing_metadata; diff --git a/src/cpp/client/client_context.cc b/src/cpp/client/client_context.cc index bf6423128a..c277d7ebe8 100644 --- a/src/cpp/client/client_context.cc +++ b/src/cpp/client/client_context.cc @@ -60,6 +60,8 @@ static ClientContext::GlobalCallbacks* g_client_callbacks = ClientContext::ClientContext() : initial_metadata_received_(false), + fail_fast_(true), + idempotent_(false), call_(nullptr), call_canceled_(false), deadline_(gpr_inf_future(GPR_CLOCK_REALTIME)), diff --git a/src/cpp/server/server.cc b/src/cpp/server/server.cc index 3e44c502fc..fafe31e84c 100644 --- a/src/cpp/server/server.cc +++ b/src/cpp/server/server.cc @@ -321,6 +321,19 @@ void Server::SetGlobalCallbacks(GlobalCallbacks* callbacks) { g_callbacks.reset(callbacks); } +static grpc_server_register_method_payload_handling PayloadHandlingForMethod( + RpcServiceMethod* method) { + switch (method->method_type()) { + case RpcMethod::NORMAL_RPC: + case RpcMethod::SERVER_STREAMING: + return GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER; + case RpcMethod::CLIENT_STREAMING: + case RpcMethod::BIDI_STREAMING: + return GRPC_SRM_PAYLOAD_NONE; + } + GPR_UNREACHABLE_CODE(return GRPC_SRM_PAYLOAD_NONE;); +} + bool Server::RegisterService(const grpc::string* host, Service* service) { bool has_async_methods = service->has_async_methods(); if (has_async_methods) { @@ -334,8 +347,9 @@ bool Server::RegisterService(const grpc::string* host, Service* service) { continue; } RpcServiceMethod* method = it->get(); - void* tag = grpc_server_register_method(server_, method->name(), - host ? host->c_str() : nullptr, 0); + void* tag = grpc_server_register_method( + server_, method->name(), host ? host->c_str() : nullptr, + PayloadHandlingForMethod(method), 0); if (tag == nullptr) { gpr_log(GPR_DEBUG, "Attempt to register %s multiple times", method->name()); diff --git a/src/csharp/Grpc.Core/CallInvoker.cs b/src/csharp/Grpc.Core/CallInvoker.cs new file mode 100644 index 0000000000..39199b1fd5 --- /dev/null +++ b/src/csharp/Grpc.Core/CallInvoker.cs @@ -0,0 +1,84 @@ +#region Copyright notice and license + +// Copyright 2015-2016, 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. + +#endregion + +using System.Threading.Tasks; +using Grpc.Core.Internal; + +namespace Grpc.Core +{ + /// <summary> + /// Abstraction of client-side RPC invocation. + /// </summary> + /// <seealso cref="Calls"/> + public abstract class CallInvoker + { + /// <summary> + /// Invokes a simple remote call in a blocking fashion. + /// </summary> + public abstract TResponse BlockingUnaryCall<TRequest, TResponse>(Method<TRequest, TResponse> method, string host, CallOptions options, TRequest request) + where TRequest : class + where TResponse : class; + + /// <summary> + /// Invokes a simple remote call asynchronously. + /// </summary> + public abstract AsyncUnaryCall<TResponse> AsyncUnaryCall<TRequest, TResponse>(Method<TRequest, TResponse> method, string host, CallOptions options, TRequest request) + where TRequest : class + where TResponse : class; + + /// <summary> + /// Invokes a server streaming call asynchronously. + /// In server streaming scenario, client sends on request and server responds with a stream of responses. + /// </summary> + public abstract AsyncServerStreamingCall<TResponse> AsyncServerStreamingCall<TRequest, TResponse>(Method<TRequest, TResponse> method, string host, CallOptions options, TRequest request) + where TRequest : class + where TResponse : class; + + /// <summary> + /// Invokes a client streaming call asynchronously. + /// In client streaming scenario, client sends a stream of requests and server responds with a single response. + /// </summary> + public abstract AsyncClientStreamingCall<TRequest, TResponse> AsyncClientStreamingCall<TRequest, TResponse>(Method<TRequest, TResponse> method, string host, CallOptions options) + where TRequest : class + where TResponse : class; + + /// <summary> + /// Invokes a duplex streaming call asynchronously. + /// In duplex streaming scenario, client sends a stream of requests and server responds with a stream of responses. + /// The response stream is completely independent and both side can be sending messages at the same time. + /// </summary> + public abstract AsyncDuplexStreamingCall<TRequest, TResponse> AsyncDuplexStreamingCall<TRequest, TResponse>(Method<TRequest, TResponse> method, string host, CallOptions options) + where TRequest : class + where TResponse : class; + } +} diff --git a/src/csharp/Grpc.Core/ClientBase.cs b/src/csharp/Grpc.Core/ClientBase.cs index e5b398062b..5517233e3c 100644 --- a/src/csharp/Grpc.Core/ClientBase.cs +++ b/src/csharp/Grpc.Core/ClientBase.cs @@ -1,6 +1,6 @@ #region Copyright notice and license -// Copyright 2015, Google Inc. +// Copyright 2015-2016, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -31,93 +31,156 @@ #endregion -using System; -using System.Text.RegularExpressions; -using System.Threading.Tasks; +using Grpc.Core.Internal; +using Grpc.Core.Utils; namespace Grpc.Core { /// <summary> - /// Interceptor for call headers. + /// Generic base class for client-side stubs. /// </summary> - /// <remarks>Header interceptor is no longer to recommented way to perform authentication. - /// For header (initial metadata) based auth such as OAuth2 or JWT access token, use <see cref="MetadataCredentials"/>. - /// </remarks> - public delegate void HeaderInterceptor(IMethod method, Metadata metadata); + public abstract class ClientBase<T> : ClientBase + where T : ClientBase<T> + { + /// <summary> + /// Initializes a new instance of <c>ClientBase</c> class that + /// throws <c>NotImplementedException</c> upon invocation of any RPC. + /// This constructor is only provided to allow creation of test doubles + /// for client classes (e.g. mocking requires a parameterless constructor). + /// </summary> + protected ClientBase() : base() + { + } + + /// <summary> + /// Initializes a new instance of <c>ClientBase</c> class. + /// </summary> + /// <param name="configuration">The configuration.</param> + protected ClientBase(ClientBaseConfiguration configuration) : base(configuration) + { + } + + /// <summary> + /// Initializes a new instance of <c>ClientBase</c> class. + /// </summary> + /// <param name="channel">The channel to use for remote call invocation.</param> + public ClientBase(Channel channel) : base(channel) + { + } + + /// <summary> + /// Initializes a new instance of <c>ClientBase</c> class. + /// </summary> + /// <param name="callInvoker">The <c>CallInvoker</c> for remote call invocation.</param> + public ClientBase(CallInvoker callInvoker) : base(callInvoker) + { + } + + /// <summary> + /// Creates a new client that sets host field for calls explicitly. + /// gRPC supports multiple "hosts" being served by a single server. + /// By default (if a client was not created by calling this method), + /// host <c>null</c> with the meaning "use default host" is used. + /// </summary> + public T WithHost(string host) + { + var newConfiguration = this.Configuration.WithHost(host); + return NewInstance(newConfiguration); + } + + /// <summary> + /// Creates a new instance of client from given <c>ClientBaseConfiguration</c>. + /// </summary> + protected abstract T NewInstance(ClientBaseConfiguration configuration); + } /// <summary> /// Base class for client-side stubs. /// </summary> public abstract class ClientBase { - readonly Channel channel; + readonly ClientBaseConfiguration configuration; + readonly CallInvoker callInvoker; + + /// <summary> + /// Initializes a new instance of <c>ClientBase</c> class that + /// throws <c>NotImplementedException</c> upon invocation of any RPC. + /// This constructor is only provided to allow creation of test doubles + /// for client classes (e.g. mocking requires a parameterless constructor). + /// </summary> + protected ClientBase() : this(new UnimplementedCallInvoker()) + { + } + + /// <summary> + /// Initializes a new instance of <c>ClientBase</c> class. + /// </summary> + /// <param name="configuration">The configuration.</param> + protected ClientBase(ClientBaseConfiguration configuration) + { + this.configuration = GrpcPreconditions.CheckNotNull(configuration, "configuration"); + this.callInvoker = configuration.CreateDecoratedCallInvoker(); + } /// <summary> /// Initializes a new instance of <c>ClientBase</c> class. /// </summary> /// <param name="channel">The channel to use for remote call invocation.</param> - public ClientBase(Channel channel) + public ClientBase(Channel channel) : this(new DefaultCallInvoker(channel)) { - this.channel = channel; } /// <summary> - /// Can be used to register a custom header interceptor. - /// The interceptor is invoked each time a new call on this client is started. - /// It is not recommented to use header interceptor to add auth headers to RPC calls. + /// Initializes a new instance of <c>ClientBase</c> class. /// </summary> - /// <seealso cref="HeaderInterceptor"/> - public HeaderInterceptor HeaderInterceptor + /// <param name="callInvoker">The <c>CallInvoker</c> for remote call invocation.</param> + public ClientBase(CallInvoker callInvoker) : this(new ClientBaseConfiguration(callInvoker, null)) { - get; - set; } /// <summary> - /// gRPC supports multiple "hosts" being served by a single server. - /// This property can be used to set the target host explicitly. - /// By default, this will be set to <c>null</c> with the meaning - /// "use default host". + /// Gets the call invoker. /// </summary> - public string Host + protected CallInvoker CallInvoker { - get; - set; + get { return this.callInvoker; } } /// <summary> - /// Channel associated with this client. + /// Gets the configuration. /// </summary> - public Channel Channel + internal ClientBaseConfiguration Configuration { - get - { - return this.channel; - } + get { return this.configuration; } } /// <summary> - /// Creates a new call to given method. + /// Represents configuration of ClientBase. The class itself is visible to + /// subclasses, but contents are marked as internal to make the instances opaque. + /// The verbose name of this class was chosen to make name clash in generated code + /// less likely. /// </summary> - /// <param name="method">The method to invoke.</param> - /// <param name="options">The call options.</param> - /// <typeparam name="TRequest">Request message type.</typeparam> - /// <typeparam name="TResponse">Response message type.</typeparam> - /// <returns>The call invocation details.</returns> - protected CallInvocationDetails<TRequest, TResponse> CreateCall<TRequest, TResponse>(Method<TRequest, TResponse> method, CallOptions options) - where TRequest : class - where TResponse : class + protected internal class ClientBaseConfiguration { - var interceptor = HeaderInterceptor; - if (interceptor != null) + readonly CallInvoker undecoratedCallInvoker; + readonly string host; + + internal ClientBaseConfiguration(CallInvoker undecoratedCallInvoker, string host) + { + this.undecoratedCallInvoker = GrpcPreconditions.CheckNotNull(undecoratedCallInvoker); + this.host = host; + } + + internal CallInvoker CreateDecoratedCallInvoker() + { + return new InterceptingCallInvoker(undecoratedCallInvoker, hostInterceptor: (h) => host); + } + + internal ClientBaseConfiguration WithHost(string host) { - if (options.Headers == null) - { - options = options.WithHeaders(new Metadata()); - } - interceptor(method, options.Headers); + GrpcPreconditions.CheckNotNull(host, "host"); + return new ClientBaseConfiguration(this.undecoratedCallInvoker, host); } - return new CallInvocationDetails<TRequest, TResponse>(channel, method, Host, options); } } } diff --git a/src/csharp/Grpc.Core/DefaultCallInvoker.cs b/src/csharp/Grpc.Core/DefaultCallInvoker.cs new file mode 100644 index 0000000000..1a99e41153 --- /dev/null +++ b/src/csharp/Grpc.Core/DefaultCallInvoker.cs @@ -0,0 +1,112 @@ +#region Copyright notice and license + +// Copyright 2015-2016, 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. + +#endregion + +using System.Threading.Tasks; +using Grpc.Core.Internal; +using Grpc.Core.Utils; + +namespace Grpc.Core +{ + /// <summary> + /// Invokes client RPCs using <see cref="Calls"/>. + /// </summary> + public class DefaultCallInvoker : CallInvoker + { + readonly Channel channel; + + /// <summary> + /// Initializes a new instance of the <see cref="Grpc.Core.DefaultCallInvoker"/> class. + /// </summary> + /// <param name="channel">Channel to use.</param> + public DefaultCallInvoker(Channel channel) + { + this.channel = GrpcPreconditions.CheckNotNull(channel); + } + + /// <summary> + /// Invokes a simple remote call in a blocking fashion. + /// </summary> + public override TResponse BlockingUnaryCall<TRequest, TResponse>(Method<TRequest, TResponse> method, string host, CallOptions options, TRequest request) + { + var call = CreateCall(method, host, options); + return Calls.BlockingUnaryCall(call, request); + } + + /// <summary> + /// Invokes a simple remote call asynchronously. + /// </summary> + public override AsyncUnaryCall<TResponse> AsyncUnaryCall<TRequest, TResponse>(Method<TRequest, TResponse> method, string host, CallOptions options, TRequest request) + { + var call = CreateCall(method, host, options); + return Calls.AsyncUnaryCall(call, request); + } + + /// <summary> + /// Invokes a server streaming call asynchronously. + /// In server streaming scenario, client sends on request and server responds with a stream of responses. + /// </summary> + public override AsyncServerStreamingCall<TResponse> AsyncServerStreamingCall<TRequest, TResponse>(Method<TRequest, TResponse> method, string host, CallOptions options, TRequest request) + { + var call = CreateCall(method, host, options); + return Calls.AsyncServerStreamingCall(call, request); + } + + /// <summary> + /// Invokes a client streaming call asynchronously. + /// In client streaming scenario, client sends a stream of requests and server responds with a single response. + /// </summary> + public override AsyncClientStreamingCall<TRequest, TResponse> AsyncClientStreamingCall<TRequest, TResponse>(Method<TRequest, TResponse> method, string host, CallOptions options) + { + var call = CreateCall(method, host, options); + return Calls.AsyncClientStreamingCall(call); + } + + /// <summary> + /// Invokes a duplex streaming call asynchronously. + /// In duplex streaming scenario, client sends a stream of requests and server responds with a stream of responses. + /// The response stream is completely independent and both side can be sending messages at the same time. + /// </summary> + public override AsyncDuplexStreamingCall<TRequest, TResponse> AsyncDuplexStreamingCall<TRequest, TResponse>(Method<TRequest, TResponse> method, string host, CallOptions options) + { + var call = CreateCall(method, host, options); + return Calls.AsyncDuplexStreamingCall(call); + } + + protected virtual CallInvocationDetails<TRequest, TResponse> CreateCall<TRequest, TResponse>(Method<TRequest, TResponse> method, string host, CallOptions options) + where TRequest : class + where TResponse : class + { + return new CallInvocationDetails<TRequest, TResponse>(channel, method, host, options); + } + } +} diff --git a/src/csharp/Grpc.Core/Grpc.Core.csproj b/src/csharp/Grpc.Core/Grpc.Core.csproj index 3189835ccd..251a688946 100644 --- a/src/csharp/Grpc.Core/Grpc.Core.csproj +++ b/src/csharp/Grpc.Core/Grpc.Core.csproj @@ -129,6 +129,10 @@ <Compile Include="Profiling\Profilers.cs" /> <Compile Include="Internal\DefaultSslRootsOverride.cs" /> <Compile Include="Utils\GrpcPreconditions.cs" /> + <Compile Include="CallInvoker.cs" /> + <Compile Include="DefaultCallInvoker.cs" /> + <Compile Include="Internal\UnimplementedCallInvoker.cs" /> + <Compile Include="Internal\InterceptingCallInvoker.cs" /> </ItemGroup> <ItemGroup> <None Include="Grpc.Core.nuspec" /> diff --git a/src/csharp/Grpc.Core/Internal/InterceptingCallInvoker.cs b/src/csharp/Grpc.Core/Internal/InterceptingCallInvoker.cs new file mode 100644 index 0000000000..ef48dc7121 --- /dev/null +++ b/src/csharp/Grpc.Core/Internal/InterceptingCallInvoker.cs @@ -0,0 +1,134 @@ +#region Copyright notice and license + +// Copyright 2015-2016, 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. + +#endregion + +using System; +using System.Threading.Tasks; +using Grpc.Core; +using Grpc.Core.Utils; + +namespace Grpc.Core.Internal +{ + /// <summary> + /// Decorates an underlying <c>CallInvoker</c> to intercept call invocations. + /// </summary> + internal class InterceptingCallInvoker : CallInvoker + { + readonly CallInvoker callInvoker; + readonly Func<string, string> hostInterceptor; + readonly Func<CallOptions, CallOptions> callOptionsInterceptor; + + /// <summary> + /// Initializes a new instance of the <see cref="Grpc.Core.InterceptingCallInvoker"/> class. + /// </summary> + public InterceptingCallInvoker(CallInvoker callInvoker, + Func<string, string> hostInterceptor = null, + Func<CallOptions, CallOptions> callOptionsInterceptor = null) + { + this.callInvoker = GrpcPreconditions.CheckNotNull(callInvoker); + this.hostInterceptor = hostInterceptor; + this.callOptionsInterceptor = callOptionsInterceptor; + } + + /// <summary> + /// Intercepts a unary call. + /// </summary> + public override TResponse BlockingUnaryCall<TRequest, TResponse>(Method<TRequest, TResponse> method, string host, CallOptions options, TRequest request) + { + host = InterceptHost(host); + options = InterceptCallOptions(options); + return callInvoker.BlockingUnaryCall(method, host, options, request); + } + + /// <summary> + /// Invokes a simple remote call asynchronously. + /// </summary> + public override AsyncUnaryCall<TResponse> AsyncUnaryCall<TRequest, TResponse>(Method<TRequest, TResponse> method, string host, CallOptions options, TRequest request) + { + host = InterceptHost(host); + options = InterceptCallOptions(options); + return callInvoker.AsyncUnaryCall(method, host, options, request); + } + + /// <summary> + /// Invokes a server streaming call asynchronously. + /// In server streaming scenario, client sends on request and server responds with a stream of responses. + /// </summary> + public override AsyncServerStreamingCall<TResponse> AsyncServerStreamingCall<TRequest, TResponse>(Method<TRequest, TResponse> method, string host, CallOptions options, TRequest request) + { + host = InterceptHost(host); + options = InterceptCallOptions(options); + return callInvoker.AsyncServerStreamingCall(method, host, options, request); + } + + /// <summary> + /// Invokes a client streaming call asynchronously. + /// In client streaming scenario, client sends a stream of requests and server responds with a single response. + /// </summary> + public override AsyncClientStreamingCall<TRequest, TResponse> AsyncClientStreamingCall<TRequest, TResponse>(Method<TRequest, TResponse> method, string host, CallOptions options) + { + host = InterceptHost(host); + options = InterceptCallOptions(options); + return callInvoker.AsyncClientStreamingCall(method, host, options); + } + + /// <summary> + /// Invokes a duplex streaming call asynchronously. + /// In duplex streaming scenario, client sends a stream of requests and server responds with a stream of responses. + /// The response stream is completely independent and both side can be sending messages at the same time. + /// </summary> + public override AsyncDuplexStreamingCall<TRequest, TResponse> AsyncDuplexStreamingCall<TRequest, TResponse>(Method<TRequest, TResponse> method, string host, CallOptions options) + { + host = InterceptHost(host); + options = InterceptCallOptions(options); + return callInvoker.AsyncDuplexStreamingCall(method, host, options); + } + + private string InterceptHost(string host) + { + if (hostInterceptor == null) + { + return host; + } + return hostInterceptor(host); + } + + private CallOptions InterceptCallOptions(CallOptions options) + { + if (callOptionsInterceptor == null) + { + return options; + } + return callOptionsInterceptor(options); + } + } +} diff --git a/src/csharp/Grpc.Core/Internal/UnimplementedCallInvoker.cs b/src/csharp/Grpc.Core/Internal/UnimplementedCallInvoker.cs new file mode 100644 index 0000000000..0c7340873b --- /dev/null +++ b/src/csharp/Grpc.Core/Internal/UnimplementedCallInvoker.cs @@ -0,0 +1,75 @@ +#region Copyright notice and license + +// Copyright 2015-2016, 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. + +#endregion + +using System; +using System.Threading.Tasks; +using Grpc.Core; +using Grpc.Core.Utils; + +namespace Grpc.Core.Internal +{ + /// <summary> + /// Call invoker that throws <c>NotImplementedException</c> for all requests. + /// </summary> + internal class UnimplementedCallInvoker : CallInvoker + { + public UnimplementedCallInvoker() + { + } + + public override TResponse BlockingUnaryCall<TRequest, TResponse>(Method<TRequest, TResponse> method, string host, CallOptions options, TRequest request) + { + throw new NotImplementedException(); + } + + public override AsyncUnaryCall<TResponse> AsyncUnaryCall<TRequest, TResponse>(Method<TRequest, TResponse> method, string host, CallOptions options, TRequest request) + { + throw new NotImplementedException(); + } + + public override AsyncServerStreamingCall<TResponse> AsyncServerStreamingCall<TRequest, TResponse>(Method<TRequest, TResponse> method, string host, CallOptions options, TRequest request) + { + throw new NotImplementedException(); + } + + public override AsyncClientStreamingCall<TRequest, TResponse> AsyncClientStreamingCall<TRequest, TResponse>(Method<TRequest, TResponse> method, string host, CallOptions options) + { + throw new NotImplementedException(); + } + + public override AsyncDuplexStreamingCall<TRequest, TResponse> AsyncDuplexStreamingCall<TRequest, TResponse>(Method<TRequest, TResponse> method, string host, CallOptions options) + { + throw new NotImplementedException(); + } + } +} diff --git a/src/csharp/Grpc.Examples.MathClient/MathClient.cs b/src/csharp/Grpc.Examples.MathClient/MathClient.cs index 64e429ed5a..aadef6833d 100644 --- a/src/csharp/Grpc.Examples.MathClient/MathClient.cs +++ b/src/csharp/Grpc.Examples.MathClient/MathClient.cs @@ -1,5 +1,5 @@ #region Copyright notice and license -// Copyright 2015, Google Inc. +// Copyright 2015-2016, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -40,7 +40,7 @@ namespace Math public static void Main(string[] args) { var channel = new Channel("127.0.0.1", 23456, ChannelCredentials.Insecure); - Math.IMathClient client = new Math.MathClient(channel); + Math.MathClient client = new Math.MathClient(channel); MathExamples.DivExample(client); MathExamples.DivAsyncExample(client).Wait(); diff --git a/src/csharp/Grpc.Examples/MathExamples.cs b/src/csharp/Grpc.Examples/MathExamples.cs index 8009ccbbfa..6075420974 100644 --- a/src/csharp/Grpc.Examples/MathExamples.cs +++ b/src/csharp/Grpc.Examples/MathExamples.cs @@ -1,5 +1,5 @@ #region Copyright notice and license -// Copyright 2015, Google Inc. +// Copyright 2015-2016, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -38,19 +38,19 @@ namespace Math { public static class MathExamples { - public static void DivExample(Math.IMathClient client) + public static void DivExample(Math.MathClient client) { DivReply result = client.Div(new DivArgs { Dividend = 10, Divisor = 3 }); Console.WriteLine("Div Result: " + result); } - public static async Task DivAsyncExample(Math.IMathClient client) + public static async Task DivAsyncExample(Math.MathClient client) { DivReply result = await client.DivAsync(new DivArgs { Dividend = 4, Divisor = 5 }); Console.WriteLine("DivAsync Result: " + result); } - public static async Task FibExample(Math.IMathClient client) + public static async Task FibExample(Math.MathClient client) { using (var call = client.Fib(new FibArgs { Limit = 5 })) { @@ -59,7 +59,7 @@ namespace Math } } - public static async Task SumExample(Math.IMathClient client) + public static async Task SumExample(Math.MathClient client) { var numbers = new List<Num> { @@ -75,7 +75,7 @@ namespace Math } } - public static async Task DivManyExample(Math.IMathClient client) + public static async Task DivManyExample(Math.MathClient client) { var divArgsList = new List<DivArgs> { @@ -90,7 +90,7 @@ namespace Math } } - public static async Task DependendRequestsExample(Math.IMathClient client) + public static async Task DependendRequestsExample(Math.MathClient client) { var numbers = new List<Num> { diff --git a/src/csharp/Grpc.Examples/MathGrpc.cs b/src/csharp/Grpc.Examples/MathGrpc.cs index a6e878d0f4..f3bb0d1cdc 100644 --- a/src/csharp/Grpc.Examples/MathGrpc.cs +++ b/src/csharp/Grpc.Examples/MathGrpc.cs @@ -52,6 +52,7 @@ namespace Math { } // client interface + [System.Obsolete("Client side interfaced will be removed in the next release. Use client class directly.")] public interface IMathClient { global::Math.DivReply Div(global::Math.DivArgs request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)); @@ -67,6 +68,7 @@ namespace Math { } // server-side interface + [System.Obsolete("Service implementations should inherit from the generated abstract base class instead.")] public interface IMath { Task<global::Math.DivReply> Div(global::Math.DivArgs request, ServerCallContext context); @@ -75,61 +77,92 @@ namespace Math { Task<global::Math.Num> Sum(IAsyncStreamReader<global::Math.Num> requestStream, ServerCallContext context); } + // server-side abstract class + public abstract class MathBase + { + public virtual Task<global::Math.DivReply> Div(global::Math.DivArgs request, ServerCallContext context) + { + throw new RpcException(new Status(StatusCode.Unimplemented, "")); + } + + public virtual Task DivMany(IAsyncStreamReader<global::Math.DivArgs> requestStream, IServerStreamWriter<global::Math.DivReply> responseStream, ServerCallContext context) + { + throw new RpcException(new Status(StatusCode.Unimplemented, "")); + } + + public virtual Task Fib(global::Math.FibArgs request, IServerStreamWriter<global::Math.Num> responseStream, ServerCallContext context) + { + throw new RpcException(new Status(StatusCode.Unimplemented, "")); + } + + public virtual Task<global::Math.Num> Sum(IAsyncStreamReader<global::Math.Num> requestStream, ServerCallContext context) + { + throw new RpcException(new Status(StatusCode.Unimplemented, "")); + } + + } + // client stub - public class MathClient : ClientBase, IMathClient + public class MathClient : ClientBase<MathClient>, IMathClient { public MathClient(Channel channel) : base(channel) { } - public global::Math.DivReply Div(global::Math.DivArgs request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public MathClient(CallInvoker callInvoker) : base(callInvoker) { - var call = CreateCall(__Method_Div, new CallOptions(headers, deadline, cancellationToken)); - return Calls.BlockingUnaryCall(call, request); } - public global::Math.DivReply Div(global::Math.DivArgs request, CallOptions options) + ///<summary>Protected parameterless constructor to allow creation of test doubles.</summary> + protected MathClient() : base() { - var call = CreateCall(__Method_Div, options); - return Calls.BlockingUnaryCall(call, request); } - public AsyncUnaryCall<global::Math.DivReply> DivAsync(global::Math.DivArgs request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + ///<summary>Protected constructor to allow creation of configured clients.</summary> + protected MathClient(ClientBaseConfiguration configuration) : base(configuration) { - var call = CreateCall(__Method_Div, new CallOptions(headers, deadline, cancellationToken)); - return Calls.AsyncUnaryCall(call, request); } - public AsyncUnaryCall<global::Math.DivReply> DivAsync(global::Math.DivArgs request, CallOptions options) + + public virtual global::Math.DivReply Div(global::Math.DivArgs request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_Div, options); - return Calls.AsyncUnaryCall(call, request); + return Div(request, new CallOptions(headers, deadline, cancellationToken)); } - public AsyncDuplexStreamingCall<global::Math.DivArgs, global::Math.DivReply> DivMany(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual global::Math.DivReply Div(global::Math.DivArgs request, CallOptions options) { - var call = CreateCall(__Method_DivMany, new CallOptions(headers, deadline, cancellationToken)); - return Calls.AsyncDuplexStreamingCall(call); + return CallInvoker.BlockingUnaryCall(__Method_Div, null, options, request); } - public AsyncDuplexStreamingCall<global::Math.DivArgs, global::Math.DivReply> DivMany(CallOptions options) + public virtual AsyncUnaryCall<global::Math.DivReply> DivAsync(global::Math.DivArgs request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_DivMany, options); - return Calls.AsyncDuplexStreamingCall(call); + return DivAsync(request, new CallOptions(headers, deadline, cancellationToken)); } - public AsyncServerStreamingCall<global::Math.Num> Fib(global::Math.FibArgs request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual AsyncUnaryCall<global::Math.DivReply> DivAsync(global::Math.DivArgs request, CallOptions options) { - var call = CreateCall(__Method_Fib, new CallOptions(headers, deadline, cancellationToken)); - return Calls.AsyncServerStreamingCall(call, request); + return CallInvoker.AsyncUnaryCall(__Method_Div, null, options, request); } - public AsyncServerStreamingCall<global::Math.Num> Fib(global::Math.FibArgs request, CallOptions options) + public virtual AsyncDuplexStreamingCall<global::Math.DivArgs, global::Math.DivReply> DivMany(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_Fib, options); - return Calls.AsyncServerStreamingCall(call, request); + return DivMany(new CallOptions(headers, deadline, cancellationToken)); } - public AsyncClientStreamingCall<global::Math.Num, global::Math.Num> Sum(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual AsyncDuplexStreamingCall<global::Math.DivArgs, global::Math.DivReply> DivMany(CallOptions options) { - var call = CreateCall(__Method_Sum, new CallOptions(headers, deadline, cancellationToken)); - return Calls.AsyncClientStreamingCall(call); + return CallInvoker.AsyncDuplexStreamingCall(__Method_DivMany, null, options); } - public AsyncClientStreamingCall<global::Math.Num, global::Math.Num> Sum(CallOptions options) + public virtual AsyncServerStreamingCall<global::Math.Num> Fib(global::Math.FibArgs request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_Sum, options); - return Calls.AsyncClientStreamingCall(call); + return Fib(request, new CallOptions(headers, deadline, cancellationToken)); + } + public virtual AsyncServerStreamingCall<global::Math.Num> Fib(global::Math.FibArgs request, CallOptions options) + { + return CallInvoker.AsyncServerStreamingCall(__Method_Fib, null, options, request); + } + public virtual AsyncClientStreamingCall<global::Math.Num, global::Math.Num> Sum(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + { + return Sum(new CallOptions(headers, deadline, cancellationToken)); + } + public virtual AsyncClientStreamingCall<global::Math.Num, global::Math.Num> Sum(CallOptions options) + { + return CallInvoker.AsyncClientStreamingCall(__Method_Sum, null, options); + } + protected override MathClient NewInstance(ClientBaseConfiguration configuration) + { + return new MathClient(configuration); } } @@ -143,6 +176,16 @@ namespace Math { .AddMethod(__Method_Sum, serviceImpl.Sum).Build(); } + // creates service definition that can be registered with a server + public static ServerServiceDefinition BindService(MathBase serviceImpl) + { + return ServerServiceDefinition.CreateBuilder(__ServiceName) + .AddMethod(__Method_Div, serviceImpl.Div) + .AddMethod(__Method_DivMany, serviceImpl.DivMany) + .AddMethod(__Method_Fib, serviceImpl.Fib) + .AddMethod(__Method_Sum, serviceImpl.Sum).Build(); + } + // creates a new client public static MathClient NewClient(Channel channel) { diff --git a/src/csharp/Grpc.Examples/MathServiceImpl.cs b/src/csharp/Grpc.Examples/MathServiceImpl.cs index 71dc655e46..79c56e57a8 100644 --- a/src/csharp/Grpc.Examples/MathServiceImpl.cs +++ b/src/csharp/Grpc.Examples/MathServiceImpl.cs @@ -1,6 +1,6 @@ #region Copyright notice and license -// Copyright 2015, Google Inc. +// Copyright 2015-2016, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -43,14 +43,14 @@ namespace Math /// <summary> /// Implementation of MathService server /// </summary> - public class MathServiceImpl : Math.IMath + public class MathServiceImpl : Math.MathBase { - public Task<DivReply> Div(DivArgs request, ServerCallContext context) + public override Task<DivReply> Div(DivArgs request, ServerCallContext context) { return Task.FromResult(DivInternal(request)); } - public async Task Fib(FibArgs request, IServerStreamWriter<Num> responseStream, ServerCallContext context) + public override async Task Fib(FibArgs request, IServerStreamWriter<Num> responseStream, ServerCallContext context) { if (request.Limit <= 0) { @@ -72,7 +72,7 @@ namespace Math } } - public async Task<Num> Sum(IAsyncStreamReader<Num> requestStream, ServerCallContext context) + public override async Task<Num> Sum(IAsyncStreamReader<Num> requestStream, ServerCallContext context) { long sum = 0; await requestStream.ForEachAsync(async num => @@ -82,7 +82,7 @@ namespace Math return new Num { Num_ = sum }; } - public async Task DivMany(IAsyncStreamReader<DivArgs> requestStream, IServerStreamWriter<DivReply> responseStream, ServerCallContext context) + public override async Task DivMany(IAsyncStreamReader<DivArgs> requestStream, IServerStreamWriter<DivReply> responseStream, ServerCallContext context) { await requestStream.ForEachAsync(async divArgs => await responseStream.WriteAsync(DivInternal(divArgs))); } diff --git a/src/csharp/Grpc.HealthCheck.Tests/HealthClientServerTest.cs b/src/csharp/Grpc.HealthCheck.Tests/HealthClientServerTest.cs index 8318e84277..fb292945a6 100644 --- a/src/csharp/Grpc.HealthCheck.Tests/HealthClientServerTest.cs +++ b/src/csharp/Grpc.HealthCheck.Tests/HealthClientServerTest.cs @@ -49,7 +49,7 @@ namespace Grpc.HealthCheck.Tests const string Host = "localhost"; Server server; Channel channel; - Grpc.Health.V1.Health.IHealthClient client; + Grpc.Health.V1.Health.HealthClient client; Grpc.HealthCheck.HealthServiceImpl serviceImpl; [TestFixtureSetUp] diff --git a/src/csharp/Grpc.HealthCheck/HealthGrpc.cs b/src/csharp/Grpc.HealthCheck/HealthGrpc.cs index 68320eb5c2..72e11cca3a 100644 --- a/src/csharp/Grpc.HealthCheck/HealthGrpc.cs +++ b/src/csharp/Grpc.HealthCheck/HealthGrpc.cs @@ -29,6 +29,7 @@ namespace Grpc.Health.V1 { } // client interface + [System.Obsolete("Client side interfaced will be removed in the next release. Use client class directly.")] public interface IHealthClient { global::Grpc.Health.V1.HealthCheckResponse Check(global::Grpc.Health.V1.HealthCheckRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)); @@ -38,36 +39,59 @@ namespace Grpc.Health.V1 { } // server-side interface + [System.Obsolete("Service implementations should inherit from the generated abstract base class instead.")] public interface IHealth { Task<global::Grpc.Health.V1.HealthCheckResponse> Check(global::Grpc.Health.V1.HealthCheckRequest request, ServerCallContext context); } + // server-side abstract class + public abstract class HealthBase + { + public virtual Task<global::Grpc.Health.V1.HealthCheckResponse> Check(global::Grpc.Health.V1.HealthCheckRequest request, ServerCallContext context) + { + throw new RpcException(new Status(StatusCode.Unimplemented, "")); + } + + } + // client stub - public class HealthClient : ClientBase, IHealthClient + public class HealthClient : ClientBase<HealthClient>, IHealthClient { public HealthClient(Channel channel) : base(channel) { } - public global::Grpc.Health.V1.HealthCheckResponse Check(global::Grpc.Health.V1.HealthCheckRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public HealthClient(CallInvoker callInvoker) : base(callInvoker) { - var call = CreateCall(__Method_Check, new CallOptions(headers, deadline, cancellationToken)); - return Calls.BlockingUnaryCall(call, request); } - public global::Grpc.Health.V1.HealthCheckResponse Check(global::Grpc.Health.V1.HealthCheckRequest request, CallOptions options) + ///<summary>Protected parameterless constructor to allow creation of test doubles.</summary> + protected HealthClient() : base() + { + } + ///<summary>Protected constructor to allow creation of configured clients.</summary> + protected HealthClient(ClientBaseConfiguration configuration) : base(configuration) + { + } + + public virtual global::Grpc.Health.V1.HealthCheckResponse Check(global::Grpc.Health.V1.HealthCheckRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_Check, options); - return Calls.BlockingUnaryCall(call, request); + return Check(request, new CallOptions(headers, deadline, cancellationToken)); } - public AsyncUnaryCall<global::Grpc.Health.V1.HealthCheckResponse> CheckAsync(global::Grpc.Health.V1.HealthCheckRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual global::Grpc.Health.V1.HealthCheckResponse Check(global::Grpc.Health.V1.HealthCheckRequest request, CallOptions options) { - var call = CreateCall(__Method_Check, new CallOptions(headers, deadline, cancellationToken)); - return Calls.AsyncUnaryCall(call, request); + return CallInvoker.BlockingUnaryCall(__Method_Check, null, options, request); } - public AsyncUnaryCall<global::Grpc.Health.V1.HealthCheckResponse> CheckAsync(global::Grpc.Health.V1.HealthCheckRequest request, CallOptions options) + public virtual AsyncUnaryCall<global::Grpc.Health.V1.HealthCheckResponse> CheckAsync(global::Grpc.Health.V1.HealthCheckRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_Check, options); - return Calls.AsyncUnaryCall(call, request); + return CheckAsync(request, new CallOptions(headers, deadline, cancellationToken)); + } + public virtual AsyncUnaryCall<global::Grpc.Health.V1.HealthCheckResponse> CheckAsync(global::Grpc.Health.V1.HealthCheckRequest request, CallOptions options) + { + return CallInvoker.AsyncUnaryCall(__Method_Check, null, options, request); + } + protected override HealthClient NewInstance(ClientBaseConfiguration configuration) + { + return new HealthClient(configuration); } } @@ -78,6 +102,13 @@ namespace Grpc.Health.V1 { .AddMethod(__Method_Check, serviceImpl.Check).Build(); } + // creates service definition that can be registered with a server + public static ServerServiceDefinition BindService(HealthBase serviceImpl) + { + return ServerServiceDefinition.CreateBuilder(__ServiceName) + .AddMethod(__Method_Check, serviceImpl.Check).Build(); + } + // creates a new client public static HealthClient NewClient(Channel channel) { diff --git a/src/csharp/Grpc.HealthCheck/HealthServiceImpl.cs b/src/csharp/Grpc.HealthCheck/HealthServiceImpl.cs index a6e82aa0d4..d0406ece00 100644 --- a/src/csharp/Grpc.HealthCheck/HealthServiceImpl.cs +++ b/src/csharp/Grpc.HealthCheck/HealthServiceImpl.cs @@ -51,7 +51,7 @@ namespace Grpc.HealthCheck /// server.AddServiceDefinition(Grpc.Health.V1.Health.BindService(serviceImpl)); /// </code> /// </summary> - public class HealthServiceImpl : Grpc.Health.V1.Health.IHealth + public class HealthServiceImpl : Grpc.Health.V1.Health.HealthBase { private readonly object myLock = new object(); private readonly Dictionary<string, HealthCheckResponse.Types.ServingStatus> statusMap = @@ -99,7 +99,7 @@ namespace Grpc.HealthCheck /// <param name="request">The check request.</param> /// <param name="context">The call context.</param> /// <returns>The asynchronous response.</returns> - public Task<HealthCheckResponse> Check(HealthCheckRequest request, ServerCallContext context) + public override Task<HealthCheckResponse> Check(HealthCheckRequest request, ServerCallContext context) { lock (myLock) { diff --git a/src/csharp/Grpc.IntegrationTesting/BenchmarkServiceImpl.cs b/src/csharp/Grpc.IntegrationTesting/BenchmarkServiceImpl.cs index 7e7bc713a0..07f2703d4a 100644 --- a/src/csharp/Grpc.IntegrationTesting/BenchmarkServiceImpl.cs +++ b/src/csharp/Grpc.IntegrationTesting/BenchmarkServiceImpl.cs @@ -1,6 +1,6 @@ #region Copyright notice and license -// Copyright 2015, Google Inc. +// Copyright 2015-2016, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -44,19 +44,19 @@ namespace Grpc.Testing /// <summary> /// Implementation of BenchmarkService server /// </summary> - public class BenchmarkServiceImpl : BenchmarkService.IBenchmarkService + public class BenchmarkServiceImpl : BenchmarkService.BenchmarkServiceBase { public BenchmarkServiceImpl() { } - public Task<SimpleResponse> UnaryCall(SimpleRequest request, ServerCallContext context) + public override Task<SimpleResponse> UnaryCall(SimpleRequest request, ServerCallContext context) { var response = new SimpleResponse { Payload = CreateZerosPayload(request.ResponseSize) }; return Task.FromResult(response); } - public async Task StreamingCall(IAsyncStreamReader<SimpleRequest> requestStream, IServerStreamWriter<SimpleResponse> responseStream, ServerCallContext context) + public override async Task StreamingCall(IAsyncStreamReader<SimpleRequest> requestStream, IServerStreamWriter<SimpleResponse> responseStream, ServerCallContext context) { await requestStream.ForEachAsync(async request => { diff --git a/src/csharp/Grpc.IntegrationTesting/ClientRunners.cs b/src/csharp/Grpc.IntegrationTesting/ClientRunners.cs index 5bfc89d591..f954ca5f34 100644 --- a/src/csharp/Grpc.IntegrationTesting/ClientRunners.cs +++ b/src/csharp/Grpc.IntegrationTesting/ClientRunners.cs @@ -61,15 +61,7 @@ namespace Grpc.IntegrationTesting public static IClientRunner CreateStarted(ClientConfig config) { Logger.Debug("ClientConfig: {0}", config); - string target = config.ServerTargets.Single(); - GrpcPreconditions.CheckArgument(config.LoadParams.LoadCase == LoadParams.LoadOneofCase.ClosedLoop, - "Only closed loop scenario supported for C#"); - GrpcPreconditions.CheckArgument(config.ClientChannels == 1, "ClientConfig.ClientChannels needs to be 1"); - if (config.OutstandingRpcsPerChannel != 0) - { - Logger.Warning("ClientConfig.OutstandingRpcsPerChannel is not supported for C#. Ignoring the value"); - } if (config.AsyncClientThreads != 0) { Logger.Warning("ClientConfig.AsyncClientThreads is not supported for C#. Ignoring the value"); @@ -83,22 +75,40 @@ namespace Grpc.IntegrationTesting Logger.Warning("ClientConfig.CoreList is not supported for C#. Ignoring the value"); } - var credentials = config.SecurityParams != null ? TestCredentials.CreateSslCredentials() : ChannelCredentials.Insecure; + var channels = CreateChannels(config.ClientChannels, config.ServerTargets, config.SecurityParams); + + return new ClientRunnerImpl(channels, + config.ClientType, + config.RpcType, + config.OutstandingRpcsPerChannel, + config.LoadParams, + config.PayloadConfig, + config.HistogramParams); + } + + private static List<Channel> CreateChannels(int clientChannels, IEnumerable<string> serverTargets, SecurityParams securityParams) + { + GrpcPreconditions.CheckArgument(clientChannels > 0, "clientChannels needs to be at least 1."); + GrpcPreconditions.CheckArgument(serverTargets.Count() > 0, "at least one serverTarget needs to be specified."); + + var credentials = securityParams != null ? TestCredentials.CreateSslCredentials() : ChannelCredentials.Insecure; List<ChannelOption> channelOptions = null; - if (config.SecurityParams != null && config.SecurityParams.ServerHostOverride != "") + if (securityParams != null && securityParams.ServerHostOverride != "") { channelOptions = new List<ChannelOption> { - new ChannelOption(ChannelOptions.SslTargetNameOverride, config.SecurityParams.ServerHostOverride) + new ChannelOption(ChannelOptions.SslTargetNameOverride, securityParams.ServerHostOverride) }; } - var channel = new Channel(target, credentials, channelOptions); - return new ClientRunnerImpl(channel, - config.ClientType, - config.RpcType, - config.PayloadConfig, - config.HistogramParams); + var result = new List<Channel>(); + for (int i = 0; i < clientChannels; i++) + { + var target = serverTargets.ElementAt(i % serverTargets.Count()); + var channel = new Channel(target, credentials, channelOptions); + result.Add(channel); + } + return result; } } @@ -106,30 +116,35 @@ namespace Grpc.IntegrationTesting { const double SecondsToNanos = 1e9; - readonly Channel channel; + readonly List<Channel> channels; readonly ClientType clientType; readonly RpcType rpcType; readonly PayloadConfig payloadConfig; readonly Histogram histogram; - readonly BenchmarkService.IBenchmarkServiceClient client; - readonly Task runnerTask; - readonly CancellationTokenSource stoppedCts; + readonly List<Task> runnerTasks; + readonly CancellationTokenSource stoppedCts = new CancellationTokenSource(); readonly WallClockStopwatch wallClockStopwatch = new WallClockStopwatch(); - public ClientRunnerImpl(Channel channel, ClientType clientType, RpcType rpcType, PayloadConfig payloadConfig, HistogramParams histogramParams) + public ClientRunnerImpl(List<Channel> channels, ClientType clientType, RpcType rpcType, int outstandingRpcsPerChannel, LoadParams loadParams, PayloadConfig payloadConfig, HistogramParams histogramParams) { - this.channel = GrpcPreconditions.CheckNotNull(channel); + GrpcPreconditions.CheckArgument(outstandingRpcsPerChannel > 0, "outstandingRpcsPerChannel"); + this.channels = new List<Channel>(channels); this.clientType = clientType; this.rpcType = rpcType; this.payloadConfig = payloadConfig; this.histogram = new Histogram(histogramParams.Resolution, histogramParams.MaxPossible); - this.stoppedCts = new CancellationTokenSource(); - this.client = BenchmarkService.NewClient(channel); - - var threadBody = GetThreadBody(); - this.runnerTask = Task.Factory.StartNew(threadBody, TaskCreationOptions.LongRunning); + this.runnerTasks = new List<Task>(); + foreach (var channel in this.channels) + { + for (int i = 0; i < outstandingRpcsPerChannel; i++) + { + var timer = CreateTimer(loadParams, 1.0 / this.channels.Count / outstandingRpcsPerChannel); + var threadBody = GetThreadBody(channel, timer); + this.runnerTasks.Add(Task.Factory.StartNew(threadBody, TaskCreationOptions.LongRunning)); + } + } } public ClientStats GetStats(bool reset) @@ -150,12 +165,19 @@ namespace Grpc.IntegrationTesting public async Task StopAsync() { stoppedCts.Cancel(); - await runnerTask; - await channel.ShutdownAsync(); + foreach (var runnerTask in runnerTasks) + { + await runnerTask; + } + foreach (var channel in channels) + { + await channel.ShutdownAsync(); + } } - private void RunClosedLoopUnary() + private void RunUnary(Channel channel, IInterarrivalTimer timer) { + var client = BenchmarkService.NewClient(channel); var request = CreateSimpleRequest(); var stopwatch = new Stopwatch(); @@ -167,11 +189,14 @@ namespace Grpc.IntegrationTesting // spec requires data point in nanoseconds. histogram.AddObservation(stopwatch.Elapsed.TotalSeconds * SecondsToNanos); + + timer.WaitForNext(); } } - private async Task RunClosedLoopUnaryAsync() + private async Task RunUnaryAsync(Channel channel, IInterarrivalTimer timer) { + var client = BenchmarkService.NewClient(channel); var request = CreateSimpleRequest(); var stopwatch = new Stopwatch(); @@ -183,11 +208,14 @@ namespace Grpc.IntegrationTesting // spec requires data point in nanoseconds. histogram.AddObservation(stopwatch.Elapsed.TotalSeconds * SecondsToNanos); + + await timer.WaitForNextAsync(); } } - private async Task RunClosedLoopStreamingAsync() + private async Task RunStreamingPingPongAsync(Channel channel, IInterarrivalTimer timer) { + var client = BenchmarkService.NewClient(channel); var request = CreateSimpleRequest(); var stopwatch = new Stopwatch(); @@ -202,6 +230,8 @@ namespace Grpc.IntegrationTesting // spec requires data point in nanoseconds. histogram.AddObservation(stopwatch.Elapsed.TotalSeconds * SecondsToNanos); + + await timer.WaitForNextAsync(); } // finish the streaming call @@ -210,7 +240,7 @@ namespace Grpc.IntegrationTesting } } - private async Task RunGenericClosedLoopStreamingAsync() + private async Task RunGenericStreamingAsync(Channel channel, IInterarrivalTimer timer) { var request = CreateByteBufferRequest(); var stopwatch = new Stopwatch(); @@ -228,6 +258,8 @@ namespace Grpc.IntegrationTesting // spec requires data point in nanoseconds. histogram.AddObservation(stopwatch.Elapsed.TotalSeconds * SecondsToNanos); + + await timer.WaitForNextAsync(); } // finish the streaming call @@ -236,7 +268,7 @@ namespace Grpc.IntegrationTesting } } - private Action GetThreadBody() + private Action GetThreadBody(Channel channel, IInterarrivalTimer timer) { if (payloadConfig.PayloadCase == PayloadConfig.PayloadOneofCase.BytebufParams) { @@ -244,7 +276,7 @@ namespace Grpc.IntegrationTesting GrpcPreconditions.CheckArgument(rpcType == RpcType.STREAMING, "Generic client only supports streaming calls"); return () => { - RunGenericClosedLoopStreamingAsync().Wait(); + RunGenericStreamingAsync(channel, timer).Wait(); }; } @@ -252,7 +284,7 @@ namespace Grpc.IntegrationTesting if (clientType == ClientType.SYNC_CLIENT) { GrpcPreconditions.CheckArgument(rpcType == RpcType.UNARY, "Sync client can only be used for Unary calls in C#"); - return RunClosedLoopUnary; + return () => RunUnary(channel, timer); } else if (clientType == ClientType.ASYNC_CLIENT) { @@ -261,12 +293,12 @@ namespace Grpc.IntegrationTesting case RpcType.UNARY: return () => { - RunClosedLoopUnaryAsync().Wait(); + RunUnaryAsync(channel, timer).Wait(); }; case RpcType.STREAMING: return () => { - RunClosedLoopStreamingAsync().Wait(); + RunStreamingPingPongAsync(channel, timer).Wait(); }; } } @@ -292,5 +324,18 @@ namespace Grpc.IntegrationTesting { return new Payload { Body = ByteString.CopyFrom(new byte[size]) }; } + + private static IInterarrivalTimer CreateTimer(LoadParams loadParams, double loadMultiplier) + { + switch (loadParams.LoadCase) + { + case LoadParams.LoadOneofCase.ClosedLoop: + return new ClosedLoopInterarrivalTimer(); + case LoadParams.LoadOneofCase.Poisson: + return new PoissonInterarrivalTimer(loadParams.Poisson.OfferedLoad * loadMultiplier); + default: + throw new ArgumentException("Unknown load type"); + } + } } } diff --git a/src/csharp/Grpc.IntegrationTesting/GeneratedClientTest.cs b/src/csharp/Grpc.IntegrationTesting/GeneratedClientTest.cs new file mode 100644 index 0000000000..37786b6c30 --- /dev/null +++ b/src/csharp/Grpc.IntegrationTesting/GeneratedClientTest.cs @@ -0,0 +1,106 @@ +#region Copyright notice and license + +// Copyright 2015-2016, 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. + +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Grpc.Core; +using Grpc.Core.Utils; +using Grpc.Testing; +using Moq; +using NUnit.Framework; + +namespace Grpc.IntegrationTesting +{ + public class GeneratedClientTest + { + TestService.TestServiceClient unimplementedClient = new UnimplementedTestServiceClient(); + + [Test] + public void ExpandedParamOverloadCanBeMocked() + { + var expected = new SimpleResponse(); + + var mockClient = new Mock<TestService.TestServiceClient>(); + // mocking is relatively clumsy because one needs to specify value for all the optional params. + mockClient.Setup(m => m.UnaryCall(It.IsAny<SimpleRequest>(), null, null, CancellationToken.None)).Returns(expected); + + Assert.AreSame(expected, mockClient.Object.UnaryCall(new SimpleRequest())); + } + + [Test] + public void CallOptionsOverloadCanBeMocked() + { + var expected = new SimpleResponse(); + + var mockClient = new Mock<TestService.TestServiceClient>(); + mockClient.Setup(m => m.UnaryCall(It.IsAny<SimpleRequest>(), It.IsAny<CallOptions>())).Returns(expected); + + Assert.AreSame(expected, mockClient.Object.UnaryCall(new SimpleRequest(), new CallOptions())); + } + + [Test] + public void DefaultMethodStubThrows_UnaryCall() + { + Assert.Throws(typeof(NotImplementedException), () => unimplementedClient.UnaryCall(new SimpleRequest())); + } + + [Test] + public void DefaultMethodStubThrows_ClientStreaming() + { + Assert.Throws(typeof(NotImplementedException), () => unimplementedClient.StreamingInputCall()); + } + + [Test] + public void DefaultMethodStubThrows_ServerStreaming() + { + Assert.Throws(typeof(NotImplementedException), () => unimplementedClient.StreamingOutputCall(new StreamingOutputCallRequest())); + } + + [Test] + public void DefaultMethodStubThrows_DuplexStreaming() + { + Assert.Throws(typeof(NotImplementedException), () => unimplementedClient.FullDuplexCall()); + } + + /// <summary> + /// Subclass of the generated client that doesn't override any method stubs. + /// </summary> + private class UnimplementedTestServiceClient : TestService.TestServiceClient + { + } + } +} diff --git a/src/csharp/Grpc.IntegrationTesting/GeneratedServiceBaseTest.cs b/src/csharp/Grpc.IntegrationTesting/GeneratedServiceBaseTest.cs new file mode 100644 index 0000000000..99aa729030 --- /dev/null +++ b/src/csharp/Grpc.IntegrationTesting/GeneratedServiceBaseTest.cs @@ -0,0 +1,116 @@ +#region Copyright notice and license + +// Copyright 2015-2016, 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. + +#endregion + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Grpc.Core; +using Grpc.Core.Utils; +using Grpc.Testing; +using Moq; +using NUnit.Framework; + +namespace Grpc.IntegrationTesting +{ + public class GeneratedServiceBaseTest + { + const string Host = "localhost"; + Server server; + Channel channel; + TestService.TestServiceClient client; + + [SetUp] + public void Init() + { + server = new Server + { + Services = { TestService.BindService(new UnimplementedTestServiceImpl()) }, + Ports = { { Host, ServerPort.PickUnused, SslServerCredentials.Insecure } } + }; + server.Start(); + channel = new Channel(Host, server.Ports.Single().BoundPort, ChannelCredentials.Insecure); + client = TestService.NewClient(channel); + } + + [TearDown] + public void Cleanup() + { + channel.ShutdownAsync().Wait(); + server.ShutdownAsync().Wait(); + } + + [Test] + public void UnimplementedByDefault_Unary() + { + var ex = Assert.Throws<RpcException>(() => client.UnaryCall(new SimpleRequest { })); + Assert.AreEqual(StatusCode.Unimplemented, ex.Status.StatusCode); + } + + [Test] + public async Task UnimplementedByDefault_ClientStreaming() + { + var call = client.StreamingInputCall(); + + var ex = Assert.Throws<RpcException>(async () => await call); + Assert.AreEqual(StatusCode.Unimplemented, ex.Status.StatusCode); + } + + [Test] + public async Task UnimplementedByDefault_ServerStreamingCall() + { + var call = client.StreamingOutputCall(new StreamingOutputCallRequest()); + + var ex = Assert.Throws<RpcException>(async () => await call.ResponseStream.MoveNext()); + Assert.AreEqual(StatusCode.Unimplemented, ex.Status.StatusCode); + } + + [Test] + public async Task UnimplementedByDefault_DuplexStreamingCall() + { + var call = client.FullDuplexCall(); + + var ex = Assert.Throws<RpcException>(async () => await call.ResponseStream.MoveNext()); + Assert.AreEqual(StatusCode.Unimplemented, ex.Status.StatusCode); + } + + /// <summary> + /// Implementation of TestService that doesn't override any methods. + /// </summary> + private class UnimplementedTestServiceImpl : TestService.TestServiceBase + { + } + } +} diff --git a/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj b/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj index d3c572fe27..7ea80b11f0 100644 --- a/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj +++ b/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj @@ -84,7 +84,6 @@ <Compile Include="..\Grpc.Core\Version.cs"> <Link>Version.cs</Link> </Compile> - <Compile Include="HeaderInterceptorTest.cs" /> <Compile Include="Properties\AssemblyInfo.cs" /> <Compile Include="Empty.cs" /> <Compile Include="Messages.cs" /> @@ -114,6 +113,9 @@ <Compile Include="QpsWorker.cs" /> <Compile Include="WallClockStopwatch.cs" /> <Compile Include="GenericService.cs" /> + <Compile Include="GeneratedServiceBaseTest.cs" /> + <Compile Include="GeneratedClientTest.cs" /> + <Compile Include="InterarrivalTimers.cs" /> </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <ItemGroup> diff --git a/src/csharp/Grpc.IntegrationTesting/InterarrivalTimers.cs b/src/csharp/Grpc.IntegrationTesting/InterarrivalTimers.cs new file mode 100644 index 0000000000..6492d34890 --- /dev/null +++ b/src/csharp/Grpc.IntegrationTesting/InterarrivalTimers.cs @@ -0,0 +1,148 @@ +#region Copyright notice and license + +// Copyright 2016, 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. + +#endregion + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using Google.Protobuf; +using Grpc.Core; +using Grpc.Core.Utils; +using Grpc.Testing; + +namespace Grpc.IntegrationTesting +{ + public interface IInterarrivalTimer + { + void WaitForNext(); + + Task WaitForNextAsync(); + } + + /// <summary> + /// Interarrival timer that doesn't wait at all. + /// </summary> + public class ClosedLoopInterarrivalTimer : IInterarrivalTimer + { + public ClosedLoopInterarrivalTimer() + { + } + + public void WaitForNext() + { + // NOP + } + + public Task WaitForNextAsync() + { + return Task.FromResult<object>(null); + } + } + + /// <summary> + /// Interarrival timer that generates Poisson process load. + /// </summary> + public class PoissonInterarrivalTimer : IInterarrivalTimer + { + readonly ExponentialDistribution exponentialDistribution; + DateTime? lastEventTime; + + public PoissonInterarrivalTimer(double offeredLoad) + { + this.exponentialDistribution = new ExponentialDistribution(new Random(), offeredLoad); + this.lastEventTime = DateTime.UtcNow; + } + + public void WaitForNext() + { + var waitDuration = GetNextWaitDuration(); + int millisTimeout = (int) Math.Round(waitDuration.TotalMilliseconds); + if (millisTimeout > 0) + { + // TODO(jtattermusch): probably only works well for a relatively low interarrival rate + Thread.Sleep(millisTimeout); + } + } + + public async Task WaitForNextAsync() + { + var waitDuration = GetNextWaitDuration(); + int millisTimeout = (int) Math.Round(waitDuration.TotalMilliseconds); + if (millisTimeout > 0) + { + // TODO(jtattermusch): probably only works well for a relatively low interarrival rate + await Task.Delay(millisTimeout); + } + } + + private TimeSpan GetNextWaitDuration() + { + if (!lastEventTime.HasValue) + { + this.lastEventTime = DateTime.Now; + } + + var origLastEventTime = this.lastEventTime.Value; + this.lastEventTime = origLastEventTime + TimeSpan.FromSeconds(exponentialDistribution.Next()); + return this.lastEventTime.Value - origLastEventTime; + } + + /// <summary> + /// Exp generator. + /// </summary> + private class ExponentialDistribution + { + readonly Random random; + readonly double lambda; + readonly double lambdaReciprocal; + + public ExponentialDistribution(Random random, double lambda) + { + this.random = random; + this.lambda = lambda; + this.lambdaReciprocal = 1.0 / lambda; + } + + public double Next() + { + double uniform = random.NextDouble(); + // Use 1.0-uni above to avoid NaN if uni is 0 + return lambdaReciprocal * (-Math.Log(1.0 - uniform)); + } + } + } +} diff --git a/src/csharp/Grpc.IntegrationTesting/InteropClient.cs b/src/csharp/Grpc.IntegrationTesting/InteropClient.cs index b0e33e49f7..7ca5221936 100644 --- a/src/csharp/Grpc.IntegrationTesting/InteropClient.cs +++ b/src/csharp/Grpc.IntegrationTesting/InteropClient.cs @@ -1,6 +1,6 @@ #region Copyright notice and license -// Copyright 2015, Google Inc. +// Copyright 2015-2016, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -217,7 +217,7 @@ namespace Grpc.IntegrationTesting } } - public static void RunEmptyUnary(TestService.ITestServiceClient client) + public static void RunEmptyUnary(TestService.TestServiceClient client) { Console.WriteLine("running empty_unary"); var response = client.EmptyCall(new Empty()); @@ -225,7 +225,7 @@ namespace Grpc.IntegrationTesting Console.WriteLine("Passed!"); } - public static void RunLargeUnary(TestService.ITestServiceClient client) + public static void RunLargeUnary(TestService.TestServiceClient client) { Console.WriteLine("running large_unary"); var request = new SimpleRequest @@ -241,7 +241,7 @@ namespace Grpc.IntegrationTesting Console.WriteLine("Passed!"); } - public static async Task RunClientStreamingAsync(TestService.ITestServiceClient client) + public static async Task RunClientStreamingAsync(TestService.TestServiceClient client) { Console.WriteLine("running client_streaming"); @@ -257,7 +257,7 @@ namespace Grpc.IntegrationTesting Console.WriteLine("Passed!"); } - public static async Task RunServerStreamingAsync(TestService.ITestServiceClient client) + public static async Task RunServerStreamingAsync(TestService.TestServiceClient client) { Console.WriteLine("running server_streaming"); @@ -281,7 +281,7 @@ namespace Grpc.IntegrationTesting Console.WriteLine("Passed!"); } - public static async Task RunPingPongAsync(TestService.ITestServiceClient client) + public static async Task RunPingPongAsync(TestService.TestServiceClient client) { Console.WriteLine("running ping_pong"); @@ -338,7 +338,7 @@ namespace Grpc.IntegrationTesting Console.WriteLine("Passed!"); } - public static async Task RunEmptyStreamAsync(TestService.ITestServiceClient client) + public static async Task RunEmptyStreamAsync(TestService.TestServiceClient client) { Console.WriteLine("running empty_stream"); using (var call = client.FullDuplexCall()) @@ -434,7 +434,7 @@ namespace Grpc.IntegrationTesting Console.WriteLine("Passed!"); } - public static async Task RunCancelAfterBeginAsync(TestService.ITestServiceClient client) + public static async Task RunCancelAfterBeginAsync(TestService.TestServiceClient client) { Console.WriteLine("running cancel_after_begin"); @@ -451,7 +451,7 @@ namespace Grpc.IntegrationTesting Console.WriteLine("Passed!"); } - public static async Task RunCancelAfterFirstResponseAsync(TestService.ITestServiceClient client) + public static async Task RunCancelAfterFirstResponseAsync(TestService.TestServiceClient client) { Console.WriteLine("running cancel_after_first_response"); @@ -477,7 +477,7 @@ namespace Grpc.IntegrationTesting Console.WriteLine("Passed!"); } - public static async Task RunTimeoutOnSleepingServerAsync(TestService.ITestServiceClient client) + public static async Task RunTimeoutOnSleepingServerAsync(TestService.TestServiceClient client) { Console.WriteLine("running timeout_on_sleeping_server"); @@ -499,7 +499,7 @@ namespace Grpc.IntegrationTesting Console.WriteLine("Passed!"); } - public static async Task RunCustomMetadataAsync(TestService.ITestServiceClient client) + public static async Task RunCustomMetadataAsync(TestService.TestServiceClient client) { Console.WriteLine("running custom_metadata"); { @@ -546,7 +546,7 @@ namespace Grpc.IntegrationTesting Console.WriteLine("Passed!"); } - public static async Task RunStatusCodeAndMessageAsync(TestService.ITestServiceClient client) + public static async Task RunStatusCodeAndMessageAsync(TestService.TestServiceClient client) { Console.WriteLine("running status_code_and_message"); var echoStatus = new EchoStatus @@ -580,7 +580,7 @@ namespace Grpc.IntegrationTesting Console.WriteLine("Passed!"); } - public static void RunUnimplementedMethod(UnimplementedService.IUnimplementedServiceClient client) + public static void RunUnimplementedMethod(UnimplementedService.UnimplementedServiceClient client) { Console.WriteLine("running unimplemented_method"); var e = Assert.Throws<RpcException>(() => client.UnimplementedCall(new Empty())); diff --git a/src/csharp/Grpc.IntegrationTesting/InteropClientServerTest.cs b/src/csharp/Grpc.IntegrationTesting/InteropClientServerTest.cs index 5facb87971..4ee1ff5ec8 100644 --- a/src/csharp/Grpc.IntegrationTesting/InteropClientServerTest.cs +++ b/src/csharp/Grpc.IntegrationTesting/InteropClientServerTest.cs @@ -51,7 +51,7 @@ namespace Grpc.IntegrationTesting const string Host = "localhost"; Server server; Channel channel; - TestService.ITestServiceClient client; + TestService.TestServiceClient client; [TestFixtureSetUp] public void Init() diff --git a/src/csharp/Grpc.IntegrationTesting/MetadataCredentialsTest.cs b/src/csharp/Grpc.IntegrationTesting/MetadataCredentialsTest.cs index 1c8bfed1f6..f95af5008f 100644 --- a/src/csharp/Grpc.IntegrationTesting/MetadataCredentialsTest.cs +++ b/src/csharp/Grpc.IntegrationTesting/MetadataCredentialsTest.cs @@ -1,6 +1,6 @@ #region Copyright notice and license -// Copyright 2015, Google Inc. +// Copyright 2015-2016, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -50,15 +50,15 @@ namespace Grpc.IntegrationTesting const string Host = "localhost"; Server server; Channel channel; - TestService.ITestServiceClient client; + TestService.TestServiceClient client; List<ChannelOption> options; - Mock<TestService.ITestService> serviceMock; + Mock<TestService.TestServiceBase> serviceMock; AsyncAuthInterceptor asyncAuthInterceptor; [SetUp] public void Init() { - serviceMock = new Mock<TestService.ITestService>(); + serviceMock = new Mock<TestService.TestServiceBase>(); serviceMock.Setup(m => m.UnaryCall(It.IsAny<SimpleRequest>(), It.IsAny<ServerCallContext>())) .Returns(new Func<SimpleRequest, ServerCallContext, Task<SimpleResponse>>(UnaryCallHandler)); diff --git a/src/csharp/Grpc.IntegrationTesting/ServicesGrpc.cs b/src/csharp/Grpc.IntegrationTesting/ServicesGrpc.cs index 996439afbf..46b16cf202 100644 --- a/src/csharp/Grpc.IntegrationTesting/ServicesGrpc.cs +++ b/src/csharp/Grpc.IntegrationTesting/ServicesGrpc.cs @@ -36,6 +36,7 @@ namespace Grpc.Testing { } // client interface + [System.Obsolete("Client side interfaced will be removed in the next release. Use client class directly.")] public interface IBenchmarkServiceClient { global::Grpc.Testing.SimpleResponse UnaryCall(global::Grpc.Testing.SimpleRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)); @@ -47,47 +48,73 @@ namespace Grpc.Testing { } // server-side interface + [System.Obsolete("Service implementations should inherit from the generated abstract base class instead.")] public interface IBenchmarkService { Task<global::Grpc.Testing.SimpleResponse> UnaryCall(global::Grpc.Testing.SimpleRequest request, ServerCallContext context); Task StreamingCall(IAsyncStreamReader<global::Grpc.Testing.SimpleRequest> requestStream, IServerStreamWriter<global::Grpc.Testing.SimpleResponse> responseStream, ServerCallContext context); } + // server-side abstract class + public abstract class BenchmarkServiceBase + { + public virtual Task<global::Grpc.Testing.SimpleResponse> UnaryCall(global::Grpc.Testing.SimpleRequest request, ServerCallContext context) + { + throw new RpcException(new Status(StatusCode.Unimplemented, "")); + } + + public virtual Task StreamingCall(IAsyncStreamReader<global::Grpc.Testing.SimpleRequest> requestStream, IServerStreamWriter<global::Grpc.Testing.SimpleResponse> responseStream, ServerCallContext context) + { + throw new RpcException(new Status(StatusCode.Unimplemented, "")); + } + + } + // client stub - public class BenchmarkServiceClient : ClientBase, IBenchmarkServiceClient + public class BenchmarkServiceClient : ClientBase<BenchmarkServiceClient>, IBenchmarkServiceClient { public BenchmarkServiceClient(Channel channel) : base(channel) { } - public global::Grpc.Testing.SimpleResponse UnaryCall(global::Grpc.Testing.SimpleRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public BenchmarkServiceClient(CallInvoker callInvoker) : base(callInvoker) + { + } + ///<summary>Protected parameterless constructor to allow creation of test doubles.</summary> + protected BenchmarkServiceClient() : base() { - var call = CreateCall(__Method_UnaryCall, new CallOptions(headers, deadline, cancellationToken)); - return Calls.BlockingUnaryCall(call, request); } - public global::Grpc.Testing.SimpleResponse UnaryCall(global::Grpc.Testing.SimpleRequest request, CallOptions options) + ///<summary>Protected constructor to allow creation of configured clients.</summary> + protected BenchmarkServiceClient(ClientBaseConfiguration configuration) : base(configuration) { - var call = CreateCall(__Method_UnaryCall, options); - return Calls.BlockingUnaryCall(call, request); } - public AsyncUnaryCall<global::Grpc.Testing.SimpleResponse> UnaryCallAsync(global::Grpc.Testing.SimpleRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + + public virtual global::Grpc.Testing.SimpleResponse UnaryCall(global::Grpc.Testing.SimpleRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_UnaryCall, new CallOptions(headers, deadline, cancellationToken)); - return Calls.AsyncUnaryCall(call, request); + return UnaryCall(request, new CallOptions(headers, deadline, cancellationToken)); } - public AsyncUnaryCall<global::Grpc.Testing.SimpleResponse> UnaryCallAsync(global::Grpc.Testing.SimpleRequest request, CallOptions options) + public virtual global::Grpc.Testing.SimpleResponse UnaryCall(global::Grpc.Testing.SimpleRequest request, CallOptions options) { - var call = CreateCall(__Method_UnaryCall, options); - return Calls.AsyncUnaryCall(call, request); + return CallInvoker.BlockingUnaryCall(__Method_UnaryCall, null, options, request); } - public AsyncDuplexStreamingCall<global::Grpc.Testing.SimpleRequest, global::Grpc.Testing.SimpleResponse> StreamingCall(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual AsyncUnaryCall<global::Grpc.Testing.SimpleResponse> UnaryCallAsync(global::Grpc.Testing.SimpleRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_StreamingCall, new CallOptions(headers, deadline, cancellationToken)); - return Calls.AsyncDuplexStreamingCall(call); + return UnaryCallAsync(request, new CallOptions(headers, deadline, cancellationToken)); } - public AsyncDuplexStreamingCall<global::Grpc.Testing.SimpleRequest, global::Grpc.Testing.SimpleResponse> StreamingCall(CallOptions options) + public virtual AsyncUnaryCall<global::Grpc.Testing.SimpleResponse> UnaryCallAsync(global::Grpc.Testing.SimpleRequest request, CallOptions options) { - var call = CreateCall(__Method_StreamingCall, options); - return Calls.AsyncDuplexStreamingCall(call); + return CallInvoker.AsyncUnaryCall(__Method_UnaryCall, null, options, request); + } + public virtual AsyncDuplexStreamingCall<global::Grpc.Testing.SimpleRequest, global::Grpc.Testing.SimpleResponse> StreamingCall(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + { + return StreamingCall(new CallOptions(headers, deadline, cancellationToken)); + } + public virtual AsyncDuplexStreamingCall<global::Grpc.Testing.SimpleRequest, global::Grpc.Testing.SimpleResponse> StreamingCall(CallOptions options) + { + return CallInvoker.AsyncDuplexStreamingCall(__Method_StreamingCall, null, options); + } + protected override BenchmarkServiceClient NewInstance(ClientBaseConfiguration configuration) + { + return new BenchmarkServiceClient(configuration); } } @@ -99,6 +126,14 @@ namespace Grpc.Testing { .AddMethod(__Method_StreamingCall, serviceImpl.StreamingCall).Build(); } + // creates service definition that can be registered with a server + public static ServerServiceDefinition BindService(BenchmarkServiceBase serviceImpl) + { + return ServerServiceDefinition.CreateBuilder(__ServiceName) + .AddMethod(__Method_UnaryCall, serviceImpl.UnaryCall) + .AddMethod(__Method_StreamingCall, serviceImpl.StreamingCall).Build(); + } + // creates a new client public static BenchmarkServiceClient NewClient(Channel channel) { @@ -153,6 +188,7 @@ namespace Grpc.Testing { } // client interface + [System.Obsolete("Client side interfaced will be removed in the next release. Use client class directly.")] public interface IWorkerServiceClient { AsyncDuplexStreamingCall<global::Grpc.Testing.ServerArgs, global::Grpc.Testing.ServerStatus> RunServer(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)); @@ -170,6 +206,7 @@ namespace Grpc.Testing { } // server-side interface + [System.Obsolete("Service implementations should inherit from the generated abstract base class instead.")] public interface IWorkerService { Task RunServer(IAsyncStreamReader<global::Grpc.Testing.ServerArgs> requestStream, IServerStreamWriter<global::Grpc.Testing.ServerStatus> responseStream, ServerCallContext context); @@ -178,71 +215,100 @@ namespace Grpc.Testing { Task<global::Grpc.Testing.Void> QuitWorker(global::Grpc.Testing.Void request, ServerCallContext context); } + // server-side abstract class + public abstract class WorkerServiceBase + { + public virtual Task RunServer(IAsyncStreamReader<global::Grpc.Testing.ServerArgs> requestStream, IServerStreamWriter<global::Grpc.Testing.ServerStatus> responseStream, ServerCallContext context) + { + throw new RpcException(new Status(StatusCode.Unimplemented, "")); + } + + public virtual Task RunClient(IAsyncStreamReader<global::Grpc.Testing.ClientArgs> requestStream, IServerStreamWriter<global::Grpc.Testing.ClientStatus> responseStream, ServerCallContext context) + { + throw new RpcException(new Status(StatusCode.Unimplemented, "")); + } + + public virtual Task<global::Grpc.Testing.CoreResponse> CoreCount(global::Grpc.Testing.CoreRequest request, ServerCallContext context) + { + throw new RpcException(new Status(StatusCode.Unimplemented, "")); + } + + public virtual Task<global::Grpc.Testing.Void> QuitWorker(global::Grpc.Testing.Void request, ServerCallContext context) + { + throw new RpcException(new Status(StatusCode.Unimplemented, "")); + } + + } + // client stub - public class WorkerServiceClient : ClientBase, IWorkerServiceClient + public class WorkerServiceClient : ClientBase<WorkerServiceClient>, IWorkerServiceClient { public WorkerServiceClient(Channel channel) : base(channel) { } - public AsyncDuplexStreamingCall<global::Grpc.Testing.ServerArgs, global::Grpc.Testing.ServerStatus> RunServer(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public WorkerServiceClient(CallInvoker callInvoker) : base(callInvoker) { - var call = CreateCall(__Method_RunServer, new CallOptions(headers, deadline, cancellationToken)); - return Calls.AsyncDuplexStreamingCall(call); } - public AsyncDuplexStreamingCall<global::Grpc.Testing.ServerArgs, global::Grpc.Testing.ServerStatus> RunServer(CallOptions options) + ///<summary>Protected parameterless constructor to allow creation of test doubles.</summary> + protected WorkerServiceClient() : base() { - var call = CreateCall(__Method_RunServer, options); - return Calls.AsyncDuplexStreamingCall(call); } - public AsyncDuplexStreamingCall<global::Grpc.Testing.ClientArgs, global::Grpc.Testing.ClientStatus> RunClient(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + ///<summary>Protected constructor to allow creation of configured clients.</summary> + protected WorkerServiceClient(ClientBaseConfiguration configuration) : base(configuration) { - var call = CreateCall(__Method_RunClient, new CallOptions(headers, deadline, cancellationToken)); - return Calls.AsyncDuplexStreamingCall(call); } - public AsyncDuplexStreamingCall<global::Grpc.Testing.ClientArgs, global::Grpc.Testing.ClientStatus> RunClient(CallOptions options) + + public virtual AsyncDuplexStreamingCall<global::Grpc.Testing.ServerArgs, global::Grpc.Testing.ServerStatus> RunServer(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_RunClient, options); - return Calls.AsyncDuplexStreamingCall(call); + return RunServer(new CallOptions(headers, deadline, cancellationToken)); } - public global::Grpc.Testing.CoreResponse CoreCount(global::Grpc.Testing.CoreRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual AsyncDuplexStreamingCall<global::Grpc.Testing.ServerArgs, global::Grpc.Testing.ServerStatus> RunServer(CallOptions options) { - var call = CreateCall(__Method_CoreCount, new CallOptions(headers, deadline, cancellationToken)); - return Calls.BlockingUnaryCall(call, request); + return CallInvoker.AsyncDuplexStreamingCall(__Method_RunServer, null, options); } - public global::Grpc.Testing.CoreResponse CoreCount(global::Grpc.Testing.CoreRequest request, CallOptions options) + public virtual AsyncDuplexStreamingCall<global::Grpc.Testing.ClientArgs, global::Grpc.Testing.ClientStatus> RunClient(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_CoreCount, options); - return Calls.BlockingUnaryCall(call, request); + return RunClient(new CallOptions(headers, deadline, cancellationToken)); } - public AsyncUnaryCall<global::Grpc.Testing.CoreResponse> CoreCountAsync(global::Grpc.Testing.CoreRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual AsyncDuplexStreamingCall<global::Grpc.Testing.ClientArgs, global::Grpc.Testing.ClientStatus> RunClient(CallOptions options) { - var call = CreateCall(__Method_CoreCount, new CallOptions(headers, deadline, cancellationToken)); - return Calls.AsyncUnaryCall(call, request); + return CallInvoker.AsyncDuplexStreamingCall(__Method_RunClient, null, options); } - public AsyncUnaryCall<global::Grpc.Testing.CoreResponse> CoreCountAsync(global::Grpc.Testing.CoreRequest request, CallOptions options) + public virtual global::Grpc.Testing.CoreResponse CoreCount(global::Grpc.Testing.CoreRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_CoreCount, options); - return Calls.AsyncUnaryCall(call, request); + return CoreCount(request, new CallOptions(headers, deadline, cancellationToken)); } - public global::Grpc.Testing.Void QuitWorker(global::Grpc.Testing.Void request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual global::Grpc.Testing.CoreResponse CoreCount(global::Grpc.Testing.CoreRequest request, CallOptions options) { - var call = CreateCall(__Method_QuitWorker, new CallOptions(headers, deadline, cancellationToken)); - return Calls.BlockingUnaryCall(call, request); + return CallInvoker.BlockingUnaryCall(__Method_CoreCount, null, options, request); } - public global::Grpc.Testing.Void QuitWorker(global::Grpc.Testing.Void request, CallOptions options) + public virtual AsyncUnaryCall<global::Grpc.Testing.CoreResponse> CoreCountAsync(global::Grpc.Testing.CoreRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_QuitWorker, options); - return Calls.BlockingUnaryCall(call, request); + return CoreCountAsync(request, new CallOptions(headers, deadline, cancellationToken)); } - public AsyncUnaryCall<global::Grpc.Testing.Void> QuitWorkerAsync(global::Grpc.Testing.Void request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual AsyncUnaryCall<global::Grpc.Testing.CoreResponse> CoreCountAsync(global::Grpc.Testing.CoreRequest request, CallOptions options) { - var call = CreateCall(__Method_QuitWorker, new CallOptions(headers, deadline, cancellationToken)); - return Calls.AsyncUnaryCall(call, request); + return CallInvoker.AsyncUnaryCall(__Method_CoreCount, null, options, request); } - public AsyncUnaryCall<global::Grpc.Testing.Void> QuitWorkerAsync(global::Grpc.Testing.Void request, CallOptions options) + public virtual global::Grpc.Testing.Void QuitWorker(global::Grpc.Testing.Void request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_QuitWorker, options); - return Calls.AsyncUnaryCall(call, request); + return QuitWorker(request, new CallOptions(headers, deadline, cancellationToken)); + } + public virtual global::Grpc.Testing.Void QuitWorker(global::Grpc.Testing.Void request, CallOptions options) + { + return CallInvoker.BlockingUnaryCall(__Method_QuitWorker, null, options, request); + } + public virtual AsyncUnaryCall<global::Grpc.Testing.Void> QuitWorkerAsync(global::Grpc.Testing.Void request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + { + return QuitWorkerAsync(request, new CallOptions(headers, deadline, cancellationToken)); + } + public virtual AsyncUnaryCall<global::Grpc.Testing.Void> QuitWorkerAsync(global::Grpc.Testing.Void request, CallOptions options) + { + return CallInvoker.AsyncUnaryCall(__Method_QuitWorker, null, options, request); + } + protected override WorkerServiceClient NewInstance(ClientBaseConfiguration configuration) + { + return new WorkerServiceClient(configuration); } } @@ -256,6 +322,16 @@ namespace Grpc.Testing { .AddMethod(__Method_QuitWorker, serviceImpl.QuitWorker).Build(); } + // creates service definition that can be registered with a server + public static ServerServiceDefinition BindService(WorkerServiceBase serviceImpl) + { + return ServerServiceDefinition.CreateBuilder(__ServiceName) + .AddMethod(__Method_RunServer, serviceImpl.RunServer) + .AddMethod(__Method_RunClient, serviceImpl.RunClient) + .AddMethod(__Method_CoreCount, serviceImpl.CoreCount) + .AddMethod(__Method_QuitWorker, serviceImpl.QuitWorker).Build(); + } + // creates a new client public static WorkerServiceClient NewClient(Channel channel) { diff --git a/src/csharp/Grpc.IntegrationTesting/SslCredentialsTest.cs b/src/csharp/Grpc.IntegrationTesting/SslCredentialsTest.cs index 37b2518c21..3df45b5f70 100644 --- a/src/csharp/Grpc.IntegrationTesting/SslCredentialsTest.cs +++ b/src/csharp/Grpc.IntegrationTesting/SslCredentialsTest.cs @@ -1,6 +1,6 @@ #region Copyright notice and license -// Copyright 2015, Google Inc. +// Copyright 2015-2016, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -53,7 +53,7 @@ namespace Grpc.IntegrationTesting const string Host = "localhost"; Server server; Channel channel; - TestService.ITestServiceClient client; + TestService.TestServiceClient client; [TestFixtureSetUp] public void Init() diff --git a/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs b/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs index 2c469080d9..b84ec2d984 100644 --- a/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs +++ b/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs @@ -69,6 +69,7 @@ namespace Grpc.Testing { } // client interface + [System.Obsolete("Client side interfaced will be removed in the next release. Use client class directly.")] public interface ITestServiceClient { global::Grpc.Testing.Empty EmptyCall(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)); @@ -90,6 +91,7 @@ namespace Grpc.Testing { } // server-side interface + [System.Obsolete("Service implementations should inherit from the generated abstract base class instead.")] public interface ITestService { Task<global::Grpc.Testing.Empty> EmptyCall(global::Grpc.Testing.Empty request, ServerCallContext context); @@ -100,91 +102,126 @@ namespace Grpc.Testing { Task HalfDuplexCall(IAsyncStreamReader<global::Grpc.Testing.StreamingOutputCallRequest> requestStream, IServerStreamWriter<global::Grpc.Testing.StreamingOutputCallResponse> responseStream, ServerCallContext context); } + // server-side abstract class + public abstract class TestServiceBase + { + public virtual Task<global::Grpc.Testing.Empty> EmptyCall(global::Grpc.Testing.Empty request, ServerCallContext context) + { + throw new RpcException(new Status(StatusCode.Unimplemented, "")); + } + + public virtual Task<global::Grpc.Testing.SimpleResponse> UnaryCall(global::Grpc.Testing.SimpleRequest request, ServerCallContext context) + { + throw new RpcException(new Status(StatusCode.Unimplemented, "")); + } + + public virtual Task StreamingOutputCall(global::Grpc.Testing.StreamingOutputCallRequest request, IServerStreamWriter<global::Grpc.Testing.StreamingOutputCallResponse> responseStream, ServerCallContext context) + { + throw new RpcException(new Status(StatusCode.Unimplemented, "")); + } + + public virtual Task<global::Grpc.Testing.StreamingInputCallResponse> StreamingInputCall(IAsyncStreamReader<global::Grpc.Testing.StreamingInputCallRequest> requestStream, ServerCallContext context) + { + throw new RpcException(new Status(StatusCode.Unimplemented, "")); + } + + public virtual Task FullDuplexCall(IAsyncStreamReader<global::Grpc.Testing.StreamingOutputCallRequest> requestStream, IServerStreamWriter<global::Grpc.Testing.StreamingOutputCallResponse> responseStream, ServerCallContext context) + { + throw new RpcException(new Status(StatusCode.Unimplemented, "")); + } + + public virtual Task HalfDuplexCall(IAsyncStreamReader<global::Grpc.Testing.StreamingOutputCallRequest> requestStream, IServerStreamWriter<global::Grpc.Testing.StreamingOutputCallResponse> responseStream, ServerCallContext context) + { + throw new RpcException(new Status(StatusCode.Unimplemented, "")); + } + + } + // client stub - public class TestServiceClient : ClientBase, ITestServiceClient + public class TestServiceClient : ClientBase<TestServiceClient>, ITestServiceClient { public TestServiceClient(Channel channel) : base(channel) { } - public global::Grpc.Testing.Empty EmptyCall(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public TestServiceClient(CallInvoker callInvoker) : base(callInvoker) + { + } + ///<summary>Protected parameterless constructor to allow creation of test doubles.</summary> + protected TestServiceClient() : base() + { + } + ///<summary>Protected constructor to allow creation of configured clients.</summary> + protected TestServiceClient(ClientBaseConfiguration configuration) : base(configuration) + { + } + + public virtual global::Grpc.Testing.Empty EmptyCall(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_EmptyCall, new CallOptions(headers, deadline, cancellationToken)); - return Calls.BlockingUnaryCall(call, request); + return EmptyCall(request, new CallOptions(headers, deadline, cancellationToken)); } - public global::Grpc.Testing.Empty EmptyCall(global::Grpc.Testing.Empty request, CallOptions options) + public virtual global::Grpc.Testing.Empty EmptyCall(global::Grpc.Testing.Empty request, CallOptions options) { - var call = CreateCall(__Method_EmptyCall, options); - return Calls.BlockingUnaryCall(call, request); + return CallInvoker.BlockingUnaryCall(__Method_EmptyCall, null, options, request); } - public AsyncUnaryCall<global::Grpc.Testing.Empty> EmptyCallAsync(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual AsyncUnaryCall<global::Grpc.Testing.Empty> EmptyCallAsync(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_EmptyCall, new CallOptions(headers, deadline, cancellationToken)); - return Calls.AsyncUnaryCall(call, request); + return EmptyCallAsync(request, new CallOptions(headers, deadline, cancellationToken)); } - public AsyncUnaryCall<global::Grpc.Testing.Empty> EmptyCallAsync(global::Grpc.Testing.Empty request, CallOptions options) + public virtual AsyncUnaryCall<global::Grpc.Testing.Empty> EmptyCallAsync(global::Grpc.Testing.Empty request, CallOptions options) { - var call = CreateCall(__Method_EmptyCall, options); - return Calls.AsyncUnaryCall(call, request); + return CallInvoker.AsyncUnaryCall(__Method_EmptyCall, null, options, request); } - public global::Grpc.Testing.SimpleResponse UnaryCall(global::Grpc.Testing.SimpleRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual global::Grpc.Testing.SimpleResponse UnaryCall(global::Grpc.Testing.SimpleRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_UnaryCall, new CallOptions(headers, deadline, cancellationToken)); - return Calls.BlockingUnaryCall(call, request); + return UnaryCall(request, new CallOptions(headers, deadline, cancellationToken)); } - public global::Grpc.Testing.SimpleResponse UnaryCall(global::Grpc.Testing.SimpleRequest request, CallOptions options) + public virtual global::Grpc.Testing.SimpleResponse UnaryCall(global::Grpc.Testing.SimpleRequest request, CallOptions options) { - var call = CreateCall(__Method_UnaryCall, options); - return Calls.BlockingUnaryCall(call, request); + return CallInvoker.BlockingUnaryCall(__Method_UnaryCall, null, options, request); } - public AsyncUnaryCall<global::Grpc.Testing.SimpleResponse> UnaryCallAsync(global::Grpc.Testing.SimpleRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual AsyncUnaryCall<global::Grpc.Testing.SimpleResponse> UnaryCallAsync(global::Grpc.Testing.SimpleRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_UnaryCall, new CallOptions(headers, deadline, cancellationToken)); - return Calls.AsyncUnaryCall(call, request); + return UnaryCallAsync(request, new CallOptions(headers, deadline, cancellationToken)); } - public AsyncUnaryCall<global::Grpc.Testing.SimpleResponse> UnaryCallAsync(global::Grpc.Testing.SimpleRequest request, CallOptions options) + public virtual AsyncUnaryCall<global::Grpc.Testing.SimpleResponse> UnaryCallAsync(global::Grpc.Testing.SimpleRequest request, CallOptions options) { - var call = CreateCall(__Method_UnaryCall, options); - return Calls.AsyncUnaryCall(call, request); + return CallInvoker.AsyncUnaryCall(__Method_UnaryCall, null, options, request); } - public AsyncServerStreamingCall<global::Grpc.Testing.StreamingOutputCallResponse> StreamingOutputCall(global::Grpc.Testing.StreamingOutputCallRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual AsyncServerStreamingCall<global::Grpc.Testing.StreamingOutputCallResponse> StreamingOutputCall(global::Grpc.Testing.StreamingOutputCallRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_StreamingOutputCall, new CallOptions(headers, deadline, cancellationToken)); - return Calls.AsyncServerStreamingCall(call, request); + return StreamingOutputCall(request, new CallOptions(headers, deadline, cancellationToken)); } - public AsyncServerStreamingCall<global::Grpc.Testing.StreamingOutputCallResponse> StreamingOutputCall(global::Grpc.Testing.StreamingOutputCallRequest request, CallOptions options) + public virtual AsyncServerStreamingCall<global::Grpc.Testing.StreamingOutputCallResponse> StreamingOutputCall(global::Grpc.Testing.StreamingOutputCallRequest request, CallOptions options) { - var call = CreateCall(__Method_StreamingOutputCall, options); - return Calls.AsyncServerStreamingCall(call, request); + return CallInvoker.AsyncServerStreamingCall(__Method_StreamingOutputCall, null, options, request); } - public AsyncClientStreamingCall<global::Grpc.Testing.StreamingInputCallRequest, global::Grpc.Testing.StreamingInputCallResponse> StreamingInputCall(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual AsyncClientStreamingCall<global::Grpc.Testing.StreamingInputCallRequest, global::Grpc.Testing.StreamingInputCallResponse> StreamingInputCall(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_StreamingInputCall, new CallOptions(headers, deadline, cancellationToken)); - return Calls.AsyncClientStreamingCall(call); + return StreamingInputCall(new CallOptions(headers, deadline, cancellationToken)); } - public AsyncClientStreamingCall<global::Grpc.Testing.StreamingInputCallRequest, global::Grpc.Testing.StreamingInputCallResponse> StreamingInputCall(CallOptions options) + public virtual AsyncClientStreamingCall<global::Grpc.Testing.StreamingInputCallRequest, global::Grpc.Testing.StreamingInputCallResponse> StreamingInputCall(CallOptions options) { - var call = CreateCall(__Method_StreamingInputCall, options); - return Calls.AsyncClientStreamingCall(call); + return CallInvoker.AsyncClientStreamingCall(__Method_StreamingInputCall, null, options); } - public AsyncDuplexStreamingCall<global::Grpc.Testing.StreamingOutputCallRequest, global::Grpc.Testing.StreamingOutputCallResponse> FullDuplexCall(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual AsyncDuplexStreamingCall<global::Grpc.Testing.StreamingOutputCallRequest, global::Grpc.Testing.StreamingOutputCallResponse> FullDuplexCall(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_FullDuplexCall, new CallOptions(headers, deadline, cancellationToken)); - return Calls.AsyncDuplexStreamingCall(call); + return FullDuplexCall(new CallOptions(headers, deadline, cancellationToken)); } - public AsyncDuplexStreamingCall<global::Grpc.Testing.StreamingOutputCallRequest, global::Grpc.Testing.StreamingOutputCallResponse> FullDuplexCall(CallOptions options) + public virtual AsyncDuplexStreamingCall<global::Grpc.Testing.StreamingOutputCallRequest, global::Grpc.Testing.StreamingOutputCallResponse> FullDuplexCall(CallOptions options) { - var call = CreateCall(__Method_FullDuplexCall, options); - return Calls.AsyncDuplexStreamingCall(call); + return CallInvoker.AsyncDuplexStreamingCall(__Method_FullDuplexCall, null, options); } - public AsyncDuplexStreamingCall<global::Grpc.Testing.StreamingOutputCallRequest, global::Grpc.Testing.StreamingOutputCallResponse> HalfDuplexCall(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual AsyncDuplexStreamingCall<global::Grpc.Testing.StreamingOutputCallRequest, global::Grpc.Testing.StreamingOutputCallResponse> HalfDuplexCall(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_HalfDuplexCall, new CallOptions(headers, deadline, cancellationToken)); - return Calls.AsyncDuplexStreamingCall(call); + return HalfDuplexCall(new CallOptions(headers, deadline, cancellationToken)); } - public AsyncDuplexStreamingCall<global::Grpc.Testing.StreamingOutputCallRequest, global::Grpc.Testing.StreamingOutputCallResponse> HalfDuplexCall(CallOptions options) + public virtual AsyncDuplexStreamingCall<global::Grpc.Testing.StreamingOutputCallRequest, global::Grpc.Testing.StreamingOutputCallResponse> HalfDuplexCall(CallOptions options) { - var call = CreateCall(__Method_HalfDuplexCall, options); - return Calls.AsyncDuplexStreamingCall(call); + return CallInvoker.AsyncDuplexStreamingCall(__Method_HalfDuplexCall, null, options); + } + protected override TestServiceClient NewInstance(ClientBaseConfiguration configuration) + { + return new TestServiceClient(configuration); } } @@ -200,6 +237,18 @@ namespace Grpc.Testing { .AddMethod(__Method_HalfDuplexCall, serviceImpl.HalfDuplexCall).Build(); } + // creates service definition that can be registered with a server + public static ServerServiceDefinition BindService(TestServiceBase serviceImpl) + { + return ServerServiceDefinition.CreateBuilder(__ServiceName) + .AddMethod(__Method_EmptyCall, serviceImpl.EmptyCall) + .AddMethod(__Method_UnaryCall, serviceImpl.UnaryCall) + .AddMethod(__Method_StreamingOutputCall, serviceImpl.StreamingOutputCall) + .AddMethod(__Method_StreamingInputCall, serviceImpl.StreamingInputCall) + .AddMethod(__Method_FullDuplexCall, serviceImpl.FullDuplexCall) + .AddMethod(__Method_HalfDuplexCall, serviceImpl.HalfDuplexCall).Build(); + } + // creates a new client public static TestServiceClient NewClient(Channel channel) { @@ -227,6 +276,7 @@ namespace Grpc.Testing { } // client interface + [System.Obsolete("Client side interfaced will be removed in the next release. Use client class directly.")] public interface IUnimplementedServiceClient { global::Grpc.Testing.Empty UnimplementedCall(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)); @@ -236,36 +286,59 @@ namespace Grpc.Testing { } // server-side interface + [System.Obsolete("Service implementations should inherit from the generated abstract base class instead.")] public interface IUnimplementedService { Task<global::Grpc.Testing.Empty> UnimplementedCall(global::Grpc.Testing.Empty request, ServerCallContext context); } + // server-side abstract class + public abstract class UnimplementedServiceBase + { + public virtual Task<global::Grpc.Testing.Empty> UnimplementedCall(global::Grpc.Testing.Empty request, ServerCallContext context) + { + throw new RpcException(new Status(StatusCode.Unimplemented, "")); + } + + } + // client stub - public class UnimplementedServiceClient : ClientBase, IUnimplementedServiceClient + public class UnimplementedServiceClient : ClientBase<UnimplementedServiceClient>, IUnimplementedServiceClient { public UnimplementedServiceClient(Channel channel) : base(channel) { } - public global::Grpc.Testing.Empty UnimplementedCall(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public UnimplementedServiceClient(CallInvoker callInvoker) : base(callInvoker) + { + } + ///<summary>Protected parameterless constructor to allow creation of test doubles.</summary> + protected UnimplementedServiceClient() : base() + { + } + ///<summary>Protected constructor to allow creation of configured clients.</summary> + protected UnimplementedServiceClient(ClientBaseConfiguration configuration) : base(configuration) + { + } + + public virtual global::Grpc.Testing.Empty UnimplementedCall(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + { + return UnimplementedCall(request, new CallOptions(headers, deadline, cancellationToken)); + } + public virtual global::Grpc.Testing.Empty UnimplementedCall(global::Grpc.Testing.Empty request, CallOptions options) { - var call = CreateCall(__Method_UnimplementedCall, new CallOptions(headers, deadline, cancellationToken)); - return Calls.BlockingUnaryCall(call, request); + return CallInvoker.BlockingUnaryCall(__Method_UnimplementedCall, null, options, request); } - public global::Grpc.Testing.Empty UnimplementedCall(global::Grpc.Testing.Empty request, CallOptions options) + public virtual AsyncUnaryCall<global::Grpc.Testing.Empty> UnimplementedCallAsync(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_UnimplementedCall, options); - return Calls.BlockingUnaryCall(call, request); + return UnimplementedCallAsync(request, new CallOptions(headers, deadline, cancellationToken)); } - public AsyncUnaryCall<global::Grpc.Testing.Empty> UnimplementedCallAsync(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual AsyncUnaryCall<global::Grpc.Testing.Empty> UnimplementedCallAsync(global::Grpc.Testing.Empty request, CallOptions options) { - var call = CreateCall(__Method_UnimplementedCall, new CallOptions(headers, deadline, cancellationToken)); - return Calls.AsyncUnaryCall(call, request); + return CallInvoker.AsyncUnaryCall(__Method_UnimplementedCall, null, options, request); } - public AsyncUnaryCall<global::Grpc.Testing.Empty> UnimplementedCallAsync(global::Grpc.Testing.Empty request, CallOptions options) + protected override UnimplementedServiceClient NewInstance(ClientBaseConfiguration configuration) { - var call = CreateCall(__Method_UnimplementedCall, options); - return Calls.AsyncUnaryCall(call, request); + return new UnimplementedServiceClient(configuration); } } @@ -276,6 +349,13 @@ namespace Grpc.Testing { .AddMethod(__Method_UnimplementedCall, serviceImpl.UnimplementedCall).Build(); } + // creates service definition that can be registered with a server + public static ServerServiceDefinition BindService(UnimplementedServiceBase serviceImpl) + { + return ServerServiceDefinition.CreateBuilder(__ServiceName) + .AddMethod(__Method_UnimplementedCall, serviceImpl.UnimplementedCall).Build(); + } + // creates a new client public static UnimplementedServiceClient NewClient(Channel channel) { @@ -311,6 +391,7 @@ namespace Grpc.Testing { } // client interface + [System.Obsolete("Client side interfaced will be removed in the next release. Use client class directly.")] public interface IReconnectServiceClient { global::Grpc.Testing.Empty Start(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)); @@ -324,57 +405,81 @@ namespace Grpc.Testing { } // server-side interface + [System.Obsolete("Service implementations should inherit from the generated abstract base class instead.")] public interface IReconnectService { Task<global::Grpc.Testing.Empty> Start(global::Grpc.Testing.Empty request, ServerCallContext context); Task<global::Grpc.Testing.ReconnectInfo> Stop(global::Grpc.Testing.Empty request, ServerCallContext context); } + // server-side abstract class + public abstract class ReconnectServiceBase + { + public virtual Task<global::Grpc.Testing.Empty> Start(global::Grpc.Testing.Empty request, ServerCallContext context) + { + throw new RpcException(new Status(StatusCode.Unimplemented, "")); + } + + public virtual Task<global::Grpc.Testing.ReconnectInfo> Stop(global::Grpc.Testing.Empty request, ServerCallContext context) + { + throw new RpcException(new Status(StatusCode.Unimplemented, "")); + } + + } + // client stub - public class ReconnectServiceClient : ClientBase, IReconnectServiceClient + public class ReconnectServiceClient : ClientBase<ReconnectServiceClient>, IReconnectServiceClient { public ReconnectServiceClient(Channel channel) : base(channel) { } - public global::Grpc.Testing.Empty Start(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public ReconnectServiceClient(CallInvoker callInvoker) : base(callInvoker) { - var call = CreateCall(__Method_Start, new CallOptions(headers, deadline, cancellationToken)); - return Calls.BlockingUnaryCall(call, request); } - public global::Grpc.Testing.Empty Start(global::Grpc.Testing.Empty request, CallOptions options) + ///<summary>Protected parameterless constructor to allow creation of test doubles.</summary> + protected ReconnectServiceClient() : base() { - var call = CreateCall(__Method_Start, options); - return Calls.BlockingUnaryCall(call, request); } - public AsyncUnaryCall<global::Grpc.Testing.Empty> StartAsync(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + ///<summary>Protected constructor to allow creation of configured clients.</summary> + protected ReconnectServiceClient(ClientBaseConfiguration configuration) : base(configuration) { - var call = CreateCall(__Method_Start, new CallOptions(headers, deadline, cancellationToken)); - return Calls.AsyncUnaryCall(call, request); } - public AsyncUnaryCall<global::Grpc.Testing.Empty> StartAsync(global::Grpc.Testing.Empty request, CallOptions options) + + public virtual global::Grpc.Testing.Empty Start(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_Start, options); - return Calls.AsyncUnaryCall(call, request); + return Start(request, new CallOptions(headers, deadline, cancellationToken)); } - public global::Grpc.Testing.ReconnectInfo Stop(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual global::Grpc.Testing.Empty Start(global::Grpc.Testing.Empty request, CallOptions options) { - var call = CreateCall(__Method_Stop, new CallOptions(headers, deadline, cancellationToken)); - return Calls.BlockingUnaryCall(call, request); + return CallInvoker.BlockingUnaryCall(__Method_Start, null, options, request); } - public global::Grpc.Testing.ReconnectInfo Stop(global::Grpc.Testing.Empty request, CallOptions options) + public virtual AsyncUnaryCall<global::Grpc.Testing.Empty> StartAsync(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_Stop, options); - return Calls.BlockingUnaryCall(call, request); + return StartAsync(request, new CallOptions(headers, deadline, cancellationToken)); } - public AsyncUnaryCall<global::Grpc.Testing.ReconnectInfo> StopAsync(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + public virtual AsyncUnaryCall<global::Grpc.Testing.Empty> StartAsync(global::Grpc.Testing.Empty request, CallOptions options) { - var call = CreateCall(__Method_Stop, new CallOptions(headers, deadline, cancellationToken)); - return Calls.AsyncUnaryCall(call, request); + return CallInvoker.AsyncUnaryCall(__Method_Start, null, options, request); } - public AsyncUnaryCall<global::Grpc.Testing.ReconnectInfo> StopAsync(global::Grpc.Testing.Empty request, CallOptions options) + public virtual global::Grpc.Testing.ReconnectInfo Stop(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) { - var call = CreateCall(__Method_Stop, options); - return Calls.AsyncUnaryCall(call, request); + return Stop(request, new CallOptions(headers, deadline, cancellationToken)); + } + public virtual global::Grpc.Testing.ReconnectInfo Stop(global::Grpc.Testing.Empty request, CallOptions options) + { + return CallInvoker.BlockingUnaryCall(__Method_Stop, null, options, request); + } + public virtual AsyncUnaryCall<global::Grpc.Testing.ReconnectInfo> StopAsync(global::Grpc.Testing.Empty request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken)) + { + return StopAsync(request, new CallOptions(headers, deadline, cancellationToken)); + } + public virtual AsyncUnaryCall<global::Grpc.Testing.ReconnectInfo> StopAsync(global::Grpc.Testing.Empty request, CallOptions options) + { + return CallInvoker.AsyncUnaryCall(__Method_Stop, null, options, request); + } + protected override ReconnectServiceClient NewInstance(ClientBaseConfiguration configuration) + { + return new ReconnectServiceClient(configuration); } } @@ -386,6 +491,14 @@ namespace Grpc.Testing { .AddMethod(__Method_Stop, serviceImpl.Stop).Build(); } + // creates service definition that can be registered with a server + public static ServerServiceDefinition BindService(ReconnectServiceBase serviceImpl) + { + return ServerServiceDefinition.CreateBuilder(__ServiceName) + .AddMethod(__Method_Start, serviceImpl.Start) + .AddMethod(__Method_Stop, serviceImpl.Stop).Build(); + } + // creates a new client public static ReconnectServiceClient NewClient(Channel channel) { diff --git a/src/csharp/Grpc.IntegrationTesting/TestServiceImpl.cs b/src/csharp/Grpc.IntegrationTesting/TestServiceImpl.cs index 5a1b4cf319..354318e80e 100644 --- a/src/csharp/Grpc.IntegrationTesting/TestServiceImpl.cs +++ b/src/csharp/Grpc.IntegrationTesting/TestServiceImpl.cs @@ -1,6 +1,6 @@ #region Copyright notice and license -// Copyright 2015, Google Inc. +// Copyright 2015-2016, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -45,14 +45,14 @@ namespace Grpc.Testing /// <summary> /// Implementation of TestService server /// </summary> - public class TestServiceImpl : TestService.ITestService + public class TestServiceImpl : TestService.TestServiceBase { - public Task<Empty> EmptyCall(Empty request, ServerCallContext context) + public override Task<Empty> EmptyCall(Empty request, ServerCallContext context) { return Task.FromResult(new Empty()); } - public async Task<SimpleResponse> UnaryCall(SimpleRequest request, ServerCallContext context) + public override async Task<SimpleResponse> UnaryCall(SimpleRequest request, ServerCallContext context) { await EnsureEchoMetadataAsync(context); EnsureEchoStatus(request.ResponseStatus, context); @@ -61,7 +61,7 @@ namespace Grpc.Testing return response; } - public async Task StreamingOutputCall(StreamingOutputCallRequest request, IServerStreamWriter<StreamingOutputCallResponse> responseStream, ServerCallContext context) + public override async Task StreamingOutputCall(StreamingOutputCallRequest request, IServerStreamWriter<StreamingOutputCallResponse> responseStream, ServerCallContext context) { await EnsureEchoMetadataAsync(context); EnsureEchoStatus(request.ResponseStatus, context); @@ -73,7 +73,7 @@ namespace Grpc.Testing } } - public async Task<StreamingInputCallResponse> StreamingInputCall(IAsyncStreamReader<StreamingInputCallRequest> requestStream, ServerCallContext context) + public override async Task<StreamingInputCallResponse> StreamingInputCall(IAsyncStreamReader<StreamingInputCallRequest> requestStream, ServerCallContext context) { await EnsureEchoMetadataAsync(context); @@ -85,7 +85,7 @@ namespace Grpc.Testing return new StreamingInputCallResponse { AggregatedPayloadSize = sum }; } - public async Task FullDuplexCall(IAsyncStreamReader<StreamingOutputCallRequest> requestStream, IServerStreamWriter<StreamingOutputCallResponse> responseStream, ServerCallContext context) + public override async Task FullDuplexCall(IAsyncStreamReader<StreamingOutputCallRequest> requestStream, IServerStreamWriter<StreamingOutputCallResponse> responseStream, ServerCallContext context) { await EnsureEchoMetadataAsync(context); @@ -100,7 +100,7 @@ namespace Grpc.Testing }); } - public async Task HalfDuplexCall(IAsyncStreamReader<StreamingOutputCallRequest> requestStream, IServerStreamWriter<StreamingOutputCallResponse> responseStream, ServerCallContext context) + public override async Task HalfDuplexCall(IAsyncStreamReader<StreamingOutputCallRequest> requestStream, IServerStreamWriter<StreamingOutputCallResponse> responseStream, ServerCallContext context) { throw new NotImplementedException(); } diff --git a/src/csharp/Grpc.IntegrationTesting/WorkerServiceImpl.cs b/src/csharp/Grpc.IntegrationTesting/WorkerServiceImpl.cs index e5ad0caa03..80dad9fdd9 100644 --- a/src/csharp/Grpc.IntegrationTesting/WorkerServiceImpl.cs +++ b/src/csharp/Grpc.IntegrationTesting/WorkerServiceImpl.cs @@ -45,7 +45,7 @@ namespace Grpc.Testing /// <summary> /// Implementation of WorkerService server /// </summary> - public class WorkerServiceImpl : WorkerService.IWorkerService + public class WorkerServiceImpl : WorkerService.WorkerServiceBase { readonly Action stopRequestHandler; @@ -54,7 +54,7 @@ namespace Grpc.Testing this.stopRequestHandler = GrpcPreconditions.CheckNotNull(stopRequestHandler); } - public async Task RunServer(IAsyncStreamReader<ServerArgs> requestStream, IServerStreamWriter<ServerStatus> responseStream, ServerCallContext context) + public override async Task RunServer(IAsyncStreamReader<ServerArgs> requestStream, IServerStreamWriter<ServerStatus> responseStream, ServerCallContext context) { GrpcPreconditions.CheckState(await requestStream.MoveNext()); var serverConfig = requestStream.Current.Setup; @@ -78,7 +78,7 @@ namespace Grpc.Testing await runner.StopAsync(); } - public async Task RunClient(IAsyncStreamReader<ClientArgs> requestStream, IServerStreamWriter<ClientStatus> responseStream, ServerCallContext context) + public override async Task RunClient(IAsyncStreamReader<ClientArgs> requestStream, IServerStreamWriter<ClientStatus> responseStream, ServerCallContext context) { GrpcPreconditions.CheckState(await requestStream.MoveNext()); var clientConfig = requestStream.Current.Setup; @@ -100,12 +100,12 @@ namespace Grpc.Testing await runner.StopAsync(); } - public Task<CoreResponse> CoreCount(CoreRequest request, ServerCallContext context) + public override Task<CoreResponse> CoreCount(CoreRequest request, ServerCallContext context) { return Task.FromResult(new CoreResponse { Cores = Environment.ProcessorCount }); } - public Task<Void> QuitWorker(Void request, ServerCallContext context) + public override Task<Void> QuitWorker(Void request, ServerCallContext context) { stopRequestHandler(); return Task.FromResult(new Void()); diff --git a/src/csharp/grpc.native.csharp/grpc.native.csharp.nuspec b/src/csharp/grpc.native.csharp/grpc.native.csharp.nuspec index 6a1795b709..cc688e2bc7 100644 --- a/src/csharp/grpc.native.csharp/grpc.native.csharp.nuspec +++ b/src/csharp/grpc.native.csharp/grpc.native.csharp.nuspec @@ -10,7 +10,7 @@ <requireLicenseAcceptance>false</requireLicenseAcceptance> <description>Native extension needed by gRPC C# library. This is not the package you are looking for, it is only meant to be used as a dependency.</description> <releaseNotes>Release of gRPC C core $version$ libraries.</releaseNotes> - <copyright>Copyright 2015-2016</copyright> + <copyright>Copyright 2015</copyright> <title>gRPC C# Native Extension</title> <summary>Native library required by gRPC C#</summary> <tags>gRPC native</tags> diff --git a/src/csharp/tests.json b/src/csharp/tests.json index d66cb1b100..718bfa3287 100644 --- a/src/csharp/tests.json +++ b/src/csharp/tests.json @@ -36,8 +36,9 @@ "Math.Tests.MathClientServerTest", "Grpc.HealthCheck.Tests.HealthClientServerTest", "Grpc.HealthCheck.Tests.HealthServiceImplTest", - "Grpc.IntegrationTesting.HeaderInterceptorTest", "Grpc.IntegrationTesting.HistogramTest", + "Grpc.IntegrationTesting.GeneratedClientTest", + "Grpc.IntegrationTesting.GeneratedServiceBaseTest", "Grpc.IntegrationTesting.InteropClientServerTest", "Grpc.IntegrationTesting.MetadataCredentialsTest", "Grpc.IntegrationTesting.RunnerClientServerTest", diff --git a/src/proto/grpc/testing/messages.proto b/src/proto/grpc/testing/messages.proto index 193b6c4171..a063b470c7 100644 --- a/src/proto/grpc/testing/messages.proto +++ b/src/proto/grpc/testing/messages.proto @@ -1,5 +1,5 @@ -// Copyright 2015, Google Inc. +// Copyright 2015-2016, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -159,6 +159,12 @@ message StreamingOutputCallResponse { } // For reconnect interop test only. +// Client tells server what reconnection parameters it used. +message ReconnectParams { + int32 max_reconnect_backoff_ms = 1; +} + +// For reconnect interop test only. // Server tells client whether its reconnects are following the spec and the // reconnect backoffs it saw. message ReconnectInfo { diff --git a/src/proto/grpc/testing/metrics.proto b/src/proto/grpc/testing/metrics.proto index 0cc4b60239..1202b20b8f 100644 --- a/src/proto/grpc/testing/metrics.proto +++ b/src/proto/grpc/testing/metrics.proto @@ -1,4 +1,4 @@ -// Copyright 2015, Google Inc. +// Copyright 2015-2016, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -42,7 +42,7 @@ message GaugeResponse { string name = 1; oneof value { int64 long_value = 2; - double double_vale = 3; + double double_value = 3; string string_value = 4; } } diff --git a/src/proto/grpc/testing/test.proto b/src/proto/grpc/testing/test.proto index 9faba297a3..84369db4b8 100644 --- a/src/proto/grpc/testing/test.proto +++ b/src/proto/grpc/testing/test.proto @@ -1,5 +1,5 @@ -// Copyright 2015, Google Inc. +// Copyright 2015-2016, Google Inc. // All rights reserved. // // Redistribution and use in source and binary forms, with or without @@ -80,6 +80,6 @@ service UnimplementedService { // A service used to control reconnect server. service ReconnectService { - rpc Start(grpc.testing.Empty) returns (grpc.testing.Empty); + rpc Start(grpc.testing.ReconnectParams) returns (grpc.testing.Empty); rpc Stop(grpc.testing.Empty) returns (grpc.testing.ReconnectInfo); } diff --git a/src/python/grpcio/grpc/_cython/imports.generated.h b/src/python/grpcio/grpc/_cython/imports.generated.h index adcd8e954a..272e85b485 100644 --- a/src/python/grpcio/grpc/_cython/imports.generated.h +++ b/src/python/grpcio/grpc/_cython/imports.generated.h @@ -283,7 +283,7 @@ extern grpc_call_destroy_type grpc_call_destroy_import; typedef grpc_call_error(*grpc_server_request_call_type)(grpc_server *server, grpc_call **call, grpc_call_details *details, grpc_metadata_array *request_metadata, grpc_completion_queue *cq_bound_to_call, grpc_completion_queue *cq_for_notification, void *tag_new); extern grpc_server_request_call_type grpc_server_request_call_import; #define grpc_server_request_call grpc_server_request_call_import -typedef void *(*grpc_server_register_method_type)(grpc_server *server, const char *method, const char *host, uint32_t flags); +typedef void *(*grpc_server_register_method_type)(grpc_server *server, const char *method, const char *host, grpc_server_register_method_payload_handling payload_handling, uint32_t flags); extern grpc_server_register_method_type grpc_server_register_method_import; #define grpc_server_register_method grpc_server_register_method_import typedef grpc_call_error(*grpc_server_request_registered_call_type)(grpc_server *server, void *registered_method, grpc_call **call, gpr_timespec *deadline, grpc_metadata_array *request_metadata, grpc_byte_buffer **optional_payload, grpc_completion_queue *cq_bound_to_call, grpc_completion_queue *cq_for_notification, void *tag_new); diff --git a/src/python/grpcio/grpc/beta/implementations.py b/src/python/grpcio/grpc/beta/implementations.py index 06ee7aa26e..742e94dc65 100644 --- a/src/python/grpcio/grpc/beta/implementations.py +++ b/src/python/grpcio/grpc/beta/implementations.py @@ -1,4 +1,4 @@ -# Copyright 2015-2016, Google Inc. +# Copyright 2015, Google Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index 689ca388e5..4cacc641a5 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -123,6 +123,7 @@ CORE_SOURCE_FILES = [ 'src/core/lib/channel/http_client_filter.c', 'src/core/lib/channel/http_server_filter.c', 'src/core/lib/channel/subchannel_call_holder.c', + 'src/core/lib/client_config/client_channel_factory.c', 'src/core/lib/client_config/client_config.c', 'src/core/lib/client_config/connector.c', 'src/core/lib/client_config/default_initial_connect_string.c', @@ -134,7 +135,6 @@ CORE_SOURCE_FILES = [ 'src/core/lib/client_config/resolver_factory.c', 'src/core/lib/client_config/resolver_registry.c', 'src/core/lib/client_config/subchannel.c', - 'src/core/lib/client_config/subchannel_factory.c', 'src/core/lib/client_config/subchannel_index.c', 'src/core/lib/client_config/uri_parser.c', 'src/core/lib/compression/compression_algorithm.c', diff --git a/src/python/grpcio/tests/interop/_secure_interop_test.py b/src/python/grpcio/tests/interop/_secure_interop_test.py index 1a1a063a6f..86d7e43351 100644 --- a/src/python/grpcio/tests/interop/_secure_interop_test.py +++ b/src/python/grpcio/tests/interop/_secure_interop_test.py @@ -1,4 +1,4 @@ -# Copyright 2015-2016, Google Inc. +# Copyright 2015, Google Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without diff --git a/src/python/grpcio/tests/interop/client.py b/src/python/grpcio/tests/interop/client.py index 02a37cc6bc..1d10d7e45d 100644 --- a/src/python/grpcio/tests/interop/client.py +++ b/src/python/grpcio/tests/interop/client.py @@ -1,4 +1,4 @@ -# Copyright 2015-2016, Google Inc. +# Copyright 2015, Google Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without diff --git a/src/python/grpcio/tests/unit/beta/_beta_features_test.py b/src/python/grpcio/tests/unit/beta/_beta_features_test.py index b8b77a96c1..bb2893a21b 100644 --- a/src/python/grpcio/tests/unit/beta/_beta_features_test.py +++ b/src/python/grpcio/tests/unit/beta/_beta_features_test.py @@ -1,4 +1,4 @@ -# Copyright 2015-2016, Google Inc. +# Copyright 2015, Google Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without diff --git a/src/python/grpcio/tests/unit/beta/_face_interface_test.py b/src/python/grpcio/tests/unit/beta/_face_interface_test.py index ea19ee47ae..3a67516906 100644 --- a/src/python/grpcio/tests/unit/beta/_face_interface_test.py +++ b/src/python/grpcio/tests/unit/beta/_face_interface_test.py @@ -1,4 +1,4 @@ -# Copyright 2015-2016, Google Inc. +# Copyright 2015, Google Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without diff --git a/src/ruby/ext/grpc/rb_call.c b/src/ruby/ext/grpc/rb_call.c index dc80d18b45..f5fdbb2ffd 100644 --- a/src/ruby/ext/grpc/rb_call.c +++ b/src/ruby/ext/grpc/rb_call.c @@ -359,7 +359,7 @@ static int grpc_rb_md_ary_fill_hash_cb(VALUE key, VALUE val, VALUE md_ary_obj) { md_ary->metadata[md_ary->count].value_length = value_len; md_ary->count += 1; } - } else { + } else if (TYPE(val) == T_STRING) { value_str = RSTRING_PTR(val); value_len = RSTRING_LEN(val); if (!grpc_is_binary_header(key_str, key_len) && @@ -373,6 +373,10 @@ static int grpc_rb_md_ary_fill_hash_cb(VALUE key, VALUE val, VALUE md_ary_obj) { md_ary->metadata[md_ary->count].value = value_str; md_ary->metadata[md_ary->count].value_length = value_len; md_ary->count += 1; + } else { + rb_raise(rb_eArgError, + "Header values must be of type string or array"); + return ST_STOP; } return ST_CONTINUE; diff --git a/src/ruby/ext/grpc/rb_grpc_imports.generated.h b/src/ruby/ext/grpc/rb_grpc_imports.generated.h index 22ea84c750..c526f434c6 100644 --- a/src/ruby/ext/grpc/rb_grpc_imports.generated.h +++ b/src/ruby/ext/grpc/rb_grpc_imports.generated.h @@ -283,7 +283,7 @@ extern grpc_call_destroy_type grpc_call_destroy_import; typedef grpc_call_error(*grpc_server_request_call_type)(grpc_server *server, grpc_call **call, grpc_call_details *details, grpc_metadata_array *request_metadata, grpc_completion_queue *cq_bound_to_call, grpc_completion_queue *cq_for_notification, void *tag_new); extern grpc_server_request_call_type grpc_server_request_call_import; #define grpc_server_request_call grpc_server_request_call_import -typedef void *(*grpc_server_register_method_type)(grpc_server *server, const char *method, const char *host, uint32_t flags); +typedef void *(*grpc_server_register_method_type)(grpc_server *server, const char *method, const char *host, grpc_server_register_method_payload_handling payload_handling, uint32_t flags); extern grpc_server_register_method_type grpc_server_register_method_import; #define grpc_server_register_method grpc_server_register_method_import typedef grpc_call_error(*grpc_server_request_registered_call_type)(grpc_server *server, void *registered_method, grpc_call **call, gpr_timespec *deadline, grpc_metadata_array *request_metadata, grpc_byte_buffer **optional_payload, grpc_completion_queue *cq_bound_to_call, grpc_completion_queue *cq_for_notification, void *tag_new); diff --git a/src/ruby/lib/grpc/generic/rpc_server.rb b/src/ruby/lib/grpc/generic/rpc_server.rb index 4b5578b018..5ba77db173 100644 --- a/src/ruby/lib/grpc/generic/rpc_server.rb +++ b/src/ruby/lib/grpc/generic/rpc_server.rb @@ -403,7 +403,7 @@ module GRPC loop_handle_server_calls end - # Sends UNAVAILABLE if there are too many unprocessed jobs + # Sends RESOURCE_EXHAUSTED if there are too many unprocessed jobs def available?(an_rpc) jobs_count, max = @pool.jobs_waiting, @max_waiting_requests GRPC.logger.info("waiting: #{jobs_count}, max: #{max}") @@ -411,7 +411,7 @@ module GRPC GRPC.logger.warn("NOT AVAILABLE: too many jobs_waiting: #{an_rpc}") noop = proc { |x| x } c = ActiveCall.new(an_rpc.call, @cq, noop, noop, an_rpc.deadline) - c.send_status(StatusCodes::UNAVAILABLE, '') + c.send_status(StatusCodes::RESOURCE_EXHAUSTED, '') nil end diff --git a/src/ruby/spec/generic/client_stub_spec.rb b/src/ruby/spec/generic/client_stub_spec.rb index 5e13c25fcf..dd8e2e9f7a 100644 --- a/src/ruby/spec/generic/client_stub_spec.rb +++ b/src/ruby/spec/generic/client_stub_spec.rb @@ -193,44 +193,45 @@ describe 'ClientStub' do describe '#client_streamer' do shared_examples 'client streaming' do before(:each) do + server_port = create_test_server + host = "localhost:#{server_port}" + @stub = GRPC::ClientStub.new(host, @cq, :this_channel_is_insecure) + @options = { k1: 'v1', k2: 'v2' } @sent_msgs = Array.new(3) { |i| 'msg_' + (i + 1).to_s } @resp = 'a_reply' end it 'should send requests to/receive a reply from a server' do - server_port = create_test_server - host = "localhost:#{server_port}" th = run_client_streamer(@sent_msgs, @resp, @pass) - stub = GRPC::ClientStub.new(host, @cq, :this_channel_is_insecure) - expect(get_response(stub)).to eq(@resp) + expect(get_response(@stub)).to eq(@resp) th.join end it 'should send metadata to the server ok' do - server_port = create_test_server - host = "localhost:#{server_port}" - th = run_client_streamer(@sent_msgs, @resp, @pass, - k1: 'v1', k2: 'v2') - stub = GRPC::ClientStub.new(host, @cq, :this_channel_is_insecure) - expect(get_response(stub)).to eq(@resp) + th = run_client_streamer(@sent_msgs, @resp, @pass, @options) + expect(get_response(@stub)).to eq(@resp) th.join end it 'should raise an error if the status is not ok' do - server_port = create_test_server - host = "localhost:#{server_port}" th = run_client_streamer(@sent_msgs, @resp, @fail) - stub = GRPC::ClientStub.new(host, @cq, :this_channel_is_insecure) - blk = proc { get_response(stub) } + blk = proc { get_response(@stub) } expect(&blk).to raise_error(GRPC::BadStatus) th.join end + + it 'should raise ArgumentError if metadata contains invalid values' do + @options.merge!(k3: 3) + expect do + get_response(@stub) + end.to raise_error(ArgumentError, + /Header values must be of type string or array/) + end end describe 'without a call operation' do def get_response(stub) - stub.client_streamer(@method, @sent_msgs, noop, noop, - k1: 'v1', k2: 'v2') + stub.client_streamer(@method, @sent_msgs, noop, noop, @options) end it_behaves_like 'client streaming' @@ -239,7 +240,7 @@ describe 'ClientStub' do describe 'via a call operation' do def get_response(stub) op = stub.client_streamer(@method, @sent_msgs, noop, noop, - return_op: true, k1: 'v1', k2: 'v2') + @options.merge(return_op: true)) expect(op).to be_a(GRPC::ActiveCall::Operation) op.execute end diff --git a/src/ruby/spec/generic/rpc_server_spec.rb b/src/ruby/spec/generic/rpc_server_spec.rb index e16ba60387..e688057cb1 100644 --- a/src/ruby/spec/generic/rpc_server_spec.rb +++ b/src/ruby/spec/generic/rpc_server_spec.rb @@ -426,7 +426,7 @@ describe GRPC::RpcServer do threads.each(&:join) end - it 'should return UNAVAILABLE on too many jobs', server: true do + it 'should return RESOURCE_EXHAUSTED on too many jobs', server: true do opts = { a_channel_arg: 'an_arg', server_override: @server, @@ -449,7 +449,8 @@ describe GRPC::RpcServer do begin stub.an_rpc(req) rescue GRPC::BadStatus => e - one_failed_as_unavailable = e.code == StatusCodes::UNAVAILABLE + one_failed_as_unavailable = + e.code == StatusCodes::RESOURCE_EXHAUSTED end end end diff --git a/test/core/bad_client/bad_client.c b/test/core/bad_client/bad_client.c index 433ecf69df..79da278b3c 100644 --- a/test/core/bad_client/bad_client.c +++ b/test/core/bad_client/bad_client.c @@ -109,7 +109,8 @@ void grpc_run_bad_client_test(grpc_bad_client_server_side_validator validator, grpc_server_register_completion_queue(a.server, a.cq, NULL); a.registered_method = grpc_server_register_method(a.server, GRPC_BAD_CLIENT_REGISTERED_METHOD, - GRPC_BAD_CLIENT_REGISTERED_HOST, 0); + GRPC_BAD_CLIENT_REGISTERED_HOST, + GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER, 0); grpc_server_start(a.server); transport = grpc_create_chttp2_transport(&exec_ctx, NULL, sfd.server, 0); server_setup_transport(&a, transport); diff --git a/test/core/bad_client/gen_build_yaml.py b/test/core/bad_client/gen_build_yaml.py index ca26eda170..d49858ed6d 100755 --- a/test/core/bad_client/gen_build_yaml.py +++ b/test/core/bad_client/gen_build_yaml.py @@ -44,6 +44,7 @@ BAD_CLIENT_TESTS = { 'connection_prefix': default_test_options._replace(cpu_cost=0.2), 'headers': default_test_options._replace(cpu_cost=0.2), 'initial_settings_frame': default_test_options._replace(cpu_cost=0.2), + 'head_of_line_blocking': default_test_options, 'server_registered_method': default_test_options, 'simple_request': default_test_options, 'window_overflow': default_test_options, diff --git a/test/core/bad_client/tests/head_of_line_blocking.c b/test/core/bad_client/tests/head_of_line_blocking.c new file mode 100644 index 0000000000..53cd4537b2 --- /dev/null +++ b/test/core/bad_client/tests/head_of_line_blocking.c @@ -0,0 +1,151 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "test/core/bad_client/bad_client.h" + +#include <string.h> + +#include <grpc/support/alloc.h> + +#include "src/core/lib/surface/server.h" +#include "test/core/end2end/cq_verifier.h" + +static const char prefix[] = + "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" + // settings frame + "\x00\x00\x00\x04\x00\x00\x00\x00\x00" + // stream 1 headers: generated from server_registered_method.headers in this + // directory + "\x00\x00\xd0\x01\x04\x00\x00\x00\x01" + "\x10\x05:path\x0f/registered/bar" + "\x10\x07:scheme\x04http" + "\x10\x07:method\x04POST" + "\x10\x0a:authority\x09localhost" + "\x10\x0c" + "content-type\x10" + "application/grpc" + "\x10\x14grpc-accept-encoding\x15identity,deflate,gzip" + "\x10\x02te\x08trailers" + "\x10\x0auser-agent\"bad-client grpc-c/0.12.0.0 (linux)" + // data frame for stream 1: advertise a 10000 byte payload (that we won't + // fulfill) + "\x00\x00\x05\x00\x00\x00\x00\x00\x01" + "\x01\x00\x00\x27\x10" + // stream 3 headers: generated from server_registered_method.headers in this + // directory + "\x00\x00\xd0\x01\x04\x00\x00\x00\x03" + "\x10\x05:path\x0f/registered/bar" + "\x10\x07:scheme\x04http" + "\x10\x07:method\x04POST" + "\x10\x0a:authority\x09localhost" + "\x10\x0c" + "content-type\x10" + "application/grpc" + "\x10\x14grpc-accept-encoding\x15identity,deflate,gzip" + "\x10\x02te\x08trailers" + "\x10\x0auser-agent\"bad-client grpc-c/0.12.0.0 (linux)" + // data frame for stream 3: advertise a 10000 byte payload (that we will + // fulfill) + "\x00\x00\x05\x00\x00\x00\x00\x00\x03" + "\x01\x00\x00\x27\x10" + ""; + +static void *tag(intptr_t t) { return (void *)t; } + +static void verifier(grpc_server *server, grpc_completion_queue *cq, + void *registered_method) { + grpc_call_error error; + grpc_call *s; + cq_verifier *cqv = cq_verifier_create(cq); + grpc_metadata_array request_metadata_recv; + gpr_timespec deadline; + grpc_byte_buffer *payload = NULL; + + grpc_metadata_array_init(&request_metadata_recv); + + error = grpc_server_request_registered_call(server, registered_method, &s, + &deadline, &request_metadata_recv, + &payload, cq, cq, tag(101)); + GPR_ASSERT(GRPC_CALL_OK == error); + cq_expect_completion(cqv, tag(101), 1); + cq_verify(cqv); + + GPR_ASSERT(payload != NULL); + + grpc_metadata_array_destroy(&request_metadata_recv); + grpc_call_destroy(s); + grpc_byte_buffer_destroy(payload); + cq_verifier_destroy(cqv); +} + +char *g_buffer; +size_t g_cap = 0; +size_t g_count = 0; + +static void addbuf(const void *data, size_t len) { + if (g_count + len > g_cap) { + g_cap = GPR_MAX(g_count + len, g_cap * 2); + g_buffer = gpr_realloc(g_buffer, g_cap); + } + memcpy(g_buffer + g_count, data, len); + g_count += len; +} + +int main(int argc, char **argv) { + int i; + grpc_test_init(argc, argv); + +#define NUM_FRAMES 10 +#define FRAME_SIZE 1000 + + addbuf(prefix, sizeof(prefix) - 1); + for (i = 0; i < NUM_FRAMES; i++) { + uint8_t hdr[9] = {(uint8_t)(FRAME_SIZE >> 16), + (uint8_t)(FRAME_SIZE >> 8), + (uint8_t)FRAME_SIZE, + 0, + 0, + 0, + 0, + 0, + 3}; + uint8_t msg[FRAME_SIZE]; + memset(msg, 'a', sizeof(msg)); + addbuf(hdr, sizeof(hdr)); + addbuf(msg, FRAME_SIZE); + } + grpc_run_bad_client_test(verifier, g_buffer, g_count, 0); + gpr_free(g_buffer); + + return 0; +} diff --git a/test/core/bad_ssl/bad_ssl_test.c b/test/core/bad_ssl/bad_ssl_test.c index 12c7710af6..c4ae212ec2 100644 --- a/test/core/bad_ssl/bad_ssl_test.c +++ b/test/core/bad_ssl/bad_ssl_test.c @@ -87,7 +87,7 @@ static void run_test(const char *target, size_t nops) { op = ops; op->op = GRPC_OP_SEND_INITIAL_METADATA; op->data.send_initial_metadata.count = 0; - op->flags = 0; + op->flags = GRPC_INITIAL_METADATA_IGNORE_CONNECTIVITY; op->reserved = NULL; op++; op->op = GRPC_OP_RECV_STATUS_ON_CLIENT; diff --git a/test/core/client_config/resolvers/dns_resolver_connectivity_test.c b/test/core/client_config/resolvers/dns_resolver_connectivity_test.c index b7c3b78fe1..bcd9fca9c7 100644 --- a/test/core/client_config/resolvers/dns_resolver_connectivity_test.c +++ b/test/core/client_config/resolvers/dns_resolver_connectivity_test.c @@ -41,20 +41,28 @@ #include "src/core/lib/iomgr/timer.h" #include "test/core/util/test_config.h" -static void subchannel_factory_ref(grpc_subchannel_factory *scv) {} -static void subchannel_factory_unref(grpc_exec_ctx *exec_ctx, - grpc_subchannel_factory *scv) {} -static grpc_subchannel *subchannel_factory_create_subchannel( - grpc_exec_ctx *exec_ctx, grpc_subchannel_factory *factory, +static void client_channel_factory_ref(grpc_client_channel_factory *scv) {} +static void client_channel_factory_unref(grpc_exec_ctx *exec_ctx, + grpc_client_channel_factory *scv) {} +static grpc_subchannel *client_channel_factory_create_subchannel( + grpc_exec_ctx *exec_ctx, grpc_client_channel_factory *factory, grpc_subchannel_args *args) { return NULL; } -static const grpc_subchannel_factory_vtable sc_vtable = { - subchannel_factory_ref, subchannel_factory_unref, - subchannel_factory_create_subchannel}; +static grpc_channel *client_channel_factory_create_channel( + grpc_exec_ctx *exec_ctx, grpc_client_channel_factory *cc_factory, + const char *target, grpc_client_channel_type type, + grpc_channel_args *args) { + GPR_UNREACHABLE_CODE(return NULL); +} + +static const grpc_client_channel_factory_vtable sc_vtable = { + client_channel_factory_ref, client_channel_factory_unref, + client_channel_factory_create_subchannel, + client_channel_factory_create_channel}; -static grpc_subchannel_factory sc_factory = {&sc_vtable}; +static grpc_client_channel_factory cc_factory = {&sc_vtable}; static gpr_mu g_mu; static bool g_fail_resolution = true; @@ -84,7 +92,7 @@ static grpc_resolver *create_resolver(const char *name) { grpc_resolver_args args; memset(&args, 0, sizeof(args)); args.uri = uri; - args.subchannel_factory = &sc_factory; + args.client_channel_factory = &cc_factory; grpc_resolver *resolver = grpc_resolver_factory_create_resolver(factory, &args); grpc_resolver_factory_unref(factory); diff --git a/test/core/client_config/resolvers/dns_resolver_test.c b/test/core/client_config/resolvers/dns_resolver_test.c index 0e8a3b13dd..6a9c06e48c 100644 --- a/test/core/client_config/resolvers/dns_resolver_test.c +++ b/test/core/client_config/resolvers/dns_resolver_test.c @@ -38,20 +38,28 @@ #include "src/core/lib/client_config/resolver_registry.h" #include "test/core/util/test_config.h" -static void subchannel_factory_ref(grpc_subchannel_factory *scv) {} -static void subchannel_factory_unref(grpc_exec_ctx *exec_ctx, - grpc_subchannel_factory *scv) {} -static grpc_subchannel *subchannel_factory_create_subchannel( - grpc_exec_ctx *exec_ctx, grpc_subchannel_factory *factory, +static void client_channel_factory_ref(grpc_client_channel_factory *scv) {} +static void client_channel_factory_unref(grpc_exec_ctx *exec_ctx, + grpc_client_channel_factory *scv) {} +static grpc_subchannel *client_channel_factory_create_subchannel( + grpc_exec_ctx *exec_ctx, grpc_client_channel_factory *factory, grpc_subchannel_args *args) { GPR_UNREACHABLE_CODE(return NULL); } -static const grpc_subchannel_factory_vtable sc_vtable = { - subchannel_factory_ref, subchannel_factory_unref, - subchannel_factory_create_subchannel}; +static grpc_channel *client_channel_factory_create_channel( + grpc_exec_ctx *exec_ctx, grpc_client_channel_factory *cc_factory, + const char *target, grpc_client_channel_type type, + grpc_channel_args *args) { + GPR_UNREACHABLE_CODE(return NULL); +} + +static const grpc_client_channel_factory_vtable sc_vtable = { + client_channel_factory_ref, client_channel_factory_unref, + client_channel_factory_create_subchannel, + client_channel_factory_create_channel}; -static grpc_subchannel_factory sc_factory = {&sc_vtable}; +static grpc_client_channel_factory cc_factory = {&sc_vtable}; static void test_succeeds(grpc_resolver_factory *factory, const char *string) { grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; @@ -63,7 +71,7 @@ static void test_succeeds(grpc_resolver_factory *factory, const char *string) { GPR_ASSERT(uri); memset(&args, 0, sizeof(args)); args.uri = uri; - args.subchannel_factory = &sc_factory; + args.client_channel_factory = &cc_factory; resolver = grpc_resolver_factory_create_resolver(factory, &args); GPR_ASSERT(resolver != NULL); GRPC_RESOLVER_UNREF(&exec_ctx, resolver, "test_succeeds"); diff --git a/test/core/client_config/resolvers/sockaddr_resolver_test.c b/test/core/client_config/resolvers/sockaddr_resolver_test.c index b2c4c63b79..99b3ca0dc8 100644 --- a/test/core/client_config/resolvers/sockaddr_resolver_test.c +++ b/test/core/client_config/resolvers/sockaddr_resolver_test.c @@ -38,20 +38,28 @@ #include "src/core/lib/client_config/resolver_registry.h" #include "test/core/util/test_config.h" -static void subchannel_factory_ref(grpc_subchannel_factory *scv) {} -static void subchannel_factory_unref(grpc_exec_ctx *exec_ctx, - grpc_subchannel_factory *scv) {} -static grpc_subchannel *subchannel_factory_create_subchannel( - grpc_exec_ctx *exec_ctx, grpc_subchannel_factory *factory, +static void client_channel_factory_ref(grpc_client_channel_factory *scv) {} +static void client_channel_factory_unref(grpc_exec_ctx *exec_ctx, + grpc_client_channel_factory *scv) {} +static grpc_subchannel *client_channel_factory_create_subchannel( + grpc_exec_ctx *exec_ctx, grpc_client_channel_factory *factory, grpc_subchannel_args *args) { GPR_UNREACHABLE_CODE(return NULL); } -static const grpc_subchannel_factory_vtable sc_vtable = { - subchannel_factory_ref, subchannel_factory_unref, - subchannel_factory_create_subchannel}; +static grpc_channel *client_channel_factory_create_channel( + grpc_exec_ctx *exec_ctx, grpc_client_channel_factory *cc_factory, + const char *target, grpc_client_channel_type type, + grpc_channel_args *args) { + GPR_UNREACHABLE_CODE(return NULL); +} + +static const grpc_client_channel_factory_vtable sc_vtable = { + client_channel_factory_ref, client_channel_factory_unref, + client_channel_factory_create_subchannel, + client_channel_factory_create_channel}; -static grpc_subchannel_factory sc_factory = {&sc_vtable}; +static grpc_client_channel_factory cc_factory = {&sc_vtable}; static void test_succeeds(grpc_resolver_factory *factory, const char *string) { grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; @@ -63,7 +71,7 @@ static void test_succeeds(grpc_resolver_factory *factory, const char *string) { GPR_ASSERT(uri); memset(&args, 0, sizeof(args)); args.uri = uri; - args.subchannel_factory = &sc_factory; + args.client_channel_factory = &cc_factory; resolver = grpc_resolver_factory_create_resolver(factory, &args); GPR_ASSERT(resolver != NULL); GRPC_RESOLVER_UNREF(&exec_ctx, resolver, "test_succeeds"); diff --git a/test/core/end2end/dualstack_socket_test.c b/test/core/end2end/dualstack_socket_test.c index 8568bb1a86..81f76ea79c 100644 --- a/test/core/end2end/dualstack_socket_test.c +++ b/test/core/end2end/dualstack_socket_test.c @@ -168,7 +168,7 @@ void test_connect(const char *server_host, const char *client_host, int port, op = ops; op->op = GRPC_OP_SEND_INITIAL_METADATA; op->data.send_initial_metadata.count = 0; - op->flags = 0; + op->flags = expect_ok ? GRPC_INITIAL_METADATA_IGNORE_CONNECTIVITY : 0; op->reserved = NULL; op++; op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT; @@ -237,7 +237,7 @@ void test_connect(const char *server_host, const char *client_host, int port, cq_expect_completion(cqv, tag(1), 1); cq_verify(cqv); - GPR_ASSERT(status == GRPC_STATUS_DEADLINE_EXCEEDED); + GPR_ASSERT(status == GRPC_STATUS_UNAVAILABLE); } grpc_call_destroy(c); diff --git a/test/core/end2end/fixtures/proxy.c b/test/core/end2end/fixtures/proxy.c index 1ca53cdad9..a6487a17ac 100644 --- a/test/core/end2end/fixtures/proxy.c +++ b/test/core/end2end/fixtures/proxy.c @@ -1,6 +1,6 @@ /* * - * Copyright 2015-2016, Google Inc. + * Copyright 2015, Google Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/test/core/end2end/tests/idempotent_request.c b/test/core/end2end/tests/idempotent_request.c index 485a854441..1bc6450414 100644 --- a/test/core/end2end/tests/idempotent_request.c +++ b/test/core/end2end/tests/idempotent_request.c @@ -1,6 +1,6 @@ /* * - * Copyright 2015-2016, Google Inc. + * Copyright 2015, Google Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/test/core/end2end/tests/simple_delayed_request.c b/test/core/end2end/tests/simple_delayed_request.c index bb9d462cef..122dcd0a5b 100644 --- a/test/core/end2end/tests/simple_delayed_request.c +++ b/test/core/end2end/tests/simple_delayed_request.c @@ -120,7 +120,7 @@ static void simple_delayed_request_body(grpc_end2end_test_config config, op = ops; op->op = GRPC_OP_SEND_INITIAL_METADATA; op->data.send_initial_metadata.count = 0; - op->flags = 0; + op->flags = GRPC_INITIAL_METADATA_IGNORE_CONNECTIVITY; op->reserved = NULL; op++; op->op = GRPC_OP_SEND_CLOSE_FROM_CLIENT; diff --git a/test/core/internal_api_canaries/iomgr.c b/test/core/internal_api_canaries/iomgr.c index 04d66994cd..f87a80cd90 100644 --- a/test/core/internal_api_canaries/iomgr.c +++ b/test/core/internal_api_canaries/iomgr.c @@ -1,6 +1,6 @@ /* * - * Copyright 2015-2016, Google Inc. + * Copyright 2015, Google Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/test/core/internal_api_canaries/support.c b/test/core/internal_api_canaries/support.c index 7e00e0d2ff..c51cbf2522 100644 --- a/test/core/internal_api_canaries/support.c +++ b/test/core/internal_api_canaries/support.c @@ -1,6 +1,6 @@ /* * - * Copyright 2015-2016, Google Inc. + * Copyright 2015, Google Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/test/core/internal_api_canaries/transport.c b/test/core/internal_api_canaries/transport.c index 01daabaa56..0617865412 100644 --- a/test/core/internal_api_canaries/transport.c +++ b/test/core/internal_api_canaries/transport.c @@ -1,6 +1,6 @@ /* * - * Copyright 2015-2016, Google Inc. + * Copyright 2015, Google Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/test/core/nanopb/corpus_response/0c35544f40d428d103e9c5b969ad9cd16767b110 b/test/core/nanopb/corpus_response/0c35544f40d428d103e9c5b969ad9cd16767b110 Binary files differnew file mode 100644 index 0000000000..2b5fc999d8 --- /dev/null +++ b/test/core/nanopb/corpus_response/0c35544f40d428d103e9c5b969ad9cd16767b110 diff --git a/test/core/nanopb/corpus_response/0c60ee9ed55c9af6190b132ef6636c1d2abe4540 b/test/core/nanopb/corpus_response/0c60ee9ed55c9af6190b132ef6636c1d2abe4540 new file mode 100644 index 0000000000..85366bee0a --- /dev/null +++ b/test/core/nanopb/corpus_response/0c60ee9ed55c9af6190b132ef6636c1d2abe4540 @@ -0,0 +1 @@ +½“½“2ƒ;΃;Î)±%Ì))±%Ì)::
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/0ecb3e69889c036a86d21eb942077dc9abd649be b/test/core/nanopb/corpus_response/0ecb3e69889c036a86d21eb942077dc9abd649be Binary files differnew file mode 100644 index 0000000000..74921b2170 --- /dev/null +++ b/test/core/nanopb/corpus_response/0ecb3e69889c036a86d21eb942077dc9abd649be diff --git a/test/core/nanopb/corpus_response/1324c95dafe597fe05f9babe92fe6fbf181c1897 b/test/core/nanopb/corpus_response/1324c95dafe597fe05f9babe92fe6fbf181c1897 new file mode 100644 index 0000000000..4b7de2e473 --- /dev/null +++ b/test/core/nanopb/corpus_response/1324c95dafe597fe05f9babe92fe6fbf181c1897 @@ -0,0 +1 @@ +(z%;:8!(¼;ªo!>::†©;=È( );;!ÞØ*:):B(r''' *þEàh;**!!Ý****
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/14eb42f7423081b455820daa2c02b358315dc0fa b/test/core/nanopb/corpus_response/14eb42f7423081b455820daa2c02b358315dc0fa new file mode 100644 index 0000000000..5a077927d9 --- /dev/null +++ b/test/core/nanopb/corpus_response/14eb42f7423081b455820daa2c02b358315dc0fa @@ -0,0 +1 @@ +(z%;:8!(¼;ª!>::†©;=È( );;!ÞØ*:):B(r''' *þEàh;**!!Ý****
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/23121c5f633db5d7c1a9f2225240754246fee513 b/test/core/nanopb/corpus_response/23121c5f633db5d7c1a9f2225240754246fee513 Binary files differnew file mode 100644 index 0000000000..e9db64ba0b --- /dev/null +++ b/test/core/nanopb/corpus_response/23121c5f633db5d7c1a9f2225240754246fee513 diff --git a/test/core/nanopb/corpus_response/235548307ee9f2b0855fded42a871990d9ade956 b/test/core/nanopb/corpus_response/235548307ee9f2b0855fded42a871990d9ade956 Binary files differnew file mode 100644 index 0000000000..da1306ddd6 --- /dev/null +++ b/test/core/nanopb/corpus_response/235548307ee9f2b0855fded42a871990d9ade956 diff --git a/test/core/nanopb/corpus_response/28ed3a797da3c48c309a4ef792147f3c56cfec40 b/test/core/nanopb/corpus_response/28ed3a797da3c48c309a4ef792147f3c56cfec40 new file mode 100644 index 0000000000..f46d387bf9 --- /dev/null +++ b/test/core/nanopb/corpus_response/28ed3a797da3c48c309a4ef792147f3c56cfec40 @@ -0,0 +1 @@ +(
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/2bf123dbfa1d37a04493b5662a4b3b9c147485fc b/test/core/nanopb/corpus_response/2bf123dbfa1d37a04493b5662a4b3b9c147485fc Binary files differnew file mode 100644 index 0000000000..7ea0b41123 --- /dev/null +++ b/test/core/nanopb/corpus_response/2bf123dbfa1d37a04493b5662a4b3b9c147485fc diff --git a/test/core/nanopb/corpus_response/2d4c0908ecc0310ea234d10b6bdb4f4ca3c41dd1 b/test/core/nanopb/corpus_response/2d4c0908ecc0310ea234d10b6bdb4f4ca3c41dd1 new file mode 100644 index 0000000000..cd74051c52 --- /dev/null +++ b/test/core/nanopb/corpus_response/2d4c0908ecc0310ea234d10b6bdb4f4ca3c41dd1 @@ -0,0 +1 @@ +):):\bJ'
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/304e8cdc9122b709ec2c063a5c8c38489a788033 b/test/core/nanopb/corpus_response/304e8cdc9122b709ec2c063a5c8c38489a788033 Binary files differnew file mode 100644 index 0000000000..a7571c0e84 --- /dev/null +++ b/test/core/nanopb/corpus_response/304e8cdc9122b709ec2c063a5c8c38489a788033 diff --git a/test/core/nanopb/corpus_response/324d4a2aed8bc1840fee212fd38dadec80a72ea2 b/test/core/nanopb/corpus_response/324d4a2aed8bc1840fee212fd38dadec80a72ea2 Binary files differnew file mode 100644 index 0000000000..9ca38b3256 --- /dev/null +++ b/test/core/nanopb/corpus_response/324d4a2aed8bc1840fee212fd38dadec80a72ea2 diff --git a/test/core/nanopb/corpus_response/33353a0b011901a13d010c6b165074ccdaa717ac b/test/core/nanopb/corpus_response/33353a0b011901a13d010c6b165074ccdaa717ac new file mode 100644 index 0000000000..9320a7a95d --- /dev/null +++ b/test/core/nanopb/corpus_response/33353a0b011901a13d010c6b165074ccdaa717ac @@ -0,0 +1 @@ +ž½“ƒÎ)±Ì)::\!;):bJ):'\éb*
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/37dfead09389fcd9b9d24ef817a0fed13d8ff2b0 b/test/core/nanopb/corpus_response/37dfead09389fcd9b9d24ef817a0fed13d8ff2b0 Binary files differnew file mode 100644 index 0000000000..725e601a5b --- /dev/null +++ b/test/core/nanopb/corpus_response/37dfead09389fcd9b9d24ef817a0fed13d8ff2b0 diff --git a/test/core/nanopb/corpus_response/47879cc364be304754f6af15563ad6f9a538da41 b/test/core/nanopb/corpus_response/47879cc364be304754f6af15563ad6f9a538da41 Binary files differnew file mode 100644 index 0000000000..b42661c56c --- /dev/null +++ b/test/core/nanopb/corpus_response/47879cc364be304754f6af15563ad6f9a538da41 diff --git a/test/core/nanopb/corpus_response/49a5cef4c730ecab22712b156ddba5106f165afd b/test/core/nanopb/corpus_response/49a5cef4c730ecab22712b156ddba5106f165afd new file mode 100644 index 0000000000..4a551cf6de --- /dev/null +++ b/test/core/nanopb/corpus_response/49a5cef4c730ecab22712b156ddba5106f165afd @@ -0,0 +1 @@ +(z!;:8!(¼;ªo!>::†©;=È( );ö;!ÞØ*:):B(r''' *þEàh;**!!Ý****
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/4bbbbb794a098deeacff73b774c30f12c54ceacb b/test/core/nanopb/corpus_response/4bbbbb794a098deeacff73b774c30f12c54ceacb new file mode 100644 index 0000000000..d99c09f882 --- /dev/null +++ b/test/core/nanopb/corpus_response/4bbbbb794a098deeacff73b774c30f12c54ceacb @@ -0,0 +1 @@ +(z%;28!(¼;ª!*>::†(z%;28!(¼;ª!>::†ùâåò©
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/4c498ce69c8476f745693deb23272930e05cad60 b/test/core/nanopb/corpus_response/4c498ce69c8476f745693deb23272930e05cad60 Binary files differnew file mode 100644 index 0000000000..86181941cb --- /dev/null +++ b/test/core/nanopb/corpus_response/4c498ce69c8476f745693deb23272930e05cad60 diff --git a/test/core/nanopb/corpus_response/4fb5e3085c32e9bccac9e18343cca07017d037de b/test/core/nanopb/corpus_response/4fb5e3085c32e9bccac9e18343cca07017d037de Binary files differnew file mode 100644 index 0000000000..59a8026f2a --- /dev/null +++ b/test/core/nanopb/corpus_response/4fb5e3085c32e9bccac9e18343cca07017d037de diff --git a/test/core/nanopb/corpus_response/4fe5e46c1299e7f3e8a41dde3ae1bf1b60b4a43c b/test/core/nanopb/corpus_response/4fe5e46c1299e7f3e8a41dde3ae1bf1b60b4a43c new file mode 100644 index 0000000000..3d44fadc61 --- /dev/null +++ b/test/core/nanopb/corpus_response/4fe5e46c1299e7f3e8a41dde3ae1bf1b60b4a43c @@ -0,0 +1 @@ +a¶(6)!á•( !!)b:'Ü:*¤();Ì0();)Ï(|)ÿ!V)'*¡!t<b߶…*!(b*()(:dVj)
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/670cc6bae958cb4f15e7297fe63959ac5799aa42 b/test/core/nanopb/corpus_response/670cc6bae958cb4f15e7297fe63959ac5799aa42 Binary files differnew file mode 100644 index 0000000000..2489cb7ba3 --- /dev/null +++ b/test/core/nanopb/corpus_response/670cc6bae958cb4f15e7297fe63959ac5799aa42 diff --git a/test/core/nanopb/corpus_response/675f3263af7d1bbb084872f2b23f6d363227e85d b/test/core/nanopb/corpus_response/675f3263af7d1bbb084872f2b23f6d363227e85d Binary files differnew file mode 100644 index 0000000000..d2fb75ced5 --- /dev/null +++ b/test/core/nanopb/corpus_response/675f3263af7d1bbb084872f2b23f6d363227e85d diff --git a/test/core/nanopb/corpus_response/67fe0d2acc727c8a39a707b92c6cebda9bd20986 b/test/core/nanopb/corpus_response/67fe0d2acc727c8a39a707b92c6cebda9bd20986 new file mode 100644 index 0000000000..0ba194a3ca --- /dev/null +++ b/test/core/nanopb/corpus_response/67fe0d2acc727c8a39a707b92c6cebda9bd20986 @@ -0,0 +1 @@ +½™'Ì)%±ƒ™Þ):
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/6d15065785eb8f4b5f17357a520cb4815a2cb355 b/test/core/nanopb/corpus_response/6d15065785eb8f4b5f17357a520cb4815a2cb355 new file mode 100644 index 0000000000..98da1dd4ee --- /dev/null +++ b/test/core/nanopb/corpus_response/6d15065785eb8f4b5f17357a520cb4815a2cb355 @@ -0,0 +1 @@ +½™'ƒÎ)±%Ì):
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/73285d7a70d73b517648067520d921e4477dbbfa b/test/core/nanopb/corpus_response/73285d7a70d73b517648067520d921e4477dbbfa Binary files differnew file mode 100644 index 0000000000..193b899d2d --- /dev/null +++ b/test/core/nanopb/corpus_response/73285d7a70d73b517648067520d921e4477dbbfa diff --git a/test/core/nanopb/corpus_response/747d1ed8bee4c6f0438beaf88ae76d8ef9f63da2 b/test/core/nanopb/corpus_response/747d1ed8bee4c6f0438beaf88ae76d8ef9f63da2 new file mode 100644 index 0000000000..8387eab9b4 --- /dev/null +++ b/test/core/nanopb/corpus_response/747d1ed8bee4c6f0438beaf88ae76d8ef9f63da2 @@ -0,0 +1 @@ +½¤½“ž½“ƒÎ½ƒ);Î)±
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/763878a34b3adeb99a03b54d09768a4451617016 b/test/core/nanopb/corpus_response/763878a34b3adeb99a03b54d09768a4451617016 new file mode 100644 index 0000000000..9c5c365715 --- /dev/null +++ b/test/core/nanopb/corpus_response/763878a34b3adeb99a03b54d09768a4451617016 @@ -0,0 +1 @@ +½“ž½“ƒÎ)ƒ;Î)±%Ì):
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/7b4b0c2555178333ba15203a930c88ef7e7500e7 b/test/core/nanopb/corpus_response/7b4b0c2555178333ba15203a930c88ef7e7500e7 Binary files differnew file mode 100644 index 0000000000..b14d25a88d --- /dev/null +++ b/test/core/nanopb/corpus_response/7b4b0c2555178333ba15203a930c88ef7e7500e7 diff --git a/test/core/nanopb/corpus_response/7b8a91aa46e370eb61307b4998889dc89775462f b/test/core/nanopb/corpus_response/7b8a91aa46e370eb61307b4998889dc89775462f new file mode 100644 index 0000000000..4061b65d96 --- /dev/null +++ b/test/core/nanopb/corpus_response/7b8a91aa46e370eb61307b4998889dc89775462f @@ -0,0 +1 @@ + :)½:
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/7cd11836c64f98742fa7beccec5c981ef4dd62ae b/test/core/nanopb/corpus_response/7cd11836c64f98742fa7beccec5c981ef4dd62ae Binary files differnew file mode 100644 index 0000000000..86fd08f413 --- /dev/null +++ b/test/core/nanopb/corpus_response/7cd11836c64f98742fa7beccec5c981ef4dd62ae diff --git a/test/core/nanopb/corpus_response/7d8f4f045e70e8a2cb45dc3c001504f5c2614b16 b/test/core/nanopb/corpus_response/7d8f4f045e70e8a2cb45dc3c001504f5c2614b16 Binary files differnew file mode 100644 index 0000000000..dd8d136cb1 --- /dev/null +++ b/test/core/nanopb/corpus_response/7d8f4f045e70e8a2cb45dc3c001504f5c2614b16 diff --git a/test/core/nanopb/corpus_response/7e9848558fb004e14795b3ebd3e1488dcde1db8c b/test/core/nanopb/corpus_response/7e9848558fb004e14795b3ebd3e1488dcde1db8c new file mode 100644 index 0000000000..be0dfcadd0 --- /dev/null +++ b/test/core/nanopb/corpus_response/7e9848558fb004e14795b3ebd3e1488dcde1db8c @@ -0,0 +1 @@ +ùâåò!Ù.!Nñrª:U:(œ;!á)*(¾):!'i)b):þ°)'!P!:'á•***!)H:*)(àñÍ*
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/89734c37ee267e69a6950c6d60ee541c1be5ccff b/test/core/nanopb/corpus_response/89734c37ee267e69a6950c6d60ee541c1be5ccff Binary files differnew file mode 100644 index 0000000000..023ef36861 --- /dev/null +++ b/test/core/nanopb/corpus_response/89734c37ee267e69a6950c6d60ee541c1be5ccff diff --git a/test/core/nanopb/corpus_response/9034aaf45143996a2b14465c352ab0c6fa26b221 b/test/core/nanopb/corpus_response/9034aaf45143996a2b14465c352ab0c6fa26b221 new file mode 100644 index 0000000000..9c95a6ba6a --- /dev/null +++ b/test/core/nanopb/corpus_response/9034aaf45143996a2b14465c352ab0c6fa26b221 @@ -0,0 +1 @@ +½
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/91e3b6a3484ab4b95cdeecc5aefe1291824060e8 b/test/core/nanopb/corpus_response/91e3b6a3484ab4b95cdeecc5aefe1291824060e8 new file mode 100644 index 0000000000..8d735ea33c --- /dev/null +++ b/test/core/nanopb/corpus_response/91e3b6a3484ab4b95cdeecc5aefe1291824060e8 @@ -0,0 +1 @@ +m!''÷:)ˆ');:Q(*á'!!m!Í()!;e''÷:
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/95cd94c858e5e97f7df4a5eb7552e5e0d5ce1ec4 b/test/core/nanopb/corpus_response/95cd94c858e5e97f7df4a5eb7552e5e0d5ce1ec4 new file mode 100644 index 0000000000..df2d8194d1 --- /dev/null +++ b/test/core/nanopb/corpus_response/95cd94c858e5e97f7df4a5eb7552e5e0d5ce1ec4 @@ -0,0 +1 @@ + :)½:
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/971f42d5a4d9816145ebc9dd28ba33ed3f5860b0 b/test/core/nanopb/corpus_response/971f42d5a4d9816145ebc9dd28ba33ed3f5860b0 Binary files differnew file mode 100644 index 0000000000..edd078a94e --- /dev/null +++ b/test/core/nanopb/corpus_response/971f42d5a4d9816145ebc9dd28ba33ed3f5860b0 diff --git a/test/core/nanopb/corpus_response/9db3a1854de87fd643b910aeab50553afc73e667 b/test/core/nanopb/corpus_response/9db3a1854de87fd643b910aeab50553afc73e667 Binary files differnew file mode 100644 index 0000000000..7cbc8b771a --- /dev/null +++ b/test/core/nanopb/corpus_response/9db3a1854de87fd643b910aeab50553afc73e667 diff --git a/test/core/nanopb/corpus_response/a147873135c6c52d4da03c260a0165bc0ab1b979 b/test/core/nanopb/corpus_response/a147873135c6c52d4da03c260a0165bc0ab1b979 Binary files differnew file mode 100644 index 0000000000..2f0a565bc3 --- /dev/null +++ b/test/core/nanopb/corpus_response/a147873135c6c52d4da03c260a0165bc0ab1b979 diff --git a/test/core/nanopb/corpus_response/a710eead945dabbbffa213a980c75f9463a27398 b/test/core/nanopb/corpus_response/a710eead945dabbbffa213a980c75f9463a27398 new file mode 100644 index 0000000000..3bc30a1f9c --- /dev/null +++ b/test/core/nanopb/corpus_response/a710eead945dabbbffa213a980c75f9463a27398 @@ -0,0 +1 @@ +½“ƒ;Î)±%Ì):
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/a72406e3ca06d941fe8e168bbf67da88a81c947b b/test/core/nanopb/corpus_response/a72406e3ca06d941fe8e168bbf67da88a81c947b new file mode 100644 index 0000000000..811a33df5b --- /dev/null +++ b/test/core/nanopb/corpus_response/a72406e3ca06d941fe8e168bbf67da88a81c947b @@ -0,0 +1 @@ +¼™'Ì)%±ƒ™Þ½)“½“2ƒ;΃;Î)±%Ì):)
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/a8a62a7ebb7d68b211ae319e082575935c07d188 b/test/core/nanopb/corpus_response/a8a62a7ebb7d68b211ae319e082575935c07d188 Binary files differnew file mode 100644 index 0000000000..7712307a3a --- /dev/null +++ b/test/core/nanopb/corpus_response/a8a62a7ebb7d68b211ae319e082575935c07d188 diff --git a/test/core/nanopb/corpus_response/a8abd012eb59b862bf9bc1ea443d2f35a1a2e222 b/test/core/nanopb/corpus_response/a8abd012eb59b862bf9bc1ea443d2f35a1a2e222 new file mode 100644 index 0000000000..3f1695f161 --- /dev/null +++ b/test/core/nanopb/corpus_response/a8abd012eb59b862bf9bc1ea443d2f35a1a2e222 @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/aab56035a3533b5d83a32a439f179eb678250113 b/test/core/nanopb/corpus_response/aab56035a3533b5d83a32a439f179eb678250113 Binary files differnew file mode 100644 index 0000000000..c9f9b4dac2 --- /dev/null +++ b/test/core/nanopb/corpus_response/aab56035a3533b5d83a32a439f179eb678250113 diff --git a/test/core/nanopb/corpus_response/ac174acef2c5da26fadc7270bab9c8c4e938c463 b/test/core/nanopb/corpus_response/ac174acef2c5da26fadc7270bab9c8c4e938c463 new file mode 100644 index 0000000000..a929daa987 --- /dev/null +++ b/test/core/nanopb/corpus_response/ac174acef2c5da26fadc7270bab9c8c4e938c463 @@ -0,0 +1 @@ +z(!;:8!(¼;ªo!>::†©;=È( );ö;!ÞØ*:):B(r''' *Eàhþ;**!!Ý****
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/acbbd60eeb76e41ce254d0fef353b92abe69c831 b/test/core/nanopb/corpus_response/acbbd60eeb76e41ce254d0fef353b92abe69c831 new file mode 100644 index 0000000000..da47491fb1 --- /dev/null +++ b/test/core/nanopb/corpus_response/acbbd60eeb76e41ce254d0fef353b92abe69c831 @@ -0,0 +1,2 @@ +½ƒ;Î)±}!;*;*°'';y©É:p +'!(S‘ð?±(¬;I:;:*:w!)èŽwÄÂ)>Å?)N!õ;)— +'
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/c1eed32e1e353737987da851ad760312ea8e557c b/test/core/nanopb/corpus_response/c1eed32e1e353737987da851ad760312ea8e557c new file mode 100644 index 0000000000..8f8d149245 --- /dev/null +++ b/test/core/nanopb/corpus_response/c1eed32e1e353737987da851ad760312ea8e557c @@ -0,0 +1 @@ +½)ƒ;Î)±}):):\!;):bJ):'\b*
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/c4214ace2c4bab24bb356f71aedca08544baad70 b/test/core/nanopb/corpus_response/c4214ace2c4bab24bb356f71aedca08544baad70 new file mode 100644 index 0000000000..ae25d72c91 --- /dev/null +++ b/test/core/nanopb/corpus_response/c4214ace2c4bab24bb356f71aedca08544baad70 @@ -0,0 +1 @@ +):\bJ'!:׸¶…''*Ž;»*j:M[(…¤!yæ“:)T²P'^)(0©!e&–°ˆ(*W;Ânc''(!$)
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/c4f87a6290aee1acfc1f26083974ce94621fca64 b/test/core/nanopb/corpus_response/c4f87a6290aee1acfc1f26083974ce94621fca64 new file mode 100644 index 0000000000..a4ceb359eb --- /dev/null +++ b/test/core/nanopb/corpus_response/c4f87a6290aee1acfc1f26083974ce94621fca64 @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/d285d78d3ba966b4b199453d38ead1aa36a7484f b/test/core/nanopb/corpus_response/d285d78d3ba966b4b199453d38ead1aa36a7484f Binary files differnew file mode 100644 index 0000000000..91b1d68f72 --- /dev/null +++ b/test/core/nanopb/corpus_response/d285d78d3ba966b4b199453d38ead1aa36a7484f diff --git a/test/core/nanopb/corpus_response/df5200f371cff3cae0e1595cd86d641725f5d1ba b/test/core/nanopb/corpus_response/df5200f371cff3cae0e1595cd86d641725f5d1ba new file mode 100644 index 0000000000..bfd9f8b3cd --- /dev/null +++ b/test/core/nanopb/corpus_response/df5200f371cff3cae0e1595cd86d641725f5d1ba @@ -0,0 +1 @@ +((³34('‰Äúx¡'¦/8(ô](:'çxR$;§'*”!(Ú(!k:(³;;*(/'-½':*:mç4'å%·Â
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/dfc66cb172919102f3ba14f6816228aa46f78154 b/test/core/nanopb/corpus_response/dfc66cb172919102f3ba14f6816228aa46f78154 new file mode 100644 index 0000000000..13f69eb579 --- /dev/null +++ b/test/core/nanopb/corpus_response/dfc66cb172919102f3ba14f6816228aa46f78154 @@ -0,0 +1 @@ +(z%;28!(¼;ª!>::†©;=( ;;)!ÈÞØm!''÷:)ˆ*:')
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/e53e789a4c175c6a2c468472f1047d0fe8db1177 b/test/core/nanopb/corpus_response/e53e789a4c175c6a2c468472f1047d0fe8db1177 Binary files differnew file mode 100644 index 0000000000..a6991c85bc --- /dev/null +++ b/test/core/nanopb/corpus_response/e53e789a4c175c6a2c468472f1047d0fe8db1177 diff --git a/test/core/nanopb/corpus_response/e67fe6794e755ea801272980f2c272edb027f6dc b/test/core/nanopb/corpus_response/e67fe6794e755ea801272980f2c272edb027f6dc new file mode 100644 index 0000000000..1b1486731a --- /dev/null +++ b/test/core/nanopb/corpus_response/e67fe6794e755ea801272980f2c272edb027f6dc @@ -0,0 +1 @@ +½“ƒ;Î)±Ì):;:\!;):bJ):'\b*
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/ead61e86fedf118df8e44ed70ce002be651cf291 b/test/core/nanopb/corpus_response/ead61e86fedf118df8e44ed70ce002be651cf291 Binary files differnew file mode 100644 index 0000000000..a4c11a7fb6 --- /dev/null +++ b/test/core/nanopb/corpus_response/ead61e86fedf118df8e44ed70ce002be651cf291 diff --git a/test/core/nanopb/corpus_response/eced8b29efbdc82eb8a1d0865c5f382f0ff78446 b/test/core/nanopb/corpus_response/eced8b29efbdc82eb8a1d0865c5f382f0ff78446 new file mode 100644 index 0000000000..a0f0de07ef --- /dev/null +++ b/test/core/nanopb/corpus_response/eced8b29efbdc82eb8a1d0865c5f382f0ff78446 @@ -0,0 +1 @@ +(z%;28!(¼;ª!*>::†(z%;28!(¼;ª!>::†©©Ï
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/f58a9135d07ea9a5e3e710f6b3bf6d48d5942dfd b/test/core/nanopb/corpus_response/f58a9135d07ea9a5e3e710f6b3bf6d48d5942dfd Binary files differnew file mode 100644 index 0000000000..17dfae3c71 --- /dev/null +++ b/test/core/nanopb/corpus_response/f58a9135d07ea9a5e3e710f6b3bf6d48d5942dfd diff --git a/test/core/nanopb/corpus_response/f8c2c4ddd2f474b4839f13a9be862c00ab0ece77 b/test/core/nanopb/corpus_response/f8c2c4ddd2f474b4839f13a9be862c00ab0ece77 Binary files differnew file mode 100644 index 0000000000..a94e0c85ac --- /dev/null +++ b/test/core/nanopb/corpus_response/f8c2c4ddd2f474b4839f13a9be862c00ab0ece77 diff --git a/test/core/nanopb/corpus_response/faa1781e1444bba5b8c677bc5e2a38d023a1ec65 b/test/core/nanopb/corpus_response/faa1781e1444bba5b8c677bc5e2a38d023a1ec65 new file mode 100644 index 0000000000..013d565bb4 --- /dev/null +++ b/test/core/nanopb/corpus_response/faa1781e1444bba5b8c677bc5e2a38d023a1ec65 @@ -0,0 +1 @@ +‚
\ No newline at end of file diff --git a/test/core/nanopb/corpus_response/fccda587af845f0685275960649d8f4a45272a95 b/test/core/nanopb/corpus_response/fccda587af845f0685275960649d8f4a45272a95 new file mode 100644 index 0000000000..cfdf87919b --- /dev/null +++ b/test/core/nanopb/corpus_response/fccda587af845f0685275960649d8f4a45272a95 @@ -0,0 +1 @@ +½™'Ì)%±'ƒ™Þ½)ƒ;Î)±}9:):\!;):bJ)):'\:b*
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/000def12957806bb0d40005cb651d35b4cde7b4e b/test/core/nanopb/corpus_serverlist/000def12957806bb0d40005cb651d35b4cde7b4e new file mode 100644 index 0000000000..314425728d --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/000def12957806bb0d40005cb651d35b4cde7b4e @@ -0,0 +1,3 @@ + É=Éÿ +'! +É)='!'ïï'½=ï!)**Í
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/0068af2acc3020f344ee84b2c8adfb90492354c3 b/test/core/nanopb/corpus_serverlist/0068af2acc3020f344ee84b2c8adfb90492354c3 new file mode 100644 index 0000000000..d2ae3657ad --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/0068af2acc3020f344ee84b2c8adfb90492354c3 @@ -0,0 +1 @@ +Á²²Wo:'ì*'!@*(Á*!)(@)ÁP²²²²(!(
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/009132022c3a1660b701728ac92e26baf82e8eac b/test/core/nanopb/corpus_serverlist/009132022c3a1660b701728ac92e26baf82e8eac Binary files differnew file mode 100644 index 0000000000..1b9e2f9ee6 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/009132022c3a1660b701728ac92e26baf82e8eac diff --git a/test/core/nanopb/corpus_serverlist/00bf0233aa1155b34a3081e4a2b7a1c9cdf8ea1e b/test/core/nanopb/corpus_serverlist/00bf0233aa1155b34a3081e4a2b7a1c9cdf8ea1e new file mode 100644 index 0000000000..3fc89e839a --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/00bf0233aa1155b34a3081e4a2b7a1c9cdf8ea1e @@ -0,0 +1,2 @@ +Ų;Ų +UõUú‰Ù( Ų;²UUú‰*Ų;²UÅÙ(Ž²'Ö!…z%)#€
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/013197cfb12b59755b807501c6d6615859f9cd3f b/test/core/nanopb/corpus_serverlist/013197cfb12b59755b807501c6d6615859f9cd3f new file mode 100644 index 0000000000..ae044dc77f --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/013197cfb12b59755b807501c6d6615859f9cd3f @@ -0,0 +1 @@ +)Û)¦'U!a Øç•ÏøÉ=*×Éÿ
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/018a4332eb19f2398162317cb6ad2e8cf700dfd6 b/test/core/nanopb/corpus_serverlist/018a4332eb19f2398162317cb6ad2e8cf700dfd6 new file mode 100644 index 0000000000..2519ccb195 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/018a4332eb19f2398162317cb6ad2e8cf700dfd6 @@ -0,0 +1 @@ +)B!B!à@)ò);'Ç“¢ƒ§'à@*::sED'tÂ'–!();!)*!)
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/0273d3496bf5f4594e59083ac319f8f863a15be0 b/test/core/nanopb/corpus_serverlist/0273d3496bf5f4594e59083ac319f8f863a15be0 new file mode 100644 index 0000000000..609e652597 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/0273d3496bf5f4594e59083ac319f8f863a15be0 @@ -0,0 +1 @@ +Á²•Wo:'ì*#!@ :*)Á²²Wo:'Wo*'!@*()*()@)(!:)Áü²²²(!'
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/0355002521e74dcdb3a0c633338bd02ab1d85312 b/test/core/nanopb/corpus_serverlist/0355002521e74dcdb3a0c633338bd02ab1d85312 new file mode 100644 index 0000000000..6e2df12eb6 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/0355002521e74dcdb3a0c633338bd02ab1d85312 @@ -0,0 +1,3 @@ +!¼;@oCÙ'–((!*Ú*'‚'*') +!((š;!x!(*:)ÞNË):y +œ“)I;ô):()”o:;©ä(*(;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/053d8d6ceeba9453c97d0ee5374db863e6f77ad4 b/test/core/nanopb/corpus_serverlist/053d8d6ceeba9453c97d0ee5374db863e6f77ad4 Binary files differnew file mode 100644 index 0000000000..268720a2e7 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/053d8d6ceeba9453c97d0ee5374db863e6f77ad4 diff --git a/test/core/nanopb/corpus_serverlist/0628c29e3ae264f8fa08652435bb3e61afe60883 b/test/core/nanopb/corpus_serverlist/0628c29e3ae264f8fa08652435bb3e61afe60883 new file mode 100644 index 0000000000..235fa37d29 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/0628c29e3ae264f8fa08652435bb3e61afe60883 @@ -0,0 +1 @@ +2;ò•:.<ý:*::ƒž*Š):’ªÜ:2;ò•:ô(ã**.<ý:*::ƒž*Š)!'dv!*!”¾(;'**:W
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/065e91578e5359b70a668164310af6f0dd40e922 b/test/core/nanopb/corpus_serverlist/065e91578e5359b70a668164310af6f0dd40e922 new file mode 100644 index 0000000000..25d794756f --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/065e91578e5359b70a668164310af6f0dd40e922 @@ -0,0 +1,2 @@ + +Á²²ò
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/06b4b617d5937da8a7b58aed5341dc5ef6d1bcd7 b/test/core/nanopb/corpus_serverlist/06b4b617d5937da8a7b58aed5341dc5ef6d1bcd7 new file mode 100644 index 0000000000..78bdaad21d --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/06b4b617d5937da8a7b58aed5341dc5ef6d1bcd7 @@ -0,0 +1 @@ +!¼;)@oCÙ diff --git a/test/core/nanopb/corpus_serverlist/07216a4f5934890b89d845f6256546c2681350ce b/test/core/nanopb/corpus_serverlist/07216a4f5934890b89d845f6256546c2681350ce new file mode 100644 index 0000000000..e48a1b5254 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/07216a4f5934890b89d845f6256546c2681350ce @@ -0,0 +1,3 @@ +)'Û¦)U!a Øç•ÏøÉÿ×' É=Éÿ +!'!É +)='!'ïïÉ=ÿ'):(:
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/08584e8308b7f52f0fe380358800d7f585cba89c b/test/core/nanopb/corpus_serverlist/08584e8308b7f52f0fe380358800d7f585cba89c new file mode 100644 index 0000000000..20fafeee24 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/08584e8308b7f52f0fe380358800d7f585cba89c @@ -0,0 +1 @@ +Øì÷(!½Æ)!5Sã::`…¶(p½!'e€*'U)))(:)婤;*:!p(È':Ö¶;óÑ))e);À'!;:µ
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/085a37568e99ec5855bd96affd259921515479e8 b/test/core/nanopb/corpus_serverlist/085a37568e99ec5855bd96affd259921515479e8 new file mode 100644 index 0000000000..b441046fb8 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/085a37568e99ec5855bd96affd259921515479e8 @@ -0,0 +1,2 @@ +Á²•W!o:'ì*#!Á::()*@:)Á|²²²Á;9!' +²Áƒ'’²
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/0903d1e9297179c18de6a3707b16f27d0d54ed67 b/test/core/nanopb/corpus_serverlist/0903d1e9297179c18de6a3707b16f27d0d54ed67 new file mode 100644 index 0000000000..ccb513ddec --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/0903d1e9297179c18de6a3707b16f27d0d54ed67 @@ -0,0 +1 @@ +(Õ';¤**´'Xò;)()<!*Â9*!(t;*î{R'! *:Èz!µ\ù;(U^Ò)a8ä(:Î'Çuy';**
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/0aa20a75bff4e8af10330c66d288e900146f1a39 b/test/core/nanopb/corpus_serverlist/0aa20a75bff4e8af10330c66d288e900146f1a39 new file mode 100644 index 0000000000..8d2d5e930c --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/0aa20a75bff4e8af10330c66d288e900146f1a39 @@ -0,0 +1 @@ +)*!B!Óà@'))ò);'Ç“¹¢ƒ§U)àB!B
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/0ae76e2b24ca999bd5e09e517aa4d88f5b5f58a4 b/test/core/nanopb/corpus_serverlist/0ae76e2b24ca999bd5e09e517aa4d88f5b5f58a4 new file mode 100644 index 0000000000..dd58fda983 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/0ae76e2b24ca999bd5e09e517aa4d88f5b5f58a4 @@ -0,0 +1 @@ +Á²•Wì:o#'*!@Á²²Wo:'Wo:::*')
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/0c3025fdfb008a6563ea2a2bb6cbc79b8ccbf8f3 b/test/core/nanopb/corpus_serverlist/0c3025fdfb008a6563ea2a2bb6cbc79b8ccbf8f3 new file mode 100644 index 0000000000..6ec1b09120 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/0c3025fdfb008a6563ea2a2bb6cbc79b8ccbf8f3 @@ -0,0 +1,2 @@ +Ų;IJ +UUú‰™( !MÁ²²²Á²
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/0d219165cd317142afa36b8b5476cc022c95c4e6 b/test/core/nanopb/corpus_serverlist/0d219165cd317142afa36b8b5476cc022c95c4e6 Binary files differnew file mode 100644 index 0000000000..6ac63d3f07 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/0d219165cd317142afa36b8b5476cc022c95c4e6 diff --git a/test/core/nanopb/corpus_serverlist/0e053123dd6256de5aff55b0731f913de250c18e b/test/core/nanopb/corpus_serverlist/0e053123dd6256de5aff55b0731f913de250c18e new file mode 100644 index 0000000000..b0f591e625 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/0e053123dd6256de5aff55b0731f913de250c18e @@ -0,0 +1,2 @@ +!' §'* É=Éÿ + '=ï!)
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/0e065f98325849ac05eed515865b33dba0264cd4 b/test/core/nanopb/corpus_serverlist/0e065f98325849ac05eed515865b33dba0264cd4 new file mode 100644 index 0000000000..220e90bc86 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/0e065f98325849ac05eed515865b33dba0264cd4 @@ -0,0 +1 @@ +!'*.*:*’P§
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/0e4ff715d491c9f0b471c400b71804739b6d400a b/test/core/nanopb/corpus_serverlist/0e4ff715d491c9f0b471c400b71804739b6d400a new file mode 100644 index 0000000000..c25468a02c --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/0e4ff715d491c9f0b471c400b71804739b6d400a @@ -0,0 +1,2 @@ +!¼+@oCÙ'–((!*Ú*'‚'*')!!¼;@oCÙ'–((!*Ú*''*' ! +’Œš;!x!(*(:)ÞNËš
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/0ec94942046cd7e00bc058204c1d046075ca9531 b/test/core/nanopb/corpus_serverlist/0ec94942046cd7e00bc058204c1d046075ca9531 new file mode 100644 index 0000000000..0184c3cbea --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/0ec94942046cd7e00bc058204c1d046075ca9531 @@ -0,0 +1 @@ +ȯõÜ!:)'*l:*\!D)…');ȯõÜ!WѯÈѯ2Ü:!:*ò)!D\õ*:l)…');W‘¯õÈѯÜ
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/0f0e8da530eb8c924cee6985d9c3dfd93274ef8c b/test/core/nanopb/corpus_serverlist/0f0e8da530eb8c924cee6985d9c3dfd93274ef8c new file mode 100644 index 0000000000..d49c2cac93 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/0f0e8da530eb8c924cee6985d9c3dfd93274ef8c @@ -0,0 +1 @@ +'P:*!/!;'Ù*;kÜ*!'l;À‚°Q'(¼ã:)'*î#â;+Ç»(›²(«;w'!*
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/0ff365225c981d74b89499d1e708684ed4d0b570 b/test/core/nanopb/corpus_serverlist/0ff365225c981d74b89499d1e708684ed4d0b570 new file mode 100644 index 0000000000..101f136836 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/0ff365225c981d74b89499d1e708684ed4d0b570 @@ -0,0 +1,2 @@ +!]!à +!ØØìƽ÷ìƽ‰÷( )!!;n(!!
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/113b1efff1677c1b9a24f89aec0c3ecc228ddf62 b/test/core/nanopb/corpus_serverlist/113b1efff1677c1b9a24f89aec0c3ecc228ddf62 new file mode 100644 index 0000000000..2ed09e89af --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/113b1efff1677c1b9a24f89aec0c3ecc228ddf62 @@ -0,0 +1,2 @@ +)'Û¦)U!a Øç•ÏøÉÿ×' É=Éÿ +'!pÉ)='!'ïïÉ=ÿ'):(:
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/11697d621eab6743ba22715722d5b23830b79075 b/test/core/nanopb/corpus_serverlist/11697d621eab6743ba22715722d5b23830b79075 new file mode 100644 index 0000000000..afbff8383a --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/11697d621eab6743ba22715722d5b23830b79075 @@ -0,0 +1 @@ +P:*:!/!;'Ù*;kÜ*!'l;À‚°Ê'¼Q:)'*;#+âîÇ»(›²(«;w'!*!J;Ó**)))r
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/12463318b795c756f389bc0fb1cca9645eafef28 b/test/core/nanopb/corpus_serverlist/12463318b795c756f389bc0fb1cca9645eafef28 new file mode 100644 index 0000000000..1d5fe161df --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/12463318b795c756f389bc0fb1cca9645eafef28 @@ -0,0 +1 @@ +!)fB!(j)ò !)!Z!'!*M)!:“ ó'ØH(ã‰T('¯fBÒ!û)
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/12784250cf16ec999529f601ae5c5798e853d34a b/test/core/nanopb/corpus_serverlist/12784250cf16ec999529f601ae5c5798e853d34a new file mode 100644 index 0000000000..f38c8f1588 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/12784250cf16ec999529f601ae5c5798e853d34a @@ -0,0 +1 @@ +2;ò•:.<ý:*::ƒž*Š):’ªÜ:ô(ã**!'dv!*!”¾(;'**W›!Øâ(!;;:/*f§¨Ça°î
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/13122d08c1cee0dae6434605917d4cc6d8ea8cc5 b/test/core/nanopb/corpus_serverlist/13122d08c1cee0dae6434605917d4cc6d8ea8cc5 new file mode 100644 index 0000000000..110037ce5b --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/13122d08c1cee0dae6434605917d4cc6d8ea8cc5 @@ -0,0 +1 @@ +'=ï!)**Í(()#õhÕ|'µ)T;“Õq£!(Sª!*(*(4!;)*A!+*'§:*Ò;µk;'¢Ãp*!¿)
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/148a1118649dd8aa9b4ed778efdf7c1611aa5d27 b/test/core/nanopb/corpus_serverlist/148a1118649dd8aa9b4ed778efdf7c1611aa5d27 Binary files differnew file mode 100644 index 0000000000..f13399b1b0 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/148a1118649dd8aa9b4ed778efdf7c1611aa5d27 diff --git a/test/core/nanopb/corpus_serverlist/15dea2bb5fb36a3dd5172796da66a821a32918e7 b/test/core/nanopb/corpus_serverlist/15dea2bb5fb36a3dd5172796da66a821a32918e7 new file mode 100644 index 0000000000..c88bba5209 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/15dea2bb5fb36a3dd5172796da66a821a32918e7 @@ -0,0 +1,2 @@ +! +(!Øìƽ‰÷(!)!°S::Ô`…¶(!q"!½!€e&@n;*'Un)))
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/16488fe15a7e33cb41f2b7c159c99154464b3fd3 b/test/core/nanopb/corpus_serverlist/16488fe15a7e33cb41f2b7c159c99154464b3fd3 new file mode 100644 index 0000000000..ae939a0498 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/16488fe15a7e33cb41f2b7c159c99154464b3fd3 @@ -0,0 +1 @@ +²U
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/1870a48a3c9c1dd9027cbd85beb503b43cff6e89 b/test/core/nanopb/corpus_serverlist/1870a48a3c9c1dd9027cbd85beb503b43cff6e89 new file mode 100644 index 0000000000..74a76f5105 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/1870a48a3c9c1dd9027cbd85beb503b43cff6e89 @@ -0,0 +1,2 @@ +!¼+@kCÙ'–((!*Ú*'‚'*')!)(;!x!(*:)ÞyËNœ“) +:)I*ô):()”o:;©'(*(;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/1900b6a9123667a79020319aa7fd54d230bc7073 b/test/core/nanopb/corpus_serverlist/1900b6a9123667a79020319aa7fd54d230bc7073 new file mode 100644 index 0000000000..3f1e26b38c --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/1900b6a9123667a79020319aa7fd54d230bc7073 @@ -0,0 +1,2 @@ +)'Û¦)U!a Øç•ÏøÉÿ×' É=Éÿ +'!I)='!'ïïÉ=ÿ'):(:
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/1a000f1cbccd2ab6f7e623e015ed2e84284c9dbf b/test/core/nanopb/corpus_serverlist/1a000f1cbccd2ab6f7e623e015ed2e84284c9dbf new file mode 100644 index 0000000000..1ae57306e8 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/1a000f1cbccd2ab6f7e623e015ed2e84284c9dbf @@ -0,0 +1,2 @@ +Á²•Wo:'ì*#!@ +Á²:*²ò):)Áü²²²Å;;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/1c1d403f6175d52ac4430d1ef2401b549761707e b/test/core/nanopb/corpus_serverlist/1c1d403f6175d52ac4430d1ef2401b549761707e Binary files differnew file mode 100644 index 0000000000..9d25e355b1 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/1c1d403f6175d52ac4430d1ef2401b549761707e diff --git a/test/core/nanopb/corpus_serverlist/1c2ae0e1915e18dffc2215e9121f1afe0e4335c4 b/test/core/nanopb/corpus_serverlist/1c2ae0e1915e18dffc2215e9121f1afe0e4335c4 new file mode 100644 index 0000000000..ead5846073 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/1c2ae0e1915e18dffc2215e9121f1afe0e4335c4 @@ -0,0 +1,3 @@ +!¼+@oCÙ'–((!*Ú*'‚'*') +!!'@¼CoÙ;–((!*Ú*''*' ! +’š;!x!(*(:)ÞNËš
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/1c5d2eef52426db9d0842f3d57b27a219434c512 b/test/core/nanopb/corpus_serverlist/1c5d2eef52426db9d0842f3d57b27a219434c512 new file mode 100644 index 0000000000..266ade1bbf --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/1c5d2eef52426db9d0842f3d57b27a219434c512 @@ -0,0 +1 @@ +P²²
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/1d0676867c1ebce84531035fa7eb86ed00762df5 b/test/core/nanopb/corpus_serverlist/1d0676867c1ebce84531035fa7eb86ed00762df5 new file mode 100644 index 0000000000..d502f61401 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/1d0676867c1ebce84531035fa7eb86ed00762df5 @@ -0,0 +1 @@ + !É=Éÿ'!
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/1d92b263fa70450b0d0aeb81bf5d2f69eefbbd99 b/test/core/nanopb/corpus_serverlist/1d92b263fa70450b0d0aeb81bf5d2f69eefbbd99 new file mode 100644 index 0000000000..40ecfd3903 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/1d92b263fa70450b0d0aeb81bf5d2f69eefbbd99 @@ -0,0 +1 @@ +!!Øìƽ÷(!)!5Sã::Ô`…¶8!q"€'!@ne½!;*'Un)))
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/1e843ed4864d6a808b671dd6769ae191ac8a13ad b/test/core/nanopb/corpus_serverlist/1e843ed4864d6a808b671dd6769ae191ac8a13ad new file mode 100644 index 0000000000..4379eead8a --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/1e843ed4864d6a808b671dd6769ae191ac8a13ad @@ -0,0 +1 @@ + É=Éÿ'!
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/1eb06a34ee568d584c4b33472788889bc68af3f5 b/test/core/nanopb/corpus_serverlist/1eb06a34ee568d584c4b33472788889bc68af3f5 new file mode 100644 index 0000000000..7bb8d454a3 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/1eb06a34ee568d584c4b33472788889bc68af3f5 @@ -0,0 +1,3 @@ +' É=Éÿ + '=ï!)**Í(()#õhÕ|'µ)É=É'! +É)ÿT=
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/2169c2b4d560d74a5487df68b56f3af1d648f544 b/test/core/nanopb/corpus_serverlist/2169c2b4d560d74a5487df68b56f3af1d648f544 new file mode 100644 index 0000000000..055390eda2 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/2169c2b4d560d74a5487df68b56f3af1d648f544 @@ -0,0 +1 @@ +ȯõÜ!:)'*l:*\!D)…');ȯõÜ!WѯõÈѯ1Ü:!:*ò)!D\õ*:l)…');WѯõÈѯ4Ü
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/21f8f7583e58c1c81a3ac8237b5fa58071edf8a4 b/test/core/nanopb/corpus_serverlist/21f8f7583e58c1c81a3ac8237b5fa58071edf8a4 new file mode 100644 index 0000000000..0549191756 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/21f8f7583e58c1c81a3ac8237b5fa58071edf8a4 @@ -0,0 +1 @@ +)'Û¦)U!a Øç•ÏøÉÿ×É=*
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/231e348407fdcb14412c691b0b20982940160ccd b/test/core/nanopb/corpus_serverlist/231e348407fdcb14412c691b0b20982940160ccd new file mode 100644 index 0000000000..5ce84e476d --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/231e348407fdcb14412c691b0b20982940160ccd @@ -0,0 +1 @@ +'!=ï'o)**Í(()#õhÕ|(µ)T;“Õ²Wo:'*()@!½()(!('(
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/27b8f060e3296eaef77dcdd4c2cd11d5650604ac b/test/core/nanopb/corpus_serverlist/27b8f060e3296eaef77dcdd4c2cd11d5650604ac new file mode 100644 index 0000000000..f82d1f9f07 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/27b8f060e3296eaef77dcdd4c2cd11d5650604ac @@ -0,0 +1,2 @@ +Ų;Ų +UõUú‰Ù( (Ų;²UUú‰*Ų;ÙU²Å(Ž²'Ö!…z%)#€
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/28ed3a797da3c48c309a4ef792147f3c56cfec40 b/test/core/nanopb/corpus_serverlist/28ed3a797da3c48c309a4ef792147f3c56cfec40 new file mode 100644 index 0000000000..f46d387bf9 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/28ed3a797da3c48c309a4ef792147f3c56cfec40 @@ -0,0 +1 @@ +(
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/291fcc6e043942638fa3c865c0a1be5e4dcc0e70 b/test/core/nanopb/corpus_serverlist/291fcc6e043942638fa3c865c0a1be5e4dcc0e70 new file mode 100644 index 0000000000..58aebd93b0 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/291fcc6e043942638fa3c865c0a1be5e4dcc0e70 @@ -0,0 +1,2 @@ +! +!Øìƽ‰÷(!)!0S::Ô`…¶(!q"!½!€e&@n;*'Un)))
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/2a7f6c1f8fdc090b24ceb90ab4f3a7b331c06c86 b/test/core/nanopb/corpus_serverlist/2a7f6c1f8fdc090b24ceb90ab4f3a7b331c06c86 new file mode 100644 index 0000000000..0fa7c0c086 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/2a7f6c1f8fdc090b24ceb90ab4f3a7b331c06c86 @@ -0,0 +1,2 @@ +! +!Øìƽ÷(!)!5Sã::Ô`…¶(!q"€'!@ne½!;*'Un)))
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/2b85f180fe56f84925b274819ce10a8972a594e7 b/test/core/nanopb/corpus_serverlist/2b85f180fe56f84925b274819ce10a8972a594e7 new file mode 100644 index 0000000000..f3078cebf1 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/2b85f180fe56f84925b274819ce10a8972a594e7 @@ -0,0 +1 @@ +Z!!Î!*M)!:“(ó'ØH(;ã‰T('¯Ò'û);<''šŸÐ*ÿÙÎ!Ë;;:t:t*(Œò8.€¨(;ñ!!
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/2dea73d7d10ba0dcfd103f7542bdf7458e772b2b b/test/core/nanopb/corpus_serverlist/2dea73d7d10ba0dcfd103f7542bdf7458e772b2b new file mode 100644 index 0000000000..e7381b05d8 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/2dea73d7d10ba0dcfd103f7542bdf7458e772b2b @@ -0,0 +1 @@ +Á²•Wo:'ì*#!@ å*)Á²²Wo:'Wo*'!@*()*()@)(!:)Áü²²²(!'
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/2e9c19f98ef88b83ec2dea8b1b7f92b8337f757b b/test/core/nanopb/corpus_serverlist/2e9c19f98ef88b83ec2dea8b1b7f92b8337f757b new file mode 100644 index 0000000000..56a0cc33bd --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/2e9c19f98ef88b83ec2dea8b1b7f92b8337f757b @@ -0,0 +1 @@ +)::(:P:*/!;;'Ù*©;k:°
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/2fbd59ffb74aba392b86f4fe2ff8067b6d45cce8 b/test/core/nanopb/corpus_serverlist/2fbd59ffb74aba392b86f4fe2ff8067b6d45cce8 new file mode 100644 index 0000000000..659d7e733e --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/2fbd59ffb74aba392b86f4fe2ff8067b6d45cce8 @@ -0,0 +1,3 @@ +! +!(Øƽ÷(!)!:5ã:S! +sèÔ`…!ØìƽÂ÷(!
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/31059c32ea28d37b7442f51b20e966665662783c b/test/core/nanopb/corpus_serverlist/31059c32ea28d37b7442f51b20e966665662783c new file mode 100644 index 0000000000..9ce0e277d9 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/31059c32ea28d37b7442f51b20e966665662783c @@ -0,0 +1 @@ +²²Wo:'Wo:'*()@!½(*()@)(!(!'
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/31f78e35feb36037864df5f8f47136f8e6e4768a b/test/core/nanopb/corpus_serverlist/31f78e35feb36037864df5f8f47136f8e6e4768a new file mode 100644 index 0000000000..e19d8d2687 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/31f78e35feb36037864df5f8f47136f8e6e4768a @@ -0,0 +1,2 @@ +!à + ØØìƽ÷ìƽ‰÷ )!!;n(!!
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/326d322d1aa31696a14518830e544770f12146ee b/test/core/nanopb/corpus_serverlist/326d322d1aa31696a14518830e544770f12146ee Binary files differnew file mode 100644 index 0000000000..da53230fe9 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/326d322d1aa31696a14518830e544770f12146ee diff --git a/test/core/nanopb/corpus_serverlist/337df26552e0884ff133cc1be8e72020be38f457 b/test/core/nanopb/corpus_serverlist/337df26552e0884ff133cc1be8e72020be38f457 new file mode 100644 index 0000000000..d139d04dd8 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/337df26552e0884ff133cc1be8e72020be38f457 @@ -0,0 +1 @@ +ȯõÜ!:)'*l:*\!D)…')È;¯õÜ!WѯõÈѯ1Ü:!:*ò)!D\
*:l)…');WѯõÈѯÔ
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/33a2a0aa86956097e034b5ee16aeceacee7efc34 b/test/core/nanopb/corpus_serverlist/33a2a0aa86956097e034b5ee16aeceacee7efc34 new file mode 100644 index 0000000000..897ad4b10a --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/33a2a0aa86956097e034b5ee16aeceacee7efc34 @@ -0,0 +1,2 @@ +Á²•Wo:'ì*#!@:*):)Áü²²²Å;;! +²Áƒ'’²
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/33d175d1ecb3a85be7dd93d24efc3ddda0a85ad6 b/test/core/nanopb/corpus_serverlist/33d175d1ecb3a85be7dd93d24efc3ddda0a85ad6 new file mode 100644 index 0000000000..447cb5ac04 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/33d175d1ecb3a85be7dd93d24efc3ddda0a85ad6 @@ -0,0 +1 @@ +Á²²²²Wo:'Wo:'*()@!½Wo:'(
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/3718a1b790db16bcfc4ec30691fab24ea7bb0b74 b/test/core/nanopb/corpus_serverlist/3718a1b790db16bcfc4ec30691fab24ea7bb0b74 new file mode 100644 index 0000000000..66abd73a26 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/3718a1b790db16bcfc4ec30691fab24ea7bb0b74 @@ -0,0 +1,3 @@ +!¼+@oCÙ'–((!*Ú*'‚'*') +!!¼;@oCÙ'–((!*Ú*''*' ! +’š;!x!(*(:)ÞNËš
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/37aa3946054035b712102a62b71c94747dfd1491 b/test/core/nanopb/corpus_serverlist/37aa3946054035b712102a62b71c94747dfd1491 new file mode 100644 index 0000000000..a679fb2c64 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/37aa3946054035b712102a62b71c94747dfd1491 @@ -0,0 +1,3 @@ +!¼;@oCÙ'–((!*Ú*'‚'*'((! š +;!x!(*:)ÞNË):y +œ“)I;ô):()”o:;©'(*(;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/37b697adc0708ad12e4ed7355f3f8fdf1b7919ca b/test/core/nanopb/corpus_serverlist/37b697adc0708ad12e4ed7355f3f8fdf1b7919ca new file mode 100644 index 0000000000..0a6988cfd7 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/37b697adc0708ad12e4ed7355f3f8fdf1b7919ca @@ -0,0 +1 @@ +2È;ò•:.<ý:*::ƒž*Š):’ªÜ:ô(ã**!'dv!*!”¾(;'**W›!Øâ(!;;:/*f§¨Ça°î
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/37bf4642c5e5a806e2042cdf5ead9bf3c97b9ac1 b/test/core/nanopb/corpus_serverlist/37bf4642c5e5a806e2042cdf5ead9bf3c97b9ac1 new file mode 100644 index 0000000000..3069505dea --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/37bf4642c5e5a806e2042cdf5ead9bf3c97b9ac1 @@ -0,0 +1,2 @@ +Ų;Ų +UõUú‰Ù( Ų;²UUú‰*Ų;²UÅÙ(Ž(²'Ö!…z%)#€
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/37d94ca6a20303389b35404f3dfd20aaa9ff0851 b/test/core/nanopb/corpus_serverlist/37d94ca6a20303389b35404f3dfd20aaa9ff0851 new file mode 100644 index 0000000000..1955fc98aa --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/37d94ca6a20303389b35404f3dfd20aaa9ff0851 @@ -0,0 +1 @@ +P:*!/!;'Ù*;kÜ*!'l;À‚°Q'ʼ:)'*î#â;+Ç»(›²(«;w'!*!J;Ó**ã)))r
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/39278604f6a1102366464bbe769ae846e542bc56 b/test/core/nanopb/corpus_serverlist/39278604f6a1102366464bbe769ae846e542bc56 new file mode 100644 index 0000000000..e1e6558427 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/39278604f6a1102366464bbe769ae846e542bc56 @@ -0,0 +1,2 @@ +!¼;@oCÙ'–(¾(!*Ú*''*' ! +’ȯõÜ!:)'*l:*\!D)…');š;!x!(*:)ÞNȯË
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/396b57d9a11a1b135e36ad266e155cc0c3b77d21 b/test/core/nanopb/corpus_serverlist/396b57d9a11a1b135e36ad266e155cc0c3b77d21 new file mode 100644 index 0000000000..b20c4d355b --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/396b57d9a11a1b135e36ad266e155cc0c3b77d21 @@ -0,0 +1,2 @@ +!)fBB!(@)ò û!!'!*M)!:“(ó'1 +)fØH(ã‰T('¯Ò''û);<'BB!(@
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/39a49db120a807fe4e80c502254a5009625c7599 b/test/core/nanopb/corpus_serverlist/39a49db120a807fe4e80c502254a5009625c7599 new file mode 100644 index 0000000000..ea066369be --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/39a49db120a807fe4e80c502254a5009625c7599 @@ -0,0 +1 @@ +!)fBB!(@)ò Z!!'!*M)!:“(ó'ØH(ã‰T('¯Ò'û);<''šŸÐ*“¢ƒÿ§'à
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/39f04d1c6d4beefa3e3d6eae3a5317d969787055 b/test/core/nanopb/corpus_serverlist/39f04d1c6d4beefa3e3d6eae3a5317d969787055 new file mode 100644 index 0000000000..a0ea7a3d50 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/39f04d1c6d4beefa3e3d6eae3a5317d969787055 @@ -0,0 +1,3 @@ +!!à +!Ø +Øìƽ÷ìƽ‰÷( )!!;n(!!
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/3b199b80209fa0b8ffedba4381019f8729cc09d6 b/test/core/nanopb/corpus_serverlist/3b199b80209fa0b8ffedba4381019f8729cc09d6 new file mode 100644 index 0000000000..382928e077 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/3b199b80209fa0b8ffedba4381019f8729cc09d6 @@ -0,0 +1 @@ +È2ò;•È;."ò:•
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/3ccf7ffb96c3e4789409db33cc12bfd8ddc24c1a b/test/core/nanopb/corpus_serverlist/3ccf7ffb96c3e4789409db33cc12bfd8ddc24c1a new file mode 100644 index 0000000000..e8d3a078f6 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/3ccf7ffb96c3e4789409db33cc12bfd8ddc24c1a @@ -0,0 +1 @@ +?P:*!/!;'Š*'kÜš!'l;À‚°Q'ʼ:)'*î#â;+Ç»((²›«;w'!*!J;Ó**ã)))r
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/3d04382d1fe11ff3b717100aece7f9eff2d04b9b b/test/core/nanopb/corpus_serverlist/3d04382d1fe11ff3b717100aece7f9eff2d04b9b new file mode 100644 index 0000000000..fd14f42b5c --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/3d04382d1fe11ff3b717100aece7f9eff2d04b9b @@ -0,0 +1,4 @@ +! +!(Øƽ÷(!)!:5ã:S! + +èÔ`…!ØìƽÂ÷(!
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/3d4eb9f836bb40cf4c734073bcba8b73e4cc93ae b/test/core/nanopb/corpus_serverlist/3d4eb9f836bb40cf4c734073bcba8b73e4cc93ae new file mode 100644 index 0000000000..fdf49e4d0d --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/3d4eb9f836bb40cf4c734073bcba8b73e4cc93ae @@ -0,0 +1 @@ +'
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/41dc8c55e41d32c30865f9761931ddd4c5b740f8 b/test/core/nanopb/corpus_serverlist/41dc8c55e41d32c30865f9761931ddd4c5b740f8 new file mode 100644 index 0000000000..20387ccea0 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/41dc8c55e41d32c30865f9761931ddd4c5b740f8 @@ -0,0 +1 @@ +Á²²Wo:Wo:'*()@½(()@)(!(¡
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/41ef7b74d212f8f7f6681edcffd0db719030d31d b/test/core/nanopb/corpus_serverlist/41ef7b74d212f8f7f6681edcffd0db719030d31d new file mode 100644 index 0000000000..bea906721f --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/41ef7b74d212f8f7f6681edcffd0db719030d31d @@ -0,0 +1 @@ +Á²²Wo:'ì*'!@:(:Á*():)Á| ²²Á²²Wo:'ì*'!@*(Á*²
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/431187b5926fa7d0823305a9f87635616ea3ef27 b/test/core/nanopb/corpus_serverlist/431187b5926fa7d0823305a9f87635616ea3ef27 Binary files differnew file mode 100644 index 0000000000..c735a4b212 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/431187b5926fa7d0823305a9f87635616ea3ef27 diff --git a/test/core/nanopb/corpus_serverlist/44c6da04b8378986721f7225e70a1514695c176c b/test/core/nanopb/corpus_serverlist/44c6da04b8378986721f7225e70a1514695c176c new file mode 100644 index 0000000000..0b54830897 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/44c6da04b8378986721f7225e70a1514695c176c @@ -0,0 +1 @@ +)*!B!Óà@'))ò);'Ç“¹¢ƒ§U)àB!U)B!B!à@)ò);'Çþ“¢ƒ§'à@*::sEBD
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/450161236e37a1dfc0da6398c4876df82ff640ac b/test/core/nanopb/corpus_serverlist/450161236e37a1dfc0da6398c4876df82ff640ac new file mode 100644 index 0000000000..5f8fe62f79 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/450161236e37a1dfc0da6398c4876df82ff640ac @@ -0,0 +1 @@ +ȯõÜ!:)'*l:*\!D)…');WѯõÈѯ2Ü!:òõ
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/45257a176ca6a05ec65a6df430bbb6b85d0a676f b/test/core/nanopb/corpus_serverlist/45257a176ca6a05ec65a6df430bbb6b85d0a676f new file mode 100644 index 0000000000..9e49f15c5b --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/45257a176ca6a05ec65a6df430bbb6b85d0a676f @@ -0,0 +1,2 @@ +²Wo:'*()@!½()(!('((Š—;ž' +ý;œ¯C:'((½!D’'*c¸L™'!;±N!’K1!(:Íâ*
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/46d1c2f2edcc9cdc0d1698fa0c8853cb19a6e7d9 b/test/core/nanopb/corpus_serverlist/46d1c2f2edcc9cdc0d1698fa0c8853cb19a6e7d9 new file mode 100644 index 0000000000..61465c5ab0 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/46d1c2f2edcc9cdc0d1698fa0c8853cb19a6e7d9 @@ -0,0 +1 @@ +'=ï!)**Í(()#õhÕ|'µ)T;“Õq£!(Sª=ï!)!***Í(()
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/4764bd4297bf0c405348d2bb87b8fbc02beadcb8 b/test/core/nanopb/corpus_serverlist/4764bd4297bf0c405348d2bb87b8fbc02beadcb8 new file mode 100644 index 0000000000..6b6a461645 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/4764bd4297bf0c405348d2bb87b8fbc02beadcb8 @@ -0,0 +1,2 @@ +É)='!'ïïÁ²•Wo:'ì*#!@ +*Á'½²:²ò!):)Á'ï!)**ü²²²(
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/48199bfd0e2c160f56d03e881bb5dfe276eec462 b/test/core/nanopb/corpus_serverlist/48199bfd0e2c160f56d03e881bb5dfe276eec462 new file mode 100644 index 0000000000..81567063a5 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/48199bfd0e2c160f56d03e881bb5dfe276eec462 @@ -0,0 +1,2 @@ +! +!Øìƽ÷(!)!5Sã::Ô`…¶(!p"€'!@ne½!;*'Un))!)
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/48e865c56e8db13640d6ecbfc0f2486eb77e07d1 b/test/core/nanopb/corpus_serverlist/48e865c56e8db13640d6ecbfc0f2486eb77e07d1 new file mode 100644 index 0000000000..521f510217 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/48e865c56e8db13640d6ecbfc0f2486eb77e07d1 @@ -0,0 +1,2 @@ +Á²•Wo:'ì*#!@ +*(Á²:²ò):)Áü²²²Å;;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/499b003b8b98edd9dbe2668c8c6af948769d7e87 b/test/core/nanopb/corpus_serverlist/499b003b8b98edd9dbe2668c8c6af948769d7e87 new file mode 100644 index 0000000000..766b50447e --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/499b003b8b98edd9dbe2668c8c6af948769d7e87 @@ -0,0 +1 @@ +È;ò2È;ò•:.•
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/4a55591c4b390c5a36cecc6f1b6f5105300b546b b/test/core/nanopb/corpus_serverlist/4a55591c4b390c5a36cecc6f1b6f5105300b546b new file mode 100644 index 0000000000..14be25cd2a --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/4a55591c4b390c5a36cecc6f1b6f5105300b546b @@ -0,0 +1 @@ + '!†É=Éÿm'!
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/4d33f97ec69c64e14dcf205be36a6319ddb8a20d b/test/core/nanopb/corpus_serverlist/4d33f97ec69c64e14dcf205be36a6319ddb8a20d new file mode 100644 index 0000000000..f06ce525a0 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/4d33f97ec69c64e14dcf205be36a6319ddb8a20d @@ -0,0 +1 @@ + Ų;²UU'ú‰(Ž'Ö Å²;;²U!Uú‰Ù(Ž'Ö!…!…z%z%
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/4dbfb08904739928e19c2f459040b35ac410f699 b/test/core/nanopb/corpus_serverlist/4dbfb08904739928e19c2f459040b35ac410f699 new file mode 100644 index 0000000000..c56ae6408b --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/4dbfb08904739928e19c2f459040b35ac410f699 @@ -0,0 +1,3 @@ +!¼;@oCÙ'–((!*Ú*'‚'*') +!((š;!x!(*:)ÞNË):y +œ“)I;ô):()”o:;©'(*(;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/501bd6fe1de2719cf8d2c517a071e5d883fbe766 b/test/core/nanopb/corpus_serverlist/501bd6fe1de2719cf8d2c517a071e5d883fbe766 new file mode 100644 index 0000000000..677eff207f --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/501bd6fe1de2719cf8d2c517a071e5d883fbe766 @@ -0,0 +1 @@ +Á²•Wo:'ì*#!@ å*²)²ÁWo:'Wo*'!@*()*()Á@()):ü!²;²²(!'
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/5208871ea8948223b64b304336cea41ac3240244 b/test/core/nanopb/corpus_serverlist/5208871ea8948223b64b304336cea41ac3240244 new file mode 100644 index 0000000000..695b70164b --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/5208871ea8948223b64b304336cea41ac3240244 @@ -0,0 +1 @@ +Á²•Wo:'ì*#!@ 'Á²²:*)Á²²Wo²:'W
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/5348c71be34967458403bd4b58bb2a8a744d35ee b/test/core/nanopb/corpus_serverlist/5348c71be34967458403bd4b58bb2a8a744d35ee new file mode 100644 index 0000000000..0b0ec9c184 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/5348c71be34967458403bd4b58bb2a8a744d35ee @@ -0,0 +1 @@ +!)fBB!(@)ò 'Z!!Î!*M)!:“(ó'ØH(ã‰T('¯Ò'û);<''šŸÐ*“¢ƒÿ§'à
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/54362c2f6965268d0835a992c3ba656171b8f044 b/test/core/nanopb/corpus_serverlist/54362c2f6965268d0835a992c3ba656171b8f044 new file mode 100644 index 0000000000..3f69098868 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/54362c2f6965268d0835a992c3ba656171b8f044 @@ -0,0 +1,4 @@ +! +!(Øƽ÷(!)!:5ãS: + +!èÔ`…!ØìƽÂ÷(!
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/54411aa13f6d9118028171935322bbbc74c15329 b/test/core/nanopb/corpus_serverlist/54411aa13f6d9118028171935322bbbc74c15329 new file mode 100644 index 0000000000..488ceb99af --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/54411aa13f6d9118028171935322bbbc74c15329 @@ -0,0 +1,2 @@ +Ų;Ų +UUú‰Ù( ÅÁ²²²²²;²UW
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/54c50af22d147f192918499b4b3819eb389468a4 b/test/core/nanopb/corpus_serverlist/54c50af22d147f192918499b4b3819eb389468a4 new file mode 100644 index 0000000000..ad654dd7b3 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/54c50af22d147f192918499b4b3819eb389468a4 @@ -0,0 +1 @@ +Á²²Wo'ì*'!@:(:Á*r):)Á|
²²Á²²Wo:'ì*'!@*(Á*²
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/55441aac903d96b36bf8a11bc804234bcf0c04da b/test/core/nanopb/corpus_serverlist/55441aac903d96b36bf8a11bc804234bcf0c04da new file mode 100644 index 0000000000..13c4013143 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/55441aac903d96b36bf8a11bc804234bcf0c04da @@ -0,0 +1 @@ +É='!'ïï½
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/56e1a7c279482a57fcbca43468df96a791ee22b4 b/test/core/nanopb/corpus_serverlist/56e1a7c279482a57fcbca43468df96a791ee22b4 new file mode 100644 index 0000000000..6612943d3c --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/56e1a7c279482a57fcbca43468df96a791ee22b4 @@ -0,0 +1 @@ +!)fBB!(@)òÎ;!!Z'!*M)!:“(ó'ØH(ã‰T('¯Ò'û);<''šŸÐ*“¢ƒÿ§'à
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/57cbea7c563d5c4b6b290271b0009c3f348d92da b/test/core/nanopb/corpus_serverlist/57cbea7c563d5c4b6b290271b0009c3f348d92da new file mode 100644 index 0000000000..969aafa6b8 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/57cbea7c563d5c4b6b290271b0009c3f348d92da @@ -0,0 +1,2 @@ +!í!;:n!@"P^ +;;(!!ð!':;!+P:y5ua;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/57e11c7a62f0fc807d7b51bb1ef0f0e22f43795b b/test/core/nanopb/corpus_serverlist/57e11c7a62f0fc807d7b51bb1ef0f0e22f43795b new file mode 100644 index 0000000000..630d756320 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/57e11c7a62f0fc807d7b51bb1ef0f0e22f43795b @@ -0,0 +1,3 @@ +!¼;@oCÙ'–((!*Ú*''*' ! +’š;!x!(*:)ÞNË):y +œ“)I)?ô)):(”o:;©'(*(;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/585183c1a240df6926689fe1bd8cb434664db4d8 b/test/core/nanopb/corpus_serverlist/585183c1a240df6926689fe1bd8cb434664db4d8 new file mode 100644 index 0000000000..08579d170b --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/585183c1a240df6926689fe1bd8cb434664db4d8 @@ -0,0 +1 @@ +!)fBB!(j)ò !Z!'!*M)!:“(ó'ØH(ã‰T('¯Ò'û);<''šŸÐ*“¢ƒÿ§'à
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/5b2ee8ca40508bf108a729dcb228191670ec34d6 b/test/core/nanopb/corpus_serverlist/5b2ee8ca40508bf108a729dcb228191670ec34d6 new file mode 100644 index 0000000000..c46daca443 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/5b2ee8ca40508bf108a729dcb228191670ec34d6 @@ -0,0 +1 @@ + Ų;²UUú‰Ù(Ž'Ö!…z%)#€!*º*)Á²²W:
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/5b47eabaf74479348fd0318f174d649dbe96e7d2 b/test/core/nanopb/corpus_serverlist/5b47eabaf74479348fd0318f174d649dbe96e7d2 new file mode 100644 index 0000000000..7a1285cc99 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/5b47eabaf74479348fd0318f174d649dbe96e7d2 @@ -0,0 +1,2 @@ +Ų;Ų +UõUú‰Ù( Ų;²UUú‰Ù(Ž
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/5ba93c9db0cff93f52b521d7420e43f6eda2784f b/test/core/nanopb/corpus_serverlist/5ba93c9db0cff93f52b521d7420e43f6eda2784f Binary files differnew file mode 100644 index 0000000000..f76dd238ad --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/5ba93c9db0cff93f52b521d7420e43f6eda2784f diff --git a/test/core/nanopb/corpus_serverlist/5cc827e33932ccf8c72c6a839074e856d93463d8 b/test/core/nanopb/corpus_serverlist/5cc827e33932ccf8c72c6a839074e856d93463d8 new file mode 100644 index 0000000000..9eb493504f --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/5cc827e33932ccf8c72c6a839074e856d93463d8 @@ -0,0 +1 @@ +²²'
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/5cc89bbf687f94ff87241a8f935905e1c441de33 b/test/core/nanopb/corpus_serverlist/5cc89bbf687f94ff87241a8f935905e1c441de33 new file mode 100644 index 0000000000..f8de668293 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/5cc89bbf687f94ff87241a8f935905e1c441de33 @@ -0,0 +1,3 @@ +)'Û¦)U!a Øç•ÏøÉÿ×' É=Éÿ +'! +É)='!'ïïÉ=ÿ'):(:
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/5ec6596f12462fe9f36924c262f97408b54bbba8 b/test/core/nanopb/corpus_serverlist/5ec6596f12462fe9f36924c262f97408b54bbba8 new file mode 100644 index 0000000000..448ce08280 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/5ec6596f12462fe9f36924c262f97408b54bbba8 @@ -0,0 +1,3 @@ +! +!;n!@"!;n!P^*;;(!!;ð!':;!+P:@"P^*;;(!!y0ua;) +;ð!'::
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/5f8f3af69295223fb04c37d28035bb75b4cbd705 b/test/core/nanopb/corpus_serverlist/5f8f3af69295223fb04c37d28035bb75b4cbd705 new file mode 100644 index 0000000000..a47eac7694 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/5f8f3af69295223fb04c37d28035bb75b4cbd705 @@ -0,0 +1,2 @@ +1 +*)fBB!(@)ò 'Z!!Î!*M)!:“(ó'ØHã(‰T('¯Ò'û);<'šŸÐ*“ƒÿ§'à
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/5fd76d48b9fefecbdabd4511decc161b25db79dd b/test/core/nanopb/corpus_serverlist/5fd76d48b9fefecbdabd4511decc161b25db79dd new file mode 100644 index 0000000000..676bb61bf8 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/5fd76d48b9fefecbdabd4511decc161b25db79dd @@ -0,0 +1,2 @@ +! +!Ø(ƽ÷(!)!5Sã::Ô`…¶(!p"€'!@ne½!;*'Un!)!)
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/614cf839ccac2d896d61a0ba0ab1f42b2fabafea b/test/core/nanopb/corpus_serverlist/614cf839ccac2d896d61a0ba0ab1f42b2fabafea new file mode 100644 index 0000000000..b0173a33a8 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/614cf839ccac2d896d61a0ba0ab1f42b2fabafea @@ -0,0 +1 @@ +
É=ÿ'É'!
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/618305cc2d3d3814d78b77ffbf421b769bd862cf b/test/core/nanopb/corpus_serverlist/618305cc2d3d3814d78b77ffbf421b769bd862cf new file mode 100644 index 0000000000..3f2ea6e771 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/618305cc2d3d3814d78b77ffbf421b769bd862cf @@ -0,0 +1,2 @@ +Á²•Wo:'ì*#!@ +*Á²:²ò):)Áü²²²Å;;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/61dfcd913c4f0a8d005bd089c34e95d8dbbf1897 b/test/core/nanopb/corpus_serverlist/61dfcd913c4f0a8d005bd089c34e95d8dbbf1897 new file mode 100644 index 0000000000..63ca029c2b --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/61dfcd913c4f0a8d005bd089c34e95d8dbbf1897 @@ -0,0 +1 @@ +!;!
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/65a89e10aab00039680e1f7d014737b634c74d8d b/test/core/nanopb/corpus_serverlist/65a89e10aab00039680e1f7d014737b634c74d8d new file mode 100644 index 0000000000..17f6f3ee20 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/65a89e10aab00039680e1f7d014737b634c74d8d @@ -0,0 +1 @@ +Èѯõ2Ü!:ò
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/66a273dbf5e37410efd45518a42b06a65cffe1f0 b/test/core/nanopb/corpus_serverlist/66a273dbf5e37410efd45518a42b06a65cffe1f0 new file mode 100644 index 0000000000..92b830ed36 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/66a273dbf5e37410efd45518a42b06a65cffe1f0 @@ -0,0 +1,3 @@ +' É=Éÿ +'! +É)='!'ïï'½=ï!)**Í
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/673ff0de0702e8098892060a5365c175d8ef18fc b/test/core/nanopb/corpus_serverlist/673ff0de0702e8098892060a5365c175d8ef18fc new file mode 100644 index 0000000000..e26a533f65 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/673ff0de0702e8098892060a5365c175d8ef18fc @@ -0,0 +1 @@ + ')'Û)'Û¦)U!a¦)U!a!†Éÿm' Øç•ÏøÉ=*×Éÿ Øç•!Ï
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/68465c782c37bfdd98ac493b0458444bb94336e5 b/test/core/nanopb/corpus_serverlist/68465c782c37bfdd98ac493b0458444bb94336e5 new file mode 100644 index 0000000000..5b0075ec1f --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/68465c782c37bfdd98ac493b0458444bb94336e5 @@ -0,0 +1,2 @@ +Ų;Ų +UõUú‰Ù( ÅÕ²;²UŲ
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/688451dee13d0be420598c6e205a3bc419173e18 b/test/core/nanopb/corpus_serverlist/688451dee13d0be420598c6e205a3bc419173e18 new file mode 100644 index 0000000000..b5ea767f3f --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/688451dee13d0be420598c6e205a3bc419173e18 @@ -0,0 +1 @@ +!)fBB!à@)ò ;'Ç“¢ƒ§'à@*:s:ED'tÂ'–!();!)*!)
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/68a1d9150e1380c219e0a1deb3993f321e000ecd b/test/core/nanopb/corpus_serverlist/68a1d9150e1380c219e0a1deb3993f321e000ecd new file mode 100644 index 0000000000..b331f3c629 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/68a1d9150e1380c219e0a1deb3993f321e000ecd @@ -0,0 +1,2 @@ +Á²•Wo:'ì*#!@:(:Á*):)Á|²²²Á;;!' +²Áƒ'’²
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/69f49bf7ae8886f5b4c6296fdb1c570256919604 b/test/core/nanopb/corpus_serverlist/69f49bf7ae8886f5b4c6296fdb1c570256919604 new file mode 100644 index 0000000000..8a353676dc --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/69f49bf7ae8886f5b4c6296fdb1c570256919604 @@ -0,0 +1,2 @@ +É)='!'ïïÁ•Wo:'ì*#!@ +*'Á²:½²ò!):)Á'ï!)**ü²²²(
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/6a425f414cd69ffffdbaa34d03eb43841b432e11 b/test/core/nanopb/corpus_serverlist/6a425f414cd69ffffdbaa34d03eb43841b432e11 new file mode 100644 index 0000000000..53f8bd4b45 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/6a425f414cd69ffffdbaa34d03eb43841b432e11 @@ -0,0 +1 @@ +:Á²²
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/6ca9e6e85f9b007a0920b0112decbd1403d506da b/test/core/nanopb/corpus_serverlist/6ca9e6e85f9b007a0920b0112decbd1403d506da new file mode 100644 index 0000000000..155a67f496 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/6ca9e6e85f9b007a0920b0112decbd1403d506da @@ -0,0 +1 @@ +U)B!B!à@)ò);'Çþ“¢ƒ§'à@*::sED'tÂ'–!();!)'²;(N);)&ÑÅvŠÅ™:
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/6cd62e3d67b4154639adbe753115bfdd770edddb b/test/core/nanopb/corpus_serverlist/6cd62e3d67b4154639adbe753115bfdd770edddb new file mode 100644 index 0000000000..9a301480ab --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/6cd62e3d67b4154639adbe753115bfdd770edddb @@ -0,0 +1 @@ + '=ï!)**Í(()#õhÕ|'µ)É=ÉÿT
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/6d4f2de4cc427417d6335ff5396ea2588509bb5b b/test/core/nanopb/corpus_serverlist/6d4f2de4cc427417d6335ff5396ea2588509bb5b new file mode 100644 index 0000000000..8e780ed660 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/6d4f2de4cc427417d6335ff5396ea2588509bb5b @@ -0,0 +1,2 @@ +Á²•W:'ì*#!@ +*:Á(²:²òD:)Áü²°²Å;;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/6ea84030dd0b5b03e4720c244ea8b4ec65e1f236 b/test/core/nanopb/corpus_serverlist/6ea84030dd0b5b03e4720c244ea8b4ec65e1f236 new file mode 100644 index 0000000000..53cb812e1b --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/6ea84030dd0b5b03e4720c244ea8b4ec65e1f236 @@ -0,0 +1 @@ +Ų;Ų‘UõUú‰Ù(Ų;²UUú‰*Ų;²HÅÙ(Ž(²'Ö…!z%)#€
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/710c1fc8cf7dc1386312c34de5057933fcf868b3 b/test/core/nanopb/corpus_serverlist/710c1fc8cf7dc1386312c34de5057933fcf868b3 new file mode 100644 index 0000000000..770e2ed725 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/710c1fc8cf7dc1386312c34de5057933fcf868b3 @@ -0,0 +1,2 @@ +! +Øìƽ÷(!)2;ò•:!.
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/720e81dcaf83f867288a90293c5de3b088d5c556 b/test/core/nanopb/corpus_serverlist/720e81dcaf83f867288a90293c5de3b088d5c556 new file mode 100644 index 0000000000..623ad37091 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/720e81dcaf83f867288a90293c5de3b088d5c556 @@ -0,0 +1 @@ +!)fBB!(@)ò 'Z!!Î!*M)!:“(ó'ØH(ã‰T('¯Ò'û);<''šŸÐ*“¢ƒÿ§'à
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/72cdc8f78ab5237f96ed354264c726ac79ec429c b/test/core/nanopb/corpus_serverlist/72cdc8f78ab5237f96ed354264c726ac79ec429c new file mode 100644 index 0000000000..a8237837ba --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/72cdc8f78ab5237f96ed354264c726ac79ec429c @@ -0,0 +1 @@ +):(:P:*!/!;·'Ù*©;k°
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/73535a4f7af7e4c6aa23556cacd63f6929ac33fe b/test/core/nanopb/corpus_serverlist/73535a4f7af7e4c6aa23556cacd63f6929ac33fe new file mode 100644 index 0000000000..ee7c14dcd2 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/73535a4f7af7e4c6aa23556cacd63f6929ac33fe @@ -0,0 +1 @@ +ȯõÜ!:)'*l:*\!D)…');ȯõÜ!WѯõÈѯ1Ü:!:*ò)!D\*:l)…');WѯõÈѯÔ
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/73d7b933a5673a4d6f5905006ef6266dda1e4fba b/test/core/nanopb/corpus_serverlist/73d7b933a5673a4d6f5905006ef6266dda1e4fba Binary files differnew file mode 100644 index 0000000000..3887fa0bfa --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/73d7b933a5673a4d6f5905006ef6266dda1e4fba diff --git a/test/core/nanopb/corpus_serverlist/753aea13c82d1f8841c2bd4309b1b55d0ae2ba8d b/test/core/nanopb/corpus_serverlist/753aea13c82d1f8841c2bd4309b1b55d0ae2ba8d Binary files differnew file mode 100644 index 0000000000..05085ca8e0 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/753aea13c82d1f8841c2bd4309b1b55d0ae2ba8d diff --git a/test/core/nanopb/corpus_serverlist/754428e00e8a1d0471e00bd9e8f060ab88ab640e b/test/core/nanopb/corpus_serverlist/754428e00e8a1d0471e00bd9e8f060ab88ab640e new file mode 100644 index 0000000000..be9b4d5310 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/754428e00e8a1d0471e00bd9e8f060ab88ab640e @@ -0,0 +1 @@ + Ų;²UUú‰Ù(Ž'Ö!…z%)#€!*º*)Á²:
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/761c29151b23b4d14ce6261626641df1182f7a96 b/test/core/nanopb/corpus_serverlist/761c29151b23b4d14ce6261626641df1182f7a96 Binary files differnew file mode 100644 index 0000000000..6d91ac7425 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/761c29151b23b4d14ce6261626641df1182f7a96 diff --git a/test/core/nanopb/corpus_serverlist/7658451dd805f277a5b1c3d4065d752d2d8de5f4 b/test/core/nanopb/corpus_serverlist/7658451dd805f277a5b1c3d4065d752d2d8de5f4 new file mode 100644 index 0000000000..f8a1e6fc61 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/7658451dd805f277a5b1c3d4065d752d2d8de5f4 @@ -0,0 +1,2 @@ +¹! +!ÆìÆØØ!ì½÷(!)!5Sã::Ô`…¶8!q½÷(!"€')2;ò•:!!.
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/767e91cedcd9bc1bdac882acc34a53cc23cf4d02 b/test/core/nanopb/corpus_serverlist/767e91cedcd9bc1bdac882acc34a53cc23cf4d02 new file mode 100644 index 0000000000..1930875685 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/767e91cedcd9bc1bdac882acc34a53cc23cf4d02 @@ -0,0 +1 @@ +¯õÜ!:)'*l:*\!D)…');W''í;:!Z2(x;*!:))FÓ':ã);)!!:"]W;;-)(!!!!;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/77d3754bdd4ea358369c936ed36b974b4181f6ab b/test/core/nanopb/corpus_serverlist/77d3754bdd4ea358369c936ed36b974b4181f6ab new file mode 100644 index 0000000000..8eb2c96a96 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/77d3754bdd4ea358369c936ed36b974b4181f6ab @@ -0,0 +1 @@ +):(:P:*!/!;'Ù*©;k°
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/7a95295bebe6237f65deb15ffeccab22716d574d b/test/core/nanopb/corpus_serverlist/7a95295bebe6237f65deb15ffeccab22716d574d new file mode 100644 index 0000000000..a08ce91d9a --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/7a95295bebe6237f65deb15ffeccab22716d574d @@ -0,0 +1,2 @@ +Ų;IJ +UUú‰™( !MÁ²²²²;²²UW
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/7ad88b82e87fbfb3d4bddaa2f6e201a151e3a007 b/test/core/nanopb/corpus_serverlist/7ad88b82e87fbfb3d4bddaa2f6e201a151e3a007 new file mode 100644 index 0000000000..301079df15 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/7ad88b82e87fbfb3d4bddaa2f6e201a151e3a007 @@ -0,0 +1,3 @@ +¹! +!¹! +ØìÆ!ØìÆ!½÷
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/7b1010cc012e34af1d03e8845868ff0e1db3a601 b/test/core/nanopb/corpus_serverlist/7b1010cc012e34af1d03e8845868ff0e1db3a601 new file mode 100644 index 0000000000..dd19e2e834 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/7b1010cc012e34af1d03e8845868ff0e1db3a601 @@ -0,0 +1,3 @@ +! +!(Øƽ÷(!)!³:0ã:! +!(Øƽ÷(!
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/7d3ddbd11e82807321c9a53835ea897cf43aa7f2 b/test/core/nanopb/corpus_serverlist/7d3ddbd11e82807321c9a53835ea897cf43aa7f2 new file mode 100644 index 0000000000..99b53b2f37 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/7d3ddbd11e82807321c9a53835ea897cf43aa7f2 @@ -0,0 +1 @@ +Á²²Wo:'Wo:'*()@!½(*()@)(!(!'
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/7da9c5ab5f049da297b0f4c1322edd696202d02a b/test/core/nanopb/corpus_serverlist/7da9c5ab5f049da297b0f4c1322edd696202d02a new file mode 100644 index 0000000000..a9cba681c6 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/7da9c5ab5f049da297b0f4c1322edd696202d02a @@ -0,0 +1 @@ + Ų;²UUú‰Ù(Ž'Ö!…z%)#€!*º*)Á²²:
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/7e265a019c02e5d089152849ac00bb005fa644f5 b/test/core/nanopb/corpus_serverlist/7e265a019c02e5d089152849ac00bb005fa644f5 new file mode 100644 index 0000000000..b469075702 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/7e265a019c02e5d089152849ac00bb005fa644f5 @@ -0,0 +1,2 @@ +Á²²Wo:'ì*'!@:(Á*():)Á²²²(;(' +Á²²
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/7f33bff4f740eb898b908374b0c1badd47566947 b/test/core/nanopb/corpus_serverlist/7f33bff4f740eb898b908374b0c1badd47566947 new file mode 100644 index 0000000000..11b1d9b638 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/7f33bff4f740eb898b908374b0c1badd47566947 @@ -0,0 +1,2 @@ +Á²•Wo:'ì*#!@ +*Á²:²ò):)Áü²²²Å;;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/81f13b9b65891f2bfce77cb183a06045c461fee6 b/test/core/nanopb/corpus_serverlist/81f13b9b65891f2bfce77cb183a06045c461fee6 new file mode 100644 index 0000000000..1ed1faf7ca --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/81f13b9b65891f2bfce77cb183a06045c461fee6 @@ -0,0 +1 @@ +)Û¦¬)U!açØ•ÏøÉÿ×É=*
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/846a14a480ffa1ad0f6333f3ecf2be3057ce6aed b/test/core/nanopb/corpus_serverlist/846a14a480ffa1ad0f6333f3ecf2be3057ce6aed new file mode 100644 index 0000000000..b116189a84 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/846a14a480ffa1ad0f6333f3ecf2be3057ce6aed @@ -0,0 +1,2 @@ +! +!;Øì½÷(!)!5Sã::`…¶(!p½'e€n!@"!;*'Un))!)
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/87373a7f89feba2d50591b433f69877044155af2 b/test/core/nanopb/corpus_serverlist/87373a7f89feba2d50591b433f69877044155af2 new file mode 100644 index 0000000000..836f2deb5a --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/87373a7f89feba2d50591b433f69877044155af2 @@ -0,0 +1,2 @@ +!;n!@"P^*;;(!!;ð!':;!+P:y0ua;) +
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/8833ba4c780c94fc6c3c466f849c0387acefdb20 b/test/core/nanopb/corpus_serverlist/8833ba4c780c94fc6c3c466f849c0387acefdb20 new file mode 100644 index 0000000000..1c3f541403 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/8833ba4c780c94fc6c3c466f849c0387acefdb20 @@ -0,0 +1 @@ + Ų;²UUú‰Ù(Ž'Ö!…z%)#€!*º*)Á²²WÁ²²²²:Wo:'
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/8c23a5ecd20db4da2c061f3463254e9de104c8b9 b/test/core/nanopb/corpus_serverlist/8c23a5ecd20db4da2c061f3463254e9de104c8b9 new file mode 100644 index 0000000000..f7fa5a3424 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/8c23a5ecd20db4da2c061f3463254e9de104c8b9 @@ -0,0 +1 @@ +ÈѯõÈѯ2Ü!:òõ2Ü!:ò
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/8d883f1577ca8c334b7c6d75ccb71209d71ced13 b/test/core/nanopb/corpus_serverlist/8d883f1577ca8c334b7c6d75ccb71209d71ced13 new file mode 100644 index 0000000000..5a77f05831 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/8d883f1577ca8c334b7c6d75ccb71209d71ced13 @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/8dc80bd5f5d1fea64412203e304432edcf5f52c4 b/test/core/nanopb/corpus_serverlist/8dc80bd5f5d1fea64412203e304432edcf5f52c4 new file mode 100644 index 0000000000..c0942a6da4 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/8dc80bd5f5d1fea64412203e304432edcf5f52c4 @@ -0,0 +1,2 @@ +! +!Øìƽ‰÷(!)!0S::Ô`…¶(!q"€&!@ne½!;*'Un)))
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/8fc9a9ea6ad7d6d51e770076eaddacad9f970c6f b/test/core/nanopb/corpus_serverlist/8fc9a9ea6ad7d6d51e770076eaddacad9f970c6f new file mode 100644 index 0000000000..110407407f --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/8fc9a9ea6ad7d6d51e770076eaddacad9f970c6f @@ -0,0 +1,2 @@ +)'Û¦)U!a Øç•ÏøÉÿ×' É=Éÿ +'!É)='!'ïïÉ=ÿ'):(:
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/8fd167de17534776ef57aba2f27675789a11b8db b/test/core/nanopb/corpus_serverlist/8fd167de17534776ef57aba2f27675789a11b8db new file mode 100644 index 0000000000..34a190e56e --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/8fd167de17534776ef57aba2f27675789a11b8db @@ -0,0 +1,3 @@ +!¼;@oCÙ'–((!*Ú*'‚'*' !( +(š;!x!(*:)ÞNË):y +œ“)I;ô):()”o:;©'(*(;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/9117d3e51560813b3ce4615dced18fa0e4d0a25a b/test/core/nanopb/corpus_serverlist/9117d3e51560813b3ce4615dced18fa0e4d0a25a new file mode 100644 index 0000000000..620dc7e63a --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/9117d3e51560813b3ce4615dced18fa0e4d0a25a @@ -0,0 +1 @@ +2;ò•:.<ý:(*::ƒž*Š):’ªÜ(ô(ã*!*'dv!*!¾(;'**W›!Øâ(!;;:/*f§¨Ça°î
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/921c68eaa8776f7544e195ae52224355d08a2d4d b/test/core/nanopb/corpus_serverlist/921c68eaa8776f7544e195ae52224355d08a2d4d new file mode 100644 index 0000000000..3b35a5955e --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/921c68eaa8776f7544e195ae52224355d08a2d4d @@ -0,0 +1 @@ +)ÿ!B!Óà@')ò);'Ç“¹¢ƒ§U)àBuB
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/9293945411fca2dc81fc34b36b575a384e6d489e b/test/core/nanopb/corpus_serverlist/9293945411fca2dc81fc34b36b575a384e6d489e new file mode 100644 index 0000000000..4b3c2b43e7 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/9293945411fca2dc81fc34b36b575a384e6d489e @@ -0,0 +1 @@ +)*!B!Óà@'))ò);'Ç“¹¢ƒ§U)àB!B
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/933287d66c3ff3f0a21f2c583c763f2f65872ef8 b/test/core/nanopb/corpus_serverlist/933287d66c3ff3f0a21f2c583c763f2f65872ef8 new file mode 100644 index 0000000000..72152406a0 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/933287d66c3ff3f0a21f2c583c763f2f65872ef8 @@ -0,0 +1 @@ +Á²²²
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/933d1d91283403f0a56571f533f482e9744eb735 b/test/core/nanopb/corpus_serverlist/933d1d91283403f0a56571f533f482e9744eb735 new file mode 100644 index 0000000000..3a9610d7a9 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/933d1d91283403f0a56571f533f482e9744eb735 @@ -0,0 +1 @@ +)B!B!à@)ò);'Ç“¢ƒ§'à@*::sED'tÂ'–!();!
)*!)
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/93855fc41b3e3004ca6ba85f34b985042d4c9869 b/test/core/nanopb/corpus_serverlist/93855fc41b3e3004ca6ba85f34b985042d4c9869 new file mode 100644 index 0000000000..1afdd59512 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/93855fc41b3e3004ca6ba85f34b985042d4c9869 @@ -0,0 +1,2 @@ +Ų;Ų +UU¶‰Ù( !ÅÁ²(²²²²;²UW
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/9544f445c39470f05785b52cfc31bb73bda22659 b/test/core/nanopb/corpus_serverlist/9544f445c39470f05785b52cfc31bb73bda22659 new file mode 100644 index 0000000000..d0fc37bef1 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/9544f445c39470f05785b52cfc31bb73bda22659 @@ -0,0 +1,2 @@ +É='!'ïï½'#Ų;Ų +UÁ²•Wì:o#'*!@Á²²ÁÁ²²••®W:'ì*U¶
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/97757217fde05ff4fc15c864bf29e9f560fd1c62 b/test/core/nanopb/corpus_serverlist/97757217fde05ff4fc15c864bf29e9f560fd1c62 new file mode 100644 index 0000000000..47e8811539 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/97757217fde05ff4fc15c864bf29e9f560fd1c62 @@ -0,0 +1,2 @@ +! +h!Øìƽ÷(!)!2Sã::Ô`…¶(!q"€'!@ne½!;*'Un)))
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/9877c0f2d40dd43878bb0209bbc4b5fa93bec55a b/test/core/nanopb/corpus_serverlist/9877c0f2d40dd43878bb0209bbc4b5fa93bec55a new file mode 100644 index 0000000000..daf888f06d --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/9877c0f2d40dd43878bb0209bbc4b5fa93bec55a @@ -0,0 +1 @@ +!)fBB!(@)ò'Z!!Î!*M)!:“(ó'ØH(ã‰T('¯Ò'û);<''šŸÐ*“¢ƒÿ§'à
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/98bc5065f79dd9d20cdac14ba28f0cf39908cb5f b/test/core/nanopb/corpus_serverlist/98bc5065f79dd9d20cdac14ba28f0cf39908cb5f new file mode 100644 index 0000000000..09f3479547 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/98bc5065f79dd9d20cdac14ba28f0cf39908cb5f @@ -0,0 +1 @@ +‰É=ï!)**Í(()#õhÕ|T'µ)ÉT
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/992860817f7fb0e49423607355dab973aa7ab815 b/test/core/nanopb/corpus_serverlist/992860817f7fb0e49423607355dab973aa7ab815 new file mode 100644 index 0000000000..aaaec9489c --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/992860817f7fb0e49423607355dab973aa7ab815 @@ -0,0 +1 @@ +Éÿ):(:=P:*!/!;·'Ù*©';k°
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/995ee3d74bc6042fd6a8908c9df5a4cb530378d8 b/test/core/nanopb/corpus_serverlist/995ee3d74bc6042fd6a8908c9df5a4cb530378d8 new file mode 100644 index 0000000000..96e6a47863 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/995ee3d74bc6042fd6a8908c9df5a4cb530378d8 @@ -0,0 +1,2 @@ +'#Ų;Ų +UÁ²•Wì:o#'*!@Á²²ÁÁ²²••®W:'ì*U¶
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/9a38c24a6e87e99a72a3a4f007b117ec191a1705 b/test/core/nanopb/corpus_serverlist/9a38c24a6e87e99a72a3a4f007b117ec191a1705 new file mode 100644 index 0000000000..6ab64b7c7b --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/9a38c24a6e87e99a72a3a4f007b117ec191a1705 @@ -0,0 +1 @@ +ȯõÜ!:)'*l:*\!D)…');ȯõÜ!WѯõÈѯ1Ü!:ò:)'*l:*\!õD)…');WѯõÈѯ2Ü
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/9aa97a0ffcdc37a8ef487355fb7271eb6891deaa b/test/core/nanopb/corpus_serverlist/9aa97a0ffcdc37a8ef487355fb7271eb6891deaa new file mode 100644 index 0000000000..ab22206f3b --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/9aa97a0ffcdc37a8ef487355fb7271eb6891deaa @@ -0,0 +1,2 @@ +! +!;n!@"P^*;;(!!;ð!':;!+P:y0ua;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/9b9fddc17ed7bc05a81c18f01e800a4e9efd0c8d b/test/core/nanopb/corpus_serverlist/9b9fddc17ed7bc05a81c18f01e800a4e9efd0c8d new file mode 100644 index 0000000000..5d7be44537 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/9b9fddc17ed7bc05a81c18f01e800a4e9efd0c8d @@ -0,0 +1 @@ +!)gB!(j)ò !)!Z!'!!)*M)“ ó'ØH(ã‰T('fBÒ!û)
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/a0d4cb9a5a30bb01e8e4f68d636fb173632ed29d b/test/core/nanopb/corpus_serverlist/a0d4cb9a5a30bb01e8e4f68d636fb173632ed29d new file mode 100644 index 0000000000..4e38d90b27 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/a0d4cb9a5a30bb01e8e4f68d636fb173632ed29d @@ -0,0 +1 @@ +)'Û¦)U!a Øç•ÏøÉÿ×É=ÿ):(:=
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/a1e070288ec564d10a8c59779aa07fa771fa1d4f b/test/core/nanopb/corpus_serverlist/a1e070288ec564d10a8c59779aa07fa771fa1d4f new file mode 100644 index 0000000000..29b27976d8 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/a1e070288ec564d10a8c59779aa07fa771fa1d4f @@ -0,0 +1 @@ +Á²²Wo'ì*'!@:(:Á*r):)Á| ²²Á²²Wo:'ì*'!@*(Á*²
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/a23d10723415d20f4ef1ed9b14d9dc24494856a0 b/test/core/nanopb/corpus_serverlist/a23d10723415d20f4ef1ed9b14d9dc24494856a0 Binary files differnew file mode 100644 index 0000000000..e34e7f3409 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/a23d10723415d20f4ef1ed9b14d9dc24494856a0 diff --git a/test/core/nanopb/corpus_serverlist/a245750cfe4212dca7bfde918de85f64eb053232 b/test/core/nanopb/corpus_serverlist/a245750cfe4212dca7bfde918de85f64eb053232 new file mode 100644 index 0000000000..e33de0f1f0 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/a245750cfe4212dca7bfde918de85f64eb053232 @@ -0,0 +1 @@ +)'Û¦)U!a:Øç•Ïø×*;'e«:c6U’êNŠ'ò:;Æ)ÚrþP:*!!G*:'³*:Ï)ZÑSÒ!!]
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/a24bbe3600f4dfd61bb8415c6a291e0521e4f267 b/test/core/nanopb/corpus_serverlist/a24bbe3600f4dfd61bb8415c6a291e0521e4f267 new file mode 100644 index 0000000000..a387266411 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/a24bbe3600f4dfd61bb8415c6a291e0521e4f267 @@ -0,0 +1 @@ +V!;n)@"P^*;;(!*!
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/a25104d039a549c8d457ecea3b55369ed312f086 b/test/core/nanopb/corpus_serverlist/a25104d039a549c8d457ecea3b55369ed312f086 new file mode 100644 index 0000000000..a04856664d --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/a25104d039a549c8d457ecea3b55369ed312f086 @@ -0,0 +1,3 @@ +!¼+@oCÙ'–((!*Ú*'‚'*') +!(š(;!x!(*:)ÞNË):y +œ“)I;ô):()”o:;©'(*(;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/a33c4fcabe6aebe012cd01c8cb851a9ab0a12098 b/test/core/nanopb/corpus_serverlist/a33c4fcabe6aebe012cd01c8cb851a9ab0a12098 new file mode 100644 index 0000000000..4dbb720541 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/a33c4fcabe6aebe012cd01c8cb851a9ab0a12098 @@ -0,0 +1,3 @@ +!¼;@oCÙ'–((!*Ú*'‚'*') +!*š;!x!(*:)ÞNË):y +œ“)I;ô9;()”o:;©'(*(;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/a393e1727b0decca9f193179765c3a83d7096437 b/test/core/nanopb/corpus_serverlist/a393e1727b0decca9f193179765c3a83d7096437 new file mode 100644 index 0000000000..3cb479ca6b --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/a393e1727b0decca9f193179765c3a83d7096437 @@ -0,0 +1 @@ +)*!B!Óà@'))ò);'Ç“¢ƒ§à':E:@sD'tÂ'–!();! '³(N);)&
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/a5507f06be4735a3a9e416ea986d52c1a6a20909 b/test/core/nanopb/corpus_serverlist/a5507f06be4735a3a9e416ea986d52c1a6a20909 new file mode 100644 index 0000000000..e341f43b59 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/a5507f06be4735a3a9e416ea986d52c1a6a20909 @@ -0,0 +1 @@ +ȯõÜ!:)'*l:*\!D)…');ȯõÜ!WÑHÈѯ2Ü:!:*ò)!D\õ*:l)…');_‘õÈ'ѯÜ
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/a5adf028c902d17dd6a7ddeadabbed2b36420313 b/test/core/nanopb/corpus_serverlist/a5adf028c902d17dd6a7ddeadabbed2b36420313 new file mode 100644 index 0000000000..a4e17bc24f --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/a5adf028c902d17dd6a7ddeadabbed2b36420313 @@ -0,0 +1 @@ +ȯõÜ!:)'*l:*\!D)…');ȯõÜ!WѯõÈѯ1Ü:!:*ò)!D\õ*:l)…');WѯõÈѯÔ
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/a6aa1237a282ee3a93f2544bb6bb7704e565209e b/test/core/nanopb/corpus_serverlist/a6aa1237a282ee3a93f2544bb6bb7704e565209e Binary files differnew file mode 100644 index 0000000000..ea6e832a0e --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/a6aa1237a282ee3a93f2544bb6bb7704e565209e diff --git a/test/core/nanopb/corpus_serverlist/a871185cabce7b96c9e2f6ffb40d9901c774b335 b/test/core/nanopb/corpus_serverlist/a871185cabce7b96c9e2f6ffb40d9901c774b335 new file mode 100644 index 0000000000..dab50d7cab --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/a871185cabce7b96c9e2f6ffb40d9901c774b335 @@ -0,0 +1,2 @@ +Á²²Wo:'ì*'!@:(:Á*):)Á|²²²Á(;(' +²Á'’²
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/a89d0e67bf53e22533a635f103d1fd400969ad56 b/test/core/nanopb/corpus_serverlist/a89d0e67bf53e22533a635f103d1fd400969ad56 new file mode 100644 index 0000000000..fe069870a7 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/a89d0e67bf53e22533a635f103d1fd400969ad56 @@ -0,0 +1 @@ +Á²²Wo:'Wo*'!@*()*()@)(!(!'
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/a8d1b4e5672a501d7a6cd14b2929297f3a82e035 b/test/core/nanopb/corpus_serverlist/a8d1b4e5672a501d7a6cd14b2929297f3a82e035 new file mode 100644 index 0000000000..dfbbf33d58 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/a8d1b4e5672a501d7a6cd14b2929297f3a82e035 @@ -0,0 +1 @@ +'P:*!/!;'Ù*;k):(:P:*!/!Ü*;!'l;À‚°Q'(¼ã:'Ù*)'*î©;k#
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/aa614cc8d05a3a58c30a890c10b9a0c1d609b228 b/test/core/nanopb/corpus_serverlist/aa614cc8d05a3a58c30a890c10b9a0c1d609b228 new file mode 100644 index 0000000000..60e69d99e6 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/aa614cc8d05a3a58c30a890c10b9a0c1d609b228 @@ -0,0 +1 @@ + !†É=Éÿ'!
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/aa65320376f63805cc82b247612b2e05b87bdbee b/test/core/nanopb/corpus_serverlist/aa65320376f63805cc82b247612b2e05b87bdbee Binary files differnew file mode 100644 index 0000000000..9100de9953 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/aa65320376f63805cc82b247612b2e05b87bdbee diff --git a/test/core/nanopb/corpus_serverlist/abd3f6e2cc8887942de20e1c257427b825aed0ad b/test/core/nanopb/corpus_serverlist/abd3f6e2cc8887942de20e1c257427b825aed0ad new file mode 100644 index 0000000000..5cd8f7565e --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/abd3f6e2cc8887942de20e1c257427b825aed0ad @@ -0,0 +1,2 @@ +! +è!Øìƽ÷(!)!5Sã::Ô`…¶(!q"€'!@ne½!;*'Un)))
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/ad0653a3a63675a7ce797e69b4673866b88ace33 b/test/core/nanopb/corpus_serverlist/ad0653a3a63675a7ce797e69b4673866b88ace33 new file mode 100644 index 0000000000..03c166f0c3 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/ad0653a3a63675a7ce797e69b4673866b88ace33 @@ -0,0 +1,2 @@ +Ų;Ų +UõUú‰Ù( Ų;²UŲ
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/ae2ce27806f67312e0d0e29a492db9ab9cb9bf4e b/test/core/nanopb/corpus_serverlist/ae2ce27806f67312e0d0e29a492db9ab9cb9bf4e new file mode 100644 index 0000000000..4cfc263c4f --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/ae2ce27806f67312e0d0e29a492db9ab9cb9bf4e @@ -0,0 +1 @@ + '!I†Éÿm'!
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/ae4c0e671bd004165a1e7877d9c67249a165d2df b/test/core/nanopb/corpus_serverlist/ae4c0e671bd004165a1e7877d9c67249a165d2df new file mode 100644 index 0000000000..ddc80065d5 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/ae4c0e671bd004165a1e7877d9c67249a165d2df @@ -0,0 +1 @@ +)'Û¦)U!aØç•ÏøÉÿ×É=*
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/af75c24dff7e22948ed141c763a1309e6f540bcc b/test/core/nanopb/corpus_serverlist/af75c24dff7e22948ed141c763a1309e6f540bcc new file mode 100644 index 0000000000..cdbbf29406 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/af75c24dff7e22948ed141c763a1309e6f540bcc @@ -0,0 +1 @@ +`:`xŒV)ýÚ*)!Óx*'**‹;'(±DßP§Ü/!¯†nÃ!$—:a(j)*ƒ!'/**(ñå;îÄVÐ'*)*
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/b0f228c6d0cbbc9f10117f344d5aae6f001d00fa b/test/core/nanopb/corpus_serverlist/b0f228c6d0cbbc9f10117f344d5aae6f001d00fa new file mode 100644 index 0000000000..5c7579ee82 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/b0f228c6d0cbbc9f10117f344d5aae6f001d00fa @@ -0,0 +1,3 @@ +! +!(Øƽ÷(!)!:5ã:S! +èÔ`…!ØìƽÂ÷(!
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/b2c6eab05580b85cda591093d3f05c44bf453fce b/test/core/nanopb/corpus_serverlist/b2c6eab05580b85cda591093d3f05c44bf453fce Binary files differnew file mode 100644 index 0000000000..3d664774a7 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/b2c6eab05580b85cda591093d3f05c44bf453fce diff --git a/test/core/nanopb/corpus_serverlist/b35281c0aae174d1ddc8999d97b9713f8004f285 b/test/core/nanopb/corpus_serverlist/b35281c0aae174d1ddc8999d97b9713f8004f285 new file mode 100644 index 0000000000..d6a4f2a6a9 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/b35281c0aae174d1ddc8999d97b9713f8004f285 @@ -0,0 +1 @@ +!!;n!@"P^*;;(!!;ð!':;!+P:y0ua;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/b484ae40795cf9730ba94d5a4ca40aa47b88eacb b/test/core/nanopb/corpus_serverlist/b484ae40795cf9730ba94d5a4ca40aa47b88eacb new file mode 100644 index 0000000000..0b6485782c --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/b484ae40795cf9730ba94d5a4ca40aa47b88eacb @@ -0,0 +1,2 @@ +Ų;Ų +UU¶‰Ù( !ÅÁ²(²²²²;²UW
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/b49c2fed1417a981ba29b32be73ee1700bea7ec9 b/test/core/nanopb/corpus_serverlist/b49c2fed1417a981ba29b32be73ee1700bea7ec9 new file mode 100644 index 0000000000..aa3bcd17bd --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/b49c2fed1417a981ba29b32be73ee1700bea7ec9 @@ -0,0 +1 @@ +(‹
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/b68542373c05c0ed25231d09955b2c699d37c45b b/test/core/nanopb/corpus_serverlist/b68542373c05c0ed25231d09955b2c699d37c45b new file mode 100644 index 0000000000..050ac90ecb --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/b68542373c05c0ed25231d09955b2c699d37c45b @@ -0,0 +1 @@ +þ
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/b6d42cbe913f7275b574a71f0768781bdb6f45b7 b/test/core/nanopb/corpus_serverlist/b6d42cbe913f7275b574a71f0768781bdb6f45b7 new file mode 100644 index 0000000000..08dd3a3d07 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/b6d42cbe913f7275b574a71f0768781bdb6f45b7 @@ -0,0 +1 @@ +)B!B!à@)ò);'Çþ“¢ƒ§'à@*::sED'tÂ'–!();!)'²;(N);)&ÑÅvŠÅ™:
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/b80b6c2cae83c2097c7e4c1fb181d47cb8fd0519 b/test/core/nanopb/corpus_serverlist/b80b6c2cae83c2097c7e4c1fb181d47cb8fd0519 new file mode 100644 index 0000000000..c94bcd7537 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/b80b6c2cae83c2097c7e4c1fb181d47cb8fd0519 @@ -0,0 +1,2 @@ +1 +)fBB!(@)ò 'Z!!Î!*M)!:“(ó'ØHã(‰T('¯Ò'û);<'šŸÐ*“ƒÿ§'à
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/b90ab62d8591182fd90cd21cdb893178d97f7e0e b/test/core/nanopb/corpus_serverlist/b90ab62d8591182fd90cd21cdb893178d97f7e0e new file mode 100644 index 0000000000..c4462f3083 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/b90ab62d8591182fd90cd21cdb893178d97f7e0e @@ -0,0 +1 @@ +Øìƽ÷!;2(!);
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/ba45c93ee6b8b286798d8791ec049207c448f7cd b/test/core/nanopb/corpus_serverlist/ba45c93ee6b8b286798d8791ec049207c448f7cd new file mode 100644 index 0000000000..e9f2235113 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/ba45c93ee6b8b286798d8791ec049207c448f7cd @@ -0,0 +1 @@ +*Ã
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/ba67e81ef0f9a14bf5a1ca228bff87c681e83a44 b/test/core/nanopb/corpus_serverlist/ba67e81ef0f9a14bf5a1ca228bff87c681e83a44 new file mode 100644 index 0000000000..eeff9f440a --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/ba67e81ef0f9a14bf5a1ca228bff87c681e83a44 @@ -0,0 +1 @@ + Ų;²UUú‰Ù(Ž'Ö!…z%)€!*:')Á²²W:
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/bbd1f06ddee4fbbd0e5c9c915889862e5df34f9c b/test/core/nanopb/corpus_serverlist/bbd1f06ddee4fbbd0e5c9c915889862e5df34f9c new file mode 100644 index 0000000000..cb453432c9 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/bbd1f06ddee4fbbd0e5c9c915889862e5df34f9c @@ -0,0 +1 @@ +Á²•Wo:'ì*#!@*P; õú‰(Á²:²Ù
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/bd982feb5dd4362e6bd9746ed216c25ce2749df4 b/test/core/nanopb/corpus_serverlist/bd982feb5dd4362e6bd9746ed216c25ce2749df4 new file mode 100644 index 0000000000..fe76f8810e --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/bd982feb5dd4362e6bd9746ed216c25ce2749df4 @@ -0,0 +1 @@ +È.¯
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/be77053335e6496288fcf8b6c4d0b4abf86493ff b/test/core/nanopb/corpus_serverlist/be77053335e6496288fcf8b6c4d0b4abf86493ff new file mode 100644 index 0000000000..eaa7408ced --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/be77053335e6496288fcf8b6c4d0b4abf86493ff @@ -0,0 +1 @@ +!!;n!@"P^*;;(!!;ð!':;!+P:y0ua;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/bfb53203499969fac4f4be48e1bcd9235c2fa101 b/test/core/nanopb/corpus_serverlist/bfb53203499969fac4f4be48e1bcd9235c2fa101 new file mode 100644 index 0000000000..b28e40ea1e --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/bfb53203499969fac4f4be48e1bcd9235c2fa101 @@ -0,0 +1,2 @@ +Ų;Ų +UU¶‰Ù( !ÅÁ²²²²²;²UW
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/c143576bdb5b34ad89fa3319507ae382a721f587 b/test/core/nanopb/corpus_serverlist/c143576bdb5b34ad89fa3319507ae382a721f587 new file mode 100644 index 0000000000..6c15b37571 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/c143576bdb5b34ad89fa3319507ae382a721f587 @@ -0,0 +1 @@ +!)fBB!(@)òZ!!'!*M)!::“(ó'ØH(ã‰T('¯Ò'û);<''šŸÐ*“¢ƒÿ§'à
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/c1ac502a15c53a90a1934f4a31d30f93db36dc8a b/test/core/nanopb/corpus_serverlist/c1ac502a15c53a90a1934f4a31d30f93db36dc8a new file mode 100644 index 0000000000..d2e8bdbb3a --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/c1ac502a15c53a90a1934f4a31d30f93db36dc8a @@ -0,0 +1 @@ + É=Éÿ'!
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/c1b29883768551fa5aadc38ba6eaad8007b9b85b b/test/core/nanopb/corpus_serverlist/c1b29883768551fa5aadc38ba6eaad8007b9b85b new file mode 100644 index 0000000000..29c3b9f280 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/c1b29883768551fa5aadc38ba6eaad8007b9b85b @@ -0,0 +1,3 @@ +!¼;@oCÙ'–((!*Ú*'‚'*' +!((š;!x!(*:)ÞNË):y +œ“)I;ô):()”o:;©'(*(;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/c2331fe0660ab5e411f6d38968c706aed390d8f6 b/test/core/nanopb/corpus_serverlist/c2331fe0660ab5e411f6d38968c706aed390d8f6 new file mode 100644 index 0000000000..cd6e0b216f --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/c2331fe0660ab5e411f6d38968c706aed390d8f6 @@ -0,0 +1 @@ +É)='!'ïï'½=ï!)**Í(()#õhÕ|'µ)T;“Õq£!(Sª=ï!)!***Í
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/c32647119c244cc018bb1863853d5c7bd37090df b/test/core/nanopb/corpus_serverlist/c32647119c244cc018bb1863853d5c7bd37090df new file mode 100644 index 0000000000..07d457a146 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/c32647119c244cc018bb1863853d5c7bd37090df @@ -0,0 +1 @@ + É=Éÿ'!
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/c4098733900c27861bbf74a71afcbbd93d62f8ee b/test/core/nanopb/corpus_serverlist/c4098733900c27861bbf74a71afcbbd93d62f8ee new file mode 100644 index 0000000000..3e69c25dfc --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/c4098733900c27861bbf74a71afcbbd93d62f8ee @@ -0,0 +1,3 @@ +!¼;@oCÙ'–((!*Ú*'‚'*') +!(([;!x!(*:)ÞNË):y +œ“)I;ô):()”o:;©'(*(;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/c4f5769bf3b4f2a55c006b4cf5a3bba44b347241 b/test/core/nanopb/corpus_serverlist/c4f5769bf3b4f2a55c006b4cf5a3bba44b347241 new file mode 100644 index 0000000000..c42581a683 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/c4f5769bf3b4f2a55c006b4cf5a3bba44b347241 @@ -0,0 +1,2 @@ +Ų;IJ +UUú‰™( MÁ²²²Á²
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/c6ea7b2d47402a458d5d03235bb042b61e05b2e8 b/test/core/nanopb/corpus_serverlist/c6ea7b2d47402a458d5d03235bb042b61e05b2e8 new file mode 100644 index 0000000000..d5ca5ed55f --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/c6ea7b2d47402a458d5d03235bb042b61e05b2e8 @@ -0,0 +1 @@ + !!;n!@"P^*;;(!!;ð!':;!+P:y1ua;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/c7255dc48b42d44f6c0676d6009051b7e1aa885b b/test/core/nanopb/corpus_serverlist/c7255dc48b42d44f6c0676d6009051b7e1aa885b new file mode 100644 index 0000000000..c30d0581bf --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/c7255dc48b42d44f6c0676d6009051b7e1aa885b @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/c7d77af55176ae0ae5e59f46e48e1e6ea108d799 b/test/core/nanopb/corpus_serverlist/c7d77af55176ae0ae5e59f46e48e1e6ea108d799 Binary files differnew file mode 100644 index 0000000000..dd7d5d1622 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/c7d77af55176ae0ae5e59f46e48e1e6ea108d799 diff --git a/test/core/nanopb/corpus_serverlist/c80827341dcdf1c21b303b82ec7e6df7eaf63f3d b/test/core/nanopb/corpus_serverlist/c80827341dcdf1c21b303b82ec7e6df7eaf63f3d new file mode 100644 index 0000000000..dc882103be --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/c80827341dcdf1c21b303b82ec7e6df7eaf63f3d @@ -0,0 +1 @@ +)B!B!à@)ò);'Ç“¢ƒ§'à@::sED'tÂ'–!();! '³(N);)&ÑÅvŠÅ™:
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/c9501031a75c067b6602e2831f03421b87be4496 b/test/core/nanopb/corpus_serverlist/c9501031a75c067b6602e2831f03421b87be4496 new file mode 100644 index 0000000000..4c223e9298 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/c9501031a75c067b6602e2831f03421b87be4496 @@ -0,0 +1 @@ +'ÐB!à@)ò);'Ç“¢ƒ''*::sED'';B!à@)ò)t;'Ç“
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/c98f88d962dfbc2a83e08bfbd8a87b0cc5a8b330 b/test/core/nanopb/corpus_serverlist/c98f88d962dfbc2a83e08bfbd8a87b0cc5a8b330 new file mode 100644 index 0000000000..c1cf8591e0 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/c98f88d962dfbc2a83e08bfbd8a87b0cc5a8b330 @@ -0,0 +1 @@ +!)fBB!à@)ò ';'Ç“¢ƒ§'à@*:s:ED'tÂ'–!();!)*!O)
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/ccd33fa22b2983978f9617b3cde76ea05b683c2c b/test/core/nanopb/corpus_serverlist/ccd33fa22b2983978f9617b3cde76ea05b683c2c new file mode 100644 index 0000000000..47c119b175 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/ccd33fa22b2983978f9617b3cde76ea05b683c2c @@ -0,0 +1,3 @@ +!¼+@oCÙ'–((!*Ú*'‚'*' +!!'@¼CoÙ;–((!*Ú*''*' ! +’š;!x!(*(:)ÞNËš
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/cd0e7701fd79879c56f680817a0d2705751b1f44 b/test/core/nanopb/corpus_serverlist/cd0e7701fd79879c56f680817a0d2705751b1f44 new file mode 100644 index 0000000000..c42b7369d1 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/cd0e7701fd79879c56f680817a0d2705751b1f44 @@ -0,0 +1,2 @@ +Á²²Wo:'ì*'!@:(:Á*():)Á|²²²Á(;(' +²Á²’²
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/cd1c2b5c2684d831aab5265e9cd6f1ee045dab9b b/test/core/nanopb/corpus_serverlist/cd1c2b5c2684d831aab5265e9cd6f1ee045dab9b Binary files differnew file mode 100644 index 0000000000..42148d85a7 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/cd1c2b5c2684d831aab5265e9cd6f1ee045dab9b diff --git a/test/core/nanopb/corpus_serverlist/cf98e8b01e7a759f28a9c5f59c896317d74ac47c b/test/core/nanopb/corpus_serverlist/cf98e8b01e7a759f28a9c5f59c896317d74ac47c new file mode 100644 index 0000000000..5682057d45 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/cf98e8b01e7a759f28a9c5f59c896317d74ac47c @@ -0,0 +1,3 @@ +!¼;@oCÙ'–((!*Ú*'‚'*') +!((š;!x!(*:)ÞNË):y +œ“)I;ô):()”o:;©'(*(;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/d1d171589e035be85dc347278f0735151a342d68 b/test/core/nanopb/corpus_serverlist/d1d171589e035be85dc347278f0735151a342d68 new file mode 100644 index 0000000000..0542aaea6b --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/d1d171589e035be85dc347278f0735151a342d68 @@ -0,0 +1 @@ +
G!;n!@"P^*;;(';!ð:!;!!+P:y1ua;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/d243143bf9b8adf6be92a157428ec6cbfd785423 b/test/core/nanopb/corpus_serverlist/d243143bf9b8adf6be92a157428ec6cbfd785423 new file mode 100644 index 0000000000..693233c079 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/d243143bf9b8adf6be92a157428ec6cbfd785423 @@ -0,0 +1 @@ +Á²•Wì:o#'*!@Á²²ÁÁ²²••®W:'ì*
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/d2cd278979f2842ebd890f1d84712750273ad0fc b/test/core/nanopb/corpus_serverlist/d2cd278979f2842ebd890f1d84712750273ad0fc new file mode 100644 index 0000000000..b12dc953cb --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/d2cd278979f2842ebd890f1d84712750273ad0fc @@ -0,0 +1,2 @@ +!¼+@oCÙ'–((!*Ú*'‚'*')!(š(;!x!(*:)ÞNË):y +œ“)I*ô):()”o:;©'(*(;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/d2e96eb2699c7dd4a183f13d3a063a1aa9c192fd b/test/core/nanopb/corpus_serverlist/d2e96eb2699c7dd4a183f13d3a063a1aa9c192fd new file mode 100644 index 0000000000..59e8225aa5 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/d2e96eb2699c7dd4a183f13d3a063a1aa9c192fd @@ -0,0 +1 @@ +!!;n!@"P^*;;(!!;ð!':;!+P:y1ua;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/d3178f8b0d26275667c27bb8533a61643213e4d8 b/test/core/nanopb/corpus_serverlist/d3178f8b0d26275667c27bb8533a61643213e4d8 new file mode 100644 index 0000000000..b3d0493aac --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/d3178f8b0d26275667c27bb8533a61643213e4d8 @@ -0,0 +1,2 @@ +!¼+@oCÙ'–((!*Ú*'‚'*')!(š(;!x!(*:)ÞNË):y +œ“)I*ô:')”o:;©£(ª(;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/d46f536ea4b601c0ff313a5eb5b47e2b55aa9eb0 b/test/core/nanopb/corpus_serverlist/d46f536ea4b601c0ff313a5eb5b47e2b55aa9eb0 new file mode 100644 index 0000000000..59ecd84e9c --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/d46f536ea4b601c0ff313a5eb5b47e2b55aa9eb0 @@ -0,0 +1 @@ +É=ï!)**Í(()#õhÕ|T'µ)T;“Õq£!(SÀª=ï!)!***Í(()
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/d4be3038631eac422022ee23f43b47905a15b2b5 b/test/core/nanopb/corpus_serverlist/d4be3038631eac422022ee23f43b47905a15b2b5 new file mode 100644 index 0000000000..14ab54c959 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/d4be3038631eac422022ee23f43b47905a15b2b5 @@ -0,0 +1 @@ +'!=ï'o)**Í(()#hÕ|(µ)T;“Õ²Wo:'*()@!½()(!('(
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/d56b30a2d1b5a2a13ae00392bcb4ca72085310d9 b/test/core/nanopb/corpus_serverlist/d56b30a2d1b5a2a13ae00392bcb4ca72085310d9 new file mode 100644 index 0000000000..8c74e89f72 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/d56b30a2d1b5a2a13ae00392bcb4ca72085310d9 @@ -0,0 +1,2 @@ +Á²•Wo:'ì*#!@ +*P; õú‰(Á²:²Ù
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/d67f85948143218d11e2fb7936a119741036045d b/test/core/nanopb/corpus_serverlist/d67f85948143218d11e2fb7936a119741036045d new file mode 100644 index 0000000000..09d7d97cfd --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/d67f85948143218d11e2fb7936a119741036045d @@ -0,0 +1 @@ +)B!B!à@)ò);'Ç“¢ƒ§'à@*::sED'tÂ'–!();!)'²(N);)&ÑÅvŠÅ™:
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/d6930ea81dfd91856a06a0c16483e47616642b4b b/test/core/nanopb/corpus_serverlist/d6930ea81dfd91856a06a0c16483e47616642b4b new file mode 100644 index 0000000000..9f8cd3845c --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/d6930ea81dfd91856a06a0c16483e47616642b4b @@ -0,0 +1 @@ +U)
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/d737c10038a92add90e2ebea5c174ed249de8018 b/test/core/nanopb/corpus_serverlist/d737c10038a92add90e2ebea5c174ed249de8018 new file mode 100644 index 0000000000..41c37cb860 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/d737c10038a92add90e2ebea5c174ed249de8018 @@ -0,0 +1 @@ +)'Û¦)U!a Øç•ÏøÉ=*×Éÿ
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/d758a67f018b176dfc7d29630cf8cb587f5b2a6b b/test/core/nanopb/corpus_serverlist/d758a67f018b176dfc7d29630cf8cb587f5b2a6b new file mode 100644 index 0000000000..df361cb4cf --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/d758a67f018b176dfc7d29630cf8cb587f5b2a6b @@ -0,0 +1,2 @@ +Á²•Wo:'ì*#!@::*):)Áü²²²Á;;!' +²Áƒ'’²
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/dc7139105787f3ba67d7971d80796e9cf5786a91 b/test/core/nanopb/corpus_serverlist/dc7139105787f3ba67d7971d80796e9cf5786a91 new file mode 100644 index 0000000000..6f0d40ab0e --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/dc7139105787f3ba67d7971d80796e9cf5786a91 @@ -0,0 +1 @@ +Øìƽ÷(!)!5Sã::`…¶(!p½'e€*'U)))(:)婤;*:!p(È':Ö¶;óÑ))e¿);À';:µ
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/dc8ec35f43e994b9c4ac61275d6b934990d42181 b/test/core/nanopb/corpus_serverlist/dc8ec35f43e994b9c4ac61275d6b934990d42181 new file mode 100644 index 0000000000..e8bf4a9907 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/dc8ec35f43e994b9c4ac61275d6b934990d42181 @@ -0,0 +1,2 @@ +Á²•Wo:'ì*#!@:*):)Áü²²²Å;;! +²Áƒ'’²
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/dd2694fe12a018bc6af6f288b5c22a030eec8049 b/test/core/nanopb/corpus_serverlist/dd2694fe12a018bc6af6f288b5c22a030eec8049 Binary files differnew file mode 100644 index 0000000000..7646d3e729 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/dd2694fe12a018bc6af6f288b5c22a030eec8049 diff --git a/test/core/nanopb/corpus_serverlist/de7424f44508582a953f137195533b7a0191eda7 b/test/core/nanopb/corpus_serverlist/de7424f44508582a953f137195533b7a0191eda7 new file mode 100644 index 0000000000..988584a4a0 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/de7424f44508582a953f137195533b7a0191eda7 @@ -0,0 +1 @@ +)'Û¦)U!a Øç•ÏøÉÿ×=É*
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/de91a02040d792dfcb71a4cb5aa4c1c006201273 b/test/core/nanopb/corpus_serverlist/de91a02040d792dfcb71a4cb5aa4c1c006201273 new file mode 100644 index 0000000000..6119c72690 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/de91a02040d792dfcb71a4cb5aa4c1c006201273 @@ -0,0 +1 @@ +''=ï!)**Í(()#õhÕ|'µ)T;“Õq£!(Sª=ï!)!***Í(()
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/deb576067b11f6e2a3a39b0f2ef38ddae5c67b18 b/test/core/nanopb/corpus_serverlist/deb576067b11f6e2a3a39b0f2ef38ddae5c67b18 new file mode 100644 index 0000000000..6a960cdad7 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/deb576067b11f6e2a3a39b0f2ef38ddae5c67b18 @@ -0,0 +1 @@ +È2ò;•È;.ò:•
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/df58248c414f342c81e056b40bee12d17a08bf61 b/test/core/nanopb/corpus_serverlist/df58248c414f342c81e056b40bee12d17a08bf61 new file mode 100644 index 0000000000..f59ec20aab --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/df58248c414f342c81e056b40bee12d17a08bf61 @@ -0,0 +1 @@ +*
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/e076020b2826abd3a4b960fb33a35fd7d0606dd8 b/test/core/nanopb/corpus_serverlist/e076020b2826abd3a4b960fb33a35fd7d0606dd8 Binary files differnew file mode 100644 index 0000000000..2cf8f9709e --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/e076020b2826abd3a4b960fb33a35fd7d0606dd8 diff --git a/test/core/nanopb/corpus_serverlist/e0bcf682342967c002621acd2563a2157826d156 b/test/core/nanopb/corpus_serverlist/e0bcf682342967c002621acd2563a2157826d156 Binary files differnew file mode 100644 index 0000000000..d9c8b2de1b --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/e0bcf682342967c002621acd2563a2157826d156 diff --git a/test/core/nanopb/corpus_serverlist/e1edca08a7654b42a64647abb0e773eddddb580b b/test/core/nanopb/corpus_serverlist/e1edca08a7654b42a64647abb0e773eddddb580b new file mode 100644 index 0000000000..cb23b40471 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/e1edca08a7654b42a64647abb0e773eddddb580b @@ -0,0 +1,2 @@ +! +!;Øì½÷(!)!5Sã::`…¶(!p½'e€n!@"!;*'Un))!)
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/e2fa528289b5971f5b40b3687a2a6f0d17348de6 b/test/core/nanopb/corpus_serverlist/e2fa528289b5971f5b40b3687a2a6f0d17348de6 new file mode 100644 index 0000000000..d4224c766a --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/e2fa528289b5971f5b40b3687a2a6f0d17348de6 @@ -0,0 +1,2 @@ +! +!;Øìƽ÷(!)!5Sã::`…¶(!p½'e€n!@"!;*'Un))!)
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/e52af0ba8750572b98f3a8968de77811ddff0893 b/test/core/nanopb/corpus_serverlist/e52af0ba8750572b98f3a8968de77811ddff0893 new file mode 100644 index 0000000000..661acf33ce --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/e52af0ba8750572b98f3a8968de77811ddff0893 @@ -0,0 +1 @@ +Á²•W'oÁ²:'²WÁ²²Wo'ì*'!@:(:Á*r):)Á|²²Á²²W
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/e5a0f40647f805b5001645ce2d94505e72fa64f3 b/test/core/nanopb/corpus_serverlist/e5a0f40647f805b5001645ce2d94505e72fa64f3 new file mode 100644 index 0000000000..4da511f995 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/e5a0f40647f805b5001645ce2d94505e72fa64f3 @@ -0,0 +1,2 @@ +!à +!Øìƽ‰÷( )!!;n!@"P^*;;(!!;ð!':;!+!P:y0ua;5S::Ô`
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/e69762f0c6a2750c0b03503a6aec90ffc94bcb72 b/test/core/nanopb/corpus_serverlist/e69762f0c6a2750c0b03503a6aec90ffc94bcb72 new file mode 100644 index 0000000000..33344333ce --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/e69762f0c6a2750c0b03503a6aec90ffc94bcb72 @@ -0,0 +1 @@ +ZB!
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/e7064f0b80f61dbc65915311032d27baa569ae2a b/test/core/nanopb/corpus_serverlist/e7064f0b80f61dbc65915311032d27baa569ae2a new file mode 100644 index 0000000000..e8a0f87653 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/e7064f0b80f61dbc65915311032d27baa569ae2a @@ -0,0 +1 @@ +)
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/e863a4420854c36168d2b8dd39ce474ebe11cd26 b/test/core/nanopb/corpus_serverlist/e863a4420854c36168d2b8dd39ce474ebe11cd26 new file mode 100644 index 0000000000..9170f6c425 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/e863a4420854c36168d2b8dd39ce474ebe11cd26 @@ -0,0 +1 @@ +ÁÁ²²²
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/e8993f97bb9c83f87c64cfc429095eeaccf32953 b/test/core/nanopb/corpus_serverlist/e8993f97bb9c83f87c64cfc429095eeaccf32953 new file mode 100644 index 0000000000..4a284b5d79 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/e8993f97bb9c83f87c64cfc429095eeaccf32953 @@ -0,0 +1 @@ + Ų;ŲU!Uú‰Ù(Ž'Ö!…z%)V!*:')Á²²W:
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/e9875d9a54b3ebc57df4da886cd30a39252ac666 b/test/core/nanopb/corpus_serverlist/e9875d9a54b3ebc57df4da886cd30a39252ac666 new file mode 100644 index 0000000000..5fb45a749e --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/e9875d9a54b3ebc57df4da886cd30a39252ac666 @@ -0,0 +1,3 @@ +!;n!@"P^*;;(!!;ð!':;!+P:y0ua;) +:';ü': +;}!—£)®*)ô'Å–”':(!):!Fý
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/e98a9d92bbbac9b1e64c0641e967adebd681b2aa b/test/core/nanopb/corpus_serverlist/e98a9d92bbbac9b1e64c0641e967adebd681b2aa new file mode 100644 index 0000000000..3555391c7e --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/e98a9d92bbbac9b1e64c0641e967adebd681b2aa @@ -0,0 +1 @@ +ѯõ2ÜÈ!:ò
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/eb7c31f48c77b742fa29126ac78a2c06c41208e8 b/test/core/nanopb/corpus_serverlist/eb7c31f48c77b742fa29126ac78a2c06c41208e8 new file mode 100644 index 0000000000..db926fdf28 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/eb7c31f48c77b742fa29126ac78a2c06c41208e8 @@ -0,0 +1 @@ +²U—
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/ec174492517f988010ed3ddbd003cb388f477bb6 b/test/core/nanopb/corpus_serverlist/ec174492517f988010ed3ddbd003cb388f477bb6 new file mode 100644 index 0000000000..23b7293b43 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/ec174492517f988010ed3ddbd003cb388f477bb6 @@ -0,0 +1 @@ +U)B!à@
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/ec4d6a393be7ec80ccb8c531337a7fc3ef140e66 b/test/core/nanopb/corpus_serverlist/ec4d6a393be7ec80ccb8c531337a7fc3ef140e66 new file mode 100644 index 0000000000..6402f351e5 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/ec4d6a393be7ec80ccb8c531337a7fc3ef140e66 @@ -0,0 +1 @@ +)'Û¦)U!a !:Øç•ÏøÉ=×Éÿ
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/ecd40909ab5e2c61841d9fb95b8aacc87651100c b/test/core/nanopb/corpus_serverlist/ecd40909ab5e2c61841d9fb95b8aacc87651100c Binary files differnew file mode 100644 index 0000000000..f74e810957 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/ecd40909ab5e2c61841d9fb95b8aacc87651100c diff --git a/test/core/nanopb/corpus_serverlist/ed17c8ddb6cc8a0b653dc87aca999d31e80c781a b/test/core/nanopb/corpus_serverlist/ed17c8ddb6cc8a0b653dc87aca999d31e80c781a new file mode 100644 index 0000000000..359a2052a7 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/ed17c8ddb6cc8a0b653dc87aca999d31e80c781a @@ -0,0 +1 @@ +Ų;Ų‘UõUú‰Ù( Ų;²UUú‰*Ų;²UÅÙ(Ž(²'Ö!…z%)#€
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/ee0b476126bb1c2249b299323718ecef1250645e b/test/core/nanopb/corpus_serverlist/ee0b476126bb1c2249b299323718ecef1250645e new file mode 100644 index 0000000000..954e32c44d --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/ee0b476126bb1c2249b299323718ecef1250645e @@ -0,0 +1,2 @@ +¹! +!ØìÆ!Øìƽ÷(!)!5Sã::Ô`…¶8!q½÷(!"€')2;ò•:!!.
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/ee1fb6a0b4139c07f1cf6bce850eaac9a2db29ba b/test/core/nanopb/corpus_serverlist/ee1fb6a0b4139c07f1cf6bce850eaac9a2db29ba new file mode 100644 index 0000000000..5611bc559f --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/ee1fb6a0b4139c07f1cf6bce850eaac9a2db29ba @@ -0,0 +1 @@ +!)fBB!(@)ò 'ÇZ!!Î!*M)!:“(ó'ØH(;ã‰T('¯Ò'û);<''šŸÐ*“¢ƒÿ§'à
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/eeac145c017ed35305f0ae69f820fc41e26e7997 b/test/core/nanopb/corpus_serverlist/eeac145c017ed35305f0ae69f820fc41e26e7997 new file mode 100644 index 0000000000..e20a603242 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/eeac145c017ed35305f0ae69f820fc41e26e7997 @@ -0,0 +1 @@ +'#9k;*;7»*)õ!!$*!H?*'›¼ßE ‹Í(±;o'*!:Ã:ÈŽ*;:ï%!)†!;*!tcÈ®:ˆ
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/efac7390c6e3a653d3ce93c3d6902f2f1c281ce0 b/test/core/nanopb/corpus_serverlist/efac7390c6e3a653d3ce93c3d6902f2f1c281ce0 new file mode 100644 index 0000000000..921afe43e1 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/efac7390c6e3a653d3ce93c3d6902f2f1c281ce0 @@ -0,0 +1 @@ +Á²•Wo:'ì*#!@ ':*)Á²²Wo:'Wo*'!@*()*()@)(!:)Áü²²²(!'
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/f0f0dace93d51cd8e045aeacca89424fc836eebc b/test/core/nanopb/corpus_serverlist/f0f0dace93d51cd8e045aeacca89424fc836eebc Binary files differnew file mode 100644 index 0000000000..74f82e6420 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/f0f0dace93d51cd8e045aeacca89424fc836eebc diff --git a/test/core/nanopb/corpus_serverlist/f3341b8cc55c0bb6e2d0a1f7f06d68e4f04057f5 b/test/core/nanopb/corpus_serverlist/f3341b8cc55c0bb6e2d0a1f7f06d68e4f04057f5 new file mode 100644 index 0000000000..aa1c2e7fac --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/f3341b8cc55c0bb6e2d0a1f7f06d68e4f04057f5 @@ -0,0 +1,2 @@ +Ų;Ų +UõUú‰Ù(
Ų;²UŲ
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/f59ff56e341b94f2bddfd718b48ae9ab1692d720 b/test/core/nanopb/corpus_serverlist/f59ff56e341b94f2bddfd718b48ae9ab1692d720 new file mode 100644 index 0000000000..8bc99b6b34 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/f59ff56e341b94f2bddfd718b48ae9ab1692d720 @@ -0,0 +1,2 @@ +Á²²Wo:'ì*'!@*(Á*()@)Á²²²(!(!' +Á²²ò
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/f5a1824b9fd9f124df8097017607bcfa00eccfce b/test/core/nanopb/corpus_serverlist/f5a1824b9fd9f124df8097017607bcfa00eccfce new file mode 100644 index 0000000000..a4cbfd6f60 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/f5a1824b9fd9f124df8097017607bcfa00eccfce @@ -0,0 +1,2 @@ +Á²²Wo:'ì*'!@:(:Á*():)Á|²²Á(;(' +²Á²’²
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/f5b92b69853a5d123bffdc6b0ab093f767ec30ad b/test/core/nanopb/corpus_serverlist/f5b92b69853a5d123bffdc6b0ab093f767ec30ad Binary files differnew file mode 100644 index 0000000000..10b6509813 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/f5b92b69853a5d123bffdc6b0ab093f767ec30ad diff --git a/test/core/nanopb/corpus_serverlist/f6aea4c380e41ddef2489ee581ab35e17fa3e8dd b/test/core/nanopb/corpus_serverlist/f6aea4c380e41ddef2489ee581ab35e17fa3e8dd new file mode 100644 index 0000000000..9f4d9356f4 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/f6aea4c380e41ddef2489ee581ab35e17fa3e8dd @@ -0,0 +1,2 @@ +Ų;IJ +UUú‰™( MÁ²²²²;²²UW
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/f7b7254a3af7c41cb86e4b23bb93c5a6d55e2583 b/test/core/nanopb/corpus_serverlist/f7b7254a3af7c41cb86e4b23bb93c5a6d55e2583 new file mode 100644 index 0000000000..3085daf738 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/f7b7254a3af7c41cb86e4b23bb93c5a6d55e2583 @@ -0,0 +1 @@ +)*!B!Óà@'))ò);'Ç“¢ƒ§à:E:@sD'tÂ'–!();! ''³(N);)&
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/f7bdc1b174f53a49c6ef8f8cdb9b8e74e0a5d4ab b/test/core/nanopb/corpus_serverlist/f7bdc1b174f53a49c6ef8f8cdb9b8e74e0a5d4ab new file mode 100644 index 0000000000..1f4ca9584c --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/f7bdc1b174f53a49c6ef8f8cdb9b8e74e0a5d4ab @@ -0,0 +1,3 @@ +!¼;@oCÙ'–((!*Ú*'‚'*') +!*š;!x!(*:)ÞNË):y +œ“)I;ô9;()”o:;¨'¨*(;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/f98c78c028baf22f39c77faf6e70edb86ac1d927 b/test/core/nanopb/corpus_serverlist/f98c78c028baf22f39c77faf6e70edb86ac1d927 new file mode 100644 index 0000000000..a8a1af8075 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/f98c78c028baf22f39c77faf6e70edb86ac1d927 @@ -0,0 +1 @@ +ŲU
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/fb440171bca6ff922727e9ff2a4ac40d8d7905ff b/test/core/nanopb/corpus_serverlist/fb440171bca6ff922727e9ff2a4ac40d8d7905ff new file mode 100644 index 0000000000..681ba0ab80 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/fb440171bca6ff922727e9ff2a4ac40d8d7905ff @@ -0,0 +1 @@ +
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/fc76cc4030b422e4cb5c145c3e8ed122e242acf0 b/test/core/nanopb/corpus_serverlist/fc76cc4030b422e4cb5c145c3e8ed122e242acf0 new file mode 100644 index 0000000000..fde58537b0 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/fc76cc4030b422e4cb5c145c3e8ed122e242acf0 @@ -0,0 +1 @@ +!)fBB!(@)ò Z!!'!*M)!:“(ó'ØH(ã‰T('¯Ò'û);<''šŸÐ*“¢ƒÿ§'à
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/fcab3b80624b431e464dc12d3b6da1cf538bd15e b/test/core/nanopb/corpus_serverlist/fcab3b80624b431e464dc12d3b6da1cf538bd15e new file mode 100644 index 0000000000..690c0a1dda --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/fcab3b80624b431e464dc12d3b6da1cf538bd15e @@ -0,0 +1,2 @@ +! +)fBB!(@)ò 'Z!!Î!*M)!:“(ó'ØHã(‰T('¯Ò'û);<'šŸÐ*“<ƒÿ§'à
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/fdb3a9b59798d7e851d9074db69422b1d2df38dd b/test/core/nanopb/corpus_serverlist/fdb3a9b59798d7e851d9074db69422b1d2df38dd new file mode 100644 index 0000000000..adbe858903 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/fdb3a9b59798d7e851d9074db69422b1d2df38dd @@ -0,0 +1 @@ +È;2È;ò•òÈ;ò2
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/fe5de5f387e31b029d589d9b1777fd0d6b3e47b3 b/test/core/nanopb/corpus_serverlist/fe5de5f387e31b029d589d9b1777fd0d6b3e47b3 new file mode 100644 index 0000000000..83c20eec29 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/fe5de5f387e31b029d589d9b1777fd0d6b3e47b3 @@ -0,0 +1,3 @@ +!¼;@oCÙ'–((!*Ú*''*' ! +(š;!x!(*:)ÞNË):y +œ“)I?ô)):(”o:;©'(*(;
\ No newline at end of file diff --git a/test/core/nanopb/corpus_serverlist/ff52d938aaa10c08b2eb0830fc0066c3b57e040f b/test/core/nanopb/corpus_serverlist/ff52d938aaa10c08b2eb0830fc0066c3b57e040f Binary files differnew file mode 100644 index 0000000000..4975d72864 --- /dev/null +++ b/test/core/nanopb/corpus_serverlist/ff52d938aaa10c08b2eb0830fc0066c3b57e040f diff --git a/src/core/lib/client_config/subchannel_factory.c b/test/core/nanopb/fuzzer_response.c index 541368ec96..b4e386020a 100644 --- a/src/core/lib/client_config/subchannel_factory.c +++ b/test/core/nanopb/fuzzer_response.c @@ -1,6 +1,6 @@ /* * - * Copyright 2015, Google Inc. + * Copyright 2016, Google Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -31,19 +31,19 @@ * */ -#include "src/core/lib/client_config/subchannel_factory.h" +#include <stdint.h> +#include <string.h> -void grpc_subchannel_factory_ref(grpc_subchannel_factory* factory) { - factory->vtable->ref(factory); -} +#include <grpc/support/alloc.h> -void grpc_subchannel_factory_unref(grpc_exec_ctx* exec_ctx, - grpc_subchannel_factory* factory) { - factory->vtable->unref(exec_ctx, factory); -} +#include "src/core/ext/lb_policy/grpclb/load_balancer_api.h" -grpc_subchannel* grpc_subchannel_factory_create_subchannel( - grpc_exec_ctx* exec_ctx, grpc_subchannel_factory* factory, - grpc_subchannel_args* args) { - return factory->vtable->create_subchannel(exec_ctx, factory, args); +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + gpr_slice slice = gpr_slice_from_copied_buffer((const char *)data, size); + grpc_grpclb_response *response; + if ((response = grpc_grpclb_response_parse(slice))) { + grpc_grpclb_response_destroy(response); + } + gpr_slice_unref(slice); + return 0; } diff --git a/test/core/nanopb/fuzzer_serverlist.c b/test/core/nanopb/fuzzer_serverlist.c new file mode 100644 index 0000000000..d4ec74f0e7 --- /dev/null +++ b/test/core/nanopb/fuzzer_serverlist.c @@ -0,0 +1,49 @@ +/* + * + * Copyright 2016, 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 <stdint.h> +#include <string.h> + +#include <grpc/support/alloc.h> + +#include "src/core/ext/lb_policy/grpclb/load_balancer_api.h" + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { + gpr_slice slice = gpr_slice_from_copied_buffer((const char *)data, size); + grpc_grpclb_serverlist *serverlist; + if ((serverlist = grpc_grpclb_response_parse_serverlist(slice))) { + grpc_grpclb_destroy_serverlist(serverlist); + } + gpr_slice_unref(slice); + return 0; +} diff --git a/test/core/surface/server_test.c b/test/core/surface/server_test.c index 4c62d8caad..3d2e25379a 100644 --- a/test/core/surface/server_test.c +++ b/test/core/surface/server_test.c @@ -1,6 +1,6 @@ /* * - * Copyright 2015-2016, Google Inc. + * Copyright 2015, Google Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -42,19 +42,25 @@ void test_register_method_fail(void) { grpc_server *server = grpc_server_create(NULL, NULL); void *method; void *method_old; - method = grpc_server_register_method(server, NULL, NULL, 0); + method = + grpc_server_register_method(server, NULL, NULL, GRPC_SRM_PAYLOAD_NONE, 0); GPR_ASSERT(method == NULL); - method_old = grpc_server_register_method(server, "m", "h", 0); + method_old = + grpc_server_register_method(server, "m", "h", GRPC_SRM_PAYLOAD_NONE, 0); GPR_ASSERT(method_old != NULL); - method = grpc_server_register_method(server, "m", "h", 0); + method = grpc_server_register_method( + server, "m", "h", GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER, 0); GPR_ASSERT(method == NULL); - method_old = grpc_server_register_method( - server, "m2", "h2", GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST); + method_old = + grpc_server_register_method(server, "m2", "h2", GRPC_SRM_PAYLOAD_NONE, + GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST); GPR_ASSERT(method_old != NULL); - method = grpc_server_register_method(server, "m2", "h2", 0); + method = + grpc_server_register_method(server, "m2", "h2", GRPC_SRM_PAYLOAD_NONE, 0); GPR_ASSERT(method == NULL); method = grpc_server_register_method( - server, "m2", "h2", GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST); + server, "m2", "h2", GRPC_SRM_PAYLOAD_READ_INITIAL_BYTE_BUFFER, + GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST); GPR_ASSERT(method == NULL); grpc_server_destroy(server); } diff --git a/test/core/util/reconnect_server.c b/test/core/util/reconnect_server.c index 5b0b3259c8..d408374a09 100644 --- a/test/core/util/reconnect_server.c +++ b/test/core/util/reconnect_server.c @@ -60,8 +60,12 @@ static void pretty_print_backoffs(reconnect_server *server) { i, backoff / 1000.0, expected_backoff / 1000.0, (backoff - expected_backoff) * 100.0 / expected_backoff); expected_backoff *= 1.6; - if (expected_backoff > 120 * 1000) { - expected_backoff = 120 * 1000; + int max_reconnect_backoff_ms = 120 * 1000; + if (server->max_reconnect_backoff_ms > 0) { + max_reconnect_backoff_ms = server->max_reconnect_backoff_ms; + } + if (expected_backoff > max_reconnect_backoff_ms) { + expected_backoff = max_reconnect_backoff_ms; } } } @@ -108,6 +112,7 @@ void reconnect_server_init(reconnect_server *server) { server->head = NULL; server->tail = NULL; server->peer = NULL; + server->max_reconnect_backoff_ms = 0; } void reconnect_server_start(reconnect_server *server, int port) { diff --git a/test/core/util/reconnect_server.h b/test/core/util/reconnect_server.h index e2e6a02461..ed02d49512 100644 --- a/test/core/util/reconnect_server.h +++ b/test/core/util/reconnect_server.h @@ -1,6 +1,6 @@ /* * - * Copyright 2015, Google Inc. + * Copyright 2015-2016, Google Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -52,6 +52,7 @@ typedef struct reconnect_server { timestamp_list *head; timestamp_list *tail; char *peer; + int max_reconnect_backoff_ms; } reconnect_server; void reconnect_server_init(reconnect_server *server); diff --git a/test/cpp/end2end/client_crash_test.cc b/test/cpp/end2end/client_crash_test.cc index c01f40dbc2..30b04fb9b9 100644 --- a/test/cpp/end2end/client_crash_test.cc +++ b/test/cpp/end2end/client_crash_test.cc @@ -88,6 +88,7 @@ TEST_F(CrashTest, KillBeforeWrite) { EchoRequest request; EchoResponse response; ClientContext context; + context.set_fail_fast(false); auto stream = stub->BidiStream(&context); @@ -113,6 +114,7 @@ TEST_F(CrashTest, KillAfterWrite) { EchoRequest request; EchoResponse response; ClientContext context; + context.set_fail_fast(false); 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 1964840fa5..ece948d5a7 100644 --- a/test/cpp/end2end/server_crash_test_client.cc +++ b/test/cpp/end2end/server_crash_test_client.cc @@ -63,6 +63,7 @@ int main(int argc, char** argv) { EchoRequest request; EchoResponse response; grpc::ClientContext context; + context.set_fail_fast(false); if (FLAGS_mode == "bidi") { auto stream = stub->BidiStream(&context); diff --git a/test/cpp/interop/reconnect_interop_client.cc b/test/cpp/interop/reconnect_interop_client.cc index 87e3bd6c76..797e52c744 100644 --- a/test/cpp/interop/reconnect_interop_client.cc +++ b/test/cpp/interop/reconnect_interop_client.cc @@ -37,6 +37,7 @@ #include <gflags/gflags.h> #include <grpc++/channel.h> #include <grpc++/client_context.h> +#include <grpc++/support/channel_arguments.h> #include <grpc/grpc.h> #include <grpc/support/log.h> #include "src/proto/grpc/testing/empty.grpc.pb.h" @@ -48,13 +49,18 @@ DEFINE_int32(server_control_port, 0, "Server port for control rpcs."); DEFINE_int32(server_retry_port, 0, "Server port for testing reconnection."); DEFINE_string(server_host, "127.0.0.1", "Server host to connect to"); +DEFINE_int32(max_reconnect_backoff_ms, 0, + "Maximum backoff time, or 0 for default."); +using grpc::CallCredentials; using grpc::Channel; +using grpc::ChannelArguments; using grpc::ClientContext; using grpc::CreateTestChannel; using grpc::Status; using grpc::testing::Empty; using grpc::testing::ReconnectInfo; +using grpc::testing::ReconnectParams; using grpc::testing::ReconnectService; int main(int argc, char** argv) { @@ -68,17 +74,25 @@ int main(int argc, char** argv) { ReconnectService::NewStub( CreateTestChannel(server_address.str(), false))); ClientContext start_context; - Empty empty_request; + ReconnectParams reconnect_params; + reconnect_params.set_max_reconnect_backoff_ms(FLAGS_max_reconnect_backoff_ms); Empty empty_response; Status start_status = - control_stub->Start(&start_context, empty_request, &empty_response); + control_stub->Start(&start_context, reconnect_params, &empty_response); GPR_ASSERT(start_status.ok()); gpr_log(GPR_INFO, "Starting connections with retries."); server_address.str(""); server_address << FLAGS_server_host << ':' << FLAGS_server_retry_port; + ChannelArguments channel_args; + if (FLAGS_max_reconnect_backoff_ms > 0) { + channel_args.SetInt(GRPC_ARG_MAX_RECONNECT_BACKOFF_MS, + FLAGS_max_reconnect_backoff_ms); + } std::shared_ptr<Channel> retry_channel = - CreateTestChannel(server_address.str(), true); + CreateTestChannel(server_address.str(), "foo.test.google.fr", true, false, + std::shared_ptr<CallCredentials>(), channel_args); + // About 13 retries. const int kDeadlineSeconds = 540; // Use any rpc to test retry. @@ -88,15 +102,15 @@ int main(int argc, char** argv) { retry_context.set_deadline(std::chrono::system_clock::now() + std::chrono::seconds(kDeadlineSeconds)); Status retry_status = - retry_stub->Start(&retry_context, empty_request, &empty_response); + retry_stub->Start(&retry_context, reconnect_params, &empty_response); GPR_ASSERT(retry_status.error_code() == grpc::StatusCode::DEADLINE_EXCEEDED); gpr_log(GPR_INFO, "Done retrying, getting final data from server"); ClientContext stop_context; ReconnectInfo response; - Status stop_status = - control_stub->Stop(&stop_context, empty_request, &response); + Status stop_status = control_stub->Stop(&stop_context, Empty(), &response); GPR_ASSERT(stop_status.ok()); GPR_ASSERT(response.passed() == true); + gpr_log(GPR_INFO, "Passed"); return 0; } diff --git a/test/cpp/interop/reconnect_interop_server.cc b/test/cpp/interop/reconnect_interop_server.cc index e2114fae19..53d51e80e7 100644 --- a/test/cpp/interop/reconnect_interop_server.cc +++ b/test/cpp/interop/reconnect_interop_server.cc @@ -71,6 +71,7 @@ using grpc::Status; using grpc::testing::Empty; using grpc::testing::ReconnectService; using grpc::testing::ReconnectInfo; +using grpc::testing::ReconnectParams; static bool got_sigint = false; @@ -92,7 +93,8 @@ class ReconnectServiceImpl : public ReconnectService::Service { void Poll(int seconds) { reconnect_server_poll(&tcp_server_, seconds); } - Status Start(ServerContext* context, const Empty* request, Empty* response) { + Status Start(ServerContext* context, const ReconnectParams* request, + Empty* response) { bool start_server = true; std::unique_lock<std::mutex> lock(mu_); while (serving_ && !shutdown_) { @@ -105,6 +107,8 @@ class ReconnectServiceImpl : public ReconnectService::Service { if (server_started_) { start_server = false; } else { + tcp_server_.max_reconnect_backoff_ms = + request->max_reconnect_backoff_ms(); server_started_ = true; } lock.unlock(); @@ -133,7 +137,9 @@ class ReconnectServiceImpl : public ReconnectService::Service { const double kTransmissionDelay = 100.0; const double kBackoffMultiplier = 1.6; const double kJitterFactor = 0.2; - const int kMaxBackoffMs = 120 * 1000; + const int kMaxBackoffMs = tcp_server_.max_reconnect_backoff_ms + ? tcp_server_.max_reconnect_backoff_ms + : 120 * 1000; bool passed = true; for (timestamp_list* cur = tcp_server_.head; cur && cur->next; cur = cur->next) { diff --git a/test/cpp/util/create_test_channel.cc b/test/cpp/util/create_test_channel.cc index 0cd9f9e767..fe8b5d5423 100644 --- a/test/cpp/util/create_test_channel.cc +++ b/test/cpp/util/create_test_channel.cc @@ -1,6 +1,6 @@ /* * - * Copyright 2015, Google Inc. + * Copyright 2015-2016, Google Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -58,8 +58,9 @@ namespace grpc { std::shared_ptr<Channel> CreateTestChannel( const grpc::string& server, const grpc::string& override_hostname, bool enable_ssl, bool use_prod_roots, - const std::shared_ptr<CallCredentials>& creds) { - ChannelArguments channel_args; + const std::shared_ptr<CallCredentials>& creds, + const ChannelArguments& args) { + ChannelArguments channel_args(args); if (enable_ssl) { const char* roots_certs = use_prod_roots ? "" : test_root_cert; SslCredentialsOptions ssl_opts = {roots_certs, "", ""}; @@ -83,6 +84,14 @@ std::shared_ptr<Channel> CreateTestChannel( std::shared_ptr<Channel> CreateTestChannel( const grpc::string& server, const grpc::string& override_hostname, + bool enable_ssl, bool use_prod_roots, + const std::shared_ptr<CallCredentials>& creds) { + return CreateTestChannel(server, override_hostname, enable_ssl, + use_prod_roots, creds, ChannelArguments()); +} + +std::shared_ptr<Channel> CreateTestChannel( + const grpc::string& server, const grpc::string& override_hostname, bool enable_ssl, bool use_prod_roots) { return CreateTestChannel(server, override_hostname, enable_ssl, use_prod_roots, std::shared_ptr<CallCredentials>()); diff --git a/test/cpp/util/create_test_channel.h b/test/cpp/util/create_test_channel.h index b50d653de3..4ff666dc1b 100644 --- a/test/cpp/util/create_test_channel.h +++ b/test/cpp/util/create_test_channel.h @@ -1,6 +1,6 @@ /* * - * Copyright 2015, Google Inc. + * Copyright 2015-2016, Google Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -53,6 +53,12 @@ std::shared_ptr<Channel> CreateTestChannel( bool enable_ssl, bool use_prod_roots, const std::shared_ptr<CallCredentials>& creds); +std::shared_ptr<Channel> CreateTestChannel( + const grpc::string& server, const grpc::string& override_hostname, + bool enable_ssl, bool use_prod_roots, + const std::shared_ptr<CallCredentials>& creds, + const ChannelArguments& args); + } // namespace grpc #endif // GRPC_TEST_CPP_UTIL_CREATE_TEST_CHANNEL_H diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal index 9cc38407b6..c4f18dc9b5 100644 --- a/tools/doxygen/Doxyfile.core.internal +++ b/tools/doxygen/Doxyfile.core.internal @@ -812,6 +812,7 @@ src/core/lib/channel/context.h \ src/core/lib/channel/http_client_filter.h \ src/core/lib/channel/http_server_filter.h \ src/core/lib/channel/subchannel_call_holder.h \ +src/core/lib/client_config/client_channel_factory.h \ src/core/lib/client_config/client_config.h \ src/core/lib/client_config/connector.h \ src/core/lib/client_config/initial_connect_string.h \ @@ -822,7 +823,6 @@ src/core/lib/client_config/resolver.h \ src/core/lib/client_config/resolver_factory.h \ src/core/lib/client_config/resolver_registry.h \ src/core/lib/client_config/subchannel.h \ -src/core/lib/client_config/subchannel_factory.h \ src/core/lib/client_config/subchannel_index.h \ src/core/lib/client_config/uri_parser.h \ src/core/lib/compression/algorithm_metadata.h \ @@ -958,6 +958,7 @@ src/core/lib/channel/connected_channel.c \ src/core/lib/channel/http_client_filter.c \ src/core/lib/channel/http_server_filter.c \ src/core/lib/channel/subchannel_call_holder.c \ +src/core/lib/client_config/client_channel_factory.c \ src/core/lib/client_config/client_config.c \ src/core/lib/client_config/connector.c \ src/core/lib/client_config/default_initial_connect_string.c \ @@ -969,7 +970,6 @@ src/core/lib/client_config/resolver.c \ src/core/lib/client_config/resolver_factory.c \ src/core/lib/client_config/resolver_registry.c \ src/core/lib/client_config/subchannel.c \ -src/core/lib/client_config/subchannel_factory.c \ src/core/lib/client_config/subchannel_index.c \ src/core/lib/client_config/uri_parser.c \ src/core/lib/compression/compression_algorithm.c \ diff --git a/tools/fuzzer/runners/nanopb_fuzzer_response_test.sh b/tools/fuzzer/runners/nanopb_fuzzer_response_test.sh new file mode 100644 index 0000000000..aaa7ceefc6 --- /dev/null +++ b/tools/fuzzer/runners/nanopb_fuzzer_response_test.sh @@ -0,0 +1,38 @@ +#!/bin/bash +# Copyright 2016, 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. +# + +flags="-max_total_time=3600 -jobs=3 -workers=3" +if [ "$config" == "asan-trace-cmp" ] +then + flags="-use_traces=1 $flags" +fi + +bins/$config/nanopb_fuzzer_response_test $flags fuzzer_output test/core/nanopb/corpus_response diff --git a/tools/fuzzer/runners/nanopb_fuzzer_serverlist_test.sh b/tools/fuzzer/runners/nanopb_fuzzer_serverlist_test.sh new file mode 100644 index 0000000000..621a4e8b67 --- /dev/null +++ b/tools/fuzzer/runners/nanopb_fuzzer_serverlist_test.sh @@ -0,0 +1,38 @@ +#!/bin/bash +# Copyright 2016, 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. +# + +flags="-max_total_time=3600 -jobs=3 -workers=3" +if [ "$config" == "asan-trace-cmp" ] +then + flags="-use_traces=1 $flags" +fi + +bins/$config/nanopb_fuzzer_serverlist_test $flags fuzzer_output test/core/nanopb/corpus_serverlist diff --git a/tools/gce/create_interop_worker.sh b/tools/gce/create_interop_worker.sh index 3c49c6102a..9170d82144 100755 --- a/tools/gce/create_interop_worker.sh +++ b/tools/gce/create_interop_worker.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2015-2016, Google Inc. +# Copyright 2015, Google Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without diff --git a/tools/run_tests/performance/__init__.py b/tools/run_tests/performance/__init__.py new file mode 100644 index 0000000000..100a624dc9 --- /dev/null +++ b/tools/run_tests/performance/__init__.py @@ -0,0 +1,28 @@ +# Copyright 2016, 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. diff --git a/tools/run_tests/performance/build_performance.sh b/tools/run_tests/performance/build_performance.sh index 829c2e3040..b33ee3a58c 100755 --- a/tools/run_tests/performance/build_performance.sh +++ b/tools/run_tests/performance/build_performance.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2015-2016, Google Inc. +# Copyright 2015, Google Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without @@ -36,16 +36,17 @@ cd $(dirname $0)/../../.. CONFIG=${CONFIG:-opt} +# build C++ qps worker & driver always - we need at least the driver to +# run any of the scenarios. +# TODO(jtattermusch): not embedding OpenSSL breaks the C# build because +# grpc_csharp_ext needs OpenSSL embedded and some intermediate files from +# this build will be reused. +make CONFIG=${CONFIG} EMBED_OPENSSL=true EMBED_ZLIB=true qps_worker qps_driver -j8 + for language in $@ do - if [ "$language" == "c++" ] + if [ "$language" != "c++" ] then - # build C++ qps worker & driver - # TODO(jtattermusch): not embedding OpenSSL breaks the C# build because - # grpc_csharp_ext needs OpenSSL embedded and some intermediate files from - # this build will be reused. - make CONFIG=${CONFIG} EMBED_OPENSSL=true EMBED_ZLIB=true qps_worker qps_driver -j8 - else tools/run_tests/run_tests.py -l $language -c $CONFIG --build_only -j 8 fi done diff --git a/tools/run_tests/performance/remote_host_build.sh b/tools/run_tests/performance/remote_host_build.sh index fee4167d33..b8886080a5 100755 --- a/tools/run_tests/performance/remote_host_build.sh +++ b/tools/run_tests/performance/remote_host_build.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2015-2016, Google Inc. +# Copyright 2015, Google Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without diff --git a/tools/run_tests/performance/remote_host_prepare.sh b/tools/run_tests/performance/remote_host_prepare.sh index c70e1d3963..18633d1420 100755 --- a/tools/run_tests/performance/remote_host_prepare.sh +++ b/tools/run_tests/performance/remote_host_prepare.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2015-2016, Google Inc. +# Copyright 2015, Google Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without diff --git a/tools/run_tests/performance/run_worker_csharp.sh b/tools/run_tests/performance/run_worker_csharp.sh index ce34b203c3..b91df09b42 100755 --- a/tools/run_tests/performance/run_worker_csharp.sh +++ b/tools/run_tests/performance/run_worker_csharp.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2015-2016, Google Inc. +# Copyright 2015, Google Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without diff --git a/tools/run_tests/performance/run_worker_node.sh b/tools/run_tests/performance/run_worker_node.sh index 36bf1b20a0..46b6ff0177 100755 --- a/tools/run_tests/performance/run_worker_node.sh +++ b/tools/run_tests/performance/run_worker_node.sh @@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2015-2016, Google Inc. +# Copyright 2015, Google Inc. # All rights reserved. # # Redistribution and use in source and binary forms, with or without diff --git a/tools/run_tests/performance/scenario_config.py b/tools/run_tests/performance/scenario_config.py new file mode 100644 index 0000000000..f95e531fa2 --- /dev/null +++ b/tools/run_tests/performance/scenario_config.py @@ -0,0 +1,153 @@ +# Copyright 2016, 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. + +# performance scenario configuration for various languages + +class CXXLanguage: + + def __init__(self): + self.safename = 'cxx' + + def worker_cmdline(self): + return ['bins/opt/qps_worker'] + + def worker_port_offset(self): + return 0 + + def scenarios(self): + # TODO(jtattermusch): add more scenarios + return { + # Scenario 1: generic async streaming ping-pong (contentionless latency) + 'cpp_async_generic_streaming_ping_pong': [ + '--rpc_type=STREAMING', + '--client_type=ASYNC_CLIENT', + '--server_type=ASYNC_GENERIC_SERVER', + '--outstanding_rpcs_per_channel=1', + '--client_channels=1', + '--bbuf_req_size=0', + '--bbuf_resp_size=0', + '--async_client_threads=1', + '--async_server_threads=1', + '--secure_test=true', + '--num_servers=1', + '--num_clients=1', + '--server_core_limit=0', + '--client_core_limit=0'], + # Scenario 5: Sync unary ping-pong with protobufs + 'cpp_sync_unary_ping_pong_protobuf': [ + '--rpc_type=UNARY', + '--client_type=SYNC_CLIENT', + '--server_type=SYNC_SERVER', + '--outstanding_rpcs_per_channel=1', + '--client_channels=1', + '--simple_req_size=0', + '--simple_resp_size=0', + '--secure_test=true', + '--num_servers=1', + '--num_clients=1', + '--server_core_limit=0', + '--client_core_limit=0']} + + def __str__(self): + return 'c++' + + +class CSharpLanguage: + + def __init__(self): + self.safename = str(self) + + def worker_cmdline(self): + return ['tools/run_tests/performance/run_worker_csharp.sh'] + + def worker_port_offset(self): + return 100 + + def scenarios(self): + # TODO(jtattermusch): add more scenarios + return { + # Scenario 1: generic async streaming ping-pong (contentionless latency) + 'csharp_async_generic_streaming_ping_pong': [ + '--rpc_type=STREAMING', + '--client_type=ASYNC_CLIENT', + '--server_type=ASYNC_GENERIC_SERVER', + '--outstanding_rpcs_per_channel=1', + '--client_channels=1', + '--bbuf_req_size=0', + '--bbuf_resp_size=0', + '--async_client_threads=1', + '--async_server_threads=1', + '--secure_test=true', + '--num_servers=1', + '--num_clients=1', + '--server_core_limit=0', + '--client_core_limit=0']} + + def __str__(self): + return 'csharp' + + +class NodeLanguage: + + def __init__(self): + pass + self.safename = str(self) + + def worker_cmdline(self): + return ['tools/run_tests/performance/run_worker_node.sh'] + + def worker_port_offset(self): + return 200 + + def scenarios(self): + # TODO(jtattermusch): add more scenarios + return { + 'node_sync_unary_ping_pong_protobuf': [ + '--rpc_type=UNARY', + '--client_type=ASYNC_CLIENT', + '--server_type=ASYNC_SERVER', + '--outstanding_rpcs_per_channel=1', + '--client_channels=1', + '--simple_req_size=0', + '--simple_resp_size=0', + '--secure_test=false', + '--num_servers=1', + '--num_clients=1', + '--server_core_limit=0', + '--client_core_limit=0']} + + def __str__(self): + return 'node' + + +LANGUAGES = { + 'c++' : CXXLanguage(), + 'csharp' : CSharpLanguage(), + 'node' : NodeLanguage(), +} diff --git a/tools/run_tests/run_node.sh b/tools/run_tests/run_node.sh index 30f2c93588..44f75645f5 100755 --- a/tools/run_tests/run_node.sh +++ b/tools/run_tests/run_node.sh @@ -48,6 +48,7 @@ if [ "$CONFIG" = "gcov" ] then ./node_modules/.bin/istanbul cover --dir reports/node_coverage \ -x **/interop/* ./node_modules/.bin/_mocha -- --timeout $timeout $test_directory + cp -r reports/node_coverage/lcov-report/* reports/node_coverage/ cd build gcov Release/obj.target/grpc/ext/*.o lcov --base-directory . --directory . -c -o coverage.info @@ -55,8 +56,6 @@ then genhtml -o ../reports/node_ext_coverage --num-spaces 2 \ -t 'Node gRPC test coverage' coverage.info --rc genhtml_hi_limit=95 \ --rc genhtml_med_limit=80 --no-prefix - echo '<html><head><meta http-equiv="refresh" content="0;URL=lcov-report/index.html"></head></html>' > \ - ../reports/node_coverage/index.html else JUNIT_REPORT_PATH=src/node/report.xml JUNIT_REPORT_STACK=1 \ ./node_modules/.bin/mocha --timeout $timeout \ diff --git a/tools/run_tests/run_performance_tests.py b/tools/run_tests/run_performance_tests.py index 0ab3d264a5..e1268e2ecb 100755 --- a/tools/run_tests/run_performance_tests.py +++ b/tools/run_tests/run_performance_tests.py @@ -40,6 +40,7 @@ import sys import tempfile import time import uuid +import performance.scenario_config as scenario_config _ROOT = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), '../..')) @@ -49,130 +50,6 @@ os.chdir(_ROOT) _REMOTE_HOST_USERNAME = 'jenkins' -class CXXLanguage: - - def __init__(self): - self.safename = 'cxx' - - def worker_cmdline(self): - return ['bins/opt/qps_worker'] - - def worker_port_offset(self): - return 0 - - def scenarios(self): - # TODO(jtattermusch): add more scenarios - return { - # Scenario 1: generic async streaming ping-pong (contentionless latency) - 'cpp_async_generic_streaming_ping_pong': [ - '--rpc_type=STREAMING', - '--client_type=ASYNC_CLIENT', - '--server_type=ASYNC_GENERIC_SERVER', - '--outstanding_rpcs_per_channel=1', - '--client_channels=1', - '--bbuf_req_size=0', - '--bbuf_resp_size=0', - '--async_client_threads=1', - '--async_server_threads=1', - '--secure_test=true', - '--num_servers=1', - '--num_clients=1', - '--server_core_limit=0', - '--client_core_limit=0'], - # Scenario 5: Sync unary ping-pong with protobufs - 'cpp_sync_unary_ping_pong_protobuf': [ - '--rpc_type=UNARY', - '--client_type=SYNC_CLIENT', - '--server_type=SYNC_SERVER', - '--outstanding_rpcs_per_channel=1', - '--client_channels=1', - '--simple_req_size=0', - '--simple_resp_size=0', - '--secure_test=true', - '--num_servers=1', - '--num_clients=1', - '--server_core_limit=0', - '--client_core_limit=0']} - - def __str__(self): - return 'c++' - - -class CSharpLanguage: - - def __init__(self): - self.safename = str(self) - - def worker_cmdline(self): - return ['tools/run_tests/performance/run_worker_csharp.sh'] - - def worker_port_offset(self): - return 100 - - def scenarios(self): - # TODO(jtattermusch): add more scenarios - return { - # Scenario 1: generic async streaming ping-pong (contentionless latency) - 'csharp_async_generic_streaming_ping_pong': [ - '--rpc_type=STREAMING', - '--client_type=ASYNC_CLIENT', - '--server_type=ASYNC_GENERIC_SERVER', - '--outstanding_rpcs_per_channel=1', - '--client_channels=1', - '--bbuf_req_size=0', - '--bbuf_resp_size=0', - '--async_client_threads=1', - '--async_server_threads=1', - '--secure_test=true', - '--num_servers=1', - '--num_clients=1', - '--server_core_limit=0', - '--client_core_limit=0']} - - def __str__(self): - return 'csharp' - - -class NodeLanguage: - - def __init__(self): - pass - self.safename = str(self) - - def worker_cmdline(self): - return ['tools/run_tests/performance/run_worker_node.sh'] - - def worker_port_offset(self): - return 200 - - def scenarios(self): - # TODO(jtattermusch): add more scenarios - return { - 'node_sync_unary_ping_pong_protobuf': [ - '--rpc_type=UNARY', - '--client_type=ASYNC_CLIENT', - '--server_type=ASYNC_SERVER', - '--outstanding_rpcs_per_channel=1', - '--client_channels=1', - '--simple_req_size=0', - '--simple_resp_size=0', - '--secure_test=false', - '--num_servers=1', - '--num_clients=1', - '--server_core_limit=0', - '--client_core_limit=0']} - - def __str__(self): - return 'node' - - -_LANGUAGES = { - 'c++' : CXXLanguage(), - 'csharp' : CSharpLanguage(), - 'node' : NodeLanguage(), -} - - class QpsWorkerJob: """Encapsulates a qps worker server job.""" @@ -272,7 +149,7 @@ def prepare_remote_hosts(hosts): sys.exit(1) -def build_on_remote_hosts(hosts, languages=_LANGUAGES.keys(), build_local=False): +def build_on_remote_hosts(hosts, languages=scenario_config.LANGUAGES.keys(), build_local=False): """Builds performance worker on remote hosts (and maybe also locally).""" build_timeout = 15*60 build_jobs = [] @@ -366,7 +243,7 @@ def finish_qps_workers(jobs): argp = argparse.ArgumentParser(description='Run performance tests.') argp.add_argument('-l', '--language', - choices=['all'] + sorted(_LANGUAGES.keys()), + choices=['all'] + sorted(scenario_config.LANGUAGES.keys()), nargs='+', default=['all'], help='Languages to benchmark.') @@ -380,9 +257,9 @@ argp.add_argument('--remote_worker_host', args = argp.parse_args() -languages = set(_LANGUAGES[l] +languages = set(scenario_config.LANGUAGES[l] for l in itertools.chain.from_iterable( - _LANGUAGES.iterkeys() if x == 'all' else [x] + scenario_config.LANGUAGES.iterkeys() if x == 'all' else [x] for x in args.language)) # Put together set of remote hosts where to run and build diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json index 138608ed35..c0fc35b6de 100644 --- a/tools/run_tests/sources_and_headers.json +++ b/tools/run_tests/sources_and_headers.json @@ -1303,6 +1303,38 @@ ], "headers": [], "language": "c", + "name": "nanopb_fuzzer_response_test", + "src": [ + "test/core/nanopb/fuzzer_response.c" + ], + "third_party": false, + "type": "target" + }, + { + "deps": [ + "gpr", + "gpr_test_util", + "grpc", + "grpc_test_util" + ], + "headers": [], + "language": "c", + "name": "nanopb_fuzzer_serverlist_test", + "src": [ + "test/core/nanopb/fuzzer_serverlist.c" + ], + "third_party": false, + "type": "target" + }, + { + "deps": [ + "gpr", + "gpr_test_util", + "grpc", + "grpc_test_util" + ], + "headers": [], + "language": "c", "name": "no_server_test", "src": [ "test/core/end2end/no_server_test.c" @@ -3170,6 +3202,23 @@ ], "headers": [], "language": "c", + "name": "head_of_line_blocking_bad_client_test", + "src": [ + "test/core/bad_client/tests/head_of_line_blocking.c" + ], + "third_party": false, + "type": "target" + }, + { + "deps": [ + "bad_client_test", + "gpr", + "gpr_test_util", + "grpc_test_util_unsecure", + "grpc_unsecure" + ], + "headers": [], + "language": "c", "name": "headers_bad_client_test", "src": [ "test/core/bad_client/tests/headers.c" @@ -3797,6 +3846,40 @@ ], "headers": [], "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "src": [ + "test/core/nanopb/fuzzer_response.c" + ], + "third_party": false, + "type": "target" + }, + { + "deps": [ + "gpr", + "gpr_test_util", + "grpc", + "grpc_test_util", + "one_input_fuzzer" + ], + "headers": [], + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "src": [ + "test/core/nanopb/fuzzer_serverlist.c" + ], + "third_party": false, + "type": "target" + }, + { + "deps": [ + "gpr", + "gpr_test_util", + "grpc", + "grpc_test_util", + "one_input_fuzzer" + ], + "headers": [], + "language": "c", "name": "uri_fuzzer_test_one_entry", "src": [ "test/core/client_config/uri_fuzzer_test.c" @@ -4040,6 +4123,7 @@ "src/core/lib/channel/http_client_filter.h", "src/core/lib/channel/http_server_filter.h", "src/core/lib/channel/subchannel_call_holder.h", + "src/core/lib/client_config/client_channel_factory.h", "src/core/lib/client_config/client_config.h", "src/core/lib/client_config/connector.h", "src/core/lib/client_config/initial_connect_string.h", @@ -4050,7 +4134,6 @@ "src/core/lib/client_config/resolver_factory.h", "src/core/lib/client_config/resolver_registry.h", "src/core/lib/client_config/subchannel.h", - "src/core/lib/client_config/subchannel_factory.h", "src/core/lib/client_config/subchannel_index.h", "src/core/lib/client_config/uri_parser.h", "src/core/lib/compression/algorithm_metadata.h", @@ -4242,6 +4325,8 @@ "src/core/lib/channel/http_server_filter.h", "src/core/lib/channel/subchannel_call_holder.c", "src/core/lib/channel/subchannel_call_holder.h", + "src/core/lib/client_config/client_channel_factory.c", + "src/core/lib/client_config/client_channel_factory.h", "src/core/lib/client_config/client_config.c", "src/core/lib/client_config/client_config.h", "src/core/lib/client_config/connector.c", @@ -4263,8 +4348,6 @@ "src/core/lib/client_config/resolver_registry.h", "src/core/lib/client_config/subchannel.c", "src/core/lib/client_config/subchannel.h", - "src/core/lib/client_config/subchannel_factory.c", - "src/core/lib/client_config/subchannel_factory.h", "src/core/lib/client_config/subchannel_index.c", "src/core/lib/client_config/subchannel_index.h", "src/core/lib/client_config/uri_parser.c", @@ -4657,6 +4740,7 @@ "src/core/lib/channel/http_client_filter.h", "src/core/lib/channel/http_server_filter.h", "src/core/lib/channel/subchannel_call_holder.h", + "src/core/lib/client_config/client_channel_factory.h", "src/core/lib/client_config/client_config.h", "src/core/lib/client_config/connector.h", "src/core/lib/client_config/initial_connect_string.h", @@ -4667,7 +4751,6 @@ "src/core/lib/client_config/resolver_factory.h", "src/core/lib/client_config/resolver_registry.h", "src/core/lib/client_config/subchannel.h", - "src/core/lib/client_config/subchannel_factory.h", "src/core/lib/client_config/subchannel_index.h", "src/core/lib/client_config/uri_parser.h", "src/core/lib/compression/algorithm_metadata.h", @@ -4842,6 +4925,8 @@ "src/core/lib/channel/http_server_filter.h", "src/core/lib/channel/subchannel_call_holder.c", "src/core/lib/channel/subchannel_call_holder.h", + "src/core/lib/client_config/client_channel_factory.c", + "src/core/lib/client_config/client_channel_factory.h", "src/core/lib/client_config/client_config.c", "src/core/lib/client_config/client_config.h", "src/core/lib/client_config/connector.c", @@ -4863,8 +4948,6 @@ "src/core/lib/client_config/resolver_registry.h", "src/core/lib/client_config/subchannel.c", "src/core/lib/client_config/subchannel.h", - "src/core/lib/client_config/subchannel_factory.c", - "src/core/lib/client_config/subchannel_factory.h", "src/core/lib/client_config/subchannel_index.c", "src/core/lib/client_config/subchannel_index.h", "src/core/lib/client_config/uri_parser.c", diff --git a/tools/run_tests/tests.json b/tools/run_tests/tests.json index 795b13d5ce..88aae70aef 100644 --- a/tools/run_tests/tests.json +++ b/tools/run_tests/tests.json @@ -2616,6 +2616,27 @@ "posix", "windows" ], + "cpu_cost": 1.0, + "exclude_configs": [], + "flaky": false, + "gtest": false, + "language": "c", + "name": "head_of_line_blocking_bad_client_test", + "platforms": [ + "linux", + "mac", + "posix", + "windows" + ] + }, + { + "args": [], + "ci_platforms": [ + "linux", + "mac", + "posix", + "windows" + ], "cpu_cost": 0.2, "exclude_configs": [], "flaky": false, @@ -37793,6 +37814,7310 @@ }, { "args": [ + "test/core/nanopb/corpus_response/0c35544f40d428d103e9c5b969ad9cd16767b110" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/0c60ee9ed55c9af6190b132ef6636c1d2abe4540" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/0ecb3e69889c036a86d21eb942077dc9abd649be" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/1324c95dafe597fe05f9babe92fe6fbf181c1897" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/14eb42f7423081b455820daa2c02b358315dc0fa" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/23121c5f633db5d7c1a9f2225240754246fee513" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/235548307ee9f2b0855fded42a871990d9ade956" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/28ed3a797da3c48c309a4ef792147f3c56cfec40" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/2bf123dbfa1d37a04493b5662a4b3b9c147485fc" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/2d4c0908ecc0310ea234d10b6bdb4f4ca3c41dd1" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/304e8cdc9122b709ec2c063a5c8c38489a788033" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/324d4a2aed8bc1840fee212fd38dadec80a72ea2" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/33353a0b011901a13d010c6b165074ccdaa717ac" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/37dfead09389fcd9b9d24ef817a0fed13d8ff2b0" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/47879cc364be304754f6af15563ad6f9a538da41" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/49a5cef4c730ecab22712b156ddba5106f165afd" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/4bbbbb794a098deeacff73b774c30f12c54ceacb" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/4c498ce69c8476f745693deb23272930e05cad60" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/4fb5e3085c32e9bccac9e18343cca07017d037de" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/4fe5e46c1299e7f3e8a41dde3ae1bf1b60b4a43c" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/670cc6bae958cb4f15e7297fe63959ac5799aa42" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/675f3263af7d1bbb084872f2b23f6d363227e85d" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/67fe0d2acc727c8a39a707b92c6cebda9bd20986" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/6d15065785eb8f4b5f17357a520cb4815a2cb355" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/73285d7a70d73b517648067520d921e4477dbbfa" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/747d1ed8bee4c6f0438beaf88ae76d8ef9f63da2" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/763878a34b3adeb99a03b54d09768a4451617016" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/7b4b0c2555178333ba15203a930c88ef7e7500e7" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/7b8a91aa46e370eb61307b4998889dc89775462f" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/7cd11836c64f98742fa7beccec5c981ef4dd62ae" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/7d8f4f045e70e8a2cb45dc3c001504f5c2614b16" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/7e9848558fb004e14795b3ebd3e1488dcde1db8c" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/89734c37ee267e69a6950c6d60ee541c1be5ccff" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/9034aaf45143996a2b14465c352ab0c6fa26b221" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/91e3b6a3484ab4b95cdeecc5aefe1291824060e8" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/95cd94c858e5e97f7df4a5eb7552e5e0d5ce1ec4" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/971f42d5a4d9816145ebc9dd28ba33ed3f5860b0" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/9db3a1854de87fd643b910aeab50553afc73e667" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/a147873135c6c52d4da03c260a0165bc0ab1b979" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/a710eead945dabbbffa213a980c75f9463a27398" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/a72406e3ca06d941fe8e168bbf67da88a81c947b" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/a8a62a7ebb7d68b211ae319e082575935c07d188" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/a8abd012eb59b862bf9bc1ea443d2f35a1a2e222" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/aab56035a3533b5d83a32a439f179eb678250113" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/ac174acef2c5da26fadc7270bab9c8c4e938c463" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/acbbd60eeb76e41ce254d0fef353b92abe69c831" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/c1eed32e1e353737987da851ad760312ea8e557c" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/c4214ace2c4bab24bb356f71aedca08544baad70" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/c4f87a6290aee1acfc1f26083974ce94621fca64" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/d285d78d3ba966b4b199453d38ead1aa36a7484f" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/df5200f371cff3cae0e1595cd86d641725f5d1ba" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/dfc66cb172919102f3ba14f6816228aa46f78154" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/e53e789a4c175c6a2c468472f1047d0fe8db1177" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/e67fe6794e755ea801272980f2c272edb027f6dc" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/ead61e86fedf118df8e44ed70ce002be651cf291" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/eced8b29efbdc82eb8a1d0865c5f382f0ff78446" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/f58a9135d07ea9a5e3e710f6b3bf6d48d5942dfd" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/f8c2c4ddd2f474b4839f13a9be862c00ab0ece77" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/faa1781e1444bba5b8c677bc5e2a38d023a1ec65" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_response/fccda587af845f0685275960649d8f4a45272a95" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_response_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/000def12957806bb0d40005cb651d35b4cde7b4e" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/0068af2acc3020f344ee84b2c8adfb90492354c3" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/009132022c3a1660b701728ac92e26baf82e8eac" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/00bf0233aa1155b34a3081e4a2b7a1c9cdf8ea1e" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/013197cfb12b59755b807501c6d6615859f9cd3f" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/018a4332eb19f2398162317cb6ad2e8cf700dfd6" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/0273d3496bf5f4594e59083ac319f8f863a15be0" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/0355002521e74dcdb3a0c633338bd02ab1d85312" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/053d8d6ceeba9453c97d0ee5374db863e6f77ad4" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/0628c29e3ae264f8fa08652435bb3e61afe60883" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/065e91578e5359b70a668164310af6f0dd40e922" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/06b4b617d5937da8a7b58aed5341dc5ef6d1bcd7" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/07216a4f5934890b89d845f6256546c2681350ce" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/08584e8308b7f52f0fe380358800d7f585cba89c" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/085a37568e99ec5855bd96affd259921515479e8" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/0903d1e9297179c18de6a3707b16f27d0d54ed67" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/0aa20a75bff4e8af10330c66d288e900146f1a39" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/0ae76e2b24ca999bd5e09e517aa4d88f5b5f58a4" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/0c3025fdfb008a6563ea2a2bb6cbc79b8ccbf8f3" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/0d219165cd317142afa36b8b5476cc022c95c4e6" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/0e053123dd6256de5aff55b0731f913de250c18e" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/0e065f98325849ac05eed515865b33dba0264cd4" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/0e4ff715d491c9f0b471c400b71804739b6d400a" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/0ec94942046cd7e00bc058204c1d046075ca9531" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/0f0e8da530eb8c924cee6985d9c3dfd93274ef8c" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/0ff365225c981d74b89499d1e708684ed4d0b570" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/113b1efff1677c1b9a24f89aec0c3ecc228ddf62" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/11697d621eab6743ba22715722d5b23830b79075" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/12463318b795c756f389bc0fb1cca9645eafef28" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/12784250cf16ec999529f601ae5c5798e853d34a" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/13122d08c1cee0dae6434605917d4cc6d8ea8cc5" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/148a1118649dd8aa9b4ed778efdf7c1611aa5d27" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/15dea2bb5fb36a3dd5172796da66a821a32918e7" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/16488fe15a7e33cb41f2b7c159c99154464b3fd3" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/1870a48a3c9c1dd9027cbd85beb503b43cff6e89" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/1900b6a9123667a79020319aa7fd54d230bc7073" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/1a000f1cbccd2ab6f7e623e015ed2e84284c9dbf" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/1c1d403f6175d52ac4430d1ef2401b549761707e" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/1c2ae0e1915e18dffc2215e9121f1afe0e4335c4" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/1c5d2eef52426db9d0842f3d57b27a219434c512" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/1d0676867c1ebce84531035fa7eb86ed00762df5" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/1d92b263fa70450b0d0aeb81bf5d2f69eefbbd99" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/1e843ed4864d6a808b671dd6769ae191ac8a13ad" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/1eb06a34ee568d584c4b33472788889bc68af3f5" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/2169c2b4d560d74a5487df68b56f3af1d648f544" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/21f8f7583e58c1c81a3ac8237b5fa58071edf8a4" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/231e348407fdcb14412c691b0b20982940160ccd" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/27b8f060e3296eaef77dcdd4c2cd11d5650604ac" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/28ed3a797da3c48c309a4ef792147f3c56cfec40" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/291fcc6e043942638fa3c865c0a1be5e4dcc0e70" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/2a7f6c1f8fdc090b24ceb90ab4f3a7b331c06c86" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/2b85f180fe56f84925b274819ce10a8972a594e7" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/2dea73d7d10ba0dcfd103f7542bdf7458e772b2b" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/2e9c19f98ef88b83ec2dea8b1b7f92b8337f757b" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/2fbd59ffb74aba392b86f4fe2ff8067b6d45cce8" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/31059c32ea28d37b7442f51b20e966665662783c" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/31f78e35feb36037864df5f8f47136f8e6e4768a" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/326d322d1aa31696a14518830e544770f12146ee" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/337df26552e0884ff133cc1be8e72020be38f457" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/33a2a0aa86956097e034b5ee16aeceacee7efc34" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/33d175d1ecb3a85be7dd93d24efc3ddda0a85ad6" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/3718a1b790db16bcfc4ec30691fab24ea7bb0b74" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/37aa3946054035b712102a62b71c94747dfd1491" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/37b697adc0708ad12e4ed7355f3f8fdf1b7919ca" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/37bf4642c5e5a806e2042cdf5ead9bf3c97b9ac1" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/37d94ca6a20303389b35404f3dfd20aaa9ff0851" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/39278604f6a1102366464bbe769ae846e542bc56" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/396b57d9a11a1b135e36ad266e155cc0c3b77d21" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/39a49db120a807fe4e80c502254a5009625c7599" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/39f04d1c6d4beefa3e3d6eae3a5317d969787055" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/3b199b80209fa0b8ffedba4381019f8729cc09d6" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/3ccf7ffb96c3e4789409db33cc12bfd8ddc24c1a" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/3d04382d1fe11ff3b717100aece7f9eff2d04b9b" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/3d4eb9f836bb40cf4c734073bcba8b73e4cc93ae" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/41dc8c55e41d32c30865f9761931ddd4c5b740f8" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/41ef7b74d212f8f7f6681edcffd0db719030d31d" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/431187b5926fa7d0823305a9f87635616ea3ef27" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/44c6da04b8378986721f7225e70a1514695c176c" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/450161236e37a1dfc0da6398c4876df82ff640ac" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/45257a176ca6a05ec65a6df430bbb6b85d0a676f" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/46d1c2f2edcc9cdc0d1698fa0c8853cb19a6e7d9" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/4764bd4297bf0c405348d2bb87b8fbc02beadcb8" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/48199bfd0e2c160f56d03e881bb5dfe276eec462" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/48e865c56e8db13640d6ecbfc0f2486eb77e07d1" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/499b003b8b98edd9dbe2668c8c6af948769d7e87" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/4a55591c4b390c5a36cecc6f1b6f5105300b546b" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/4d33f97ec69c64e14dcf205be36a6319ddb8a20d" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/4dbfb08904739928e19c2f459040b35ac410f699" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/501bd6fe1de2719cf8d2c517a071e5d883fbe766" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/5208871ea8948223b64b304336cea41ac3240244" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/5348c71be34967458403bd4b58bb2a8a744d35ee" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/54362c2f6965268d0835a992c3ba656171b8f044" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/54411aa13f6d9118028171935322bbbc74c15329" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/54c50af22d147f192918499b4b3819eb389468a4" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/55441aac903d96b36bf8a11bc804234bcf0c04da" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/56e1a7c279482a57fcbca43468df96a791ee22b4" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/57cbea7c563d5c4b6b290271b0009c3f348d92da" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/57e11c7a62f0fc807d7b51bb1ef0f0e22f43795b" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/585183c1a240df6926689fe1bd8cb434664db4d8" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/5b2ee8ca40508bf108a729dcb228191670ec34d6" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/5b47eabaf74479348fd0318f174d649dbe96e7d2" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/5ba93c9db0cff93f52b521d7420e43f6eda2784f" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/5cc827e33932ccf8c72c6a839074e856d93463d8" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/5cc89bbf687f94ff87241a8f935905e1c441de33" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/5ec6596f12462fe9f36924c262f97408b54bbba8" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/5f8f3af69295223fb04c37d28035bb75b4cbd705" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/5fd76d48b9fefecbdabd4511decc161b25db79dd" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/614cf839ccac2d896d61a0ba0ab1f42b2fabafea" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/618305cc2d3d3814d78b77ffbf421b769bd862cf" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/61dfcd913c4f0a8d005bd089c34e95d8dbbf1897" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/65a89e10aab00039680e1f7d014737b634c74d8d" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/66a273dbf5e37410efd45518a42b06a65cffe1f0" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/673ff0de0702e8098892060a5365c175d8ef18fc" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/68465c782c37bfdd98ac493b0458444bb94336e5" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/688451dee13d0be420598c6e205a3bc419173e18" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/68a1d9150e1380c219e0a1deb3993f321e000ecd" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/69f49bf7ae8886f5b4c6296fdb1c570256919604" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/6a425f414cd69ffffdbaa34d03eb43841b432e11" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/6ca9e6e85f9b007a0920b0112decbd1403d506da" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/6cd62e3d67b4154639adbe753115bfdd770edddb" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/6d4f2de4cc427417d6335ff5396ea2588509bb5b" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/6ea84030dd0b5b03e4720c244ea8b4ec65e1f236" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/710c1fc8cf7dc1386312c34de5057933fcf868b3" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/720e81dcaf83f867288a90293c5de3b088d5c556" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/72cdc8f78ab5237f96ed354264c726ac79ec429c" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/73535a4f7af7e4c6aa23556cacd63f6929ac33fe" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/73d7b933a5673a4d6f5905006ef6266dda1e4fba" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/753aea13c82d1f8841c2bd4309b1b55d0ae2ba8d" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/754428e00e8a1d0471e00bd9e8f060ab88ab640e" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/761c29151b23b4d14ce6261626641df1182f7a96" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/7658451dd805f277a5b1c3d4065d752d2d8de5f4" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/767e91cedcd9bc1bdac882acc34a53cc23cf4d02" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/77d3754bdd4ea358369c936ed36b974b4181f6ab" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/7a95295bebe6237f65deb15ffeccab22716d574d" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/7ad88b82e87fbfb3d4bddaa2f6e201a151e3a007" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/7b1010cc012e34af1d03e8845868ff0e1db3a601" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/7d3ddbd11e82807321c9a53835ea897cf43aa7f2" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/7da9c5ab5f049da297b0f4c1322edd696202d02a" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/7e265a019c02e5d089152849ac00bb005fa644f5" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/7f33bff4f740eb898b908374b0c1badd47566947" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/81f13b9b65891f2bfce77cb183a06045c461fee6" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/846a14a480ffa1ad0f6333f3ecf2be3057ce6aed" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/87373a7f89feba2d50591b433f69877044155af2" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/8833ba4c780c94fc6c3c466f849c0387acefdb20" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/8c23a5ecd20db4da2c061f3463254e9de104c8b9" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/8d883f1577ca8c334b7c6d75ccb71209d71ced13" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/8dc80bd5f5d1fea64412203e304432edcf5f52c4" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/8fc9a9ea6ad7d6d51e770076eaddacad9f970c6f" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/8fd167de17534776ef57aba2f27675789a11b8db" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/9117d3e51560813b3ce4615dced18fa0e4d0a25a" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/921c68eaa8776f7544e195ae52224355d08a2d4d" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/9293945411fca2dc81fc34b36b575a384e6d489e" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/933287d66c3ff3f0a21f2c583c763f2f65872ef8" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/933d1d91283403f0a56571f533f482e9744eb735" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/93855fc41b3e3004ca6ba85f34b985042d4c9869" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/9544f445c39470f05785b52cfc31bb73bda22659" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/97757217fde05ff4fc15c864bf29e9f560fd1c62" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/9877c0f2d40dd43878bb0209bbc4b5fa93bec55a" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/98bc5065f79dd9d20cdac14ba28f0cf39908cb5f" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/992860817f7fb0e49423607355dab973aa7ab815" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/995ee3d74bc6042fd6a8908c9df5a4cb530378d8" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/9a38c24a6e87e99a72a3a4f007b117ec191a1705" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/9aa97a0ffcdc37a8ef487355fb7271eb6891deaa" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/9b9fddc17ed7bc05a81c18f01e800a4e9efd0c8d" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/a0d4cb9a5a30bb01e8e4f68d636fb173632ed29d" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/a1e070288ec564d10a8c59779aa07fa771fa1d4f" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/a23d10723415d20f4ef1ed9b14d9dc24494856a0" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/a245750cfe4212dca7bfde918de85f64eb053232" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/a24bbe3600f4dfd61bb8415c6a291e0521e4f267" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/a25104d039a549c8d457ecea3b55369ed312f086" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/a33c4fcabe6aebe012cd01c8cb851a9ab0a12098" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/a393e1727b0decca9f193179765c3a83d7096437" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/a5507f06be4735a3a9e416ea986d52c1a6a20909" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/a5adf028c902d17dd6a7ddeadabbed2b36420313" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/a6aa1237a282ee3a93f2544bb6bb7704e565209e" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/a871185cabce7b96c9e2f6ffb40d9901c774b335" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/a89d0e67bf53e22533a635f103d1fd400969ad56" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/a8d1b4e5672a501d7a6cd14b2929297f3a82e035" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/aa614cc8d05a3a58c30a890c10b9a0c1d609b228" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/aa65320376f63805cc82b247612b2e05b87bdbee" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/abd3f6e2cc8887942de20e1c257427b825aed0ad" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/ad0653a3a63675a7ce797e69b4673866b88ace33" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/ae2ce27806f67312e0d0e29a492db9ab9cb9bf4e" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/ae4c0e671bd004165a1e7877d9c67249a165d2df" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/af75c24dff7e22948ed141c763a1309e6f540bcc" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/b0f228c6d0cbbc9f10117f344d5aae6f001d00fa" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/b2c6eab05580b85cda591093d3f05c44bf453fce" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/b35281c0aae174d1ddc8999d97b9713f8004f285" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/b484ae40795cf9730ba94d5a4ca40aa47b88eacb" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/b49c2fed1417a981ba29b32be73ee1700bea7ec9" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/b68542373c05c0ed25231d09955b2c699d37c45b" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/b6d42cbe913f7275b574a71f0768781bdb6f45b7" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/b80b6c2cae83c2097c7e4c1fb181d47cb8fd0519" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/b90ab62d8591182fd90cd21cdb893178d97f7e0e" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/ba45c93ee6b8b286798d8791ec049207c448f7cd" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/ba67e81ef0f9a14bf5a1ca228bff87c681e83a44" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/bbd1f06ddee4fbbd0e5c9c915889862e5df34f9c" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/bd982feb5dd4362e6bd9746ed216c25ce2749df4" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/be77053335e6496288fcf8b6c4d0b4abf86493ff" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/bfb53203499969fac4f4be48e1bcd9235c2fa101" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/c143576bdb5b34ad89fa3319507ae382a721f587" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/c1ac502a15c53a90a1934f4a31d30f93db36dc8a" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/c1b29883768551fa5aadc38ba6eaad8007b9b85b" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/c2331fe0660ab5e411f6d38968c706aed390d8f6" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/c32647119c244cc018bb1863853d5c7bd37090df" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/c4098733900c27861bbf74a71afcbbd93d62f8ee" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/c4f5769bf3b4f2a55c006b4cf5a3bba44b347241" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/c6ea7b2d47402a458d5d03235bb042b61e05b2e8" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/c7255dc48b42d44f6c0676d6009051b7e1aa885b" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/c7d77af55176ae0ae5e59f46e48e1e6ea108d799" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/c80827341dcdf1c21b303b82ec7e6df7eaf63f3d" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/c9501031a75c067b6602e2831f03421b87be4496" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/c98f88d962dfbc2a83e08bfbd8a87b0cc5a8b330" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/ccd33fa22b2983978f9617b3cde76ea05b683c2c" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/cd0e7701fd79879c56f680817a0d2705751b1f44" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/cd1c2b5c2684d831aab5265e9cd6f1ee045dab9b" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/cf98e8b01e7a759f28a9c5f59c896317d74ac47c" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/d1d171589e035be85dc347278f0735151a342d68" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/d243143bf9b8adf6be92a157428ec6cbfd785423" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/d2cd278979f2842ebd890f1d84712750273ad0fc" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/d2e96eb2699c7dd4a183f13d3a063a1aa9c192fd" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/d3178f8b0d26275667c27bb8533a61643213e4d8" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/d46f536ea4b601c0ff313a5eb5b47e2b55aa9eb0" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/d4be3038631eac422022ee23f43b47905a15b2b5" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/d56b30a2d1b5a2a13ae00392bcb4ca72085310d9" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/d67f85948143218d11e2fb7936a119741036045d" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/d6930ea81dfd91856a06a0c16483e47616642b4b" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/d737c10038a92add90e2ebea5c174ed249de8018" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/d758a67f018b176dfc7d29630cf8cb587f5b2a6b" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/dc7139105787f3ba67d7971d80796e9cf5786a91" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/dc8ec35f43e994b9c4ac61275d6b934990d42181" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/dd2694fe12a018bc6af6f288b5c22a030eec8049" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/de7424f44508582a953f137195533b7a0191eda7" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/de91a02040d792dfcb71a4cb5aa4c1c006201273" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/deb576067b11f6e2a3a39b0f2ef38ddae5c67b18" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/df58248c414f342c81e056b40bee12d17a08bf61" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/e076020b2826abd3a4b960fb33a35fd7d0606dd8" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/e0bcf682342967c002621acd2563a2157826d156" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/e1edca08a7654b42a64647abb0e773eddddb580b" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/e2fa528289b5971f5b40b3687a2a6f0d17348de6" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/e52af0ba8750572b98f3a8968de77811ddff0893" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/e5a0f40647f805b5001645ce2d94505e72fa64f3" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/e69762f0c6a2750c0b03503a6aec90ffc94bcb72" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/e7064f0b80f61dbc65915311032d27baa569ae2a" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/e863a4420854c36168d2b8dd39ce474ebe11cd26" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/e8993f97bb9c83f87c64cfc429095eeaccf32953" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/e9875d9a54b3ebc57df4da886cd30a39252ac666" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/e98a9d92bbbac9b1e64c0641e967adebd681b2aa" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/eb7c31f48c77b742fa29126ac78a2c06c41208e8" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/ec174492517f988010ed3ddbd003cb388f477bb6" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/ec4d6a393be7ec80ccb8c531337a7fc3ef140e66" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/ecd40909ab5e2c61841d9fb95b8aacc87651100c" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/ed17c8ddb6cc8a0b653dc87aca999d31e80c781a" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/ee0b476126bb1c2249b299323718ecef1250645e" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/ee1fb6a0b4139c07f1cf6bce850eaac9a2db29ba" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/eeac145c017ed35305f0ae69f820fc41e26e7997" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/efac7390c6e3a653d3ce93c3d6902f2f1c281ce0" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/f0f0dace93d51cd8e045aeacca89424fc836eebc" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/f3341b8cc55c0bb6e2d0a1f7f06d68e4f04057f5" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/f59ff56e341b94f2bddfd718b48ae9ab1692d720" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/f5a1824b9fd9f124df8097017607bcfa00eccfce" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/f5b92b69853a5d123bffdc6b0ab093f767ec30ad" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/f6aea4c380e41ddef2489ee581ab35e17fa3e8dd" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/f7b7254a3af7c41cb86e4b23bb93c5a6d55e2583" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/f7bdc1b174f53a49c6ef8f8cdb9b8e74e0a5d4ab" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/f98c78c028baf22f39c77faf6e70edb86ac1d927" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/fb440171bca6ff922727e9ff2a4ac40d8d7905ff" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/fc76cc4030b422e4cb5c145c3e8ed122e242acf0" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/fcab3b80624b431e464dc12d3b6da1cf538bd15e" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/fdb3a9b59798d7e851d9074db69422b1d2df38dd" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/fe5de5f387e31b029d589d9b1777fd0d6b3e47b3" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ + "test/core/nanopb/corpus_serverlist/ff52d938aaa10c08b2eb0830fc0066c3b57e040f" + ], + "ci_platforms": [ + "linux", + "mac", + "windows", + "posix" + ], + "cpu_cost": 0.1, + "exclude_configs": [], + "flaky": false, + "language": "c", + "name": "nanopb_fuzzer_serverlist_test_one_entry", + "platforms": [ + "linux", + "mac", + "windows", + "posix" + ] + }, + { + "args": [ "test/core/client_config/uri_corpus/042dc4512fa3d391c5170cf3aa61e6a638f84342" ], "ci_platforms": [ diff --git a/vsprojects/buildtests_c.sln b/vsprojects/buildtests_c.sln index 01c060421c..a582f2b719 100644 --- a/vsprojects/buildtests_c.sln +++ b/vsprojects/buildtests_c.sln @@ -1066,6 +1066,18 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "connection_prefix_bad_clien {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} = {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} EndProjectSection EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "head_of_line_blocking_bad_client_test", "vcxproj\test\head_of_line_blocking_bad_client_test\head_of_line_blocking_bad_client_test.vcxproj", "{23DF0572-DBF1-08DA-8EAD-8508354C90A4}" + ProjectSection(myProperties) = preProject + lib = "False" + EndProjectSection + ProjectSection(ProjectDependencies) = postProject + {BA67B418-B699-E41A-9CC4-0279C49481A5} = {BA67B418-B699-E41A-9CC4-0279C49481A5} + {0A7E7F92-FDEA-40F1-A9EC-3BA484F98BBF} = {0A7E7F92-FDEA-40F1-A9EC-3BA484F98BBF} + {46CEDFFF-9692-456A-AA24-38B5D6BCF4C5} = {46CEDFFF-9692-456A-AA24-38B5D6BCF4C5} + {EAB0A629-17A9-44DB-B5FF-E91A721FE037} = {EAB0A629-17A9-44DB-B5FF-E91A721FE037} + {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} = {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} + EndProjectSection +EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "headers_bad_client_test", "vcxproj\test\headers_bad_client_test\headers_bad_client_test.vcxproj", "{7819A11E-607E-F0C0-FC47-C704CF7D818C}" ProjectSection(myProperties) = preProject lib = "False" @@ -3038,6 +3050,22 @@ Global {AF9D0EB2-2A53-B815-3A63-E82C7F91DB29}.Release-DLL|Win32.Build.0 = Release|Win32 {AF9D0EB2-2A53-B815-3A63-E82C7F91DB29}.Release-DLL|x64.ActiveCfg = Release|x64 {AF9D0EB2-2A53-B815-3A63-E82C7F91DB29}.Release-DLL|x64.Build.0 = Release|x64 + {23DF0572-DBF1-08DA-8EAD-8508354C90A4}.Debug|Win32.ActiveCfg = Debug|Win32 + {23DF0572-DBF1-08DA-8EAD-8508354C90A4}.Debug|x64.ActiveCfg = Debug|x64 + {23DF0572-DBF1-08DA-8EAD-8508354C90A4}.Release|Win32.ActiveCfg = Release|Win32 + {23DF0572-DBF1-08DA-8EAD-8508354C90A4}.Release|x64.ActiveCfg = Release|x64 + {23DF0572-DBF1-08DA-8EAD-8508354C90A4}.Debug|Win32.Build.0 = Debug|Win32 + {23DF0572-DBF1-08DA-8EAD-8508354C90A4}.Debug|x64.Build.0 = Debug|x64 + {23DF0572-DBF1-08DA-8EAD-8508354C90A4}.Release|Win32.Build.0 = Release|Win32 + {23DF0572-DBF1-08DA-8EAD-8508354C90A4}.Release|x64.Build.0 = Release|x64 + {23DF0572-DBF1-08DA-8EAD-8508354C90A4}.Debug-DLL|Win32.ActiveCfg = Debug|Win32 + {23DF0572-DBF1-08DA-8EAD-8508354C90A4}.Debug-DLL|Win32.Build.0 = Debug|Win32 + {23DF0572-DBF1-08DA-8EAD-8508354C90A4}.Debug-DLL|x64.ActiveCfg = Debug|x64 + {23DF0572-DBF1-08DA-8EAD-8508354C90A4}.Debug-DLL|x64.Build.0 = Debug|x64 + {23DF0572-DBF1-08DA-8EAD-8508354C90A4}.Release-DLL|Win32.ActiveCfg = Release|Win32 + {23DF0572-DBF1-08DA-8EAD-8508354C90A4}.Release-DLL|Win32.Build.0 = Release|Win32 + {23DF0572-DBF1-08DA-8EAD-8508354C90A4}.Release-DLL|x64.ActiveCfg = Release|x64 + {23DF0572-DBF1-08DA-8EAD-8508354C90A4}.Release-DLL|x64.Build.0 = Release|x64 {7819A11E-607E-F0C0-FC47-C704CF7D818C}.Debug|Win32.ActiveCfg = Debug|Win32 {7819A11E-607E-F0C0-FC47-C704CF7D818C}.Debug|x64.ActiveCfg = Debug|x64 {7819A11E-607E-F0C0-FC47-C704CF7D818C}.Release|Win32.ActiveCfg = Release|Win32 diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj b/vsprojects/vcxproj/grpc/grpc.vcxproj index e275ff9982..fe991a1a36 100644 --- a/vsprojects/vcxproj/grpc/grpc.vcxproj +++ b/vsprojects/vcxproj/grpc/grpc.vcxproj @@ -321,6 +321,7 @@ <ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\http_client_filter.h" /> <ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\http_server_filter.h" /> <ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\subchannel_call_holder.h" /> + <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\client_channel_factory.h" /> <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\client_config.h" /> <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\connector.h" /> <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\initial_connect_string.h" /> @@ -331,7 +332,6 @@ <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\resolver_factory.h" /> <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\resolver_registry.h" /> <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel.h" /> - <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel_factory.h" /> <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel_index.h" /> <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\uri_parser.h" /> <ClInclude Include="$(SolutionDir)\..\src\core\lib\compression\algorithm_metadata.h" /> @@ -518,6 +518,8 @@ </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\subchannel_call_holder.c"> </ClCompile> + <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\client_channel_factory.c"> + </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\client_config.c"> </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\connector.c"> @@ -540,8 +542,6 @@ </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel.c"> </ClCompile> - <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel_factory.c"> - </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel_index.c"> </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\uri_parser.c"> diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters index 989f8268a7..636599fd7f 100644 --- a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters +++ b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters @@ -148,6 +148,9 @@ <ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\subchannel_call_holder.c"> <Filter>src\core\lib\channel</Filter> </ClCompile> + <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\client_channel_factory.c"> + <Filter>src\core\lib\client_config</Filter> + </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\client_config.c"> <Filter>src\core\lib\client_config</Filter> </ClCompile> @@ -181,9 +184,6 @@ <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel.c"> <Filter>src\core\lib\client_config</Filter> </ClCompile> - <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel_factory.c"> - <Filter>src\core\lib\client_config</Filter> - </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel_index.c"> <Filter>src\core\lib\client_config</Filter> </ClCompile> @@ -650,6 +650,9 @@ <ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\subchannel_call_holder.h"> <Filter>src\core\lib\channel</Filter> </ClInclude> + <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\client_channel_factory.h"> + <Filter>src\core\lib\client_config</Filter> + </ClInclude> <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\client_config.h"> <Filter>src\core\lib\client_config</Filter> </ClInclude> @@ -680,9 +683,6 @@ <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel.h"> <Filter>src\core\lib\client_config</Filter> </ClInclude> - <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel_factory.h"> - <Filter>src\core\lib\client_config</Filter> - </ClInclude> <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel_index.h"> <Filter>src\core\lib\client_config</Filter> </ClInclude> diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj index 7466fe3877..11e4c47b61 100644 --- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj +++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj @@ -311,6 +311,7 @@ <ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\http_client_filter.h" /> <ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\http_server_filter.h" /> <ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\subchannel_call_holder.h" /> + <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\client_channel_factory.h" /> <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\client_config.h" /> <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\connector.h" /> <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\initial_connect_string.h" /> @@ -321,7 +322,6 @@ <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\resolver_factory.h" /> <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\resolver_registry.h" /> <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel.h" /> - <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel_factory.h" /> <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel_index.h" /> <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\uri_parser.h" /> <ClInclude Include="$(SolutionDir)\..\src\core\lib\compression\algorithm_metadata.h" /> @@ -490,6 +490,8 @@ </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\subchannel_call_holder.c"> </ClCompile> + <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\client_channel_factory.c"> + </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\client_config.c"> </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\connector.c"> @@ -512,8 +514,6 @@ </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel.c"> </ClCompile> - <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel_factory.c"> - </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel_index.c"> </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\uri_parser.c"> diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters index 93b0ae90d6..80524e4714 100644 --- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters +++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters @@ -142,6 +142,9 @@ <ClCompile Include="$(SolutionDir)\..\src\core\lib\channel\subchannel_call_holder.c"> <Filter>src\core\lib\channel</Filter> </ClCompile> + <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\client_channel_factory.c"> + <Filter>src\core\lib\client_config</Filter> + </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\client_config.c"> <Filter>src\core\lib\client_config</Filter> </ClCompile> @@ -175,9 +178,6 @@ <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel.c"> <Filter>src\core\lib\client_config</Filter> </ClCompile> - <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel_factory.c"> - <Filter>src\core\lib\client_config</Filter> - </ClCompile> <ClCompile Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel_index.c"> <Filter>src\core\lib\client_config</Filter> </ClCompile> @@ -587,6 +587,9 @@ <ClInclude Include="$(SolutionDir)\..\src\core\lib\channel\subchannel_call_holder.h"> <Filter>src\core\lib\channel</Filter> </ClInclude> + <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\client_channel_factory.h"> + <Filter>src\core\lib\client_config</Filter> + </ClInclude> <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\client_config.h"> <Filter>src\core\lib\client_config</Filter> </ClInclude> @@ -617,9 +620,6 @@ <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel.h"> <Filter>src\core\lib\client_config</Filter> </ClInclude> - <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel_factory.h"> - <Filter>src\core\lib\client_config</Filter> - </ClInclude> <ClInclude Include="$(SolutionDir)\..\src\core\lib\client_config\subchannel_index.h"> <Filter>src\core\lib\client_config</Filter> </ClInclude> diff --git a/vsprojects/vcxproj/test/head_of_line_blocking_bad_client_test/head_of_line_blocking_bad_client_test.vcxproj b/vsprojects/vcxproj/test/head_of_line_blocking_bad_client_test/head_of_line_blocking_bad_client_test.vcxproj new file mode 100644 index 0000000000..fb10f95574 --- /dev/null +++ b/vsprojects/vcxproj/test/head_of_line_blocking_bad_client_test/head_of_line_blocking_bad_client_test.vcxproj @@ -0,0 +1,202 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.props" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\1.0.204.1.props')" /> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{23DF0572-DBF1-08DA-8EAD-8508354C90A4}</ProjectGuid> + <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected> + <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(VisualStudioVersion)' == '10.0'" Label="Configuration"> + <PlatformToolset>v100</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(VisualStudioVersion)' == '11.0'" Label="Configuration"> + <PlatformToolset>v110</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(VisualStudioVersion)' == '12.0'" Label="Configuration"> + <PlatformToolset>v120</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(VisualStudioVersion)' == '14.0'" Label="Configuration"> + <PlatformToolset>v140</PlatformToolset> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration"> + <ConfigurationType>Application</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + <Import Project="$(SolutionDir)\..\vsprojects\global.props" /> + <Import Project="$(SolutionDir)\..\vsprojects\openssl.props" /> + <Import Project="$(SolutionDir)\..\vsprojects\winsock.props" /> + <Import Project="$(SolutionDir)\..\vsprojects\zlib.props" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)'=='Debug'"> + <TargetName>head_of_line_blocking_bad_client_test</TargetName> + <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib> + <Configuration-grpc_dependencies_zlib>Debug</Configuration-grpc_dependencies_zlib> + <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl> + <Configuration-grpc_dependencies_openssl>Debug</Configuration-grpc_dependencies_openssl> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)'=='Release'"> + <TargetName>head_of_line_blocking_bad_client_test</TargetName> + <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib> + <Configuration-grpc_dependencies_zlib>Release</Configuration-grpc_dependencies_zlib> + <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl> + <Configuration-grpc_dependencies_openssl>Release</Configuration-grpc_dependencies_openssl> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <SDLCheck>true</SDLCheck> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <TreatWarningAsError>true</TreatWarningAsError> + <DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat> + <MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation> + <GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <SDLCheck>true</SDLCheck> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <TreatWarningAsError>true</TreatWarningAsError> + <DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat> + <MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation> + <GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>MaxSpeed</Optimization> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <SDLCheck>true</SDLCheck> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <TreatWarningAsError>true</TreatWarningAsError> + <DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat> + <MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation> + <GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + </ItemDefinitionGroup> + + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>MaxSpeed</Optimization> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <SDLCheck>true</SDLCheck> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <TreatWarningAsError>true</TreatWarningAsError> + <DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat> + <MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild> + </ClCompile> + <Link> + <SubSystem>Console</SubSystem> + <GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation> + <GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + </Link> + </ItemDefinitionGroup> + + <ItemGroup> + <ClCompile Include="$(SolutionDir)\..\test\core\bad_client\tests\head_of_line_blocking.c"> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\test/bad_client\bad_client_test\bad_client_test.vcxproj"> + <Project>{BA67B418-B699-E41A-9CC4-0279C49481A5}</Project> + </ProjectReference> + <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc_test_util_unsecure\grpc_test_util_unsecure.vcxproj"> + <Project>{0A7E7F92-FDEA-40F1-A9EC-3BA484F98BBF}</Project> + </ProjectReference> + <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc_unsecure\grpc_unsecure.vcxproj"> + <Project>{46CEDFFF-9692-456A-AA24-38B5D6BCF4C5}</Project> + </ProjectReference> + <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\gpr_test_util\gpr_test_util.vcxproj"> + <Project>{EAB0A629-17A9-44DB-B5FF-E91A721FE037}</Project> + </ProjectReference> + <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\gpr\gpr.vcxproj"> + <Project>{B23D3D1A-9438-4EDA-BEB6-9A0A03D17792}</Project> + </ProjectReference> + </ItemGroup> + <ItemGroup> + <None Include="packages.config" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies.zlib.redist.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies\grpc.dependencies.zlib.targets')" /> + <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies.zlib.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies\grpc.dependencies.zlib.targets')" /> + <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies.openssl.redist.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies\grpc.dependencies.openssl.targets')" /> + <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies\grpc.dependencies.openssl.targets')" /> + </ImportGroup> + <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> + <PropertyGroup> + <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText> + </PropertyGroup> + <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies.zlib.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies.zlib.redist.targets')" /> + <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies.zlib.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies.zlib.targets')" /> + <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies.openssl.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies.openssl.redist.targets')" /> + <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.props')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.props')" /> + <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.targets')" /> + </Target> +</Project> + diff --git a/vsprojects/vcxproj/test/head_of_line_blocking_bad_client_test/head_of_line_blocking_bad_client_test.vcxproj.filters b/vsprojects/vcxproj/test/head_of_line_blocking_bad_client_test/head_of_line_blocking_bad_client_test.vcxproj.filters new file mode 100644 index 0000000000..c3609f0de4 --- /dev/null +++ b/vsprojects/vcxproj/test/head_of_line_blocking_bad_client_test/head_of_line_blocking_bad_client_test.vcxproj.filters @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup> + <ClCompile Include="$(SolutionDir)\..\test\core\bad_client\tests\head_of_line_blocking.c"> + <Filter>test\core\bad_client\tests</Filter> + </ClCompile> + </ItemGroup> + + <ItemGroup> + <Filter Include="test"> + <UniqueIdentifier>{c7d7f2b5-9afd-5668-b11f-ceb3a3503569}</UniqueIdentifier> + </Filter> + <Filter Include="test\core"> + <UniqueIdentifier>{3175d310-96bd-0c78-72e3-b5985873fa82}</UniqueIdentifier> + </Filter> + <Filter Include="test\core\bad_client"> + <UniqueIdentifier>{d7e592e2-acda-4572-59b7-20845fb05bd5}</UniqueIdentifier> + </Filter> + <Filter Include="test\core\bad_client\tests"> + <UniqueIdentifier>{1fa3207b-dc88-d316-7c13-9ac70ddc850e}</UniqueIdentifier> + </Filter> + </ItemGroup> +</Project> + |