Merge branch 'optionalize_resolvers' into optionalize_client_config
This commit is contained in:
commit
3e94de19cd
6
BUILD
6
BUILD
|
|
@ -163,7 +163,6 @@ cc_library(
|
|||
"src/core/ext/census/census_interface.h",
|
||||
"src/core/ext/census/census_rpc_stats.h",
|
||||
"src/core/ext/census/grpc_filter.h",
|
||||
"src/core/ext/census/grpc_plugin.h",
|
||||
"src/core/ext/census/mlog.h",
|
||||
"src/core/ext/census/rpc_metric_id.h",
|
||||
"src/core/ext/client_config/client_channel.h",
|
||||
|
|
@ -531,7 +530,6 @@ cc_library(
|
|||
"src/core/ext/census/census_interface.h",
|
||||
"src/core/ext/census/census_rpc_stats.h",
|
||||
"src/core/ext/census/grpc_filter.h",
|
||||
"src/core/ext/census/grpc_plugin.h",
|
||||
"src/core/ext/census/mlog.h",
|
||||
"src/core/ext/census/rpc_metric_id.h",
|
||||
"src/core/ext/client_config/client_channel.h",
|
||||
|
|
@ -821,8 +819,7 @@ cc_library(
|
|||
cc_library(
|
||||
name = "grpc_zookeeper",
|
||||
srcs = [
|
||||
"src/core/ext/client_config/resolvers/zookeeper_resolver.h",
|
||||
"src/core/ext/client_config/resolvers/zookeeper_resolver.c",
|
||||
"src/core/ext/resolver/zookeeper/zookeeper_resolver.c",
|
||||
],
|
||||
hdrs = [
|
||||
"include/grpc/grpc_zookeeper.h",
|
||||
|
|
@ -1536,7 +1533,6 @@ objc_library(
|
|||
"src/core/ext/census/census_interface.h",
|
||||
"src/core/ext/census/census_rpc_stats.h",
|
||||
"src/core/ext/census/grpc_filter.h",
|
||||
"src/core/ext/census/grpc_plugin.h",
|
||||
"src/core/ext/census/mlog.h",
|
||||
"src/core/ext/census/rpc_metric_id.h",
|
||||
"src/core/ext/client_config/client_channel.h",
|
||||
|
|
|
|||
201
Makefile
201
Makefile
|
|
@ -902,6 +902,7 @@ fling_stream_test: $(BINDIR)/$(CONFIG)/fling_stream_test
|
|||
fling_test: $(BINDIR)/$(CONFIG)/fling_test
|
||||
gen_hpack_tables: $(BINDIR)/$(CONFIG)/gen_hpack_tables
|
||||
gen_legal_metadata_characters: $(BINDIR)/$(CONFIG)/gen_legal_metadata_characters
|
||||
goaway_server_test: $(BINDIR)/$(CONFIG)/goaway_server_test
|
||||
gpr_avl_test: $(BINDIR)/$(CONFIG)/gpr_avl_test
|
||||
gpr_backoff_test: $(BINDIR)/$(CONFIG)/gpr_backoff_test
|
||||
gpr_cmdline_test: $(BINDIR)/$(CONFIG)/gpr_cmdline_test
|
||||
|
|
@ -1116,6 +1117,10 @@ h2_sockpair+trace_nosec_test: $(BINDIR)/$(CONFIG)/h2_sockpair+trace_nosec_test
|
|||
h2_sockpair_1byte_nosec_test: $(BINDIR)/$(CONFIG)/h2_sockpair_1byte_nosec_test
|
||||
h2_uds_nosec_test: $(BINDIR)/$(CONFIG)/h2_uds_nosec_test
|
||||
h2_uds+poll_nosec_test: $(BINDIR)/$(CONFIG)/h2_uds+poll_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
|
||||
uri_fuzzer_test_one_entry: $(BINDIR)/$(CONFIG)/uri_fuzzer_test_one_entry
|
||||
|
||||
run_dep_checks:
|
||||
$(OPENSSL_ALPN_CHECK_CMD) || true
|
||||
|
|
@ -1172,7 +1177,7 @@ plugins: $(PROTOC_PLUGINS)
|
|||
|
||||
privatelibs: privatelibs_c privatelibs_cxx
|
||||
|
||||
privatelibs_c: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libreconnect_server.a $(LIBDIR)/$(CONFIG)/libtest_tcp_server.a $(LIBDIR)/$(CONFIG)/libz.a $(LIBDIR)/$(CONFIG)/libbad_client_test.a $(LIBDIR)/$(CONFIG)/libbad_ssl_test_server.a $(LIBDIR)/$(CONFIG)/libend2end_tests.a $(LIBDIR)/$(CONFIG)/libend2end_nosec_tests.a
|
||||
privatelibs_c: $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util_unsecure.a $(LIBDIR)/$(CONFIG)/libone_input_fuzzer.a $(LIBDIR)/$(CONFIG)/libreconnect_server.a $(LIBDIR)/$(CONFIG)/libtest_tcp_server.a $(LIBDIR)/$(CONFIG)/libz.a $(LIBDIR)/$(CONFIG)/libbad_client_test.a $(LIBDIR)/$(CONFIG)/libbad_ssl_test_server.a $(LIBDIR)/$(CONFIG)/libend2end_tests.a $(LIBDIR)/$(CONFIG)/libend2end_nosec_tests.a
|
||||
pc_c: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc.pc
|
||||
|
||||
pc_c_unsecure: $(LIBDIR)/$(CONFIG)/pkgconfig/grpc_unsecure.pc
|
||||
|
|
@ -1222,6 +1227,7 @@ buildtests_c: privatelibs_c \
|
|||
$(BINDIR)/$(CONFIG)/fling_server \
|
||||
$(BINDIR)/$(CONFIG)/fling_stream_test \
|
||||
$(BINDIR)/$(CONFIG)/fling_test \
|
||||
$(BINDIR)/$(CONFIG)/goaway_server_test \
|
||||
$(BINDIR)/$(CONFIG)/gpr_avl_test \
|
||||
$(BINDIR)/$(CONFIG)/gpr_backoff_test \
|
||||
$(BINDIR)/$(CONFIG)/gpr_cmdline_test \
|
||||
|
|
@ -1340,6 +1346,10 @@ buildtests_c: privatelibs_c \
|
|||
$(BINDIR)/$(CONFIG)/h2_sockpair_1byte_nosec_test \
|
||||
$(BINDIR)/$(CONFIG)/h2_uds_nosec_test \
|
||||
$(BINDIR)/$(CONFIG)/h2_uds+poll_nosec_test \
|
||||
$(BINDIR)/$(CONFIG)/hpack_parser_fuzzer_test_one_entry \
|
||||
$(BINDIR)/$(CONFIG)/http_fuzzer_test_one_entry \
|
||||
$(BINDIR)/$(CONFIG)/json_fuzzer_test_one_entry \
|
||||
$(BINDIR)/$(CONFIG)/uri_fuzzer_test_one_entry \
|
||||
|
||||
|
||||
buildtests_cxx: buildtests_zookeeper privatelibs_cxx \
|
||||
|
|
@ -1480,6 +1490,8 @@ test_c: buildtests_c
|
|||
$(Q) $(BINDIR)/$(CONFIG)/fling_stream_test || ( echo test fling_stream_test failed ; exit 1 )
|
||||
$(E) "[RUN] Testing fling_test"
|
||||
$(Q) $(BINDIR)/$(CONFIG)/fling_test || ( echo test fling_test failed ; exit 1 )
|
||||
$(E) "[RUN] Testing goaway_server_test"
|
||||
$(Q) $(BINDIR)/$(CONFIG)/goaway_server_test || ( echo test goaway_server_test failed ; exit 1 )
|
||||
$(E) "[RUN] Testing gpr_avl_test"
|
||||
$(Q) $(BINDIR)/$(CONFIG)/gpr_avl_test || ( echo test gpr_avl_test failed ; exit 1 )
|
||||
$(E) "[RUN] Testing gpr_backoff_test"
|
||||
|
|
@ -3000,7 +3012,7 @@ endif
|
|||
|
||||
|
||||
LIBGRPC_ZOOKEEPER_SRC = \
|
||||
src/core/ext/client_config/resolvers/zookeeper_resolver.c \
|
||||
src/core/ext/resolver/zookeeper/zookeeper_resolver.c \
|
||||
|
||||
PUBLIC_HEADERS_C += \
|
||||
include/grpc/grpc_zookeeper.h \
|
||||
|
|
@ -3042,6 +3054,31 @@ ifneq ($(NO_DEPS),true)
|
|||
endif
|
||||
|
||||
|
||||
LIBONE_INPUT_FUZZER_SRC = \
|
||||
test/core/util/one_corpus_entry_fuzzer.c \
|
||||
|
||||
PUBLIC_HEADERS_C += \
|
||||
|
||||
LIBONE_INPUT_FUZZER_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(LIBONE_INPUT_FUZZER_SRC))))
|
||||
|
||||
|
||||
$(LIBDIR)/$(CONFIG)/libone_input_fuzzer.a: $(ZLIB_DEP) $(LIBONE_INPUT_FUZZER_OBJS)
|
||||
$(E) "[AR] Creating $@"
|
||||
$(Q) mkdir -p `dirname $@`
|
||||
$(Q) rm -f $(LIBDIR)/$(CONFIG)/libone_input_fuzzer.a
|
||||
$(Q) $(AR) $(LIBDIR)/$(CONFIG)/libone_input_fuzzer.a $(LIBONE_INPUT_FUZZER_OBJS)
|
||||
ifeq ($(SYSTEM),Darwin)
|
||||
$(Q) ranlib -no_warning_for_no_symbols $(LIBDIR)/$(CONFIG)/libone_input_fuzzer.a
|
||||
endif
|
||||
|
||||
|
||||
|
||||
|
||||
ifneq ($(NO_DEPS),true)
|
||||
-include $(LIBONE_INPUT_FUZZER_OBJS:.o=.dep)
|
||||
endif
|
||||
|
||||
|
||||
LIBRECONNECT_SERVER_SRC = \
|
||||
test/core/util/reconnect_server.c \
|
||||
|
||||
|
|
@ -6754,6 +6791,38 @@ endif
|
|||
endif
|
||||
|
||||
|
||||
GOAWAY_SERVER_TEST_SRC = \
|
||||
test/core/end2end/goaway_server_test.c \
|
||||
|
||||
GOAWAY_SERVER_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GOAWAY_SERVER_TEST_SRC))))
|
||||
ifeq ($(NO_SECURE),true)
|
||||
|
||||
# You can't build secure targets if you don't have OpenSSL.
|
||||
|
||||
$(BINDIR)/$(CONFIG)/goaway_server_test: openssl_dep_error
|
||||
|
||||
else
|
||||
|
||||
|
||||
|
||||
$(BINDIR)/$(CONFIG)/goaway_server_test: $(GOAWAY_SERVER_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) $(LD) $(LDFLAGS) $(GOAWAY_SERVER_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) -o $(BINDIR)/$(CONFIG)/goaway_server_test
|
||||
|
||||
endif
|
||||
|
||||
$(OBJDIR)/$(CONFIG)/test/core/end2end/goaway_server_test.o: $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LIBDIR)/$(CONFIG)/libgpr_test_util.a $(LIBDIR)/$(CONFIG)/libgpr.a
|
||||
|
||||
deps_goaway_server_test: $(GOAWAY_SERVER_TEST_OBJS:.o=.dep)
|
||||
|
||||
ifneq ($(NO_SECURE),true)
|
||||
ifneq ($(NO_DEPS),true)
|
||||
-include $(GOAWAY_SERVER_TEST_OBJS:.o=.dep)
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
GPR_AVL_TEST_SRC = \
|
||||
test/core/support/avl_test.c \
|
||||
|
||||
|
|
@ -13711,6 +13780,134 @@ ifneq ($(NO_DEPS),true)
|
|||
endif
|
||||
|
||||
|
||||
HPACK_PARSER_FUZZER_TEST_ONE_ENTRY_SRC = \
|
||||
test/core/transport/chttp2/hpack_parser_fuzzer_test.c \
|
||||
|
||||
HPACK_PARSER_FUZZER_TEST_ONE_ENTRY_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HPACK_PARSER_FUZZER_TEST_ONE_ENTRY_SRC))))
|
||||
ifeq ($(NO_SECURE),true)
|
||||
|
||||
# You can't build secure targets if you don't have OpenSSL.
|
||||
|
||||
$(BINDIR)/$(CONFIG)/hpack_parser_fuzzer_test_one_entry: openssl_dep_error
|
||||
|
||||
else
|
||||
|
||||
|
||||
|
||||
$(BINDIR)/$(CONFIG)/hpack_parser_fuzzer_test_one_entry: $(HPACK_PARSER_FUZZER_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) $(HPACK_PARSER_FUZZER_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)/hpack_parser_fuzzer_test_one_entry
|
||||
|
||||
endif
|
||||
|
||||
$(OBJDIR)/$(CONFIG)/test/core/transport/chttp2/hpack_parser_fuzzer_test.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_hpack_parser_fuzzer_test_one_entry: $(HPACK_PARSER_FUZZER_TEST_ONE_ENTRY_OBJS:.o=.dep)
|
||||
|
||||
ifneq ($(NO_SECURE),true)
|
||||
ifneq ($(NO_DEPS),true)
|
||||
-include $(HPACK_PARSER_FUZZER_TEST_ONE_ENTRY_OBJS:.o=.dep)
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
HTTP_FUZZER_TEST_ONE_ENTRY_SRC = \
|
||||
test/core/http/fuzzer.c \
|
||||
|
||||
HTTP_FUZZER_TEST_ONE_ENTRY_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(HTTP_FUZZER_TEST_ONE_ENTRY_SRC))))
|
||||
ifeq ($(NO_SECURE),true)
|
||||
|
||||
# You can't build secure targets if you don't have OpenSSL.
|
||||
|
||||
$(BINDIR)/$(CONFIG)/http_fuzzer_test_one_entry: openssl_dep_error
|
||||
|
||||
else
|
||||
|
||||
|
||||
|
||||
$(BINDIR)/$(CONFIG)/http_fuzzer_test_one_entry: $(HTTP_FUZZER_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) $(HTTP_FUZZER_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)/http_fuzzer_test_one_entry
|
||||
|
||||
endif
|
||||
|
||||
$(OBJDIR)/$(CONFIG)/test/core/http/fuzzer.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_http_fuzzer_test_one_entry: $(HTTP_FUZZER_TEST_ONE_ENTRY_OBJS:.o=.dep)
|
||||
|
||||
ifneq ($(NO_SECURE),true)
|
||||
ifneq ($(NO_DEPS),true)
|
||||
-include $(HTTP_FUZZER_TEST_ONE_ENTRY_OBJS:.o=.dep)
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
JSON_FUZZER_TEST_ONE_ENTRY_SRC = \
|
||||
test/core/json/fuzzer.c \
|
||||
|
||||
JSON_FUZZER_TEST_ONE_ENTRY_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(JSON_FUZZER_TEST_ONE_ENTRY_SRC))))
|
||||
ifeq ($(NO_SECURE),true)
|
||||
|
||||
# You can't build secure targets if you don't have OpenSSL.
|
||||
|
||||
$(BINDIR)/$(CONFIG)/json_fuzzer_test_one_entry: openssl_dep_error
|
||||
|
||||
else
|
||||
|
||||
|
||||
|
||||
$(BINDIR)/$(CONFIG)/json_fuzzer_test_one_entry: $(JSON_FUZZER_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) $(JSON_FUZZER_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)/json_fuzzer_test_one_entry
|
||||
|
||||
endif
|
||||
|
||||
$(OBJDIR)/$(CONFIG)/test/core/json/fuzzer.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_json_fuzzer_test_one_entry: $(JSON_FUZZER_TEST_ONE_ENTRY_OBJS:.o=.dep)
|
||||
|
||||
ifneq ($(NO_SECURE),true)
|
||||
ifneq ($(NO_DEPS),true)
|
||||
-include $(JSON_FUZZER_TEST_ONE_ENTRY_OBJS:.o=.dep)
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
URI_FUZZER_TEST_ONE_ENTRY_SRC = \
|
||||
test/core/client_config/uri_fuzzer_test.c \
|
||||
|
||||
URI_FUZZER_TEST_ONE_ENTRY_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(URI_FUZZER_TEST_ONE_ENTRY_SRC))))
|
||||
ifeq ($(NO_SECURE),true)
|
||||
|
||||
# You can't build secure targets if you don't have OpenSSL.
|
||||
|
||||
$(BINDIR)/$(CONFIG)/uri_fuzzer_test_one_entry: openssl_dep_error
|
||||
|
||||
else
|
||||
|
||||
|
||||
|
||||
$(BINDIR)/$(CONFIG)/uri_fuzzer_test_one_entry: $(URI_FUZZER_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) $(URI_FUZZER_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)/uri_fuzzer_test_one_entry
|
||||
|
||||
endif
|
||||
|
||||
$(OBJDIR)/$(CONFIG)/test/core/client_config/uri_fuzzer_test.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_uri_fuzzer_test_one_entry: $(URI_FUZZER_TEST_ONE_ENTRY_OBJS:.o=.dep)
|
||||
|
||||
ifneq ($(NO_SECURE),true)
|
||||
ifneq ($(NO_DEPS),true)
|
||||
-include $(URI_FUZZER_TEST_ONE_ENTRY_OBJS:.o=.dep)
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
28
build.yaml
28
build.yaml
|
|
@ -17,7 +17,6 @@ filegroups:
|
|||
- src/core/ext/census/census_interface.h
|
||||
- src/core/ext/census/census_rpc_stats.h
|
||||
- src/core/ext/census/grpc_filter.h
|
||||
- src/core/ext/census/grpc_plugin.h
|
||||
- src/core/ext/census/mlog.h
|
||||
- src/core/ext/census/rpc_metric_id.h
|
||||
src:
|
||||
|
|
@ -774,10 +773,8 @@ libs:
|
|||
language: c
|
||||
public_headers:
|
||||
- include/grpc/grpc_zookeeper.h
|
||||
headers:
|
||||
- src/core/ext/client_config/resolvers/zookeeper_resolver.h
|
||||
src:
|
||||
- src/core/ext/client_config/resolvers/zookeeper_resolver.c
|
||||
- src/core/ext/resolver/zookeeper/zookeeper_resolver.c
|
||||
deps:
|
||||
- gpr
|
||||
- grpc
|
||||
|
|
@ -786,6 +783,14 @@ libs:
|
|||
platforms:
|
||||
- linux
|
||||
secure: false
|
||||
- name: one_input_fuzzer
|
||||
build: private
|
||||
language: c
|
||||
src:
|
||||
- test/core/util/one_corpus_entry_fuzzer.c
|
||||
deps:
|
||||
- gpr
|
||||
secure: false
|
||||
- name: reconnect_server
|
||||
build: private
|
||||
language: c
|
||||
|
|
@ -1315,6 +1320,21 @@ targets:
|
|||
src:
|
||||
- tools/codegen/core/gen_legal_metadata_characters.c
|
||||
deps: []
|
||||
- name: goaway_server_test
|
||||
cpu_cost: 0.1
|
||||
build: test
|
||||
language: c
|
||||
src:
|
||||
- test/core/end2end/goaway_server_test.c
|
||||
deps:
|
||||
- grpc_test_util
|
||||
- grpc
|
||||
- gpr_test_util
|
||||
- gpr
|
||||
platforms:
|
||||
- mac
|
||||
- linux
|
||||
- posix
|
||||
- name: gpr_avl_test
|
||||
build: test
|
||||
language: c
|
||||
|
|
|
|||
|
|
@ -165,7 +165,6 @@ Pod::Spec.new do |s|
|
|||
'src/core/ext/census/census_interface.h',
|
||||
'src/core/ext/census/census_rpc_stats.h',
|
||||
'src/core/ext/census/grpc_filter.h',
|
||||
'src/core/ext/census/grpc_plugin.h',
|
||||
'src/core/ext/census/mlog.h',
|
||||
'src/core/ext/census/rpc_metric_id.h',
|
||||
'src/core/ext/client_config/client_channel.h',
|
||||
|
|
@ -493,7 +492,6 @@ Pod::Spec.new do |s|
|
|||
'src/core/ext/census/census_interface.h',
|
||||
'src/core/ext/census/census_rpc_stats.h',
|
||||
'src/core/ext/census/grpc_filter.h',
|
||||
'src/core/ext/census/grpc_plugin.h',
|
||||
'src/core/ext/census/mlog.h',
|
||||
'src/core/ext/census/rpc_metric_id.h',
|
||||
'src/core/ext/client_config/client_channel.h',
|
||||
|
|
|
|||
|
|
@ -161,7 +161,6 @@ Gem::Specification.new do |s|
|
|||
s.files += %w( src/core/ext/census/census_interface.h )
|
||||
s.files += %w( src/core/ext/census/census_rpc_stats.h )
|
||||
s.files += %w( src/core/ext/census/grpc_filter.h )
|
||||
s.files += %w( src/core/ext/census/grpc_plugin.h )
|
||||
s.files += %w( src/core/ext/census/mlog.h )
|
||||
s.files += %w( src/core/ext/census/rpc_metric_id.h )
|
||||
s.files += %w( src/core/ext/client_config/client_channel.h )
|
||||
|
|
|
|||
|
|
@ -104,7 +104,6 @@
|
|||
"src/core/ext/census/census_interface.h",
|
||||
"src/core/ext/census/census_rpc_stats.h",
|
||||
"src/core/ext/census/grpc_filter.h",
|
||||
"src/core/ext/census/grpc_plugin.h",
|
||||
"src/core/ext/census/mlog.h",
|
||||
"src/core/ext/census/rpc_metric_id.h",
|
||||
"src/core/ext/client_config/client_channel.h",
|
||||
|
|
|
|||
|
|
@ -165,7 +165,6 @@
|
|||
<file baseinstalldir="/" name="src/core/ext/census/census_interface.h" role="src" />
|
||||
<file baseinstalldir="/" name="src/core/ext/census/census_rpc_stats.h" role="src" />
|
||||
<file baseinstalldir="/" name="src/core/ext/census/grpc_filter.h" role="src" />
|
||||
<file baseinstalldir="/" name="src/core/ext/census/grpc_plugin.h" role="src" />
|
||||
<file baseinstalldir="/" name="src/core/ext/census/mlog.h" role="src" />
|
||||
<file baseinstalldir="/" name="src/core/ext/census/rpc_metric_id.h" role="src" />
|
||||
<file baseinstalldir="/" name="src/core/ext/client_config/client_channel.h" role="src" />
|
||||
|
|
|
|||
|
|
@ -42,9 +42,9 @@
|
|||
#include <grpc/support/slice.h>
|
||||
#include <grpc/support/time.h>
|
||||
|
||||
#include "src/core/lib/channel/channel_stack.h"
|
||||
#include "src/core/ext/census/census_interface.h"
|
||||
#include "src/core/ext/census/census_rpc_stats.h"
|
||||
#include "src/core/lib/channel/channel_stack.h"
|
||||
#include "src/core/lib/transport/static_metadata.h"
|
||||
|
||||
typedef struct call_data {
|
||||
|
|
|
|||
|
|
@ -38,8 +38,12 @@
|
|||
#include <grpc/support/alloc.h>
|
||||
#include <grpc/support/log.h>
|
||||
#include <grpc/support/port_platform.h>
|
||||
#include <grpc/support/slice.h>
|
||||
#include <grpc/support/slice_buffer.h>
|
||||
#include <grpc/support/string_util.h>
|
||||
|
||||
#include "src/core/lib/support/string.h"
|
||||
|
||||
/** a size_t default value... maps to all 1's */
|
||||
#define NOT_SET (~(size_t)0)
|
||||
|
||||
|
|
@ -133,6 +137,51 @@ static int parse_fragment_or_query(const char *uri_text, size_t *i) {
|
|||
return 1;
|
||||
}
|
||||
|
||||
static void do_nothing(void *ignored) {}
|
||||
static void parse_query_parts(grpc_uri *uri) {
|
||||
static const char *QUERY_PARTS_SEPARATOR = "&";
|
||||
static const char *QUERY_PARTS_VALUE_SEPARATOR = "=";
|
||||
GPR_ASSERT(uri->query != NULL);
|
||||
if (uri->query[0] == '\0') {
|
||||
uri->query_parts = NULL;
|
||||
uri->query_parts_values = NULL;
|
||||
uri->num_query_parts = 0;
|
||||
return;
|
||||
}
|
||||
gpr_slice query_slice =
|
||||
gpr_slice_new(uri->query, strlen(uri->query), do_nothing);
|
||||
gpr_slice_buffer query_parts; /* the &-separated elements of the query */
|
||||
gpr_slice_buffer query_param_parts; /* the =-separated subelements */
|
||||
|
||||
gpr_slice_buffer_init(&query_parts);
|
||||
gpr_slice_buffer_init(&query_param_parts);
|
||||
|
||||
gpr_slice_split(query_slice, QUERY_PARTS_SEPARATOR, &query_parts);
|
||||
uri->query_parts = gpr_malloc(query_parts.count * sizeof(char *));
|
||||
uri->query_parts_values = gpr_malloc(query_parts.count * sizeof(char *));
|
||||
uri->num_query_parts = query_parts.count;
|
||||
for (size_t i = 0; i < query_parts.count; i++) {
|
||||
gpr_slice_split(query_parts.slices[i], QUERY_PARTS_VALUE_SEPARATOR,
|
||||
&query_param_parts);
|
||||
GPR_ASSERT(query_param_parts.count > 0);
|
||||
uri->query_parts[i] =
|
||||
gpr_dump_slice(query_param_parts.slices[0], GPR_DUMP_ASCII);
|
||||
if (query_param_parts.count > 1) {
|
||||
/* TODO(dgq): only the first value after the separator is considered.
|
||||
* Perhaps all chars after the first separator for the query part should
|
||||
* be included, even if they include the separator. */
|
||||
uri->query_parts_values[i] =
|
||||
gpr_dump_slice(query_param_parts.slices[1], GPR_DUMP_ASCII);
|
||||
} else {
|
||||
uri->query_parts_values[i] = NULL;
|
||||
}
|
||||
gpr_slice_buffer_reset_and_unref(&query_param_parts);
|
||||
}
|
||||
gpr_slice_buffer_destroy(&query_parts);
|
||||
gpr_slice_buffer_destroy(&query_param_parts);
|
||||
gpr_slice_unref(query_slice);
|
||||
}
|
||||
|
||||
grpc_uri *grpc_uri_parse(const char *uri_text, int suppress_errors) {
|
||||
grpc_uri *uri;
|
||||
size_t scheme_begin = 0;
|
||||
|
|
@ -227,16 +276,35 @@ grpc_uri *grpc_uri_parse(const char *uri_text, int suppress_errors) {
|
|||
uri->path = copy_component(uri_text, path_begin, path_end);
|
||||
uri->query = copy_component(uri_text, query_begin, query_end);
|
||||
uri->fragment = copy_component(uri_text, fragment_begin, fragment_end);
|
||||
parse_query_parts(uri);
|
||||
|
||||
return uri;
|
||||
}
|
||||
|
||||
const char *grpc_uri_get_query_arg(const grpc_uri *uri, const char *key) {
|
||||
GPR_ASSERT(key != NULL);
|
||||
if (key[0] == '\0') return NULL;
|
||||
|
||||
for (size_t i = 0; i < uri->num_query_parts; ++i) {
|
||||
if (0 == strcmp(key, uri->query_parts[i])) {
|
||||
return uri->query_parts_values[i];
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void grpc_uri_destroy(grpc_uri *uri) {
|
||||
if (!uri) return;
|
||||
gpr_free(uri->scheme);
|
||||
gpr_free(uri->authority);
|
||||
gpr_free(uri->path);
|
||||
gpr_free(uri->query);
|
||||
for (size_t i = 0; i < uri->num_query_parts; ++i) {
|
||||
gpr_free(uri->query_parts[i]);
|
||||
gpr_free(uri->query_parts_values[i]);
|
||||
}
|
||||
gpr_free(uri->query_parts);
|
||||
gpr_free(uri->query_parts_values);
|
||||
gpr_free(uri->fragment);
|
||||
gpr_free(uri);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -34,17 +34,29 @@
|
|||
#ifndef GRPC_CORE_EXT_CLIENT_CONFIG_URI_PARSER_H
|
||||
#define GRPC_CORE_EXT_CLIENT_CONFIG_URI_PARSER_H
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
typedef struct {
|
||||
char *scheme;
|
||||
char *authority;
|
||||
char *path;
|
||||
char *query;
|
||||
/** Query substrings separated by '&' */
|
||||
char **query_parts;
|
||||
/** Number of elements in \a query_parts and \a query_parts_values */
|
||||
size_t num_query_parts;
|
||||
/** Split each query part by '='. NULL if not present. */
|
||||
char **query_parts_values;
|
||||
char *fragment;
|
||||
} grpc_uri;
|
||||
|
||||
/** parse a uri, return NULL on failure */
|
||||
grpc_uri *grpc_uri_parse(const char *uri_text, int suppress_errors);
|
||||
|
||||
/** return the part of a query string after the '=' in "?key=xxx&...", or NULL
|
||||
* if key is not present */
|
||||
const char *grpc_uri_get_query_arg(const grpc_uri *uri, const char *key);
|
||||
|
||||
/** destroy a uri */
|
||||
void grpc_uri_destroy(grpc_uri *uri);
|
||||
|
||||
|
|
|
|||
|
|
@ -31,8 +31,6 @@
|
|||
*
|
||||
*/
|
||||
|
||||
#include "src/core/ext/client_config/resolvers/zookeeper_resolver.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <grpc/support/alloc.h>
|
||||
|
|
@ -474,15 +472,6 @@ static grpc_resolver *zookeeper_create(grpc_resolver_args *args,
|
|||
return &r->base;
|
||||
}
|
||||
|
||||
static void zookeeper_plugin_init() {
|
||||
grpc_register_resolver_type(grpc_zookeeper_resolver_factory_create());
|
||||
}
|
||||
|
||||
void grpc_zookeeper_register() {
|
||||
GRPC_API_TRACE("grpc_zookeeper_register(void)", 0, ());
|
||||
grpc_register_plugin(zookeeper_plugin_init, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* FACTORY
|
||||
*/
|
||||
|
|
@ -509,6 +498,15 @@ static const grpc_resolver_factory_vtable zookeeper_factory_vtable = {
|
|||
static grpc_resolver_factory zookeeper_resolver_factory = {
|
||||
&zookeeper_factory_vtable};
|
||||
|
||||
grpc_resolver_factory *grpc_zookeeper_resolver_factory_create() {
|
||||
static grpc_resolver_factory *zookeeper_resolver_factory_create() {
|
||||
return &zookeeper_resolver_factory;
|
||||
}
|
||||
|
||||
static void zookeeper_plugin_init() {
|
||||
grpc_register_resolver_type(zookeeper_resolver_factory_create());
|
||||
}
|
||||
|
||||
void grpc_zookeeper_register() {
|
||||
GRPC_API_TRACE("grpc_zookeeper_register(void)", 0, ());
|
||||
grpc_register_plugin(zookeeper_plugin_init, NULL);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -40,8 +40,8 @@
|
|||
#include <grpc/support/slice.h>
|
||||
#include <grpc/support/slice_buffer.h>
|
||||
|
||||
#include "src/core/ext/transport/chttp2/transport/chttp2_transport.h"
|
||||
#include "src/core/ext/census/grpc_filter.h"
|
||||
#include "src/core/ext/transport/chttp2/transport/chttp2_transport.h"
|
||||
#include "src/core/lib/channel/channel_args.h"
|
||||
#include "src/core/ext/client_config/client_channel.h"
|
||||
#include "src/core/lib/channel/compress_filter.h"
|
||||
|
|
|
|||
|
|
@ -103,7 +103,8 @@ static void on_connect(grpc_exec_ctx *exec_ctx, void *acp, bool from_iocp) {
|
|||
GPR_ASSERT(transfered_bytes == 0);
|
||||
if (!wsa_success) {
|
||||
char *utf8_message = gpr_format_message(WSAGetLastError());
|
||||
gpr_log(GPR_ERROR, "on_connect error: %s", utf8_message);
|
||||
gpr_log(GPR_ERROR, "on_connect error connecting to '%s': %s",
|
||||
ac->addr_name, utf8_message);
|
||||
gpr_free(utf8_message);
|
||||
} else {
|
||||
*ep = grpc_tcp_create(ac->socket, ac->addr_name);
|
||||
|
|
|
|||
|
|
@ -180,6 +180,13 @@ grpc_json_reader_status grpc_json_reader_run(grpc_json_reader *reader) {
|
|||
case GRPC_JSON_STATE_VALUE_NUMBER_WITH_DECIMAL:
|
||||
case GRPC_JSON_STATE_VALUE_NUMBER_ZERO:
|
||||
case GRPC_JSON_STATE_VALUE_NUMBER_EPM:
|
||||
if (reader->depth == 0) {
|
||||
return GRPC_JSON_PARSE_ERROR;
|
||||
} else if ((c == '}') && !reader->in_object) {
|
||||
return GRPC_JSON_PARSE_ERROR;
|
||||
} else if ((c == ']') && !reader->in_array) {
|
||||
return GRPC_JSON_PARSE_ERROR;
|
||||
}
|
||||
success = (uint32_t)json_reader_set_number(reader);
|
||||
if (!success) return GRPC_JSON_PARSE_ERROR;
|
||||
json_reader_string_clear(reader);
|
||||
|
|
@ -195,8 +202,10 @@ grpc_json_reader_status grpc_json_reader_run(grpc_json_reader *reader) {
|
|||
}
|
||||
if (reader->in_object) {
|
||||
reader->state = GRPC_JSON_STATE_OBJECT_KEY_BEGIN;
|
||||
} else {
|
||||
} else if (reader->in_array) {
|
||||
reader->state = GRPC_JSON_STATE_VALUE_BEGIN;
|
||||
} else {
|
||||
return GRPC_JSON_PARSE_ERROR;
|
||||
}
|
||||
} else {
|
||||
if (reader->depth-- == 0) return GRPC_JSON_PARSE_ERROR;
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
<AssemblyName>Grpc.Auth</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||
<DocumentationFile>bin\$(Configuration)\Grpc.Auth.Xml</DocumentationFile>
|
||||
<NuGetPackageImportStamp>4f8487a9</NuGetPackageImportStamp>
|
||||
<NuGetPackageImportStamp>455903a2</NuGetPackageImportStamp>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
|
|
@ -39,43 +39,30 @@
|
|||
<AssemblyOriginatorKeyFile>..\keys\Grpc.snk</AssemblyOriginatorKeyFile>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="Google.Apis.Auth, Version=1.10.0.25333, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<Reference Include="BouncyCastle.Crypto, Version=1.7.4137.9688, Culture=neutral, PublicKeyToken=a4292a325f69b123, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Google.Apis.Auth.1.10.0\lib\net40\Google.Apis.Auth.dll</HintPath>
|
||||
<HintPath>..\packages\BouncyCastle.1.7.0\lib\Net40-Client\BouncyCastle.Crypto.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Google.Apis.Auth.PlatformServices, Version=1.10.0.25333, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<Reference Include="Google.Apis.Auth, Version=1.11.1.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Google.Apis.Auth.1.10.0\lib\net40\Google.Apis.Auth.PlatformServices.dll</HintPath>
|
||||
<HintPath>..\packages\Google.Apis.Auth.1.11.1\lib\net45\Google.Apis.Auth.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Google.Apis.Core, Version=1.10.0.25331, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<Reference Include="Google.Apis.Auth.PlatformServices, Version=1.11.1.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Google.Apis.Core.1.10.0\lib\portable-net40+sl50+win+wpa81+wp80\Google.Apis.Core.dll</HintPath>
|
||||
<HintPath>..\packages\Google.Apis.Auth.1.11.1\lib\net45\Google.Apis.Auth.PlatformServices.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Google.Apis.Core, Version=1.11.1.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Google.Apis.Core.1.11.1\lib\net45\Google.Apis.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Net" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Net.Http.WebRequest" />
|
||||
<Reference Include="BouncyCastle.Crypto">
|
||||
<HintPath>..\packages\BouncyCastle.1.7.0\lib\Net40-Client\BouncyCastle.Crypto.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Threading.Tasks">
|
||||
<HintPath>..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Threading.Tasks.Extensions">
|
||||
<HintPath>..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Threading.Tasks.Extensions.Desktop">
|
||||
<HintPath>..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.Desktop.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json">
|
||||
<HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Net.Http.Extensions">
|
||||
<HintPath>..\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Extensions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Net.Http.Primitives">
|
||||
<HintPath>..\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Primitives.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="..\Grpc.Core\Version.cs">
|
||||
|
|
@ -93,15 +80,7 @@
|
|||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config" />
|
||||
<None Include="Grpc.Auth.nuspec" />
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<Import Project="..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
|
||||
<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('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets'))" />
|
||||
</Target>
|
||||
</Project>
|
||||
|
|
@ -15,7 +15,7 @@
|
|||
<copyright>Copyright 2015, Google Inc.</copyright>
|
||||
<tags>gRPC RPC Protocol HTTP/2 Auth OAuth2</tags>
|
||||
<dependencies>
|
||||
<dependency id="Google.Apis.Auth" version="1.9.3" />
|
||||
<dependency id="Google.Apis.Auth" version="1.11.1" />
|
||||
<dependency id="Grpc.Core" version="$version$" />
|
||||
</dependencies>
|
||||
</metadata>
|
||||
|
|
|
|||
|
|
@ -1,19 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.2.29.0" newVersion="4.2.29.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.2.28.0" newVersion="4.0.0.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Google.Apis.Core" publicKeyToken="4b01fa6e34db77ab" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-1.9.2.38523" newVersion="1.9.2.38523" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
</configuration>
|
||||
|
|
@ -1,11 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="BouncyCastle" version="1.7.0" targetFramework="net45" />
|
||||
<package id="Google.Apis.Auth" version="1.10.0" targetFramework="net45" />
|
||||
<package id="Google.Apis.Core" version="1.10.0" targetFramework="net45" />
|
||||
<package id="Microsoft.Bcl" version="1.1.10" targetFramework="net45" />
|
||||
<package id="Microsoft.Bcl.Async" version="1.0.168" targetFramework="net45" />
|
||||
<package id="Microsoft.Bcl.Build" version="1.0.21" targetFramework="net45" />
|
||||
<package id="Microsoft.Net.Http" version="2.2.29" targetFramework="net45" />
|
||||
<package id="Google.Apis.Auth" version="1.11.1" targetFramework="net45" />
|
||||
<package id="Google.Apis.Core" version="1.11.1" targetFramework="net45" />
|
||||
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
|
||||
</packages>
|
||||
|
|
@ -9,7 +9,7 @@
|
|||
<AssemblyName>Grpc.IntegrationTesting.Client</AssemblyName>
|
||||
<StartupObject>Grpc.IntegrationTesting.Client.Program</StartupObject>
|
||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||
<NuGetPackageImportStamp>6d22e68f</NuGetPackageImportStamp>
|
||||
<NuGetPackageImportStamp>dfa56e6c</NuGetPackageImportStamp>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
|
|
@ -43,28 +43,17 @@
|
|||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\BouncyCastle.1.7.0\lib\Net40-Client\BouncyCastle.Crypto.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Google.Apis.Auth, Version=1.10.0.25333, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<Reference Include="Google.Apis.Auth, Version=1.11.1.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Google.Apis.Auth.1.10.0\lib\net40\Google.Apis.Auth.dll</HintPath>
|
||||
<HintPath>..\packages\Google.Apis.Auth.1.11.1\lib\net45\Google.Apis.Auth.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Google.Apis.Auth.PlatformServices, Version=1.10.0.25333, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<Reference Include="Google.Apis.Auth.PlatformServices, Version=1.11.1.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Google.Apis.Auth.1.10.0\lib\net40\Google.Apis.Auth.PlatformServices.dll</HintPath>
|
||||
<HintPath>..\packages\Google.Apis.Auth.1.11.1\lib\net45\Google.Apis.Auth.PlatformServices.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Google.Apis.Core, Version=1.10.0.25331, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<Reference Include="Google.Apis.Core, Version=1.11.1.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Google.Apis.Core.1.10.0\lib\portable-net40+sl50+win+wpa81+wp80\Google.Apis.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Threading.Tasks, Version=1.0.12.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Threading.Tasks.Extensions">
|
||||
<HintPath>..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Threading.Tasks.Extensions.Desktop, Version=1.0.168.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.Desktop.dll</HintPath>
|
||||
<HintPath>..\packages\Google.Apis.Core.1.11.1\lib\net45\Google.Apis.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
|
|
@ -73,12 +62,6 @@
|
|||
<Reference Include="System" />
|
||||
<Reference Include="System.Net" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Net.Http.Extensions">
|
||||
<HintPath>..\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Extensions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Net.Http.Primitives">
|
||||
<HintPath>..\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Primitives.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Net.Http.WebRequest" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
|
@ -100,14 +83,6 @@
|
|||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config" />
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<Import Project="..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
|
||||
<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('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets'))" />
|
||||
</Target>
|
||||
</Project>
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.2.29.0" newVersion="4.2.29.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.2.28.0" newVersion="4.0.0.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Google.Apis.Core" publicKeyToken="4b01fa6e34db77ab" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-1.9.2.38523" newVersion="1.9.2.38523" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
</configuration>
|
||||
|
|
@ -1,11 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="BouncyCastle" version="1.7.0" targetFramework="net45" />
|
||||
<package id="Google.Apis.Auth" version="1.10.0" targetFramework="net45" />
|
||||
<package id="Google.Apis.Core" version="1.10.0" targetFramework="net45" />
|
||||
<package id="Microsoft.Bcl" version="1.1.10" targetFramework="net45" />
|
||||
<package id="Microsoft.Bcl.Async" version="1.0.168" targetFramework="net45" />
|
||||
<package id="Microsoft.Bcl.Build" version="1.0.21" targetFramework="net45" />
|
||||
<package id="Microsoft.Net.Http" version="2.2.29" targetFramework="net45" />
|
||||
<package id="Google.Apis.Auth" version="1.11.1" targetFramework="net45" />
|
||||
<package id="Google.Apis.Core" version="1.11.1" targetFramework="net45" />
|
||||
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
|
||||
</packages>
|
||||
|
|
@ -6,6 +6,10 @@
|
|||
<assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.2.29.0" newVersion="4.2.29.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Google.Apis.Core" publicKeyToken="4b01fa6e34db77ab" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-1.11.1.0" newVersion="1.11.1.0" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
</configuration>
|
||||
|
|
@ -9,7 +9,7 @@
|
|||
<AssemblyName>Grpc.IntegrationTesting.Server</AssemblyName>
|
||||
<StartupObject>Grpc.IntegrationTesting.Server.Program</StartupObject>
|
||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||
<NuGetPackageImportStamp>d9ee8e52</NuGetPackageImportStamp>
|
||||
<NuGetPackageImportStamp>7ceb739e</NuGetPackageImportStamp>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
|
|
@ -43,28 +43,17 @@
|
|||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\BouncyCastle.1.7.0\lib\Net40-Client\BouncyCastle.Crypto.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Google.Apis.Auth, Version=1.10.0.25333, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<Reference Include="Google.Apis.Auth, Version=1.11.1.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Google.Apis.Auth.1.10.0\lib\net40\Google.Apis.Auth.dll</HintPath>
|
||||
<HintPath>..\packages\Google.Apis.Auth.1.11.1\lib\net45\Google.Apis.Auth.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Google.Apis.Auth.PlatformServices, Version=1.10.0.25333, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<Reference Include="Google.Apis.Auth.PlatformServices, Version=1.11.1.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Google.Apis.Auth.1.10.0\lib\net40\Google.Apis.Auth.PlatformServices.dll</HintPath>
|
||||
<HintPath>..\packages\Google.Apis.Auth.1.11.1\lib\net45\Google.Apis.Auth.PlatformServices.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Google.Apis.Core, Version=1.10.0.25331, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<Reference Include="Google.Apis.Core, Version=1.11.1.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Google.Apis.Core.1.10.0\lib\portable-net40+sl50+win+wpa81+wp80\Google.Apis.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Threading.Tasks, Version=1.0.12.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Threading.Tasks.Extensions">
|
||||
<HintPath>..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Threading.Tasks.Extensions.Desktop, Version=1.0.168.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.Desktop.dll</HintPath>
|
||||
<HintPath>..\packages\Google.Apis.Core.1.11.1\lib\net45\Google.Apis.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
|
|
@ -73,12 +62,6 @@
|
|||
<Reference Include="System" />
|
||||
<Reference Include="System.Net" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Net.Http.Extensions">
|
||||
<HintPath>..\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Extensions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Net.Http.Primitives">
|
||||
<HintPath>..\packages\Microsoft.Net.Http.2.2.29\lib\net45\System.Net.Http.Primitives.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="System.Net.Http.WebRequest" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
|
|
@ -100,14 +83,6 @@
|
|||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config" />
|
||||
<None Include="packages.config" />
|
||||
</ItemGroup>
|
||||
<Import Project="..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
|
||||
<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('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets'))" />
|
||||
</Target>
|
||||
</Project>
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.2.29.0" newVersion="4.2.29.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.2.28.0" newVersion="4.0.0.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Google.Apis.Core" publicKeyToken="4b01fa6e34db77ab" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-1.9.2.38523" newVersion="1.9.2.38523" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
</configuration>
|
||||
|
|
@ -1,11 +1,7 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="BouncyCastle" version="1.7.0" targetFramework="net45" />
|
||||
<package id="Google.Apis.Auth" version="1.10.0" targetFramework="net45" />
|
||||
<package id="Google.Apis.Core" version="1.10.0" targetFramework="net45" />
|
||||
<package id="Microsoft.Bcl" version="1.1.10" targetFramework="net45" />
|
||||
<package id="Microsoft.Bcl.Async" version="1.0.168" targetFramework="net45" />
|
||||
<package id="Microsoft.Bcl.Build" version="1.0.21" targetFramework="net45" />
|
||||
<package id="Microsoft.Net.Http" version="2.2.29" targetFramework="net45" />
|
||||
<package id="Google.Apis.Auth" version="1.11.1" targetFramework="net45" />
|
||||
<package id="Google.Apis.Core" version="1.11.1" targetFramework="net45" />
|
||||
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
|
||||
</packages>
|
||||
|
|
@ -8,7 +8,7 @@
|
|||
<RootNamespace>Grpc.IntegrationTesting</RootNamespace>
|
||||
<AssemblyName>Grpc.IntegrationTesting</AssemblyName>
|
||||
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||
<NuGetPackageImportStamp>6566287f</NuGetPackageImportStamp>
|
||||
<NuGetPackageImportStamp>3a1c655d</NuGetPackageImportStamp>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
|
|
@ -38,20 +38,24 @@
|
|||
<AssemblyOriginatorKeyFile>..\keys\Grpc.snk</AssemblyOriginatorKeyFile>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="BouncyCastle.Crypto, Version=1.7.4137.9688, Culture=neutral, PublicKeyToken=a4292a325f69b123, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\BouncyCastle.1.7.0\lib\Net40-Client\BouncyCastle.Crypto.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="CommandLine">
|
||||
<HintPath>..\packages\CommandLineParser.1.9.71\lib\net45\CommandLine.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Google.Apis.Auth, Version=1.10.0.25333, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<Reference Include="Google.Apis.Auth, Version=1.11.1.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Google.Apis.Auth.1.10.0\lib\net40\Google.Apis.Auth.dll</HintPath>
|
||||
<HintPath>..\packages\Google.Apis.Auth.1.11.1\lib\net45\Google.Apis.Auth.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Google.Apis.Auth.PlatformServices, Version=1.10.0.25333, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<Reference Include="Google.Apis.Auth.PlatformServices, Version=1.11.1.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Google.Apis.Auth.1.10.0\lib\net40\Google.Apis.Auth.PlatformServices.dll</HintPath>
|
||||
<HintPath>..\packages\Google.Apis.Auth.1.11.1\lib\net45\Google.Apis.Auth.PlatformServices.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Google.Apis.Core, Version=1.10.0.25331, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<Reference Include="Google.Apis.Core, Version=1.11.1.0, Culture=neutral, PublicKeyToken=4b01fa6e34db77ab, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Google.Apis.Core.1.10.0\lib\portable-net40+sl50+win+wpa81+wp80\Google.Apis.Core.dll</HintPath>
|
||||
<HintPath>..\packages\Google.Apis.Core.1.11.1\lib\net45\Google.Apis.Core.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Google.Protobuf, Version=3.0.0.0, Culture=neutral, PublicKeyToken=a7d26565bac4d604, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
|
|
@ -60,6 +64,10 @@
|
|||
<Reference Include="Moq">
|
||||
<HintPath>..\packages\Moq.4.2.1510.2205\lib\net40\Moq.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json, Version=7.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
<HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="nunit.framework">
|
||||
<HintPath>..\packages\NUnit.2.6.4\lib\nunit.framework.dll</HintPath>
|
||||
</Reference>
|
||||
|
|
@ -71,21 +79,6 @@
|
|||
<Reference Include="System.Net" />
|
||||
<Reference Include="System.Net.Http" />
|
||||
<Reference Include="System.Net.Http.WebRequest" />
|
||||
<Reference Include="BouncyCastle.Crypto">
|
||||
<HintPath>..\packages\BouncyCastle.1.7.0\lib\Net40-Client\BouncyCastle.Crypto.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Threading.Tasks">
|
||||
<HintPath>..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Threading.Tasks.Extensions">
|
||||
<HintPath>..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Threading.Tasks.Extensions.Desktop">
|
||||
<HintPath>..\packages\Microsoft.Bcl.Async.1.0.168\lib\net40\Microsoft.Threading.Tasks.Extensions.Desktop.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Newtonsoft.Json">
|
||||
<HintPath>..\packages\Newtonsoft.Json.7.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="..\Grpc.Core\Version.cs">
|
||||
|
|
@ -134,8 +127,9 @@
|
|||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="app.config" />
|
||||
<None Include="packages.config" />
|
||||
<None Include="packages.config">
|
||||
<SubType>Designer</SubType>
|
||||
</None>
|
||||
<None Include="data\README">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
|
|
@ -152,11 +146,4 @@
|
|||
<ItemGroup>
|
||||
<Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
|
||||
</ItemGroup>
|
||||
<Import Project="..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
|
||||
<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('..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets'))" />
|
||||
</Target>
|
||||
</Project>
|
||||
|
|
@ -1,19 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<runtime>
|
||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Net.Http.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.2.29.0" newVersion="4.2.29.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-4.2.28.0" newVersion="4.0.0.0" />
|
||||
</dependentAssembly>
|
||||
<dependentAssembly>
|
||||
<assemblyIdentity name="Google.Apis.Core" publicKeyToken="4b01fa6e34db77ab" culture="neutral" />
|
||||
<bindingRedirect oldVersion="0.0.0.0-1.9.2.38523" newVersion="1.9.2.38523" />
|
||||
</dependentAssembly>
|
||||
</assemblyBinding>
|
||||
</runtime>
|
||||
</configuration>
|
||||
|
|
@ -2,14 +2,10 @@
|
|||
<packages>
|
||||
<package id="BouncyCastle" version="1.7.0" targetFramework="net45" />
|
||||
<package id="CommandLineParser" version="1.9.71" targetFramework="net45" />
|
||||
<package id="Google.Apis.Auth" version="1.10.0" targetFramework="net45" />
|
||||
<package id="Google.Apis.Core" version="1.10.0" targetFramework="net45" />
|
||||
<package id="Google.Apis.Auth" version="1.11.1" targetFramework="net45" />
|
||||
<package id="Google.Apis.Core" version="1.11.1" targetFramework="net45" />
|
||||
<package id="Google.Protobuf" version="3.0.0-beta2" targetFramework="net45" />
|
||||
<package id="Ix-Async" version="1.2.5" targetFramework="net45" />
|
||||
<package id="Microsoft.Bcl" version="1.1.10" targetFramework="net45" />
|
||||
<package id="Microsoft.Bcl.Async" version="1.0.168" targetFramework="net45" />
|
||||
<package id="Microsoft.Bcl.Build" version="1.0.21" targetFramework="net45" />
|
||||
<package id="Microsoft.Net.Http" version="2.2.29" targetFramework="net45" />
|
||||
<package id="Moq" version="4.2.1510.2205" targetFramework="net45" />
|
||||
<package id="Newtonsoft.Json" version="7.0.1" targetFramework="net45" />
|
||||
<package id="NUnit" version="2.6.4" targetFramework="net45" />
|
||||
|
|
|
|||
|
|
@ -545,6 +545,8 @@ var test_cases = {
|
|||
Client: testProto.TestService}
|
||||
};
|
||||
|
||||
exports.test_cases = test_cases;
|
||||
|
||||
/**
|
||||
* Execute a single test case.
|
||||
* @param {string} address The address of the server to connect to, in the
|
||||
|
|
|
|||
|
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var grpc = require('../../..');
|
||||
|
||||
var proto = grpc.load(__dirname + '/../../proto/grpc/testing/metrics.proto');
|
||||
var metrics = proto.grpc.testing;
|
||||
|
||||
function main() {
|
||||
var parseArgs = require('minimist');
|
||||
var argv = parseArgs(process.argv, {
|
||||
string: 'metrics_server_address',
|
||||
boolean: 'total_only'
|
||||
});
|
||||
var client = new metrics.MetricsService(argv.metrics_server_address,
|
||||
grpc.credentials.createInsecure());
|
||||
if (argv.total_only) {
|
||||
client.getGauge({name: 'qps'}, function(err, data) {
|
||||
console.log(data.name + ':', data.long_value);
|
||||
});
|
||||
} else {
|
||||
var call = client.getAllGauges({});
|
||||
call.on('data', function(data) {
|
||||
console.log(data.name + ':', data.long_value);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
main();
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var _ = require('lodash');
|
||||
|
||||
var grpc = require('../../..');
|
||||
|
||||
var proto = grpc.load(__dirname + '/../../proto/grpc/testing/metrics.proto');
|
||||
var metrics = proto.grpc.testing;
|
||||
|
||||
function getGauge(call, callback) {
|
||||
/* jshint validthis: true */
|
||||
// Should be bound to a MetricsServer object
|
||||
var name = call.request.name;
|
||||
if (this.gauges.hasOwnProperty(name)) {
|
||||
callback(null, _.assign({name: name}, this.gauges[name]()));
|
||||
} else {
|
||||
callback({code: grpc.status.NOT_FOUND,
|
||||
details: 'No such gauge: ' + name});
|
||||
}
|
||||
}
|
||||
|
||||
function getAllGauges(call) {
|
||||
/* jshint validthis: true */
|
||||
// Should be bound to a MetricsServer object
|
||||
_.each(this.gauges, function(getter, name) {
|
||||
call.write(_.assign({name: name}, getter()));
|
||||
});
|
||||
call.end();
|
||||
}
|
||||
|
||||
function MetricsServer(port) {
|
||||
var server = new grpc.Server();
|
||||
server.addProtoService(metrics.MetricsService.service, {
|
||||
getGauge: _.bind(getGauge, this),
|
||||
getAllGauges: _.bind(getAllGauges, this)
|
||||
});
|
||||
server.bind('localhost:' + port, grpc.ServerCredentials.createInsecure());
|
||||
this.server = server;
|
||||
this.gauges = {};
|
||||
}
|
||||
|
||||
MetricsServer.prototype.start = function() {
|
||||
this.server.start();
|
||||
}
|
||||
|
||||
MetricsServer.prototype.registerGauge = function(name, getter) {
|
||||
this.gauges[name] = getter;
|
||||
};
|
||||
|
||||
MetricsServer.prototype.shutdown = function() {
|
||||
this.server.forceShutdown();
|
||||
};
|
||||
|
||||
module.exports = MetricsServer;
|
||||
|
|
@ -0,0 +1,126 @@
|
|||
/*
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
var _ = require('lodash');
|
||||
|
||||
var grpc = require('../../..');
|
||||
|
||||
var interop_client = require('../interop/interop_client');
|
||||
var MetricsServer = require('./metrics_server');
|
||||
|
||||
var running;
|
||||
|
||||
var metrics_server;
|
||||
|
||||
var start_time;
|
||||
var query_count;
|
||||
|
||||
function makeCall(client, test_cases) {
|
||||
if (!running) {
|
||||
return;
|
||||
}
|
||||
var test_case = test_cases[_.random(test_cases.length - 1)];
|
||||
interop_client.test_cases[test_case].run(client, function() {
|
||||
query_count += 1;
|
||||
makeCall(client, test_cases);
|
||||
});
|
||||
}
|
||||
|
||||
function makeCalls(client, test_cases, parallel_calls_per_channel) {
|
||||
_.times(parallel_calls_per_channel, function() {
|
||||
makeCall(client, test_cases);
|
||||
});
|
||||
}
|
||||
|
||||
function getQps() {
|
||||
var diff = process.hrtime(start_time);
|
||||
var seconds = diff[0] + diff[1] / 1e9;
|
||||
return {long_value: query_count / seconds};
|
||||
}
|
||||
|
||||
function start(server_addresses, test_cases, channels_per_server,
|
||||
parallel_calls_per_channel, metrics_port) {
|
||||
running = true;
|
||||
/* Assuming that we are not calling unimplemented_method. The client class
|
||||
* used by empty_unary is (currently) the client class used by every interop
|
||||
* test except unimplemented_method */
|
||||
var Client = interop_client.test_cases.empty_unary.Client;
|
||||
/* Make channels_per_server clients connecting to each server address */
|
||||
var channels = _.flatten(_.times(
|
||||
channels_per_server, _.partial(_.map, server_addresses, function(address) {
|
||||
return new Client(address, grpc.credentials.createInsecure());
|
||||
})));
|
||||
metrics_server = new MetricsServer(metrics_port);
|
||||
metrics_server.registerGauge('qps', getQps);
|
||||
start_time = process.hrtime();
|
||||
query_count = 0;
|
||||
_.each(channels, _.partial(makeCalls, _, test_cases,
|
||||
parallel_calls_per_channel));
|
||||
metrics_server.start();
|
||||
}
|
||||
|
||||
function stop() {
|
||||
running = false;
|
||||
metrics_server.shutdown();
|
||||
console.log('QPS: ' + getQps().long_value);
|
||||
}
|
||||
|
||||
function main() {
|
||||
var parseArgs = require('minimist');
|
||||
var argv = parseArgs(process.argv, {
|
||||
string: ['server_addresses', 'test_cases', 'metrics_port'],
|
||||
default: {'server_addresses': 'localhost:8080',
|
||||
'test_duration-secs': -1,
|
||||
'num_channels_per_server': 1,
|
||||
'num_stubs_per_channel': 1,
|
||||
'metrics_port': '8081'}
|
||||
});
|
||||
var server_addresses = argv.server_addresses.split(',');
|
||||
/* Generate an array of test cases, where the number of instances of each name
|
||||
* corresponds to the number given in the argument.
|
||||
* e.g. 'empty_unary:1,large_unary:2' =>
|
||||
* ['empty_unary', 'large_unary', 'large_unary'] */
|
||||
var test_cases = _.flatten(_.map(argv.test_cases.split(','), function(value) {
|
||||
var split = value.split(':');
|
||||
return _.times(split[1], _.constant(split[0]));
|
||||
}));
|
||||
start(server_addresses, test_cases, argv.num_channels_per_server,
|
||||
argv.num_stubs_per_channel, argv.metrics_port);
|
||||
if (argv['test_duration-secs'] > -1) {
|
||||
setTimeout(stop, argv['test_duration-secs'] * 1000);
|
||||
}
|
||||
}
|
||||
|
||||
main();
|
||||
|
|
@ -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
|
||||
|
|
@ -61,15 +61,16 @@ class ChannelCredentials(object):
|
|||
self._low_credentials = low_credentials
|
||||
|
||||
|
||||
def ssl_channel_credentials(root_certificates, private_key, certificate_chain):
|
||||
def ssl_channel_credentials(root_certificates=None, private_key=None,
|
||||
certificate_chain=None):
|
||||
"""Creates a ChannelCredentials for use with an SSL-enabled Channel.
|
||||
|
||||
Args:
|
||||
root_certificates: The PEM-encoded root certificates or None to ask for
|
||||
root_certificates: The PEM-encoded root certificates or unset to ask for
|
||||
them to be retrieved from a default location.
|
||||
private_key: The PEM-encoded private key to use or None if no private key
|
||||
private_key: The PEM-encoded private key to use or unset if no private key
|
||||
should be used.
|
||||
certificate_chain: The PEM-encoded certificate chain to use or None if no
|
||||
certificate_chain: The PEM-encoded certificate chain to use or unset if no
|
||||
certificate chain should be used.
|
||||
|
||||
Returns:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -56,7 +56,7 @@ class SecureInteropTest(
|
|||
self.stub = test_pb2.beta_create_TestService_stub(
|
||||
test_utilities.not_really_secure_channel(
|
||||
'[::]', port, implementations.ssl_channel_credentials(
|
||||
resources.test_root_certificates(), None, None),
|
||||
resources.test_root_certificates()),
|
||||
_SERVER_HOST_OVERRIDE))
|
||||
|
||||
def tearDown(self):
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -94,7 +94,7 @@ def _stub(args):
|
|||
|
||||
channel = test_utilities.not_really_secure_channel(
|
||||
args.server_host, args.server_port,
|
||||
implementations.ssl_channel_credentials(root_certificates, None, None),
|
||||
implementations.ssl_channel_credentials(root_certificates),
|
||||
args.server_host_override)
|
||||
stub = test_pb2.beta_create_TestService_stub(
|
||||
channel, metadata_transformer=metadata_transformer)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -183,7 +183,7 @@ class BetaFeaturesTest(unittest.TestCase):
|
|||
port = self._server.add_secure_port('[::]:0', server_credentials)
|
||||
self._server.start()
|
||||
self._channel_credentials = implementations.ssl_channel_credentials(
|
||||
resources.test_root_certificates(), None, None)
|
||||
resources.test_root_certificates())
|
||||
self._call_credentials = implementations.metadata_call_credentials(
|
||||
_metadata_plugin)
|
||||
channel = test_utilities.not_really_secure_channel(
|
||||
|
|
@ -296,7 +296,7 @@ class ContextManagementAndLifecycleTest(unittest.TestCase):
|
|||
self._server_credentials = implementations.ssl_server_credentials(
|
||||
[(resources.private_key(), resources.certificate_chain(),),])
|
||||
self._channel_credentials = implementations.ssl_channel_credentials(
|
||||
resources.test_root_certificates(), None, None)
|
||||
resources.test_root_certificates())
|
||||
self._stub_options = implementations.stub_options(
|
||||
thread_pool_size=test_constants.POOL_SIZE)
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -94,7 +94,7 @@ class _Implementation(test_interfaces.Implementation):
|
|||
port = server.add_secure_port('[::]:0', server_credentials)
|
||||
server.start()
|
||||
channel_credentials = implementations.ssl_channel_credentials(
|
||||
resources.test_root_certificates(), None, None)
|
||||
resources.test_root_certificates())
|
||||
channel = test_utilities.not_really_secure_channel(
|
||||
'localhost', port, channel_credentials, _SERVER_HOST_OVERRIDE)
|
||||
stub_options = implementations.stub_options(
|
||||
|
|
|
|||
|
|
@ -38,14 +38,13 @@ from tests.unit import resources
|
|||
class ChannelCredentialsTest(unittest.TestCase):
|
||||
|
||||
def test_runtime_provided_root_certificates(self):
|
||||
channel_credentials = implementations.ssl_channel_credentials(
|
||||
None, None, None)
|
||||
channel_credentials = implementations.ssl_channel_credentials()
|
||||
self.assertIsInstance(
|
||||
channel_credentials, implementations.ChannelCredentials)
|
||||
|
||||
def test_application_provided_root_certificates(self):
|
||||
channel_credentials = implementations.ssl_channel_credentials(
|
||||
resources.test_root_certificates(), None, None)
|
||||
resources.test_root_certificates())
|
||||
self.assertIsInstance(
|
||||
channel_credentials, implementations.ChannelCredentials)
|
||||
|
||||
|
|
|
|||
|
|
@ -40,11 +40,18 @@ $PROTOC -I src/proto src/proto/grpc/health/v1/health.proto \
|
|||
--ruby_out=src/ruby/pb \
|
||||
--plugin=$PLUGIN
|
||||
|
||||
$PROTOC -I . test/proto/{messages,test,empty}.proto \
|
||||
$PROTOC -I . \
|
||||
src/proto/grpc/testing/{messages,test,empty}.proto \
|
||||
--grpc_out=src/ruby/pb \
|
||||
--ruby_out=src/ruby/pb \
|
||||
--plugin=$PLUGIN
|
||||
|
||||
$PROTOC -I . \
|
||||
src/proto/grpc/testing/{messages,payloads,stats,services,control}.proto \
|
||||
--grpc_out=src/ruby/qps \
|
||||
--ruby_out=src/ruby/qps \
|
||||
--plugin=$PLUGIN
|
||||
|
||||
$PROTOC -I src/proto/math src/proto/math/math.proto \
|
||||
--grpc_out=src/ruby/bin \
|
||||
--ruby_out=src/ruby/bin \
|
||||
|
|
|
|||
|
|
@ -0,0 +1,164 @@
|
|||
#!/usr/bin/env ruby
|
||||
|
||||
# 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.
|
||||
|
||||
# Worker and worker service implementation
|
||||
|
||||
this_dir = File.expand_path(File.dirname(__FILE__))
|
||||
lib_dir = File.join(File.dirname(this_dir), 'lib')
|
||||
$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
|
||||
$LOAD_PATH.unshift(this_dir) unless $LOAD_PATH.include?(this_dir)
|
||||
|
||||
require 'grpc'
|
||||
require 'histogram'
|
||||
require 'src/proto/grpc/testing/services_services'
|
||||
|
||||
class Poisson
|
||||
def interarrival
|
||||
@lambda_recip * (-Math.log(1.0-rand))
|
||||
end
|
||||
def advance
|
||||
t = @next_time
|
||||
@next_time += interarrival
|
||||
t
|
||||
end
|
||||
def initialize(lambda)
|
||||
@lambda_recip = 1.0/lambda
|
||||
@next_time = Time.now + interarrival
|
||||
end
|
||||
end
|
||||
|
||||
class BenchmarkClient
|
||||
def initialize(config)
|
||||
opts = {}
|
||||
if config.security_params
|
||||
if config.security_params.use_test_ca
|
||||
certs = load_test_certs
|
||||
cred = GRPC::Core::ChannelCredentials.new(certs[0])
|
||||
else
|
||||
cred = GRPC::Core::ChannelCredentials.new()
|
||||
end
|
||||
if config.security_params.server_host_override
|
||||
opts[GRPC::Core::Channel::SSL_TARGET] =
|
||||
config.security_params.server_host_override
|
||||
end
|
||||
else
|
||||
cred = :this_channel_is_insecure
|
||||
end
|
||||
@histres = config.histogram_params.resolution
|
||||
@histmax = config.histogram_params.max_possible
|
||||
@start_time = Time.now
|
||||
@histogram = Histogram.new(@histres, @histmax)
|
||||
@done = false
|
||||
|
||||
gtsr = Grpc::Testing::SimpleRequest
|
||||
gtpt = Grpc::Testing::PayloadType
|
||||
gtp = Grpc::Testing::Payload
|
||||
simple_params = config.payload_config.simple_params
|
||||
req = gtsr.new(response_type: gtpt::COMPRESSABLE,
|
||||
response_size: simple_params.resp_size,
|
||||
payload: gtp.new(type: gtpt::COMPRESSABLE,
|
||||
body: nulls(simple_params.req_size)))
|
||||
|
||||
(0..config.client_channels-1).each do |chan|
|
||||
gtbss = Grpc::Testing::BenchmarkService::Stub
|
||||
st = config.server_targets
|
||||
stub = gtbss.new(st[chan % st.length], cred, **opts)
|
||||
(0..config.outstanding_rpcs_per_channel-1).each do |r|
|
||||
Thread.new {
|
||||
case config.load_params.load.to_s
|
||||
when 'closed_loop'
|
||||
waiter = nil
|
||||
when 'poisson'
|
||||
waiter = Poisson.new(config.load_params.poisson.offered_load /
|
||||
(config.client_channels *
|
||||
config.outstanding_rpcs_per_channel))
|
||||
end
|
||||
case config.rpc_type
|
||||
when :UNARY
|
||||
unary_ping_ponger(req,stub,config,waiter)
|
||||
when :STREAMING
|
||||
streaming_ping_ponger(req,stub,config,waiter)
|
||||
end
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
def wait_to_issue(waiter)
|
||||
if waiter
|
||||
delay = waiter.advance-Time.now
|
||||
sleep delay if delay > 0
|
||||
end
|
||||
end
|
||||
def unary_ping_ponger(req, stub, config,waiter)
|
||||
while !@done
|
||||
wait_to_issue(waiter)
|
||||
start = Time.now
|
||||
resp = stub.unary_call(req)
|
||||
@histogram.add((Time.now-start)*1e9)
|
||||
end
|
||||
end
|
||||
def streaming_ping_ponger(req, stub, config, waiter)
|
||||
q = EnumeratorQueue.new(self)
|
||||
resp = stub.streaming_call(q.each_item)
|
||||
start = Time.now
|
||||
q.push(req)
|
||||
resp.each do |r|
|
||||
@histogram.add((Time.now-start)*1e9)
|
||||
if !@done
|
||||
wait_to_issue(waiter)
|
||||
start = Time.now
|
||||
q.push(req)
|
||||
else
|
||||
q.push(self)
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
def mark(reset)
|
||||
lat = Grpc::Testing::HistogramData.new(
|
||||
bucket: @histogram.contents,
|
||||
min_seen: @histogram.minimum,
|
||||
max_seen: @histogram.maximum,
|
||||
sum: @histogram.sum,
|
||||
sum_of_squares: @histogram.sum_of_squares,
|
||||
count: @histogram.count
|
||||
)
|
||||
elapsed = Time.now-@start_time
|
||||
if reset
|
||||
@start_time = Time.now
|
||||
@histogram = Histogram.new(@histres, @histmax)
|
||||
end
|
||||
Grpc::Testing::ClientStats.new(latencies: lat, time_elapsed: elapsed)
|
||||
end
|
||||
def shutdown
|
||||
@done = true
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
#!/usr/bin/env ruby
|
||||
|
||||
# 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.
|
||||
|
||||
# Histogram class for use in performance testing and measurement
|
||||
|
||||
class Histogram
|
||||
# Determine the bucket index for a given value
|
||||
# @param {number} value The value to check
|
||||
# @return {number} The bucket index
|
||||
def bucket_for(value)
|
||||
(Math.log(value)/Math.log(@multiplier)).to_i
|
||||
end
|
||||
# Initialize an empty histogram
|
||||
# @param {number} resolution The resolution of the histogram
|
||||
# @param {number} max_possible The maximum value for the histogram
|
||||
def initialize(resolution, max_possible)
|
||||
@resolution=resolution
|
||||
@max_possible=max_possible
|
||||
@sum=0
|
||||
@sum_of_squares=0
|
||||
@multiplier=1+resolution
|
||||
@count=0
|
||||
@min_seen=max_possible
|
||||
@max_seen=0
|
||||
@buckets=Array.new(bucket_for(max_possible)+1, 0)
|
||||
end
|
||||
# Add a value to the histogram. This updates all statistics with the new
|
||||
# value. Those statistics should not be modified except with this function
|
||||
# @param {number} value The value to add
|
||||
def add(value)
|
||||
@sum += value
|
||||
@sum_of_squares += value * value
|
||||
@count += 1
|
||||
if value < @min_seen
|
||||
@min_seen = value
|
||||
end
|
||||
if value > @max_seen
|
||||
@max_seen = value
|
||||
end
|
||||
@buckets[bucket_for(value)] += 1
|
||||
end
|
||||
def minimum
|
||||
@min_seen
|
||||
end
|
||||
def maximum
|
||||
@max_seen
|
||||
end
|
||||
def sum
|
||||
@sum
|
||||
end
|
||||
def sum_of_squares
|
||||
@sum_of_squares
|
||||
end
|
||||
def count
|
||||
@count
|
||||
end
|
||||
def contents
|
||||
@buckets
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
#!/usr/bin/env ruby
|
||||
|
||||
# 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.
|
||||
|
||||
# Worker and worker service implementation
|
||||
|
||||
this_dir = File.expand_path(File.dirname(__FILE__))
|
||||
lib_dir = File.join(File.dirname(this_dir), 'lib')
|
||||
$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
|
||||
$LOAD_PATH.unshift(this_dir) unless $LOAD_PATH.include?(this_dir)
|
||||
|
||||
require 'grpc'
|
||||
|
||||
# produces a string of null chars (\0 aka pack 'x') of length l.
|
||||
def nulls(l)
|
||||
fail 'requires #{l} to be +ve' if l < 0
|
||||
[].pack('x' * l).force_encoding('ascii-8bit')
|
||||
end
|
||||
|
||||
# load the test-only certificates
|
||||
def load_test_certs
|
||||
this_dir = File.expand_path(File.dirname(__FILE__))
|
||||
data_dir = File.join(File.dirname(this_dir), 'spec/testdata')
|
||||
files = ['ca.pem', 'server1.key', 'server1.pem']
|
||||
files.map { |f| File.open(File.join(data_dir, f)).read }
|
||||
end
|
||||
|
||||
# A EnumeratorQueue wraps a Queue yielding the items added to it via each_item.
|
||||
class EnumeratorQueue
|
||||
extend Forwardable
|
||||
def_delegators :@q, :push
|
||||
|
||||
def initialize(sentinel)
|
||||
@q = Queue.new
|
||||
@sentinel = sentinel
|
||||
end
|
||||
|
||||
def each_item
|
||||
return enum_for(:each_item) unless block_given?
|
||||
loop do
|
||||
r = @q.pop
|
||||
break if r.equal?(@sentinel)
|
||||
fail r if r.is_a? Exception
|
||||
yield r
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,91 @@
|
|||
#!/usr/bin/env ruby
|
||||
|
||||
# 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.
|
||||
|
||||
# Worker and worker service implementation
|
||||
|
||||
this_dir = File.expand_path(File.dirname(__FILE__))
|
||||
lib_dir = File.join(File.dirname(this_dir), 'lib')
|
||||
$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
|
||||
$LOAD_PATH.unshift(this_dir) unless $LOAD_PATH.include?(this_dir)
|
||||
|
||||
require 'grpc'
|
||||
require 'qps-common'
|
||||
require 'src/proto/grpc/testing/messages'
|
||||
require 'src/proto/grpc/testing/services_services'
|
||||
require 'src/proto/grpc/testing/stats'
|
||||
|
||||
class BenchmarkServiceImpl < Grpc::Testing::BenchmarkService::Service
|
||||
def unary_call(req, _call)
|
||||
sr = Grpc::Testing::SimpleResponse
|
||||
pl = Grpc::Testing::Payload
|
||||
sr.new(payload: pl.new(body: nulls(req.response_size)))
|
||||
end
|
||||
def streaming_call(reqs)
|
||||
q = EnumeratorQueue.new(self)
|
||||
Thread.new {
|
||||
sr = Grpc::Testing::SimpleResponse
|
||||
pl = Grpc::Testing::Payload
|
||||
reqs.each do |req|
|
||||
q.push(sr.new(payload: pl.new(body: nulls(req.response_size))))
|
||||
end
|
||||
q.push(self)
|
||||
}
|
||||
q.each_item
|
||||
end
|
||||
end
|
||||
|
||||
class BenchmarkServer
|
||||
def initialize(config, port)
|
||||
if config.security_params
|
||||
certs = load_test_certs
|
||||
cred = GRPC::Core::ServerCredentials.new(
|
||||
nil, [{private_key: certs[1], cert_chain: certs[2]}], false)
|
||||
else
|
||||
cred = :this_port_is_insecure
|
||||
end
|
||||
@server = GRPC::RpcServer.new
|
||||
@port = @server.add_http2_port("0.0.0.0:" + port.to_s, cred)
|
||||
@server.handle(BenchmarkServiceImpl.new)
|
||||
@start_time = Time.now
|
||||
Thread.new {
|
||||
@server.run
|
||||
}
|
||||
end
|
||||
def mark(reset)
|
||||
s = Grpc::Testing::ServerStats.new(time_elapsed:
|
||||
(Time.now-@start_time).to_f)
|
||||
@start_time = Time.now if reset
|
||||
s
|
||||
end
|
||||
def get_port
|
||||
@port
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,129 @@
|
|||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: src/proto/grpc/testing/control.proto
|
||||
|
||||
require 'google/protobuf'
|
||||
|
||||
require 'src/proto/grpc/testing/payloads'
|
||||
require 'src/proto/grpc/testing/stats'
|
||||
Google::Protobuf::DescriptorPool.generated_pool.build do
|
||||
add_message "grpc.testing.PoissonParams" do
|
||||
optional :offered_load, :double, 1
|
||||
end
|
||||
add_message "grpc.testing.UniformParams" do
|
||||
optional :interarrival_lo, :double, 1
|
||||
optional :interarrival_hi, :double, 2
|
||||
end
|
||||
add_message "grpc.testing.DeterministicParams" do
|
||||
optional :offered_load, :double, 1
|
||||
end
|
||||
add_message "grpc.testing.ParetoParams" do
|
||||
optional :interarrival_base, :double, 1
|
||||
optional :alpha, :double, 2
|
||||
end
|
||||
add_message "grpc.testing.ClosedLoopParams" do
|
||||
end
|
||||
add_message "grpc.testing.LoadParams" do
|
||||
oneof :load do
|
||||
optional :closed_loop, :message, 1, "grpc.testing.ClosedLoopParams"
|
||||
optional :poisson, :message, 2, "grpc.testing.PoissonParams"
|
||||
optional :uniform, :message, 3, "grpc.testing.UniformParams"
|
||||
optional :determ, :message, 4, "grpc.testing.DeterministicParams"
|
||||
optional :pareto, :message, 5, "grpc.testing.ParetoParams"
|
||||
end
|
||||
end
|
||||
add_message "grpc.testing.SecurityParams" do
|
||||
optional :use_test_ca, :bool, 1
|
||||
optional :server_host_override, :string, 2
|
||||
end
|
||||
add_message "grpc.testing.ClientConfig" do
|
||||
repeated :server_targets, :string, 1
|
||||
optional :client_type, :enum, 2, "grpc.testing.ClientType"
|
||||
optional :security_params, :message, 3, "grpc.testing.SecurityParams"
|
||||
optional :outstanding_rpcs_per_channel, :int32, 4
|
||||
optional :client_channels, :int32, 5
|
||||
optional :async_client_threads, :int32, 7
|
||||
optional :rpc_type, :enum, 8, "grpc.testing.RpcType"
|
||||
optional :load_params, :message, 10, "grpc.testing.LoadParams"
|
||||
optional :payload_config, :message, 11, "grpc.testing.PayloadConfig"
|
||||
optional :histogram_params, :message, 12, "grpc.testing.HistogramParams"
|
||||
repeated :core_list, :int32, 13
|
||||
optional :core_limit, :int32, 14
|
||||
end
|
||||
add_message "grpc.testing.ClientStatus" do
|
||||
optional :stats, :message, 1, "grpc.testing.ClientStats"
|
||||
end
|
||||
add_message "grpc.testing.Mark" do
|
||||
optional :reset, :bool, 1
|
||||
end
|
||||
add_message "grpc.testing.ClientArgs" do
|
||||
oneof :argtype do
|
||||
optional :setup, :message, 1, "grpc.testing.ClientConfig"
|
||||
optional :mark, :message, 2, "grpc.testing.Mark"
|
||||
end
|
||||
end
|
||||
add_message "grpc.testing.ServerConfig" do
|
||||
optional :server_type, :enum, 1, "grpc.testing.ServerType"
|
||||
optional :security_params, :message, 2, "grpc.testing.SecurityParams"
|
||||
optional :port, :int32, 4
|
||||
optional :async_server_threads, :int32, 7
|
||||
optional :core_limit, :int32, 8
|
||||
optional :payload_config, :message, 9, "grpc.testing.PayloadConfig"
|
||||
repeated :core_list, :int32, 10
|
||||
end
|
||||
add_message "grpc.testing.ServerArgs" do
|
||||
oneof :argtype do
|
||||
optional :setup, :message, 1, "grpc.testing.ServerConfig"
|
||||
optional :mark, :message, 2, "grpc.testing.Mark"
|
||||
end
|
||||
end
|
||||
add_message "grpc.testing.ServerStatus" do
|
||||
optional :stats, :message, 1, "grpc.testing.ServerStats"
|
||||
optional :port, :int32, 2
|
||||
optional :cores, :int32, 3
|
||||
end
|
||||
add_message "grpc.testing.CoreRequest" do
|
||||
end
|
||||
add_message "grpc.testing.CoreResponse" do
|
||||
optional :cores, :int32, 1
|
||||
end
|
||||
add_message "grpc.testing.Void" do
|
||||
end
|
||||
add_enum "grpc.testing.ClientType" do
|
||||
value :SYNC_CLIENT, 0
|
||||
value :ASYNC_CLIENT, 1
|
||||
end
|
||||
add_enum "grpc.testing.ServerType" do
|
||||
value :SYNC_SERVER, 0
|
||||
value :ASYNC_SERVER, 1
|
||||
value :ASYNC_GENERIC_SERVER, 2
|
||||
end
|
||||
add_enum "grpc.testing.RpcType" do
|
||||
value :UNARY, 0
|
||||
value :STREAMING, 1
|
||||
end
|
||||
end
|
||||
|
||||
module Grpc
|
||||
module Testing
|
||||
PoissonParams = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.PoissonParams").msgclass
|
||||
UniformParams = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.UniformParams").msgclass
|
||||
DeterministicParams = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.DeterministicParams").msgclass
|
||||
ParetoParams = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ParetoParams").msgclass
|
||||
ClosedLoopParams = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ClosedLoopParams").msgclass
|
||||
LoadParams = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.LoadParams").msgclass
|
||||
SecurityParams = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.SecurityParams").msgclass
|
||||
ClientConfig = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ClientConfig").msgclass
|
||||
ClientStatus = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ClientStatus").msgclass
|
||||
Mark = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.Mark").msgclass
|
||||
ClientArgs = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ClientArgs").msgclass
|
||||
ServerConfig = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ServerConfig").msgclass
|
||||
ServerArgs = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ServerArgs").msgclass
|
||||
ServerStatus = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ServerStatus").msgclass
|
||||
CoreRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.CoreRequest").msgclass
|
||||
CoreResponse = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.CoreResponse").msgclass
|
||||
Void = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.Void").msgclass
|
||||
ClientType = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ClientType").enummodule
|
||||
ServerType = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ServerType").enummodule
|
||||
RpcType = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.RpcType").enummodule
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,80 @@
|
|||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: src/proto/grpc/testing/messages.proto
|
||||
|
||||
require 'google/protobuf'
|
||||
|
||||
Google::Protobuf::DescriptorPool.generated_pool.build do
|
||||
add_message "grpc.testing.Payload" do
|
||||
optional :type, :enum, 1, "grpc.testing.PayloadType"
|
||||
optional :body, :bytes, 2
|
||||
end
|
||||
add_message "grpc.testing.EchoStatus" do
|
||||
optional :code, :int32, 1
|
||||
optional :message, :string, 2
|
||||
end
|
||||
add_message "grpc.testing.SimpleRequest" do
|
||||
optional :response_type, :enum, 1, "grpc.testing.PayloadType"
|
||||
optional :response_size, :int32, 2
|
||||
optional :payload, :message, 3, "grpc.testing.Payload"
|
||||
optional :fill_username, :bool, 4
|
||||
optional :fill_oauth_scope, :bool, 5
|
||||
optional :response_compression, :enum, 6, "grpc.testing.CompressionType"
|
||||
optional :response_status, :message, 7, "grpc.testing.EchoStatus"
|
||||
end
|
||||
add_message "grpc.testing.SimpleResponse" do
|
||||
optional :payload, :message, 1, "grpc.testing.Payload"
|
||||
optional :username, :string, 2
|
||||
optional :oauth_scope, :string, 3
|
||||
end
|
||||
add_message "grpc.testing.StreamingInputCallRequest" do
|
||||
optional :payload, :message, 1, "grpc.testing.Payload"
|
||||
end
|
||||
add_message "grpc.testing.StreamingInputCallResponse" do
|
||||
optional :aggregated_payload_size, :int32, 1
|
||||
end
|
||||
add_message "grpc.testing.ResponseParameters" do
|
||||
optional :size, :int32, 1
|
||||
optional :interval_us, :int32, 2
|
||||
end
|
||||
add_message "grpc.testing.StreamingOutputCallRequest" do
|
||||
optional :response_type, :enum, 1, "grpc.testing.PayloadType"
|
||||
repeated :response_parameters, :message, 2, "grpc.testing.ResponseParameters"
|
||||
optional :payload, :message, 3, "grpc.testing.Payload"
|
||||
optional :response_compression, :enum, 6, "grpc.testing.CompressionType"
|
||||
optional :response_status, :message, 7, "grpc.testing.EchoStatus"
|
||||
end
|
||||
add_message "grpc.testing.StreamingOutputCallResponse" do
|
||||
optional :payload, :message, 1, "grpc.testing.Payload"
|
||||
end
|
||||
add_message "grpc.testing.ReconnectInfo" do
|
||||
optional :passed, :bool, 1
|
||||
repeated :backoff_ms, :int32, 2
|
||||
end
|
||||
add_enum "grpc.testing.PayloadType" do
|
||||
value :COMPRESSABLE, 0
|
||||
value :UNCOMPRESSABLE, 1
|
||||
value :RANDOM, 2
|
||||
end
|
||||
add_enum "grpc.testing.CompressionType" do
|
||||
value :NONE, 0
|
||||
value :GZIP, 1
|
||||
value :DEFLATE, 2
|
||||
end
|
||||
end
|
||||
|
||||
module Grpc
|
||||
module Testing
|
||||
Payload = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.Payload").msgclass
|
||||
EchoStatus = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.EchoStatus").msgclass
|
||||
SimpleRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.SimpleRequest").msgclass
|
||||
SimpleResponse = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.SimpleResponse").msgclass
|
||||
StreamingInputCallRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.StreamingInputCallRequest").msgclass
|
||||
StreamingInputCallResponse = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.StreamingInputCallResponse").msgclass
|
||||
ResponseParameters = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ResponseParameters").msgclass
|
||||
StreamingOutputCallRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.StreamingOutputCallRequest").msgclass
|
||||
StreamingOutputCallResponse = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.StreamingOutputCallResponse").msgclass
|
||||
ReconnectInfo = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ReconnectInfo").msgclass
|
||||
PayloadType = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.PayloadType").enummodule
|
||||
CompressionType = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.CompressionType").enummodule
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: src/proto/grpc/testing/payloads.proto
|
||||
|
||||
require 'google/protobuf'
|
||||
|
||||
Google::Protobuf::DescriptorPool.generated_pool.build do
|
||||
add_message "grpc.testing.ByteBufferParams" do
|
||||
optional :req_size, :int32, 1
|
||||
optional :resp_size, :int32, 2
|
||||
end
|
||||
add_message "grpc.testing.SimpleProtoParams" do
|
||||
optional :req_size, :int32, 1
|
||||
optional :resp_size, :int32, 2
|
||||
end
|
||||
add_message "grpc.testing.ComplexProtoParams" do
|
||||
end
|
||||
add_message "grpc.testing.PayloadConfig" do
|
||||
oneof :payload do
|
||||
optional :bytebuf_params, :message, 1, "grpc.testing.ByteBufferParams"
|
||||
optional :simple_params, :message, 2, "grpc.testing.SimpleProtoParams"
|
||||
optional :complex_params, :message, 3, "grpc.testing.ComplexProtoParams"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
module Grpc
|
||||
module Testing
|
||||
ByteBufferParams = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ByteBufferParams").msgclass
|
||||
SimpleProtoParams = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.SimpleProtoParams").msgclass
|
||||
ComplexProtoParams = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ComplexProtoParams").msgclass
|
||||
PayloadConfig = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.PayloadConfig").msgclass
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: src/proto/grpc/testing/services.proto
|
||||
|
||||
require 'google/protobuf'
|
||||
|
||||
require 'src/proto/grpc/testing/messages'
|
||||
require 'src/proto/grpc/testing/control'
|
||||
Google::Protobuf::DescriptorPool.generated_pool.build do
|
||||
end
|
||||
|
||||
module Grpc
|
||||
module Testing
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# Source: src/proto/grpc/testing/services.proto for package 'grpc.testing'
|
||||
|
||||
require 'grpc'
|
||||
require 'src/proto/grpc/testing/services'
|
||||
|
||||
module Grpc
|
||||
module Testing
|
||||
module BenchmarkService
|
||||
|
||||
# TODO: add proto service documentation here
|
||||
class Service
|
||||
|
||||
include GRPC::GenericService
|
||||
|
||||
self.marshal_class_method = :encode
|
||||
self.unmarshal_class_method = :decode
|
||||
self.service_name = 'grpc.testing.BenchmarkService'
|
||||
|
||||
rpc :UnaryCall, SimpleRequest, SimpleResponse
|
||||
rpc :StreamingCall, stream(SimpleRequest), stream(SimpleResponse)
|
||||
end
|
||||
|
||||
Stub = Service.rpc_stub_class
|
||||
end
|
||||
module WorkerService
|
||||
|
||||
# TODO: add proto service documentation here
|
||||
class Service
|
||||
|
||||
include GRPC::GenericService
|
||||
|
||||
self.marshal_class_method = :encode
|
||||
self.unmarshal_class_method = :decode
|
||||
self.service_name = 'grpc.testing.WorkerService'
|
||||
|
||||
rpc :RunServer, stream(ServerArgs), stream(ServerStatus)
|
||||
rpc :RunClient, stream(ClientArgs), stream(ClientStatus)
|
||||
rpc :CoreCount, CoreRequest, CoreResponse
|
||||
rpc :QuitWorker, Void, Void
|
||||
end
|
||||
|
||||
Stub = Service.rpc_stub_class
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
# Generated by the protocol buffer compiler. DO NOT EDIT!
|
||||
# source: src/proto/grpc/testing/stats.proto
|
||||
|
||||
require 'google/protobuf'
|
||||
|
||||
Google::Protobuf::DescriptorPool.generated_pool.build do
|
||||
add_message "grpc.testing.ServerStats" do
|
||||
optional :time_elapsed, :double, 1
|
||||
optional :time_user, :double, 2
|
||||
optional :time_system, :double, 3
|
||||
end
|
||||
add_message "grpc.testing.HistogramParams" do
|
||||
optional :resolution, :double, 1
|
||||
optional :max_possible, :double, 2
|
||||
end
|
||||
add_message "grpc.testing.HistogramData" do
|
||||
repeated :bucket, :uint32, 1
|
||||
optional :min_seen, :double, 2
|
||||
optional :max_seen, :double, 3
|
||||
optional :sum, :double, 4
|
||||
optional :sum_of_squares, :double, 5
|
||||
optional :count, :double, 6
|
||||
end
|
||||
add_message "grpc.testing.ClientStats" do
|
||||
optional :latencies, :message, 1, "grpc.testing.HistogramData"
|
||||
optional :time_elapsed, :double, 2
|
||||
optional :time_user, :double, 3
|
||||
optional :time_system, :double, 4
|
||||
end
|
||||
end
|
||||
|
||||
module Grpc
|
||||
module Testing
|
||||
ServerStats = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ServerStats").msgclass
|
||||
HistogramParams = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.HistogramParams").msgclass
|
||||
HistogramData = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.HistogramData").msgclass
|
||||
ClientStats = Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ClientStats").msgclass
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,128 @@
|
|||
#!/usr/bin/env ruby
|
||||
|
||||
# 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.
|
||||
|
||||
# Worker and worker service implementation
|
||||
|
||||
this_dir = File.expand_path(File.dirname(__FILE__))
|
||||
lib_dir = File.join(File.dirname(this_dir), 'lib')
|
||||
$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
|
||||
$LOAD_PATH.unshift(this_dir) unless $LOAD_PATH.include?(this_dir)
|
||||
|
||||
require 'grpc'
|
||||
require 'optparse'
|
||||
require 'histogram'
|
||||
require 'etc'
|
||||
require 'facter'
|
||||
require 'client'
|
||||
require 'qps-common'
|
||||
require 'server'
|
||||
require 'src/proto/grpc/testing/services_services'
|
||||
|
||||
class WorkerServiceImpl < Grpc::Testing::WorkerService::Service
|
||||
def cpu_cores
|
||||
Facter.value('processors')['count']
|
||||
end
|
||||
def run_server(reqs)
|
||||
q = EnumeratorQueue.new(self)
|
||||
Thread.new {
|
||||
bms = ''
|
||||
gtss = Grpc::Testing::ServerStatus
|
||||
reqs.each do |req|
|
||||
case req.argtype.to_s
|
||||
when 'setup'
|
||||
bms = BenchmarkServer.new(req.setup, @server_port)
|
||||
q.push(gtss.new(stats: bms.mark(false), port: bms.get_port))
|
||||
when 'mark'
|
||||
q.push(gtss.new(stats: bms.mark(req.mark.reset), cores: cpu_cores))
|
||||
end
|
||||
end
|
||||
q.push(self)
|
||||
bms.stop
|
||||
}
|
||||
q.each_item
|
||||
end
|
||||
def run_client(reqs)
|
||||
q = EnumeratorQueue.new(self)
|
||||
Thread.new {
|
||||
client = ''
|
||||
reqs.each do |req|
|
||||
case req.argtype.to_s
|
||||
when 'setup'
|
||||
client = BenchmarkClient.new(req.setup)
|
||||
q.push(Grpc::Testing::ClientStatus.new(stats: client.mark(false)))
|
||||
when 'mark'
|
||||
q.push(Grpc::Testing::ClientStatus.new(stats:
|
||||
client.mark(req.mark.reset)))
|
||||
end
|
||||
end
|
||||
q.push(self)
|
||||
client.shutdown
|
||||
}
|
||||
q.each_item
|
||||
end
|
||||
def core_count(_args, _call)
|
||||
Grpc::Testing::CoreResponse.new(cores: cpu_cores)
|
||||
end
|
||||
def quit_worker(_args, _call)
|
||||
Thread.new {
|
||||
sleep 3
|
||||
@server.stop
|
||||
}
|
||||
Grpc::Testing::Void.new
|
||||
end
|
||||
def initialize(s, sp)
|
||||
@server = s
|
||||
@server_port = sp
|
||||
end
|
||||
end
|
||||
|
||||
def main
|
||||
options = {
|
||||
'driver_port' => 0,
|
||||
'server_port' => 0
|
||||
}
|
||||
OptionParser.new do |opts|
|
||||
opts.banner = 'Usage: [--driver_port <port>] [--server_port <port>]'
|
||||
opts.on('--driver_port PORT', '<port>') do |v|
|
||||
options['driver_port'] = v
|
||||
end
|
||||
opts.on('--server_port PORT', '<port>') do |v|
|
||||
options['server_port'] = v
|
||||
end
|
||||
end.parse!
|
||||
s = GRPC::RpcServer.new
|
||||
s.add_http2_port("0.0.0.0:" + options['driver_port'].to_s,
|
||||
:this_port_is_insecure)
|
||||
s.handle(WorkerServiceImpl.new(s, options['server_port'].to_i))
|
||||
s.run
|
||||
end
|
||||
|
||||
main
|
||||
|
|
@ -97,6 +97,7 @@ int main(int argc, char **argv) {
|
|||
|
||||
test_fails(ipv4, "ipv4:10.2.1.1");
|
||||
test_succeeds(ipv4, "ipv4:10.2.1.1:1234");
|
||||
test_succeeds(ipv4, "ipv4:10.2.1.1:1234,127.0.0.1:4321");
|
||||
test_fails(ipv4, "ipv4:10.2.1.1:123456");
|
||||
test_fails(ipv4, "ipv4:www.google.com");
|
||||
test_fails(ipv4, "ipv4:[");
|
||||
|
|
|
|||
|
|
@ -56,6 +56,73 @@ static void test_fails(const char *uri_text) {
|
|||
GPR_ASSERT(NULL == grpc_uri_parse(uri_text, 0));
|
||||
}
|
||||
|
||||
static void test_query_parts() {
|
||||
{
|
||||
const char *uri_text = "http://foo/path?a&b=B&c=&#frag";
|
||||
grpc_uri *uri = grpc_uri_parse(uri_text, 0);
|
||||
GPR_ASSERT(uri);
|
||||
|
||||
GPR_ASSERT(0 == strcmp("http", uri->scheme));
|
||||
GPR_ASSERT(0 == strcmp("foo", uri->authority));
|
||||
GPR_ASSERT(0 == strcmp("/path", uri->path));
|
||||
GPR_ASSERT(0 == strcmp("a&b=B&c=&", uri->query));
|
||||
GPR_ASSERT(4 == uri->num_query_parts);
|
||||
|
||||
GPR_ASSERT(0 == strcmp("a", uri->query_parts[0]));
|
||||
GPR_ASSERT(NULL == uri->query_parts_values[0]);
|
||||
|
||||
GPR_ASSERT(0 == strcmp("b", uri->query_parts[1]));
|
||||
GPR_ASSERT(0 == strcmp("B", uri->query_parts_values[1]));
|
||||
|
||||
GPR_ASSERT(0 == strcmp("c", uri->query_parts[2]));
|
||||
GPR_ASSERT(0 == strcmp("", uri->query_parts_values[2]));
|
||||
|
||||
GPR_ASSERT(0 == strcmp("", uri->query_parts[3]));
|
||||
GPR_ASSERT(NULL == uri->query_parts_values[3]);
|
||||
|
||||
GPR_ASSERT(NULL == grpc_uri_get_query_arg(uri, "a"));
|
||||
GPR_ASSERT(0 == strcmp("B", grpc_uri_get_query_arg(uri, "b")));
|
||||
GPR_ASSERT(0 == strcmp("", grpc_uri_get_query_arg(uri, "c")));
|
||||
GPR_ASSERT(NULL == grpc_uri_get_query_arg(uri, ""));
|
||||
|
||||
GPR_ASSERT(0 == strcmp("frag", uri->fragment));
|
||||
grpc_uri_destroy(uri);
|
||||
}
|
||||
{
|
||||
/* test the current behavior of multiple query part values */
|
||||
const char *uri_text = "http://auth/path?foo=bar=baz&foobar==";
|
||||
grpc_uri *uri = grpc_uri_parse(uri_text, 0);
|
||||
GPR_ASSERT(uri);
|
||||
|
||||
GPR_ASSERT(0 == strcmp("http", uri->scheme));
|
||||
GPR_ASSERT(0 == strcmp("auth", uri->authority));
|
||||
GPR_ASSERT(0 == strcmp("/path", uri->path));
|
||||
GPR_ASSERT(0 == strcmp("foo=bar=baz&foobar==", uri->query));
|
||||
GPR_ASSERT(2 == uri->num_query_parts);
|
||||
|
||||
GPR_ASSERT(0 == strcmp("bar", grpc_uri_get_query_arg(uri, "foo")));
|
||||
GPR_ASSERT(0 == strcmp("", grpc_uri_get_query_arg(uri, "foobar")));
|
||||
|
||||
grpc_uri_destroy(uri);
|
||||
}
|
||||
{
|
||||
/* empty query */
|
||||
const char *uri_text = "http://foo/path";
|
||||
grpc_uri *uri = grpc_uri_parse(uri_text, 0);
|
||||
GPR_ASSERT(uri);
|
||||
|
||||
GPR_ASSERT(0 == strcmp("http", uri->scheme));
|
||||
GPR_ASSERT(0 == strcmp("foo", uri->authority));
|
||||
GPR_ASSERT(0 == strcmp("/path", uri->path));
|
||||
GPR_ASSERT(0 == strcmp("", uri->query));
|
||||
GPR_ASSERT(0 == uri->num_query_parts);
|
||||
GPR_ASSERT(NULL == uri->query_parts);
|
||||
GPR_ASSERT(NULL == uri->query_parts_values);
|
||||
GPR_ASSERT(0 == strcmp("", uri->fragment));
|
||||
grpc_uri_destroy(uri);
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
grpc_test_init(argc, argv);
|
||||
test_succeeds("http://www.google.com", "http", "www.google.com", "", "", "");
|
||||
|
|
@ -82,5 +149,6 @@ int main(int argc, char **argv) {
|
|||
test_fails("http://foo?x[bar]");
|
||||
test_fails("http://foo?bar#lol#");
|
||||
|
||||
test_query_parts();
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,301 @@
|
|||
/*
|
||||
*
|
||||
* 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 <grpc/grpc.h>
|
||||
#include <grpc/support/alloc.h>
|
||||
#include <grpc/support/log.h>
|
||||
#include <grpc/support/string_util.h>
|
||||
#include <string.h>
|
||||
#include "src/core/lib/iomgr/resolve_address.h"
|
||||
#include "src/core/lib/iomgr/sockaddr.h"
|
||||
#include "test/core/end2end/cq_verifier.h"
|
||||
#include "test/core/util/port.h"
|
||||
#include "test/core/util/test_config.h"
|
||||
|
||||
static void *tag(intptr_t i) { return (void *)i; }
|
||||
|
||||
static gpr_mu g_mu;
|
||||
static int g_resolve_port = -1;
|
||||
static grpc_resolved_addresses *(*iomgr_resolve_address)(
|
||||
const char *name, const char *default_port);
|
||||
|
||||
static void set_resolve_port(int port) {
|
||||
gpr_mu_lock(&g_mu);
|
||||
g_resolve_port = port;
|
||||
gpr_mu_unlock(&g_mu);
|
||||
}
|
||||
|
||||
static grpc_resolved_addresses *my_resolve_address(const char *name,
|
||||
const char *addr) {
|
||||
if (0 != strcmp(name, "test")) {
|
||||
return iomgr_resolve_address(name, addr);
|
||||
}
|
||||
|
||||
gpr_mu_lock(&g_mu);
|
||||
if (g_resolve_port < 0) {
|
||||
gpr_mu_unlock(&g_mu);
|
||||
return NULL;
|
||||
} else {
|
||||
grpc_resolved_addresses *addrs = gpr_malloc(sizeof(*addrs));
|
||||
addrs->naddrs = 1;
|
||||
addrs->addrs = gpr_malloc(sizeof(*addrs->addrs));
|
||||
memset(addrs->addrs, 0, sizeof(*addrs->addrs));
|
||||
struct sockaddr_in *sa = (struct sockaddr_in *)addrs->addrs[0].addr;
|
||||
sa->sin_family = AF_INET;
|
||||
sa->sin_addr.s_addr = htonl(0x7f000001);
|
||||
sa->sin_port = htons((uint16_t)g_resolve_port);
|
||||
addrs->addrs[0].len = sizeof(*sa);
|
||||
gpr_mu_unlock(&g_mu);
|
||||
return addrs;
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
grpc_completion_queue *cq;
|
||||
cq_verifier *cqv;
|
||||
grpc_op ops[6];
|
||||
grpc_op *op;
|
||||
|
||||
grpc_test_init(argc, argv);
|
||||
|
||||
gpr_mu_init(&g_mu);
|
||||
iomgr_resolve_address = grpc_blocking_resolve_address;
|
||||
grpc_blocking_resolve_address = my_resolve_address;
|
||||
grpc_init();
|
||||
|
||||
int was_cancelled1;
|
||||
int was_cancelled2;
|
||||
|
||||
grpc_metadata_array trailing_metadata_recv1;
|
||||
grpc_metadata_array request_metadata1;
|
||||
grpc_call_details request_details1;
|
||||
grpc_status_code status1;
|
||||
char *details1 = NULL;
|
||||
size_t details_capacity1 = 0;
|
||||
grpc_metadata_array_init(&trailing_metadata_recv1);
|
||||
grpc_metadata_array_init(&request_metadata1);
|
||||
grpc_call_details_init(&request_details1);
|
||||
|
||||
grpc_metadata_array trailing_metadata_recv2;
|
||||
grpc_metadata_array request_metadata2;
|
||||
grpc_call_details request_details2;
|
||||
grpc_status_code status2;
|
||||
char *details2 = NULL;
|
||||
size_t details_capacity2 = 0;
|
||||
grpc_metadata_array_init(&trailing_metadata_recv2);
|
||||
grpc_metadata_array_init(&request_metadata2);
|
||||
grpc_call_details_init(&request_details2);
|
||||
|
||||
cq = grpc_completion_queue_create(NULL);
|
||||
cqv = cq_verifier_create(cq);
|
||||
|
||||
/* reserve two ports */
|
||||
int port1 = grpc_pick_unused_port_or_die();
|
||||
int port2 = grpc_pick_unused_port_or_die();
|
||||
|
||||
char *addr;
|
||||
|
||||
/* create a channel that picks first amongst the servers */
|
||||
grpc_channel *chan = grpc_insecure_channel_create("test", NULL, NULL);
|
||||
/* and an initial call to them */
|
||||
grpc_call *call1 = grpc_channel_create_call(
|
||||
chan, NULL, GRPC_PROPAGATE_DEFAULTS, cq, "/foo", "127.0.0.1",
|
||||
GRPC_TIMEOUT_SECONDS_TO_DEADLINE(20), NULL);
|
||||
/* send initial metadata to probe connectivity */
|
||||
op = ops;
|
||||
op->op = GRPC_OP_SEND_INITIAL_METADATA;
|
||||
op->data.send_initial_metadata.count = 0;
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
op++;
|
||||
GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(call1, ops,
|
||||
(size_t)(op - ops),
|
||||
tag(0x101), NULL));
|
||||
/* and receive status to probe termination */
|
||||
op = ops;
|
||||
op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
|
||||
op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv1;
|
||||
op->data.recv_status_on_client.status = &status1;
|
||||
op->data.recv_status_on_client.status_details = &details1;
|
||||
op->data.recv_status_on_client.status_details_capacity = &details_capacity1;
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
op++;
|
||||
GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(call1, ops,
|
||||
(size_t)(op - ops),
|
||||
tag(0x102), NULL));
|
||||
|
||||
/* bring a server up on the first port */
|
||||
grpc_server *server1 = grpc_server_create(NULL, NULL);
|
||||
gpr_asprintf(&addr, "127.0.0.1:%d", port1);
|
||||
grpc_server_add_insecure_http2_port(server1, addr);
|
||||
grpc_server_register_completion_queue(server1, cq, NULL);
|
||||
gpr_free(addr);
|
||||
grpc_server_start(server1);
|
||||
|
||||
/* request a call to the server */
|
||||
grpc_call *server_call1;
|
||||
GPR_ASSERT(GRPC_CALL_OK ==
|
||||
grpc_server_request_call(server1, &server_call1, &request_details1,
|
||||
&request_metadata1, cq, cq, tag(0x301)));
|
||||
|
||||
set_resolve_port(port1);
|
||||
|
||||
/* first call should now start */
|
||||
cq_expect_completion(cqv, tag(0x101), 1);
|
||||
cq_expect_completion(cqv, tag(0x301), 1);
|
||||
cq_verify(cqv);
|
||||
|
||||
GPR_ASSERT(GRPC_CHANNEL_READY ==
|
||||
grpc_channel_check_connectivity_state(chan, 0));
|
||||
grpc_channel_watch_connectivity_state(chan, GRPC_CHANNEL_READY,
|
||||
gpr_inf_future(GPR_CLOCK_REALTIME), cq,
|
||||
tag(0x9999));
|
||||
|
||||
/* listen for close on the server call to probe for finishing */
|
||||
op = ops;
|
||||
op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
|
||||
op->data.recv_close_on_server.cancelled = &was_cancelled1;
|
||||
op->flags = 0;
|
||||
op++;
|
||||
GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(server_call1, ops,
|
||||
(size_t)(op - ops),
|
||||
tag(0x302), NULL));
|
||||
|
||||
/* shutdown first server:
|
||||
* we should see a connectivity change and then nothing */
|
||||
set_resolve_port(-1);
|
||||
grpc_server_shutdown_and_notify(server1, cq, tag(0xdead1));
|
||||
cq_expect_completion(cqv, tag(0x9999), 1);
|
||||
cq_verify(cqv);
|
||||
cq_verify_empty(cqv);
|
||||
|
||||
/* and a new call: should go through to server2 when we start it */
|
||||
grpc_call *call2 = grpc_channel_create_call(
|
||||
chan, NULL, GRPC_PROPAGATE_DEFAULTS, cq, "/foo", "127.0.0.1",
|
||||
GRPC_TIMEOUT_SECONDS_TO_DEADLINE(20), NULL);
|
||||
/* send initial metadata to probe connectivity */
|
||||
op = ops;
|
||||
op->op = GRPC_OP_SEND_INITIAL_METADATA;
|
||||
op->data.send_initial_metadata.count = 0;
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
op++;
|
||||
GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(call2, ops,
|
||||
(size_t)(op - ops),
|
||||
tag(0x201), NULL));
|
||||
/* and receive status to probe termination */
|
||||
op = ops;
|
||||
op->op = GRPC_OP_RECV_STATUS_ON_CLIENT;
|
||||
op->data.recv_status_on_client.trailing_metadata = &trailing_metadata_recv2;
|
||||
op->data.recv_status_on_client.status = &status2;
|
||||
op->data.recv_status_on_client.status_details = &details2;
|
||||
op->data.recv_status_on_client.status_details_capacity = &details_capacity2;
|
||||
op->flags = 0;
|
||||
op->reserved = NULL;
|
||||
op++;
|
||||
GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(call2, ops,
|
||||
(size_t)(op - ops),
|
||||
tag(0x202), NULL));
|
||||
|
||||
/* and bring up second server */
|
||||
set_resolve_port(port2);
|
||||
grpc_server *server2 = grpc_server_create(NULL, NULL);
|
||||
gpr_asprintf(&addr, "127.0.0.1:%d", port2);
|
||||
grpc_server_add_insecure_http2_port(server2, addr);
|
||||
grpc_server_register_completion_queue(server2, cq, NULL);
|
||||
gpr_free(addr);
|
||||
grpc_server_start(server2);
|
||||
|
||||
/* request a call to the server */
|
||||
grpc_call *server_call2;
|
||||
GPR_ASSERT(GRPC_CALL_OK ==
|
||||
grpc_server_request_call(server2, &server_call2, &request_details2,
|
||||
&request_metadata2, cq, cq, tag(0x401)));
|
||||
|
||||
/* second call should now start */
|
||||
cq_expect_completion(cqv, tag(0x201), 1);
|
||||
cq_expect_completion(cqv, tag(0x401), 1);
|
||||
cq_verify(cqv);
|
||||
|
||||
/* listen for close on the server call to probe for finishing */
|
||||
op = ops;
|
||||
op->op = GRPC_OP_RECV_CLOSE_ON_SERVER;
|
||||
op->data.recv_close_on_server.cancelled = &was_cancelled2;
|
||||
op->flags = 0;
|
||||
op++;
|
||||
GPR_ASSERT(GRPC_CALL_OK == grpc_call_start_batch(server_call2, ops,
|
||||
(size_t)(op - ops),
|
||||
tag(0x402), NULL));
|
||||
|
||||
/* shutdown second server: we should see nothing */
|
||||
grpc_server_shutdown_and_notify(server2, cq, tag(0xdead2));
|
||||
cq_verify_empty(cqv);
|
||||
|
||||
grpc_call_cancel(call1, NULL);
|
||||
grpc_call_cancel(call2, NULL);
|
||||
|
||||
/* now everything else should finish */
|
||||
cq_expect_completion(cqv, tag(0x102), 1);
|
||||
cq_expect_completion(cqv, tag(0x202), 1);
|
||||
cq_expect_completion(cqv, tag(0x302), 1);
|
||||
cq_expect_completion(cqv, tag(0x402), 1);
|
||||
cq_expect_completion(cqv, tag(0xdead1), 1);
|
||||
cq_expect_completion(cqv, tag(0xdead2), 1);
|
||||
cq_verify(cqv);
|
||||
|
||||
grpc_call_destroy(call1);
|
||||
grpc_call_destroy(call2);
|
||||
grpc_call_destroy(server_call1);
|
||||
grpc_call_destroy(server_call2);
|
||||
grpc_server_destroy(server1);
|
||||
grpc_server_destroy(server2);
|
||||
grpc_channel_destroy(chan);
|
||||
|
||||
grpc_metadata_array_destroy(&trailing_metadata_recv1);
|
||||
grpc_metadata_array_destroy(&request_metadata1);
|
||||
grpc_call_details_destroy(&request_details1);
|
||||
gpr_free(details1);
|
||||
grpc_metadata_array_destroy(&trailing_metadata_recv2);
|
||||
grpc_metadata_array_destroy(&request_metadata2);
|
||||
grpc_call_details_destroy(&request_details2);
|
||||
gpr_free(details2);
|
||||
|
||||
cq_verifier_destroy(cqv);
|
||||
grpc_completion_queue_destroy(cq);
|
||||
|
||||
grpc_shutdown();
|
||||
gpr_mu_destroy(&g_mu);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"":21}
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"":21]
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"":0}f'+G{)13(ァ!(''\!
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"":0},f'+G{)23(ァ!''!
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"":0]f'+G{)13(ァ!(''\!
|
||||
|
|
@ -0,0 +1 @@
|
|||
{"":0],f'`+G{-22(ァ!''!
|
||||
|
|
@ -35,16 +35,53 @@
|
|||
#include <string.h>
|
||||
|
||||
#include <grpc/support/alloc.h>
|
||||
#include <grpc/support/log.h>
|
||||
|
||||
#include "src/core/lib/json/json.h"
|
||||
|
||||
static size_t g_total_size = 0;
|
||||
static gpr_allocation_functions g_old_allocs;
|
||||
|
||||
void *guard_malloc(size_t size) {
|
||||
size_t *ptr;
|
||||
g_total_size += size;
|
||||
ptr = g_old_allocs.malloc_fn(size + sizeof(size));
|
||||
*ptr++ = size;
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void *guard_realloc(void *vptr, size_t size) {
|
||||
size_t *ptr = vptr;
|
||||
--ptr;
|
||||
g_total_size -= *ptr;
|
||||
ptr = g_old_allocs.realloc_fn(ptr, size + sizeof(size));
|
||||
g_total_size += size;
|
||||
*ptr++ = size;
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void guard_free(void *vptr) {
|
||||
size_t *ptr = vptr;
|
||||
--ptr;
|
||||
g_total_size -= *ptr;
|
||||
g_old_allocs.free_fn(ptr);
|
||||
}
|
||||
|
||||
struct gpr_allocation_functions g_guard_allocs = {guard_malloc, guard_realloc,
|
||||
guard_free};
|
||||
|
||||
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
|
||||
char *s = gpr_malloc(size);
|
||||
char *s;
|
||||
g_old_allocs = gpr_get_allocation_functions();
|
||||
gpr_set_allocation_functions(g_guard_allocs);
|
||||
s = gpr_malloc(size);
|
||||
memcpy(s, data, size);
|
||||
grpc_json *x;
|
||||
if ((x = grpc_json_parse_string_with_len(s, size))) {
|
||||
grpc_json_destroy(x);
|
||||
}
|
||||
gpr_free(s);
|
||||
gpr_set_allocation_functions(g_old_allocs);
|
||||
GPR_ASSERT(g_total_size == 0);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -89,6 +89,8 @@ static testing_pair testing_pairs[] = {
|
|||
{"{\"foo\": bar}", NULL},
|
||||
{"{\"foo\": bar\"x\"}", NULL},
|
||||
{"fals", NULL},
|
||||
{"0,0 ", NULL},
|
||||
{"\"foo\",[]", NULL},
|
||||
/* Testing unterminated string. */
|
||||
{"\"\\x", NULL},
|
||||
/* Testing invalid UTF-16 number. */
|
||||
|
|
|
|||
|
|
@ -0,0 +1,46 @@
|
|||
/*
|
||||
*
|
||||
* 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 <grpc/support/log.h>
|
||||
#include "src/core/lib/support/load_file.h"
|
||||
|
||||
extern int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
int ok = 0;
|
||||
gpr_slice buffer = gpr_load_file(argv[1], 0, &ok);
|
||||
GPR_ASSERT(ok);
|
||||
LLVMFuzzerTestOneInput(GPR_SLICE_START_PTR(buffer), GPR_SLICE_LENGTH(buffer));
|
||||
gpr_slice_unref(buffer);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -179,6 +179,7 @@ template <class Service>
|
|||
class CommonStressTest {
|
||||
public:
|
||||
CommonStressTest() : kMaxMessageSize_(8192) {}
|
||||
virtual ~CommonStressTest() {}
|
||||
virtual void SetUp() = 0;
|
||||
virtual void TearDown() = 0;
|
||||
void ResetStub() {
|
||||
|
|
|
|||
|
|
@ -98,11 +98,11 @@ DEFINE_string(test_cases, "",
|
|||
" 'large_unary', 10% of the time and 'empty_stream' the remaining"
|
||||
" 70% of the time");
|
||||
|
||||
DEFINE_int32(log_level, GPR_LOG_SEVERITY_DEBUG,
|
||||
DEFINE_int32(log_level, GPR_LOG_SEVERITY_INFO,
|
||||
"Severity level of messages that should be logged. Any messages "
|
||||
"greater than or equal to the level set here will be logged. "
|
||||
"The choices are: 0 (GPR_LOG_SEVERITY_DEBUG), 1 "
|
||||
"(GPR_LOG_SEVERITY_INFO) and 2 (GPR_LOG_SEVERITY_ERROR.");
|
||||
"(GPR_LOG_SEVERITY_INFO) and 2 (GPR_LOG_SEVERITY_ERROR)");
|
||||
|
||||
using grpc::testing::kTestCaseList;
|
||||
using grpc::testing::MetricsService;
|
||||
|
|
|
|||
|
|
@ -0,0 +1,57 @@
|
|||
# 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.
|
||||
|
||||
"""Create tests for each fuzzer"""
|
||||
|
||||
import copy
|
||||
import glob
|
||||
|
||||
def mako_plugin(dictionary):
|
||||
targets = dictionary['targets']
|
||||
tests = dictionary['tests']
|
||||
for tgt in targets:
|
||||
if tgt['build'] == 'fuzzer':
|
||||
new_target = copy.deepcopy(tgt)
|
||||
new_target['build'] = 'test'
|
||||
new_target['name'] += '_one_entry'
|
||||
new_target['run'] = False
|
||||
new_target['deps'].insert(0, 'one_input_fuzzer')
|
||||
targets.append(new_target)
|
||||
for corpus in new_target['corpus_dirs']:
|
||||
for fn in sorted(glob.glob('%s/*' % corpus)):
|
||||
tests.append({
|
||||
'name': new_target['name'],
|
||||
'args': [fn],
|
||||
'exclude_configs': [],
|
||||
'platforms': ['linux', 'mac', 'windows', 'posix'],
|
||||
'ci_platforms': ['linux', 'mac', 'windows', 'posix'],
|
||||
'flaky': False,
|
||||
'language': 'c',
|
||||
'cpu_cost': 0.1,
|
||||
})
|
||||
|
|
@ -31,7 +31,7 @@
|
|||
set -e
|
||||
|
||||
# directories to run against
|
||||
DIRS="src/core src/cpp test/core test/cpp include"
|
||||
DIRS="src/core/lib src/core/ext src/cpp test/core test/cpp include"
|
||||
|
||||
# file matching patterns to check
|
||||
GLOB="*.h *.c *.cc"
|
||||
|
|
|
|||
|
|
@ -777,7 +777,6 @@ src/core/ext/census/aggregation.h \
|
|||
src/core/ext/census/census_interface.h \
|
||||
src/core/ext/census/census_rpc_stats.h \
|
||||
src/core/ext/census/grpc_filter.h \
|
||||
src/core/ext/census/grpc_plugin.h \
|
||||
src/core/ext/census/mlog.h \
|
||||
src/core/ext/census/rpc_metric_id.h \
|
||||
src/core/ext/client_config/client_channel.h \
|
||||
|
|
|
|||
|
|
@ -29,6 +29,10 @@
|
|||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# Creates a performance worker on GCE.
|
||||
# IMPORTANT: After creating the worker, one needs to manually add the pubkey
|
||||
# of jenkins@the-machine-where-jenkins-starts-perf-tests
|
||||
# to ~/.ssh/authorized_keys so that multi-machine scenarios can work.
|
||||
# See tools/run_tests/run_performance_tests.py for details.
|
||||
|
||||
set -ex
|
||||
|
||||
|
|
@ -37,7 +41,7 @@ cd $(dirname $0)
|
|||
CLOUD_PROJECT=grpc-testing
|
||||
ZONE=us-central1-b # this zone allows 32core machines
|
||||
|
||||
INSTANCE_NAME="${1:-grpc-performance-driver}"
|
||||
INSTANCE_NAME="${1:-grpc-performance-server1}"
|
||||
MACHINE_TYPE=n1-standard-32
|
||||
|
||||
gcloud compute instances create $INSTANCE_NAME \
|
||||
|
|
@ -53,9 +57,9 @@ sleep 60
|
|||
gcloud compute copy-files \
|
||||
--project="$CLOUD_PROJECT" \
|
||||
--zone "$ZONE" \
|
||||
jenkins_master.pub linux_performance_worker_init.sh ${INSTANCE_NAME}:~
|
||||
jenkins_master.pub linux_performance_worker_init.sh jenkins@${INSTANCE_NAME}:~
|
||||
|
||||
gcloud compute ssh \
|
||||
--project="$CLOUD_PROJECT" \
|
||||
--zone "$ZONE" \
|
||||
$INSTANCE_NAME --command "./linux_performance_worker_init.sh"
|
||||
jenkins@${INSTANCE_NAME} --command "./linux_performance_worker_init.sh"
|
||||
|
|
|
|||
|
|
@ -36,13 +36,10 @@ set -ex
|
|||
|
||||
sudo apt-get update
|
||||
|
||||
# Install JRE
|
||||
sudo apt-get install -y openjdk-7-jre
|
||||
# Install Java 8 JDK (to build gRPC Java)
|
||||
sudo apt-get install -y openjdk-8-jdk
|
||||
sudo apt-get install -y unzip lsof
|
||||
|
||||
# Setup jenkins user (or the user will already exist bcuz magic)
|
||||
sudo adduser jenkins --disabled-password || true
|
||||
|
||||
# Add pubkey of jenkins@grpc-jenkins-master to authorized keys of jenkins@
|
||||
# This needs to happen as the last step to prevent Jenkins master from connecting
|
||||
# to a machine that hasn't been properly setup yet.
|
||||
|
|
@ -89,7 +86,7 @@ curl -O https://bootstrap.pypa.io/get-pip.py
|
|||
sudo pypy get-pip.py
|
||||
sudo pypy -m pip install tabulate
|
||||
|
||||
# Node dependences.
|
||||
# Node dependencies (nvm has to be installed under user jenkins)
|
||||
touch .profile
|
||||
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.25.4/install.sh | bash
|
||||
nvm install 0.12 && npm config set cache /tmp/npm-cache
|
||||
|
|
@ -104,3 +101,5 @@ sudo apt-get install -y mono-devel nuget
|
|||
# Ruby dependencies
|
||||
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
|
||||
curl -sSL https://get.rvm.io | bash -s stable --ruby
|
||||
|
||||
# Java dependencies - nothing as we already have Java JDK 8
|
||||
|
|
|
|||
|
|
@ -36,5 +36,17 @@ cd $(dirname $0)/../../..
|
|||
|
||||
CONFIG=${CONFIG:-opt}
|
||||
|
||||
# build C++ qps worker & driver
|
||||
make CONFIG=${CONFIG} qps_worker qps_driver -j8
|
||||
for language in $@
|
||||
do
|
||||
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
|
||||
|
||||
|
|
|
|||
|
|
@ -33,4 +33,4 @@ set -ex
|
|||
cd $(dirname $0)/../../..
|
||||
|
||||
# execute the build script remotely
|
||||
ssh "${USER_AT_HOST}" "CONFIG=${CONFIG} ~/performance_workspace/grpc/tools/run_tests/performance/build_performance.sh"
|
||||
ssh "${USER_AT_HOST}" "CONFIG=${CONFIG} ~/performance_workspace/grpc/tools/run_tests/performance/build_performance.sh $*"
|
||||
|
|
|
|||
|
|
@ -35,10 +35,11 @@ cd $(dirname $0)/../../..
|
|||
# cleanup after previous builds
|
||||
ssh "${USER_AT_HOST}" "rm -rf ~/performance_workspace && mkdir -p ~/performance_workspace"
|
||||
|
||||
# TODO(jtattermusch): To be sure there are not running processes that would
|
||||
# TODO(jtattermusch): To be sure there are no running processes that would
|
||||
# mess with the results, be rough and reboot the slave here
|
||||
# and wait for it to come back online.
|
||||
ssh "${USER_AT_HOST}" "killall qps_worker mono node || true"
|
||||
|
||||
# push the current sources to the slave and unpack it.
|
||||
scp ../grpc.tar "${USER_AT_HOST}:~/performance_workspace"
|
||||
ssh "${USER_AT_HOST}" "tar -xf ~/performance_workspace/grpc.tar -C ~/performance_workspace"
|
||||
ssh "${USER_AT_HOST}" "tar -xf ~/performance_workspace/grpc.tar -C ~/performance_workspace"
|
||||
|
|
|
|||
|
|
@ -0,0 +1,38 @@
|
|||
#!/bin/bash
|
||||
# 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.
|
||||
|
||||
set -ex
|
||||
|
||||
cd $(dirname $0)/../../..
|
||||
|
||||
# needed to correctly locate testca
|
||||
cd src/csharp/Grpc.IntegrationTesting.QpsWorker/bin/Release
|
||||
|
||||
mono Grpc.IntegrationTesting.QpsWorker.exe $@
|
||||
|
|
@ -0,0 +1,38 @@
|
|||
#!/bin/bash
|
||||
# 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.
|
||||
|
||||
source ~/.nvm/nvm.sh
|
||||
nvm use 0.12
|
||||
|
||||
set -ex
|
||||
|
||||
cd $(dirname $0)/../../..
|
||||
|
||||
node src/node/performance/worker.js $@
|
||||
|
|
@ -31,6 +31,7 @@
|
|||
"""Run performance tests locally or remotely."""
|
||||
|
||||
import argparse
|
||||
import itertools
|
||||
import jobset
|
||||
import multiprocessing
|
||||
import os
|
||||
|
|
@ -53,6 +54,12 @@ 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 {
|
||||
|
|
@ -96,6 +103,32 @@ 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'
|
||||
|
||||
|
|
@ -106,6 +139,29 @@ class NodeLanguage:
|
|||
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'
|
||||
|
||||
|
|
@ -120,8 +176,9 @@ _LANGUAGES = {
|
|||
class QpsWorkerJob:
|
||||
"""Encapsulates a qps worker server job."""
|
||||
|
||||
def __init__(self, spec, host_and_port):
|
||||
def __init__(self, spec, language, host_and_port):
|
||||
self._spec = spec
|
||||
self.language = language
|
||||
self.host_and_port = host_and_port
|
||||
self._job = jobset.Job(spec, bin_hash=None, newline_on_success=True, travis=True, add_env={})
|
||||
|
||||
|
|
@ -133,22 +190,24 @@ class QpsWorkerJob:
|
|||
return self._job.kill()
|
||||
|
||||
|
||||
def create_qpsworker_job(language, port=10000, remote_host=None):
|
||||
def create_qpsworker_job(language, shortname=None,
|
||||
port=10000, remote_host=None):
|
||||
# TODO: support more languages
|
||||
cmd = 'bins/opt/qps_worker --driver_port=%s' % port
|
||||
cmdline = language.worker_cmdline() + ['--driver_port=%s' % port]
|
||||
if remote_host:
|
||||
user_at_host = '%s@%s' % (_REMOTE_HOST_USERNAME, remote_host)
|
||||
cmd = 'ssh %s "cd ~/performance_workspace/grpc/ && %s"' % (user_at_host, cmd)
|
||||
cmdline = ['ssh',
|
||||
str(user_at_host),
|
||||
'cd ~/performance_workspace/grpc/ && %s' % ' '.join(cmdline)]
|
||||
host_and_port='%s:%s' % (remote_host, port)
|
||||
else:
|
||||
host_and_port='localhost:%s' % port
|
||||
|
||||
jobspec = jobset.JobSpec(
|
||||
cmdline=[cmd],
|
||||
shortname='qps_worker',
|
||||
timeout_seconds=15*60,
|
||||
shell=True)
|
||||
return QpsWorkerJob(jobspec, host_and_port)
|
||||
cmdline=cmdline,
|
||||
shortname=shortname,
|
||||
timeout_seconds=15*60)
|
||||
return QpsWorkerJob(jobspec, language, host_and_port)
|
||||
|
||||
|
||||
def create_scenario_jobspec(scenario_name, driver_args, workers, remote_host=None):
|
||||
|
|
@ -199,7 +258,7 @@ def prepare_remote_hosts(hosts):
|
|||
cmdline=['tools/run_tests/performance/remote_host_prepare.sh'],
|
||||
shortname='remote_host_prepare.%s' % host,
|
||||
environ = {'USER_AT_HOST': user_at_host},
|
||||
timeout_seconds=3*60))
|
||||
timeout_seconds=5*60))
|
||||
jobset.message('START', 'Preparing remote hosts.', do_newline=True)
|
||||
num_failures, _ = jobset.run(
|
||||
prepare_jobs, newline_on_success=True, maxjobs=10)
|
||||
|
|
@ -213,15 +272,15 @@ def prepare_remote_hosts(hosts):
|
|||
sys.exit(1)
|
||||
|
||||
|
||||
def build_on_remote_hosts(hosts, build_local=False):
|
||||
"""Builds performance worker on remote hosts."""
|
||||
def build_on_remote_hosts(hosts, languages=_LANGUAGES.keys(), build_local=False):
|
||||
"""Builds performance worker on remote hosts (and maybe also locally)."""
|
||||
build_timeout = 15*60
|
||||
build_jobs = []
|
||||
for host in hosts:
|
||||
user_at_host = '%s@%s' % (_REMOTE_HOST_USERNAME, host)
|
||||
build_jobs.append(
|
||||
jobset.JobSpec(
|
||||
cmdline=['tools/run_tests/performance/remote_host_build.sh'],
|
||||
cmdline=['tools/run_tests/performance/remote_host_build.sh'] + languages,
|
||||
shortname='remote_host_build.%s' % host,
|
||||
environ = {'USER_AT_HOST': user_at_host, 'CONFIG': 'opt'},
|
||||
timeout_seconds=build_timeout))
|
||||
|
|
@ -229,56 +288,62 @@ def build_on_remote_hosts(hosts, build_local=False):
|
|||
# Build locally as well
|
||||
build_jobs.append(
|
||||
jobset.JobSpec(
|
||||
cmdline=['tools/run_tests/performance/build_performance.sh'],
|
||||
cmdline=['tools/run_tests/performance/build_performance.sh'] + languages,
|
||||
shortname='local_build',
|
||||
environ = {'CONFIG': 'opt'},
|
||||
timeout_seconds=build_timeout))
|
||||
jobset.message('START', 'Building on remote hosts.', do_newline=True)
|
||||
jobset.message('START', 'Building.', do_newline=True)
|
||||
num_failures, _ = jobset.run(
|
||||
build_jobs, newline_on_success=True, maxjobs=10)
|
||||
if num_failures == 0:
|
||||
jobset.message('SUCCESS',
|
||||
'Build on remote hosts was successful.',
|
||||
'Built successfully.',
|
||||
do_newline=True)
|
||||
else:
|
||||
jobset.message('FAILED', 'Failed to build on remote hosts.',
|
||||
jobset.message('FAILED', 'Build failed.',
|
||||
do_newline=True)
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
def start_qpsworkers(worker_hosts):
|
||||
def start_qpsworkers(languages, worker_hosts):
|
||||
"""Starts QPS workers as background jobs."""
|
||||
if not worker_hosts:
|
||||
# run two workers locally
|
||||
# run two workers locally (for each language)
|
||||
workers=[(None, 10000), (None, 10010)]
|
||||
elif len(worker_hosts) == 1:
|
||||
# run two workers on the remote host
|
||||
# run two workers on the remote host (for each language)
|
||||
workers=[(worker_hosts[0], 10000), (worker_hosts[0], 10010)]
|
||||
else:
|
||||
# run one worker per each remote host
|
||||
# run one worker per each remote host (for each language)
|
||||
workers=[(worker_host, 10000) for worker_host in worker_hosts]
|
||||
|
||||
return [create_qpsworker_job(CXXLanguage(),
|
||||
port=worker[1],
|
||||
return [create_qpsworker_job(language,
|
||||
shortname= 'qps_worker_%s_%s' % (language,
|
||||
worker_idx),
|
||||
port=worker[1] + language.worker_port_offset(),
|
||||
remote_host=worker[0])
|
||||
for worker in workers]
|
||||
for language in languages
|
||||
for worker_idx, worker in enumerate(workers)]
|
||||
|
||||
|
||||
def create_scenarios(languages, workers, remote_host=None):
|
||||
def create_scenarios(languages, workers_by_lang, remote_host=None):
|
||||
"""Create jobspecs for scenarios to run."""
|
||||
scenarios = []
|
||||
for language in languages:
|
||||
for scenario_name, driver_args in language.scenarios().iteritems():
|
||||
scenario = create_scenario_jobspec(scenario_name,
|
||||
driver_args,
|
||||
workers,
|
||||
workers_by_lang[str(language)],
|
||||
remote_host=remote_host)
|
||||
scenarios.append(scenario)
|
||||
|
||||
# the very last scenario requests shutting down the workers.
|
||||
all_workers = [worker
|
||||
for workers in workers_by_lang.values()
|
||||
for worker in workers]
|
||||
scenarios.append(create_scenario_jobspec('quit_workers',
|
||||
['--quit=true'],
|
||||
workers,
|
||||
all_workers,
|
||||
remote_host=remote_host))
|
||||
return scenarios
|
||||
|
||||
|
|
@ -300,6 +365,11 @@ def finish_qps_workers(jobs):
|
|||
|
||||
|
||||
argp = argparse.ArgumentParser(description='Run performance tests.')
|
||||
argp.add_argument('-l', '--language',
|
||||
choices=['all'] + sorted(_LANGUAGES.keys()),
|
||||
nargs='+',
|
||||
default=['all'],
|
||||
help='Languages to benchmark.')
|
||||
argp.add_argument('--remote_driver_host',
|
||||
default=None,
|
||||
help='Run QPS driver on given host. By default, QPS driver is run locally.')
|
||||
|
|
@ -310,6 +380,11 @@ argp.add_argument('--remote_worker_host',
|
|||
|
||||
args = argp.parse_args()
|
||||
|
||||
languages = set(_LANGUAGES[l]
|
||||
for l in itertools.chain.from_iterable(
|
||||
_LANGUAGES.iterkeys() if x == 'all' else [x]
|
||||
for x in args.language))
|
||||
|
||||
# Put together set of remote hosts where to run and build
|
||||
remote_hosts = set()
|
||||
if args.remote_worker_host:
|
||||
|
|
@ -325,15 +400,18 @@ if remote_hosts:
|
|||
build_local = False
|
||||
if not args.remote_driver_host:
|
||||
build_local = True
|
||||
build_on_remote_hosts(remote_hosts, build_local=build_local)
|
||||
build_on_remote_hosts(remote_hosts, languages=[str(l) for l in languages], build_local=build_local)
|
||||
|
||||
qpsworker_jobs = start_qpsworkers(args.remote_worker_host)
|
||||
qpsworker_jobs = start_qpsworkers(languages, args.remote_worker_host)
|
||||
|
||||
worker_addresses = [job.host_and_port for job in qpsworker_jobs]
|
||||
# get list of worker addresses for each language.
|
||||
worker_addresses = dict([(str(language), []) for language in languages])
|
||||
for job in qpsworker_jobs:
|
||||
worker_addresses[str(job.language)].append(job.host_and_port)
|
||||
|
||||
try:
|
||||
scenarios = create_scenarios(languages=[CXXLanguage()],
|
||||
workers=worker_addresses,
|
||||
scenarios = create_scenarios(languages,
|
||||
workers_by_lang=worker_addresses,
|
||||
remote_host=args.remote_driver_host)
|
||||
if not scenarios:
|
||||
raise Exception('No scenarios to run')
|
||||
|
|
|
|||
|
|
@ -390,6 +390,22 @@
|
|||
"third_party": false,
|
||||
"type": "target"
|
||||
},
|
||||
{
|
||||
"deps": [
|
||||
"gpr",
|
||||
"gpr_test_util",
|
||||
"grpc",
|
||||
"grpc_test_util"
|
||||
],
|
||||
"headers": [],
|
||||
"language": "c",
|
||||
"name": "goaway_server_test",
|
||||
"src": [
|
||||
"test/core/end2end/goaway_server_test.c"
|
||||
],
|
||||
"third_party": false,
|
||||
"type": "target"
|
||||
},
|
||||
{
|
||||
"deps": [
|
||||
"gpr",
|
||||
|
|
@ -3839,6 +3855,74 @@
|
|||
"third_party": false,
|
||||
"type": "target"
|
||||
},
|
||||
{
|
||||
"deps": [
|
||||
"gpr",
|
||||
"gpr_test_util",
|
||||
"grpc",
|
||||
"grpc_test_util",
|
||||
"one_input_fuzzer"
|
||||
],
|
||||
"headers": [],
|
||||
"language": "c",
|
||||
"name": "hpack_parser_fuzzer_test_one_entry",
|
||||
"src": [
|
||||
"test/core/transport/chttp2/hpack_parser_fuzzer_test.c"
|
||||
],
|
||||
"third_party": false,
|
||||
"type": "target"
|
||||
},
|
||||
{
|
||||
"deps": [
|
||||
"gpr",
|
||||
"gpr_test_util",
|
||||
"grpc",
|
||||
"grpc_test_util",
|
||||
"one_input_fuzzer"
|
||||
],
|
||||
"headers": [],
|
||||
"language": "c",
|
||||
"name": "http_fuzzer_test_one_entry",
|
||||
"src": [
|
||||
"test/core/http/fuzzer.c"
|
||||
],
|
||||
"third_party": false,
|
||||
"type": "target"
|
||||
},
|
||||
{
|
||||
"deps": [
|
||||
"gpr",
|
||||
"gpr_test_util",
|
||||
"grpc",
|
||||
"grpc_test_util",
|
||||
"one_input_fuzzer"
|
||||
],
|
||||
"headers": [],
|
||||
"language": "c",
|
||||
"name": "json_fuzzer_test_one_entry",
|
||||
"src": [
|
||||
"test/core/json/fuzzer.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"
|
||||
],
|
||||
"third_party": false,
|
||||
"type": "target"
|
||||
},
|
||||
{
|
||||
"deps": [],
|
||||
"headers": [
|
||||
|
|
@ -4040,7 +4124,6 @@
|
|||
"src/core/ext/census/census_interface.h",
|
||||
"src/core/ext/census/census_rpc_stats.h",
|
||||
"src/core/ext/census/grpc_filter.h",
|
||||
"src/core/ext/census/grpc_plugin.h",
|
||||
"src/core/ext/census/mlog.h",
|
||||
"src/core/ext/census/rpc_metric_id.h",
|
||||
"src/core/ext/client_config/client_channel.h",
|
||||
|
|
@ -4198,7 +4281,6 @@
|
|||
"src/core/ext/census/grpc_filter.c",
|
||||
"src/core/ext/census/grpc_filter.h",
|
||||
"src/core/ext/census/grpc_plugin.c",
|
||||
"src/core/ext/census/grpc_plugin.h",
|
||||
"src/core/ext/census/initialize.c",
|
||||
"src/core/ext/census/mlog.c",
|
||||
"src/core/ext/census/mlog.h",
|
||||
|
|
@ -4661,7 +4743,6 @@
|
|||
"src/core/ext/census/census_interface.h",
|
||||
"src/core/ext/census/census_rpc_stats.h",
|
||||
"src/core/ext/census/grpc_filter.h",
|
||||
"src/core/ext/census/grpc_plugin.h",
|
||||
"src/core/ext/census/mlog.h",
|
||||
"src/core/ext/census/rpc_metric_id.h",
|
||||
"src/core/ext/client_config/client_channel.h",
|
||||
|
|
@ -4804,7 +4885,6 @@
|
|||
"src/core/ext/census/grpc_filter.c",
|
||||
"src/core/ext/census/grpc_filter.h",
|
||||
"src/core/ext/census/grpc_plugin.c",
|
||||
"src/core/ext/census/grpc_plugin.h",
|
||||
"src/core/ext/census/initialize.c",
|
||||
"src/core/ext/census/mlog.c",
|
||||
"src/core/ext/census/mlog.h",
|
||||
|
|
@ -5067,15 +5147,26 @@
|
|||
"grpc"
|
||||
],
|
||||
"headers": [
|
||||
"include/grpc/grpc_zookeeper.h",
|
||||
"src/core/ext/client_config/resolvers/zookeeper_resolver.h"
|
||||
"include/grpc/grpc_zookeeper.h"
|
||||
],
|
||||
"language": "c",
|
||||
"name": "grpc_zookeeper",
|
||||
"src": [
|
||||
"include/grpc/grpc_zookeeper.h",
|
||||
"src/core/ext/client_config/resolvers/zookeeper_resolver.c",
|
||||
"src/core/ext/client_config/resolvers/zookeeper_resolver.h"
|
||||
"src/core/ext/resolver/zookeeper/zookeeper_resolver.c"
|
||||
],
|
||||
"third_party": false,
|
||||
"type": "lib"
|
||||
},
|
||||
{
|
||||
"deps": [
|
||||
"gpr"
|
||||
],
|
||||
"headers": [],
|
||||
"language": "c",
|
||||
"name": "one_input_fuzzer",
|
||||
"src": [
|
||||
"test/core/util/one_corpus_entry_fuzzer.c"
|
||||
],
|
||||
"third_party": false,
|
||||
"type": "lib"
|
||||
|
|
|
|||
|
|
@ -63,8 +63,8 @@
|
|||
The stress tests are launched by the following script (path is relative to GRPC root directory) :
|
||||
`tools/run_tests/stress_test/run_stress_tests_on_gke.py`
|
||||
|
||||
The script has several parameters and you can find out more details by using the `--help` flag.
|
||||
- `<grpc_root_dir>$ tools/run_tests/stress_test/run_stress_tests_on_gke.py --help`
|
||||
You can find out more details by using the `--help` flag.
|
||||
- `<grpc_root_dir>$ tools/run_tests/stress_test/run_on_gke.py --help`
|
||||
|
||||
> **Example**
|
||||
> ```bash
|
||||
|
|
|
|||
|
|
@ -6,18 +6,18 @@ This document specifies the features a stress test client should implement in or
|
|||
--------------
|
||||
**1.** A stress test client should be able to repeatedly execute one or more of the existing 'interop test cases'. It may just be a wrapper around the existing interop test client. The exact command line arguments the client should support are listed in _Table 1_ below.
|
||||
|
||||
**2.** The stress test client must implement a metrics server defined by _[metrics.proto](https://github.com/grpc/grpc/blob/master/src/proto/grpc/testing/metrics.proto)_ and must expose _qps_ as a long-valued Gauge. The client can track the overall _qps_ in one Gauge or in multiple Gagues (for example: One per Channel or Stub).
|
||||
**2.** The stress test client must implement a metrics server defined by _[metrics.proto](https://github.com/grpc/grpc/blob/master/src/proto/grpc/testing/metrics.proto)_ and must expose _qps_ as a long-valued Gauge. The client can track the overall _qps_ in one Gauge or in multiple Gauges (for example: One per Channel or Stub).
|
||||
The framework periodically queries the _qps_ by calling the `GetAllGauges()` method (the framework assumes that all the returned Gauges are _qps_ Gauges) and uses this to determine if the stress test client is running or crashed or stalled.
|
||||
> *Note:* In this context, the term _**qps**_ means _interop test cases per second_ (not _messages per second_ or _rpc calls per second_)
|
||||
|
||||
|
||||
**Table 1:** Command line arguments that should be supported by the stress test client.
|
||||
|
||||
>_**Note** The current C++ [stress client](https://github.com/grpc/grpc/blob/master/test/cpp/interop/stress_test.cc) supports more flags than those listed here but those flags will soon be deprecated_|
|
||||
>_**Note** The current C++ [stress client](https://github.com/grpc/grpc/blob/master/test/cpp/interop/stress_test.cc) supports more flags than those listed here but those flags will soon be deprecated._
|
||||
|
||||
Parameter | Description
|
||||
----------------------|---------------------------------
|
||||
`--server_address` | The stress client should accept a list of server addresses in the following format:<br> ```<name_1>:<port_1>,<name_2>:<port_2>..<name_N>:<port_N>``` <br> _Note:_ `<name>` can be either server name or IP address.<br><br>_Type:_ string <br>_default:_ ```localhost:8080``` <br>_Example:_ ``foo.foobar.com:8080,bar.foobar.com:8080`` <br><br> Currently, the stress test framework only passes one server address to the client.
|
||||
`--server_addresses` | The stress client should accept a list of server addresses in the following format:<br> ```<name_1>:<port_1>,<name_2>:<port_2>..<name_N>:<port_N>``` <br> _Note:_ `<name>` can be either server name or IP address.<br><br>_Type:_ string <br>_default:_ ```localhost:8080``` <br>_Example:_ ``foo.foobar.com:8080,bar.foobar.com:8080`` <br><br> Currently, the stress test framework only passes one server address to the client.
|
||||
`--test_cases` | List of test cases along with the relative weights in the following format:<br> `<testcase_1:w_1>,<testcase_2:w_2>...<testcase_n:w_n>`. <br> The test cases names are the same as those currently used by the interop clients<br><br>_Type:_ string <br>_Example:_ `empty_unary:20,large_unary:10,empty_stream:70` <br>(The stress client would then make `empty_unary` calls 20% of the time, `large_unary` calls 10% of the time and `empty_stream` calls 70% of the time.) <br>_Note:_ The weights need not add up to 100.
|
||||
`--test_duration-secs` | The test duration in seconds. A value of -1 means that the test should run forever until forcefully terminated. <br>_Type:_ int <br>_default:_ -1
|
||||
`--num_channels_per_server` | Number of channels (i.e connections) to each server. <br> _Type:_ int <br> _default:_ 1 <br><br> _Note:_ Unfortunately, the term `channel` is used differently in `grpc-java` and `C based grpc`. In this context, this really means "number of connections to the server"
|
||||
|
|
|
|||
|
|
@ -633,4 +633,5 @@ if __name__ == '__main__':
|
|||
os.path.dirname(sys.argv[0]), '../../..'))
|
||||
os.chdir(grpc_root)
|
||||
|
||||
run_tests(config)
|
||||
if not run_tests(config):
|
||||
sys.exit(1)
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load Diff
|
|
@ -61,6 +61,14 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "grpc_unsecure", "vcxproj\.\
|
|||
{B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} = {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "one_input_fuzzer", "vcxproj\.\one_input_fuzzer\one_input_fuzzer.vcxproj", "{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}"
|
||||
ProjectSection(myProperties) = preProject
|
||||
lib = "True"
|
||||
EndProjectSection
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} = {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "reconnect_server", "vcxproj\.\reconnect_server\reconnect_server.vcxproj", "{929C90AE-483F-AC80-EF93-226199F9E428}"
|
||||
ProjectSection(myProperties) = preProject
|
||||
lib = "True"
|
||||
|
|
@ -1494,6 +1502,22 @@ Global
|
|||
{46CEDFFF-9692-456A-AA24-38B5D6BCF4C5}.Release-DLL|Win32.Build.0 = Release-DLL|Win32
|
||||
{46CEDFFF-9692-456A-AA24-38B5D6BCF4C5}.Release-DLL|x64.ActiveCfg = Release-DLL|x64
|
||||
{46CEDFFF-9692-456A-AA24-38B5D6BCF4C5}.Release-DLL|x64.Build.0 = Release-DLL|x64
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Release|x64.ActiveCfg = Release|x64
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Debug|x64.Build.0 = Debug|x64
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Release|Win32.Build.0 = Release|Win32
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Release|x64.Build.0 = Release|x64
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Debug-DLL|Win32.ActiveCfg = Debug|Win32
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Debug-DLL|Win32.Build.0 = Debug|Win32
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Debug-DLL|x64.ActiveCfg = Debug|x64
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Debug-DLL|x64.Build.0 = Debug|x64
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Release-DLL|Win32.ActiveCfg = Release|Win32
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Release-DLL|Win32.Build.0 = Release|Win32
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Release-DLL|x64.ActiveCfg = Release|x64
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Release-DLL|x64.Build.0 = Release|x64
|
||||
{929C90AE-483F-AC80-EF93-226199F9E428}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{929C90AE-483F-AC80-EF93-226199F9E428}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{929C90AE-483F-AC80-EF93-226199F9E428}.Release|Win32.ActiveCfg = Release|Win32
|
||||
|
|
|
|||
|
|
@ -61,6 +61,14 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "grpc_unsecure", "vcxproj\.\
|
|||
{B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} = {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "one_input_fuzzer", "vcxproj\.\one_input_fuzzer\one_input_fuzzer.vcxproj", "{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}"
|
||||
ProjectSection(myProperties) = preProject
|
||||
lib = "True"
|
||||
EndProjectSection
|
||||
ProjectSection(ProjectDependencies) = postProject
|
||||
{B23D3D1A-9438-4EDA-BEB6-9A0A03D17792} = {B23D3D1A-9438-4EDA-BEB6-9A0A03D17792}
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "reconnect_server", "vcxproj\.\reconnect_server\reconnect_server.vcxproj", "{929C90AE-483F-AC80-EF93-226199F9E428}"
|
||||
ProjectSection(myProperties) = preProject
|
||||
lib = "True"
|
||||
|
|
@ -298,6 +306,22 @@ Global
|
|||
{46CEDFFF-9692-456A-AA24-38B5D6BCF4C5}.Release-DLL|Win32.Build.0 = Release-DLL|Win32
|
||||
{46CEDFFF-9692-456A-AA24-38B5D6BCF4C5}.Release-DLL|x64.ActiveCfg = Release-DLL|x64
|
||||
{46CEDFFF-9692-456A-AA24-38B5D6BCF4C5}.Release-DLL|x64.Build.0 = Release-DLL|x64
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Release|Win32.ActiveCfg = Release|Win32
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Release|x64.ActiveCfg = Release|x64
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Debug|Win32.Build.0 = Debug|Win32
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Debug|x64.Build.0 = Debug|x64
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Release|Win32.Build.0 = Release|Win32
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Release|x64.Build.0 = Release|x64
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Debug-DLL|Win32.ActiveCfg = Debug|Win32
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Debug-DLL|Win32.Build.0 = Debug|Win32
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Debug-DLL|x64.ActiveCfg = Debug|x64
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Debug-DLL|x64.Build.0 = Debug|x64
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Release-DLL|Win32.ActiveCfg = Release|Win32
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Release-DLL|Win32.Build.0 = Release|Win32
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Release-DLL|x64.ActiveCfg = Release|x64
|
||||
{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}.Release-DLL|x64.Build.0 = Release|x64
|
||||
{929C90AE-483F-AC80-EF93-226199F9E428}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||
{929C90AE-483F-AC80-EF93-226199F9E428}.Debug|x64.ActiveCfg = Debug|x64
|
||||
{929C90AE-483F-AC80-EF93-226199F9E428}.Release|Win32.ActiveCfg = Release|Win32
|
||||
|
|
|
|||
|
|
@ -286,7 +286,6 @@
|
|||
<ClInclude Include="$(SolutionDir)\..\src\core\ext\census\census_interface.h" />
|
||||
<ClInclude Include="$(SolutionDir)\..\src\core\ext\census\census_rpc_stats.h" />
|
||||
<ClInclude Include="$(SolutionDir)\..\src\core\ext\census\grpc_filter.h" />
|
||||
<ClInclude Include="$(SolutionDir)\..\src\core\ext\census\grpc_plugin.h" />
|
||||
<ClInclude Include="$(SolutionDir)\..\src\core\ext\census\mlog.h" />
|
||||
<ClInclude Include="$(SolutionDir)\..\src\core\ext\census\rpc_metric_id.h" />
|
||||
<ClInclude Include="$(SolutionDir)\..\src\core\ext\client_config\client_channel.h" />
|
||||
|
|
|
|||
|
|
@ -551,9 +551,6 @@
|
|||
<ClInclude Include="$(SolutionDir)\..\src\core\ext\census\grpc_filter.h">
|
||||
<Filter>src\core\ext\census</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="$(SolutionDir)\..\src\core\ext\census\grpc_plugin.h">
|
||||
<Filter>src\core\ext\census</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="$(SolutionDir)\..\src\core\ext\census\mlog.h">
|
||||
<Filter>src\core\ext\census</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
|||
|
|
@ -276,7 +276,6 @@
|
|||
<ClInclude Include="$(SolutionDir)\..\src\core\ext\census\census_interface.h" />
|
||||
<ClInclude Include="$(SolutionDir)\..\src\core\ext\census\census_rpc_stats.h" />
|
||||
<ClInclude Include="$(SolutionDir)\..\src\core\ext\census\grpc_filter.h" />
|
||||
<ClInclude Include="$(SolutionDir)\..\src\core\ext\census\grpc_plugin.h" />
|
||||
<ClInclude Include="$(SolutionDir)\..\src\core\ext\census\mlog.h" />
|
||||
<ClInclude Include="$(SolutionDir)\..\src\core\ext\census\rpc_metric_id.h" />
|
||||
<ClInclude Include="$(SolutionDir)\..\src\core\ext\client_config\client_channel.h" />
|
||||
|
|
|
|||
|
|
@ -488,9 +488,6 @@
|
|||
<ClInclude Include="$(SolutionDir)\..\src\core\ext\census\grpc_filter.h">
|
||||
<Filter>src\core\ext\census</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="$(SolutionDir)\..\src\core\ext\census\grpc_plugin.h">
|
||||
<Filter>src\core\ext\census</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="$(SolutionDir)\..\src\core\ext\census\mlog.h">
|
||||
<Filter>src\core\ext\census</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,167 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<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>{3589BCA3-CB0E-58FE-2F67-C4475D5CA517}</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>StaticLibrary</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
|
||||
<ConfigurationType>StaticLibrary</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\winsock.props" />
|
||||
</ImportGroup>
|
||||
<PropertyGroup Label="UserMacros" />
|
||||
<PropertyGroup Condition="'$(Configuration)'=='Debug'">
|
||||
<TargetName>one_input_fuzzer</TargetName>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)'=='Release'">
|
||||
<TargetName>one_input_fuzzer</TargetName>
|
||||
</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>Windows</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>Windows</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>Windows</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>Windows</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\util\one_corpus_entry_fuzzer.c">
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\gpr\gpr.vcxproj">
|
||||
<Project>{B23D3D1A-9438-4EDA-BEB6-9A0A03D17792}</Project>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</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>
|
||||
</Target>
|
||||
</Project>
|
||||
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
<?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\util\one_corpus_entry_fuzzer.c">
|
||||
<Filter>test\core\util</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Filter Include="test">
|
||||
<UniqueIdentifier>{178c17dc-766b-aa84-e928-d6bd0e456ff9}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="test\core">
|
||||
<UniqueIdentifier>{f08c2f86-ff65-4ce8-1ae6-e40fae0cef67}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="test\core\util">
|
||||
<UniqueIdentifier>{17c672ec-2cce-5636-14c8-4812cd2e1b9a}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
Loading…
Reference in New Issue