aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Craig Tiller <craig.tiller@gmail.com>2016-02-24 08:36:27 -0800
committerGravatar Craig Tiller <craig.tiller@gmail.com>2016-02-24 08:36:27 -0800
commit65c443ba51bf3327d3c93a6795b98c0db03149a5 (patch)
tree1f39d83cb40be3b56aa74307c410a22dd7dcfb18
parent5b0fde1a0a2bfa9c2bd39da7285f541a534e65c1 (diff)
parent91edc13bf8a83dd024f9ce4e0ad2246202545a38 (diff)
Merge github.com:grpc/grpc into hide-the-worker
-rw-r--r--.gitmodules3
-rw-r--r--BUILD33
-rw-r--r--Makefile84
-rw-r--r--binding.gyp5
-rw-r--r--build.yaml68
-rw-r--r--config.m4554
-rw-r--r--gRPC.podspec21
-rwxr-xr-xgrpc.gemspec11
-rw-r--r--package.json11
-rw-r--r--package.xml998
-rw-r--r--src/core/client_config/lb_policies/load_balancer_api.c163
-rw-r--r--src/core/client_config/lb_policies/load_balancer_api.h85
-rw-r--r--src/core/proto/grpc/lb/v0/load_balancer.pb.c119
-rw-r--r--src/core/proto/grpc/lb/v0/load_balancer.pb.h182
-rw-r--r--src/csharp/Grpc.IntegrationTesting/Control.cs419
-rw-r--r--src/csharp/Grpc.IntegrationTesting/QpsWorker.cs15
-rw-r--r--src/csharp/Grpc.IntegrationTesting/RunnerClientServerTest.cs6
-rw-r--r--src/csharp/Grpc.IntegrationTesting/ServerRunners.cs2
-rw-r--r--src/csharp/Grpc.IntegrationTesting/Services.cs7
-rw-r--r--src/csharp/Grpc.IntegrationTesting/ServicesGrpc.cs71
-rw-r--r--src/csharp/Grpc.IntegrationTesting/WorkerServiceImpl.cs18
-rw-r--r--src/proto/grpc/lb/v0/load_balancer.options6
-rw-r--r--src/proto/grpc/lb/v0/load_balancer.proto144
-rw-r--r--src/python/grpcio/grpc_core_dependencies.py5
-rw-r--r--summerofcode/ideas.md48
-rw-r--r--templates/config.m4.template44
-rw-r--r--templates/package.xml.template159
-rw-r--r--templates/tools/dockerfile/apt_get_basic.include3
-rw-r--r--templates/tools/dockerfile/run_tests_addons.include3
-rw-r--r--templates/tools/dockerfile/test/cxx_squeeze_x64/Dockerfile.template45
-rw-r--r--templates/tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile.template39
-rw-r--r--templates/tools/run_tests/sources_and_headers.json.template21
-rw-r--r--templates/vsprojects/protoc.props.template3
-rw-r--r--test/cpp/common/alarm_cpp_test.cc30
-rw-r--r--test/cpp/grpclb/grpclb_api_test.cc133
-rw-r--r--test/cpp/qps/qps_openloop_test.cc5
-rw-r--r--test/distrib/php/distribtest.php13
-rwxr-xr-xtest/distrib/php/run_distrib_test.sh39
m---------third_party/nanopb0
-rwxr-xr-xtools/codegen/core/gen_load_balancing_proto.sh138
-rwxr-xr-xtools/distrib/check_nanopb_output.sh68
-rw-r--r--tools/dockerfile/distribtest/php_jessie_x64/Dockerfile32
-rw-r--r--tools/dockerfile/grpc_artifact_linux_x64/Dockerfile7
-rw-r--r--tools/dockerfile/grpc_artifact_protoc/Dockerfile63
-rwxr-xr-xtools/dockerfile/grpc_clang_format/clang_format_all_the_things.sh2
-rw-r--r--tools/dockerfile/test/cxx_squeeze_x64/Dockerfile84
-rw-r--r--tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile86
-rw-r--r--tools/doxygen/Doxyfile.core.internal11
-rwxr-xr-xtools/jenkins/build_docker_and_run_tests.sh11
-rwxr-xr-xtools/jenkins/docker_run_tests.sh1
-rwxr-xr-xtools/jenkins/run_performance.sh5
-rw-r--r--tools/run_tests/artifact_targets.py74
-rwxr-xr-xtools/run_tests/build_artifact_php.sh40
-rw-r--r--tools/run_tests/build_artifact_protoc.bat51
-rwxr-xr-xtools/run_tests/build_artifact_protoc.sh41
-rwxr-xr-xtools/run_tests/build_package_php.sh36
-rw-r--r--tools/run_tests/configs.json8
-rw-r--r--tools/run_tests/distribtest_targets.py31
-rw-r--r--tools/run_tests/package_targets.py20
-rwxr-xr-xtools/run_tests/run_tests.py355
-rwxr-xr-xtools/run_tests/sanity/check_submodules.sh1
-rwxr-xr-xtools/run_tests/sanity/check_version.py97
-rw-r--r--tools/run_tests/sanity/sanity_tests.yaml4
-rw-r--r--tools/run_tests/sources_and_headers.json41
-rw-r--r--tools/run_tests/tests.json26
-rw-r--r--vsprojects/protoc.props2
-rw-r--r--vsprojects/vcxproj/grpc/grpc.vcxproj16
-rw-r--r--vsprojects/vcxproj/grpc/grpc.vcxproj.filters51
-rw-r--r--vsprojects/vcxproj/grpc_plugin_support/grpc_plugin_support.vcxproj1
-rw-r--r--vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj16
-rw-r--r--vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters51
-rw-r--r--vsprojects/vcxproj/test/grpclb_api_test/grpclb_api_test.vcxproj209
-rw-r--r--vsprojects/vcxproj/test/grpclb_api_test/grpclb_api_test.vcxproj.filters39
73 files changed, 5030 insertions, 303 deletions
diff --git a/.gitmodules b/.gitmodules
index 008bc5fae8..c37d0abdf0 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -14,3 +14,6 @@
[submodule "third_party/boringssl"]
path = third_party/boringssl
url = https://boringssl.googlesource.com/boringssl
+[submodule "third_party/nanopb"]
+ path = third_party/nanopb
+ url = https://github.com/nanopb/nanopb.git
diff --git a/BUILD b/BUILD
index 83c0f4f7df..91559ff98e 100644
--- a/BUILD
+++ b/BUILD
@@ -168,6 +168,7 @@ cc_library(
"src/core/client_config/client_config.h",
"src/core/client_config/connector.h",
"src/core/client_config/initial_connect_string.h",
+ "src/core/client_config/lb_policies/load_balancer_api.h",
"src/core/client_config/lb_policies/pick_first.h",
"src/core/client_config/lb_policies/round_robin.h",
"src/core/client_config/lb_policy.h",
@@ -228,6 +229,7 @@ cc_library(
"src/core/json/json_common.h",
"src/core/json/json_reader.h",
"src/core/json/json_writer.h",
+ "src/core/proto/grpc/lb/v0/load_balancer.pb.h",
"src/core/statistics/census_interface.h",
"src/core/statistics/census_rpc_stats.h",
"src/core/surface/api_trace.h",
@@ -284,6 +286,10 @@ cc_library(
"src/core/census/aggregation.h",
"src/core/census/mlog.h",
"src/core/census/rpc_metric_id.h",
+ "third_party/nanopb/pb.h",
+ "third_party/nanopb/pb_common.h",
+ "third_party/nanopb/pb_decode.h",
+ "third_party/nanopb/pb_encode.h",
"src/core/census/grpc_context.c",
"src/core/census/grpc_filter.c",
"src/core/channel/channel_args.c",
@@ -299,6 +305,7 @@ cc_library(
"src/core/client_config/connector.c",
"src/core/client_config/default_initial_connect_string.c",
"src/core/client_config/initial_connect_string.c",
+ "src/core/client_config/lb_policies/load_balancer_api.c",
"src/core/client_config/lb_policies/pick_first.c",
"src/core/client_config/lb_policies/round_robin.c",
"src/core/client_config/lb_policy.c",
@@ -363,6 +370,7 @@ cc_library(
"src/core/json/json_reader.c",
"src/core/json/json_string.c",
"src/core/json/json_writer.c",
+ "src/core/proto/grpc/lb/v0/load_balancer.pb.c",
"src/core/surface/alarm.c",
"src/core/surface/api_trace.c",
"src/core/surface/byte_buffer.c",
@@ -439,6 +447,9 @@ cc_library(
"src/core/census/operation.c",
"src/core/census/placeholders.c",
"src/core/census/tracing.c",
+ "third_party/nanopb/pb_common.c",
+ "third_party/nanopb/pb_decode.c",
+ "third_party/nanopb/pb_encode.c",
],
hdrs = [
"include/grpc/grpc_security.h",
@@ -487,6 +498,7 @@ cc_library(
"src/core/client_config/client_config.h",
"src/core/client_config/connector.h",
"src/core/client_config/initial_connect_string.h",
+ "src/core/client_config/lb_policies/load_balancer_api.h",
"src/core/client_config/lb_policies/pick_first.h",
"src/core/client_config/lb_policies/round_robin.h",
"src/core/client_config/lb_policy.h",
@@ -547,6 +559,7 @@ cc_library(
"src/core/json/json_common.h",
"src/core/json/json_reader.h",
"src/core/json/json_writer.h",
+ "src/core/proto/grpc/lb/v0/load_balancer.pb.h",
"src/core/statistics/census_interface.h",
"src/core/statistics/census_rpc_stats.h",
"src/core/surface/api_trace.h",
@@ -589,6 +602,10 @@ cc_library(
"src/core/census/aggregation.h",
"src/core/census/mlog.h",
"src/core/census/rpc_metric_id.h",
+ "third_party/nanopb/pb.h",
+ "third_party/nanopb/pb_common.h",
+ "third_party/nanopb/pb_decode.h",
+ "third_party/nanopb/pb_encode.h",
"src/core/surface/init_unsecure.c",
"src/core/census/grpc_context.c",
"src/core/census/grpc_filter.c",
@@ -605,6 +622,7 @@ cc_library(
"src/core/client_config/connector.c",
"src/core/client_config/default_initial_connect_string.c",
"src/core/client_config/initial_connect_string.c",
+ "src/core/client_config/lb_policies/load_balancer_api.c",
"src/core/client_config/lb_policies/pick_first.c",
"src/core/client_config/lb_policies/round_robin.c",
"src/core/client_config/lb_policy.c",
@@ -669,6 +687,7 @@ cc_library(
"src/core/json/json_reader.c",
"src/core/json/json_string.c",
"src/core/json/json_writer.c",
+ "src/core/proto/grpc/lb/v0/load_balancer.pb.c",
"src/core/surface/alarm.c",
"src/core/surface/api_trace.c",
"src/core/surface/byte_buffer.c",
@@ -724,6 +743,9 @@ cc_library(
"src/core/census/operation.c",
"src/core/census/placeholders.c",
"src/core/census/tracing.c",
+ "third_party/nanopb/pb_common.c",
+ "third_party/nanopb/pb_decode.c",
+ "third_party/nanopb/pb_encode.c",
],
hdrs = [
"include/grpc/byte_buffer.h",
@@ -1262,6 +1284,7 @@ objc_library(
"src/core/client_config/connector.c",
"src/core/client_config/default_initial_connect_string.c",
"src/core/client_config/initial_connect_string.c",
+ "src/core/client_config/lb_policies/load_balancer_api.c",
"src/core/client_config/lb_policies/pick_first.c",
"src/core/client_config/lb_policies/round_robin.c",
"src/core/client_config/lb_policy.c",
@@ -1326,6 +1349,7 @@ objc_library(
"src/core/json/json_reader.c",
"src/core/json/json_string.c",
"src/core/json/json_writer.c",
+ "src/core/proto/grpc/lb/v0/load_balancer.pb.c",
"src/core/surface/alarm.c",
"src/core/surface/api_trace.c",
"src/core/surface/byte_buffer.c",
@@ -1402,6 +1426,9 @@ objc_library(
"src/core/census/operation.c",
"src/core/census/placeholders.c",
"src/core/census/tracing.c",
+ "third_party/nanopb/pb_common.c",
+ "third_party/nanopb/pb_decode.c",
+ "third_party/nanopb/pb_encode.c",
],
hdrs = [
"include/grpc/grpc_security.h",
@@ -1431,6 +1458,7 @@ objc_library(
"src/core/client_config/client_config.h",
"src/core/client_config/connector.h",
"src/core/client_config/initial_connect_string.h",
+ "src/core/client_config/lb_policies/load_balancer_api.h",
"src/core/client_config/lb_policies/pick_first.h",
"src/core/client_config/lb_policies/round_robin.h",
"src/core/client_config/lb_policy.h",
@@ -1491,6 +1519,7 @@ objc_library(
"src/core/json/json_common.h",
"src/core/json/json_reader.h",
"src/core/json/json_writer.h",
+ "src/core/proto/grpc/lb/v0/load_balancer.pb.h",
"src/core/statistics/census_interface.h",
"src/core/statistics/census_rpc_stats.h",
"src/core/surface/api_trace.h",
@@ -1547,6 +1576,10 @@ objc_library(
"src/core/census/aggregation.h",
"src/core/census/mlog.h",
"src/core/census/rpc_metric_id.h",
+ "third_party/nanopb/pb.h",
+ "third_party/nanopb/pb_common.h",
+ "third_party/nanopb/pb_decode.h",
+ "third_party/nanopb/pb_encode.h",
],
includes = [
"include",
diff --git a/Makefile b/Makefile
index 3037af3491..6ba96815e7 100644
--- a/Makefile
+++ b/Makefile
@@ -121,7 +121,7 @@ LD_asan-noleaks = clang
LDXX_asan-noleaks = clang++
CPPFLAGS_asan-noleaks = -O0 -fsanitize=address -fno-omit-frame-pointer -Wno-unused-command-line-argument -DGPR_NO_DIRECT_SYSCALLS
LDFLAGS_asan-noleaks = -fsanitize=address
-DEFINES_asan-noleaks += GRPC_TEST_SLOWDOWN_BUILD_FACTOR=1.5
+DEFINES_asan-noleaks += GRPC_TEST_SLOWDOWN_BUILD_FACTOR=3
VALID_CONFIG_ubsan = 1
REQUIRE_CUSTOM_LIBRARIES_ubsan = 1
@@ -177,7 +177,7 @@ LD_asan = clang
LDXX_asan = clang++
CPPFLAGS_asan = -O0 -fsanitize=address -fno-omit-frame-pointer -Wno-unused-command-line-argument -DGPR_NO_DIRECT_SYSCALLS
LDFLAGS_asan = -fsanitize=address
-DEFINES_asan += GRPC_TEST_SLOWDOWN_BUILD_FACTOR=1.5
+DEFINES_asan += GRPC_TEST_SLOWDOWN_BUILD_FACTOR=3
VALID_CONFIG_tsan = 1
REQUIRE_CUSTOM_LIBRARIES_tsan = 1
@@ -187,7 +187,7 @@ LD_tsan = clang
LDXX_tsan = clang++
CPPFLAGS_tsan = -O0 -fsanitize=thread -fno-omit-frame-pointer -Wno-unused-command-line-argument -fPIE -pie -DGPR_NO_DIRECT_SYSCALLS
LDFLAGS_tsan = -fsanitize=thread -fPIE -pie $(if $(JENKINS_BUILD),-Wl$(comma)-Ttext-segment=0x7e0000000000,)
-DEFINES_tsan += GRPC_TEST_SLOWDOWN_BUILD_FACTOR=2
+DEFINES_tsan += GRPC_TEST_SLOWDOWN_BUILD_FACTOR=5
VALID_CONFIG_msan = 1
REQUIRE_CUSTOM_LIBRARIES_msan = 1
@@ -198,7 +198,7 @@ LDXX_msan = clang++
CPPFLAGS_msan = -O0 -fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=1 -Wno-unused-command-line-argument -fPIE -pie -DGPR_NO_DIRECT_SYSCALLS
LDFLAGS_msan = -fsanitize=memory -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_USE_OWN_TR1_TUPLE=1 -fPIE -pie $(if $(JENKINS_BUILD),-Wl$(comma)-Ttext-segment=0x7e0000000000,)
DEFINES_msan = NDEBUG
-DEFINES_msan += GRPC_TEST_SLOWDOWN_BUILD_FACTOR=2
+DEFINES_msan += GRPC_TEST_SLOWDOWN_BUILD_FACTOR=4
VALID_CONFIG_mutrace = 1
CC_mutrace = $(DEFAULT_CC)
@@ -941,6 +941,7 @@ grpc_csharp_plugin: $(BINDIR)/$(CONFIG)/grpc_csharp_plugin
grpc_objective_c_plugin: $(BINDIR)/$(CONFIG)/grpc_objective_c_plugin
grpc_python_plugin: $(BINDIR)/$(CONFIG)/grpc_python_plugin
grpc_ruby_plugin: $(BINDIR)/$(CONFIG)/grpc_ruby_plugin
+grpclb_api_test: $(BINDIR)/$(CONFIG)/grpclb_api_test
hybrid_end2end_test: $(BINDIR)/$(CONFIG)/hybrid_end2end_test
interop_client: $(BINDIR)/$(CONFIG)/interop_client
interop_server: $(BINDIR)/$(CONFIG)/interop_server
@@ -1285,6 +1286,7 @@ buildtests_cxx: buildtests_zookeeper privatelibs_cxx \
$(BINDIR)/$(CONFIG)/generic_async_streaming_ping_pong_test \
$(BINDIR)/$(CONFIG)/generic_end2end_test \
$(BINDIR)/$(CONFIG)/grpc_cli \
+ $(BINDIR)/$(CONFIG)/grpclb_api_test \
$(BINDIR)/$(CONFIG)/hybrid_end2end_test \
$(BINDIR)/$(CONFIG)/interop_client \
$(BINDIR)/$(CONFIG)/interop_server \
@@ -1595,6 +1597,8 @@ test_cxx: test_zookeeper buildtests_cxx
$(Q) $(BINDIR)/$(CONFIG)/generic_async_streaming_ping_pong_test || ( echo test generic_async_streaming_ping_pong_test failed ; exit 1 )
$(E) "[RUN] Testing generic_end2end_test"
$(Q) $(BINDIR)/$(CONFIG)/generic_end2end_test || ( echo test generic_end2end_test failed ; exit 1 )
+ $(E) "[RUN] Testing grpclb_api_test"
+ $(Q) $(BINDIR)/$(CONFIG)/grpclb_api_test || ( echo test grpclb_api_test failed ; exit 1 )
$(E) "[RUN] Testing hybrid_end2end_test"
$(Q) $(BINDIR)/$(CONFIG)/hybrid_end2end_test || ( echo test hybrid_end2end_test failed ; exit 1 )
$(E) "[RUN] Testing interop_test"
@@ -1747,6 +1751,21 @@ $(LIBDIR)/$(CONFIG)/pkgconfig/grpc++_unsecure.pc:
$(Q) echo "$(GRPCXX_UNSECURE_PC_FILE)" | tr , '\n' >$@
ifeq ($(NO_PROTOC),true)
+$(GENDIR)/src/proto/grpc/lb/v0/load_balancer.pb.cc: protoc_dep_error
+$(GENDIR)/src/proto/grpc/lb/v0/load_balancer.grpc.pb.cc: protoc_dep_error
+else
+$(GENDIR)/src/proto/grpc/lb/v0/load_balancer.pb.cc: src/proto/grpc/lb/v0/load_balancer.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS)
+ $(E) "[PROTOC] Generating protobuf CC file from $<"
+ $(Q) mkdir -p `dirname $@`
+ $(Q) $(PROTOC) --cpp_out=$(GENDIR) $<
+
+$(GENDIR)/src/proto/grpc/lb/v0/load_balancer.grpc.pb.cc: src/proto/grpc/lb/v0/load_balancer.proto $(PROTOBUF_DEP) $(PROTOC_PLUGINS)
+ $(E) "[GRPC] Generating gRPC's protobuf service CC file from $<"
+ $(Q) mkdir -p `dirname $@`
+ $(Q) $(PROTOC) --grpc_out=$(GENDIR) --plugin=protoc-gen-grpc=$(BINDIR)/$(CONFIG)/grpc_cpp_plugin $<
+endif
+
+ifeq ($(NO_PROTOC),true)
$(GENDIR)/src/proto/grpc/testing/control.pb.cc: protoc_dep_error
$(GENDIR)/src/proto/grpc/testing/control.grpc.pb.cc: protoc_dep_error
else
@@ -2333,6 +2352,7 @@ LIBGRPC_SRC = \
src/core/client_config/connector.c \
src/core/client_config/default_initial_connect_string.c \
src/core/client_config/initial_connect_string.c \
+ src/core/client_config/lb_policies/load_balancer_api.c \
src/core/client_config/lb_policies/pick_first.c \
src/core/client_config/lb_policies/round_robin.c \
src/core/client_config/lb_policy.c \
@@ -2397,6 +2417,7 @@ LIBGRPC_SRC = \
src/core/json/json_reader.c \
src/core/json/json_string.c \
src/core/json/json_writer.c \
+ src/core/proto/grpc/lb/v0/load_balancer.pb.c \
src/core/surface/alarm.c \
src/core/surface/api_trace.c \
src/core/surface/byte_buffer.c \
@@ -2473,6 +2494,9 @@ LIBGRPC_SRC = \
src/core/census/operation.c \
src/core/census/placeholders.c \
src/core/census/tracing.c \
+ third_party/nanopb/pb_common.c \
+ third_party/nanopb/pb_decode.c \
+ third_party/nanopb/pb_encode.c \
PUBLIC_HEADERS_C += \
include/grpc/grpc_security.h \
@@ -2640,6 +2664,7 @@ LIBGRPC_UNSECURE_SRC = \
src/core/client_config/connector.c \
src/core/client_config/default_initial_connect_string.c \
src/core/client_config/initial_connect_string.c \
+ src/core/client_config/lb_policies/load_balancer_api.c \
src/core/client_config/lb_policies/pick_first.c \
src/core/client_config/lb_policies/round_robin.c \
src/core/client_config/lb_policy.c \
@@ -2704,6 +2729,7 @@ LIBGRPC_UNSECURE_SRC = \
src/core/json/json_reader.c \
src/core/json/json_string.c \
src/core/json/json_writer.c \
+ src/core/proto/grpc/lb/v0/load_balancer.pb.c \
src/core/surface/alarm.c \
src/core/surface/api_trace.c \
src/core/surface/byte_buffer.c \
@@ -2759,6 +2785,9 @@ LIBGRPC_UNSECURE_SRC = \
src/core/census/operation.c \
src/core/census/placeholders.c \
src/core/census/tracing.c \
+ third_party/nanopb/pb_common.c \
+ third_party/nanopb/pb_decode.c \
+ third_party/nanopb/pb_encode.c \
PUBLIC_HEADERS_C += \
include/grpc/byte_buffer.h \
@@ -9712,6 +9741,53 @@ ifneq ($(NO_DEPS),true)
endif
+GRPCLB_API_TEST_SRC = \
+ $(GENDIR)/src/proto/grpc/lb/v0/load_balancer.pb.cc $(GENDIR)/src/proto/grpc/lb/v0/load_balancer.grpc.pb.cc \
+ test/cpp/grpclb/grpclb_api_test.cc \
+
+GRPCLB_API_TEST_OBJS = $(addprefix $(OBJDIR)/$(CONFIG)/, $(addsuffix .o, $(basename $(GRPCLB_API_TEST_SRC))))
+ifeq ($(NO_SECURE),true)
+
+# You can't build secure targets if you don't have OpenSSL.
+
+$(BINDIR)/$(CONFIG)/grpclb_api_test: openssl_dep_error
+
+else
+
+
+
+
+ifeq ($(NO_PROTOBUF),true)
+
+# You can't build the protoc plugins or protobuf-enabled targets if you don't have protobuf 3.0.0+.
+
+$(BINDIR)/$(CONFIG)/grpclb_api_test: protobuf_dep_error
+
+else
+
+$(BINDIR)/$(CONFIG)/grpclb_api_test: $(PROTOBUF_DEP) $(GRPCLB_API_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a
+ $(E) "[LD] Linking $@"
+ $(Q) mkdir -p `dirname $@`
+ $(Q) $(LDXX) $(LDFLAGS) $(GRPCLB_API_TEST_OBJS) $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a $(LDLIBSXX) $(LDLIBS_PROTOBUF) $(LDLIBS) $(LDLIBS_SECURE) $(GTEST_LIB) -o $(BINDIR)/$(CONFIG)/grpclb_api_test
+
+endif
+
+endif
+
+$(OBJDIR)/$(CONFIG)/src/proto/grpc/lb/v0/load_balancer.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a
+
+$(OBJDIR)/$(CONFIG)/test/cpp/grpclb/grpclb_api_test.o: $(LIBDIR)/$(CONFIG)/libgrpc++_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc_test_util.a $(LIBDIR)/$(CONFIG)/libgrpc++.a $(LIBDIR)/$(CONFIG)/libgrpc.a
+
+deps_grpclb_api_test: $(GRPCLB_API_TEST_OBJS:.o=.dep)
+
+ifneq ($(NO_SECURE),true)
+ifneq ($(NO_DEPS),true)
+-include $(GRPCLB_API_TEST_OBJS:.o=.dep)
+endif
+endif
+$(OBJDIR)/$(CONFIG)/test/cpp/grpclb/grpclb_api_test.o: $(GENDIR)/src/proto/grpc/lb/v0/load_balancer.pb.cc $(GENDIR)/src/proto/grpc/lb/v0/load_balancer.grpc.pb.cc
+
+
HYBRID_END2END_TEST_SRC = \
test/cpp/end2end/hybrid_end2end_test.cc \
diff --git a/binding.gyp b/binding.gyp
index 0f5817e8dc..35eede15d7 100644
--- a/binding.gyp
+++ b/binding.gyp
@@ -572,6 +572,7 @@
'src/core/client_config/connector.c',
'src/core/client_config/default_initial_connect_string.c',
'src/core/client_config/initial_connect_string.c',
+ 'src/core/client_config/lb_policies/load_balancer_api.c',
'src/core/client_config/lb_policies/pick_first.c',
'src/core/client_config/lb_policies/round_robin.c',
'src/core/client_config/lb_policy.c',
@@ -636,6 +637,7 @@
'src/core/json/json_reader.c',
'src/core/json/json_string.c',
'src/core/json/json_writer.c',
+ 'src/core/proto/grpc/lb/v0/load_balancer.pb.c',
'src/core/surface/alarm.c',
'src/core/surface/api_trace.c',
'src/core/surface/byte_buffer.c',
@@ -712,6 +714,9 @@
'src/core/census/operation.c',
'src/core/census/placeholders.c',
'src/core/census/tracing.c',
+ 'third_party/nanopb/pb_common.c',
+ 'third_party/nanopb/pb_decode.c',
+ 'third_party/nanopb/pb_encode.c',
],
"conditions": [
['OS == "mac"', {
diff --git a/build.yaml b/build.yaml
index 4d76bab1e1..b16cb162d4 100644
--- a/build.yaml
+++ b/build.yaml
@@ -258,6 +258,7 @@ filegroups:
- src/core/client_config/client_config.h
- src/core/client_config/connector.h
- src/core/client_config/initial_connect_string.h
+ - src/core/client_config/lb_policies/load_balancer_api.h
- src/core/client_config/lb_policies/pick_first.h
- src/core/client_config/lb_policies/round_robin.h
- src/core/client_config/lb_policy.h
@@ -318,6 +319,7 @@ filegroups:
- src/core/json/json_common.h
- src/core/json/json_reader.h
- src/core/json/json_writer.h
+ - src/core/proto/grpc/lb/v0/load_balancer.pb.h
- src/core/statistics/census_interface.h
- src/core/statistics/census_rpc_stats.h
- src/core/surface/api_trace.h
@@ -373,6 +375,7 @@ filegroups:
- src/core/client_config/connector.c
- src/core/client_config/default_initial_connect_string.c
- src/core/client_config/initial_connect_string.c
+ - src/core/client_config/lb_policies/load_balancer_api.c
- src/core/client_config/lb_policies/pick_first.c
- src/core/client_config/lb_policies/round_robin.c
- src/core/client_config/lb_policy.c
@@ -437,6 +440,7 @@ filegroups:
- src/core/json/json_reader.c
- src/core/json/json_string.c
- src/core/json/json_writer.c
+ - src/core/proto/grpc/lb/v0/load_balancer.pb.c
- src/core/surface/alarm.c
- src/core/surface/api_trace.c
- src/core/surface/byte_buffer.c
@@ -550,6 +554,16 @@ filegroups:
- test/core/util/port_posix.c
- test/core/util/port_windows.c
- test/core/util/slice_splitter.c
+- name: nanopb
+ headers:
+ - third_party/nanopb/pb.h
+ - third_party/nanopb/pb_common.h
+ - third_party/nanopb/pb_decode.h
+ - third_party/nanopb/pb_encode.h
+ src:
+ - third_party/nanopb/pb_common.c
+ - third_party/nanopb/pb_decode.c
+ - third_party/nanopb/pb_encode.c
libs:
- name: gpr
build: all
@@ -585,6 +599,7 @@ libs:
- grpc_base
- grpc_secure
- census
+ - nanopb
secure: true
vs_packages:
- grpc.dependencies.openssl
@@ -654,6 +669,7 @@ libs:
- grpc_base
- grpc_codegen
- census
+ - nanopb
secure: false
vs_project_guid: '{46CEDFFF-9692-456A-AA24-38B5D6BCF4C5}'
- name: grpc_zookeeper
@@ -800,6 +816,8 @@ libs:
- gpr_codegen
secure: false
vs_project_guid: '{B6E81D84-2ACB-41B8-8781-493A944C7817}'
+ vs_props:
+ - protoc
- name: interop_client_helper
build: private
language: c++
@@ -2210,6 +2228,17 @@ targets:
secure: false
vs_config_type: Application
vs_project_guid: '{069E9D05-B78B-4751-9252-D21EBAE7DE8E}'
+- name: grpclb_api_test
+ build: test
+ language: c++
+ src:
+ - src/proto/grpc/lb/v0/load_balancer.proto
+ - test/cpp/grpclb/grpclb_api_test.cc
+ deps:
+ - grpc++_test_util
+ - grpc_test_util
+ - grpc++
+ - grpc
- name: hybrid_end2end_test
build: test
language: c++
@@ -2334,6 +2363,7 @@ targets:
- linux
- posix
- name: qps_openloop_test
+ cpu_cost: 10
build: test
language: c++
src:
@@ -2366,8 +2396,6 @@ targets:
- gpr_test_util
- gpr
- grpc++_test_config
- exclude_configs:
- - tsan
platforms:
- mac
- linux
@@ -2655,7 +2683,7 @@ configs:
test_environ:
ASAN_OPTIONS: detect_leaks=1:color=always
LSAN_OPTIONS: suppressions=tools/lsan_suppressions.txt:report_objects=1
- timeout_multiplier: 1.5
+ timeout_multiplier: 3
asan-noleaks:
CC: clang
CPPFLAGS: -O0 -fsanitize=address -fno-omit-frame-pointer -Wno-unused-command-line-argument
@@ -2667,7 +2695,7 @@ configs:
compile_the_world: true
test_environ:
ASAN_OPTIONS: detect_leaks=0:color=always
- timeout_multiplier: 1.5
+ timeout_multiplier: 3
basicprof:
CPPFLAGS: -O2 -DGRPC_BASIC_PROFILER -DGRPC_TIMERS_RDTSC
DEFINES: NDEBUG
@@ -2706,7 +2734,7 @@ configs:
-fPIE -pie $(if $(JENKINS_BUILD),-Wl$(comma)-Ttext-segment=0x7e0000000000,)
LDXX: clang++
compile_the_world: true
- timeout_multiplier: 2
+ timeout_multiplier: 4
mutrace:
CPPFLAGS: -O0
DEFINES: _DEBUG DEBUG
@@ -2728,7 +2756,7 @@ configs:
compile_the_world: true
test_environ:
TSAN_OPTIONS: suppressions=tools/tsan_suppressions.txt:halt_on_error=1:second_deadlock_stack=1
- timeout_multiplier: 2
+ timeout_multiplier: 5
ubsan:
CC: clang
CPPFLAGS: -O1 -fsanitize=undefined -fno-omit-frame-pointer -Wno-unused-command-line-argument
@@ -2787,6 +2815,34 @@ node_modules:
- src/node/ext/server.cc
- src/node/ext/server_credentials.cc
- src/node/ext/timeval.cc
+php_config_m4:
+ deps:
+ - grpc
+ - gpr
+ - boringssl
+ - z
+ headers:
+ - src/php/ext/grpc/byte_buffer.h
+ - src/php/ext/grpc/call.h
+ - src/php/ext/grpc/call_credentials.h
+ - src/php/ext/grpc/channel.h
+ - src/php/ext/grpc/channel_credentials.h
+ - src/php/ext/grpc/completion_queue.h
+ - src/php/ext/grpc/php_grpc.h
+ - src/php/ext/grpc/server.h
+ - src/php/ext/grpc/server_credentials.h
+ - src/php/ext/grpc/timeval.h
+ src:
+ - src/php/ext/grpc/byte_buffer.c
+ - src/php/ext/grpc/call.c
+ - src/php/ext/grpc/call_credentials.c
+ - src/php/ext/grpc/channel.c
+ - src/php/ext/grpc/channel_credentials.c
+ - src/php/ext/grpc/completion_queue.c
+ - src/php/ext/grpc/php_grpc.c
+ - src/php/ext/grpc/server.c
+ - src/php/ext/grpc/server_credentials.c
+ - src/php/ext/grpc/timeval.c
python_dependencies:
deps:
- grpc
diff --git a/config.m4 b/config.m4
new file mode 100644
index 0000000000..0323d5d2ad
--- /dev/null
+++ b/config.m4
@@ -0,0 +1,554 @@
+PHP_ARG_ENABLE(grpc, whether to enable grpc support,
+[ --enable-grpc Enable grpc support])
+
+if test "$PHP_GRPC" != "no"; then
+ dnl Write more examples of tests here...
+
+ dnl # --with-grpc -> add include path
+ PHP_ADD_INCLUDE(../../grpc/include)
+ PHP_ADD_INCLUDE(../../grpc/src/php/ext/grpc)
+ PHP_ADD_INCLUDE(../../grpc/third_party/boringssl/include)
+
+ LIBS="-lpthread $LIBS"
+
+ GRPC_SHARED_LIBADD="-lpthread $GRPC_SHARED_LIBADD"
+ PHP_ADD_LIBRARY(pthread)
+
+ PHP_ADD_LIBRARY(dl,,GRPC_SHARED_LIBADD)
+ PHP_ADD_LIBRARY(dl)
+
+ case $host in
+ *darwin*) ;;
+ *)
+ PHP_ADD_LIBRARY(rt,,GRPC_SHARED_LIBADD)
+ PHP_ADD_LIBRARY(rt)
+ ;;
+ esac
+
+ PHP_NEW_EXTENSION(grpc,
+ src/php/ext/grpc/byte_buffer.c \
+ src/php/ext/grpc/call.c \
+ src/php/ext/grpc/call_credentials.c \
+ src/php/ext/grpc/channel.c \
+ src/php/ext/grpc/channel_credentials.c \
+ src/php/ext/grpc/completion_queue.c \
+ src/php/ext/grpc/php_grpc.c \
+ src/php/ext/grpc/server.c \
+ src/php/ext/grpc/server_credentials.c \
+ src/php/ext/grpc/timeval.c \
+ src/core/profiling/basic_timers.c \
+ src/core/profiling/stap_timers.c \
+ src/core/support/alloc.c \
+ src/core/support/avl.c \
+ src/core/support/cmdline.c \
+ src/core/support/cpu_iphone.c \
+ src/core/support/cpu_linux.c \
+ src/core/support/cpu_posix.c \
+ src/core/support/cpu_windows.c \
+ src/core/support/env_linux.c \
+ src/core/support/env_posix.c \
+ src/core/support/env_win32.c \
+ src/core/support/file.c \
+ src/core/support/file_posix.c \
+ src/core/support/file_win32.c \
+ src/core/support/histogram.c \
+ src/core/support/host_port.c \
+ src/core/support/log.c \
+ src/core/support/log_android.c \
+ src/core/support/log_linux.c \
+ src/core/support/log_posix.c \
+ src/core/support/log_win32.c \
+ src/core/support/murmur_hash.c \
+ src/core/support/slice.c \
+ src/core/support/slice_buffer.c \
+ src/core/support/stack_lockfree.c \
+ src/core/support/string.c \
+ src/core/support/string_posix.c \
+ src/core/support/string_win32.c \
+ src/core/support/subprocess_posix.c \
+ src/core/support/subprocess_windows.c \
+ src/core/support/sync.c \
+ src/core/support/sync_posix.c \
+ src/core/support/sync_win32.c \
+ src/core/support/thd.c \
+ src/core/support/thd_posix.c \
+ src/core/support/thd_win32.c \
+ src/core/support/time.c \
+ src/core/support/time_posix.c \
+ src/core/support/time_precise.c \
+ src/core/support/time_win32.c \
+ src/core/support/tls_pthread.c \
+ src/core/support/wrap_memcpy.c \
+ src/core/census/grpc_context.c \
+ src/core/census/grpc_filter.c \
+ src/core/channel/channel_args.c \
+ src/core/channel/channel_stack.c \
+ src/core/channel/client_channel.c \
+ src/core/channel/client_uchannel.c \
+ src/core/channel/compress_filter.c \
+ src/core/channel/connected_channel.c \
+ src/core/channel/http_client_filter.c \
+ src/core/channel/http_server_filter.c \
+ src/core/channel/subchannel_call_holder.c \
+ src/core/client_config/client_config.c \
+ src/core/client_config/connector.c \
+ src/core/client_config/default_initial_connect_string.c \
+ src/core/client_config/initial_connect_string.c \
+ src/core/client_config/lb_policies/load_balancer_api.c \
+ src/core/client_config/lb_policies/pick_first.c \
+ src/core/client_config/lb_policies/round_robin.c \
+ src/core/client_config/lb_policy.c \
+ src/core/client_config/lb_policy_factory.c \
+ src/core/client_config/lb_policy_registry.c \
+ src/core/client_config/resolver.c \
+ src/core/client_config/resolver_factory.c \
+ src/core/client_config/resolver_registry.c \
+ src/core/client_config/resolvers/dns_resolver.c \
+ src/core/client_config/resolvers/sockaddr_resolver.c \
+ src/core/client_config/subchannel.c \
+ src/core/client_config/subchannel_factory.c \
+ src/core/client_config/subchannel_index.c \
+ src/core/client_config/uri_parser.c \
+ src/core/compression/algorithm.c \
+ src/core/compression/message_compress.c \
+ src/core/debug/trace.c \
+ src/core/httpcli/format_request.c \
+ src/core/httpcli/httpcli.c \
+ src/core/httpcli/parser.c \
+ src/core/iomgr/closure.c \
+ src/core/iomgr/endpoint.c \
+ src/core/iomgr/endpoint_pair_posix.c \
+ src/core/iomgr/endpoint_pair_windows.c \
+ src/core/iomgr/exec_ctx.c \
+ src/core/iomgr/executor.c \
+ src/core/iomgr/fd_posix.c \
+ src/core/iomgr/iocp_windows.c \
+ src/core/iomgr/iomgr.c \
+ src/core/iomgr/iomgr_posix.c \
+ src/core/iomgr/iomgr_windows.c \
+ src/core/iomgr/pollset_multipoller_with_epoll.c \
+ src/core/iomgr/pollset_multipoller_with_poll_posix.c \
+ src/core/iomgr/pollset_posix.c \
+ src/core/iomgr/pollset_set_posix.c \
+ src/core/iomgr/pollset_set_windows.c \
+ src/core/iomgr/pollset_windows.c \
+ src/core/iomgr/resolve_address_posix.c \
+ src/core/iomgr/resolve_address_windows.c \
+ src/core/iomgr/sockaddr_utils.c \
+ src/core/iomgr/socket_utils_common_posix.c \
+ src/core/iomgr/socket_utils_linux.c \
+ src/core/iomgr/socket_utils_posix.c \
+ src/core/iomgr/socket_windows.c \
+ src/core/iomgr/tcp_client_posix.c \
+ src/core/iomgr/tcp_client_windows.c \
+ src/core/iomgr/tcp_posix.c \
+ src/core/iomgr/tcp_server_posix.c \
+ src/core/iomgr/tcp_server_windows.c \
+ src/core/iomgr/tcp_windows.c \
+ src/core/iomgr/time_averaged_stats.c \
+ src/core/iomgr/timer.c \
+ src/core/iomgr/timer_heap.c \
+ src/core/iomgr/udp_server.c \
+ src/core/iomgr/wakeup_fd_eventfd.c \
+ src/core/iomgr/wakeup_fd_nospecial.c \
+ src/core/iomgr/wakeup_fd_pipe.c \
+ src/core/iomgr/wakeup_fd_posix.c \
+ src/core/iomgr/workqueue_posix.c \
+ src/core/iomgr/workqueue_windows.c \
+ src/core/json/json.c \
+ src/core/json/json_reader.c \
+ src/core/json/json_string.c \
+ src/core/json/json_writer.c \
+ src/core/proto/grpc/lb/v0/load_balancer.pb.c \
+ src/core/surface/alarm.c \
+ src/core/surface/api_trace.c \
+ src/core/surface/byte_buffer.c \
+ src/core/surface/byte_buffer_reader.c \
+ src/core/surface/call.c \
+ src/core/surface/call_details.c \
+ src/core/surface/call_log_batch.c \
+ src/core/surface/channel.c \
+ src/core/surface/channel_connectivity.c \
+ src/core/surface/channel_create.c \
+ src/core/surface/channel_ping.c \
+ src/core/surface/completion_queue.c \
+ src/core/surface/event_string.c \
+ src/core/surface/init.c \
+ src/core/surface/lame_client.c \
+ src/core/surface/metadata_array.c \
+ src/core/surface/server.c \
+ src/core/surface/server_chttp2.c \
+ src/core/surface/server_create.c \
+ src/core/surface/validate_metadata.c \
+ src/core/surface/version.c \
+ src/core/transport/byte_stream.c \
+ src/core/transport/chttp2/alpn.c \
+ src/core/transport/chttp2/bin_encoder.c \
+ src/core/transport/chttp2/frame_data.c \
+ src/core/transport/chttp2/frame_goaway.c \
+ src/core/transport/chttp2/frame_ping.c \
+ src/core/transport/chttp2/frame_rst_stream.c \
+ src/core/transport/chttp2/frame_settings.c \
+ src/core/transport/chttp2/frame_window_update.c \
+ src/core/transport/chttp2/hpack_encoder.c \
+ src/core/transport/chttp2/hpack_parser.c \
+ src/core/transport/chttp2/hpack_table.c \
+ src/core/transport/chttp2/huffsyms.c \
+ src/core/transport/chttp2/incoming_metadata.c \
+ src/core/transport/chttp2/parsing.c \
+ src/core/transport/chttp2/status_conversion.c \
+ src/core/transport/chttp2/stream_lists.c \
+ src/core/transport/chttp2/stream_map.c \
+ src/core/transport/chttp2/timeout_encoding.c \
+ src/core/transport/chttp2/varint.c \
+ src/core/transport/chttp2/writing.c \
+ src/core/transport/chttp2_transport.c \
+ src/core/transport/connectivity_state.c \
+ src/core/transport/metadata.c \
+ src/core/transport/metadata_batch.c \
+ src/core/transport/static_metadata.c \
+ src/core/transport/transport.c \
+ src/core/transport/transport_op_string.c \
+ src/core/httpcli/httpcli_security_connector.c \
+ src/core/security/base64.c \
+ src/core/security/client_auth_filter.c \
+ src/core/security/credentials.c \
+ src/core/security/credentials_metadata.c \
+ src/core/security/credentials_posix.c \
+ src/core/security/credentials_win32.c \
+ src/core/security/google_default_credentials.c \
+ src/core/security/handshake.c \
+ src/core/security/json_token.c \
+ src/core/security/jwt_verifier.c \
+ src/core/security/secure_endpoint.c \
+ src/core/security/security_connector.c \
+ src/core/security/security_context.c \
+ src/core/security/server_auth_filter.c \
+ src/core/security/server_secure_chttp2.c \
+ src/core/surface/init_secure.c \
+ src/core/surface/secure_channel_create.c \
+ src/core/tsi/fake_transport_security.c \
+ src/core/tsi/ssl_transport_security.c \
+ src/core/tsi/transport_security.c \
+ src/core/census/context.c \
+ src/core/census/initialize.c \
+ src/core/census/mlog.c \
+ src/core/census/operation.c \
+ src/core/census/placeholders.c \
+ src/core/census/tracing.c \
+ third_party/nanopb/pb_common.c \
+ third_party/nanopb/pb_decode.c \
+ third_party/nanopb/pb_encode.c \
+ src/boringssl/err_data.c \
+ third_party/boringssl/crypto/aes/aes.c \
+ third_party/boringssl/crypto/aes/mode_wrappers.c \
+ third_party/boringssl/crypto/asn1/a_bitstr.c \
+ third_party/boringssl/crypto/asn1/a_bool.c \
+ third_party/boringssl/crypto/asn1/a_bytes.c \
+ third_party/boringssl/crypto/asn1/a_d2i_fp.c \
+ third_party/boringssl/crypto/asn1/a_dup.c \
+ third_party/boringssl/crypto/asn1/a_enum.c \
+ third_party/boringssl/crypto/asn1/a_gentm.c \
+ third_party/boringssl/crypto/asn1/a_i2d_fp.c \
+ third_party/boringssl/crypto/asn1/a_int.c \
+ third_party/boringssl/crypto/asn1/a_mbstr.c \
+ third_party/boringssl/crypto/asn1/a_object.c \
+ third_party/boringssl/crypto/asn1/a_octet.c \
+ third_party/boringssl/crypto/asn1/a_print.c \
+ third_party/boringssl/crypto/asn1/a_strnid.c \
+ third_party/boringssl/crypto/asn1/a_time.c \
+ third_party/boringssl/crypto/asn1/a_type.c \
+ third_party/boringssl/crypto/asn1/a_utctm.c \
+ third_party/boringssl/crypto/asn1/a_utf8.c \
+ third_party/boringssl/crypto/asn1/asn1_lib.c \
+ third_party/boringssl/crypto/asn1/asn1_par.c \
+ third_party/boringssl/crypto/asn1/asn_pack.c \
+ third_party/boringssl/crypto/asn1/bio_asn1.c \
+ third_party/boringssl/crypto/asn1/bio_ndef.c \
+ third_party/boringssl/crypto/asn1/f_enum.c \
+ third_party/boringssl/crypto/asn1/f_int.c \
+ third_party/boringssl/crypto/asn1/f_string.c \
+ third_party/boringssl/crypto/asn1/t_bitst.c \
+ third_party/boringssl/crypto/asn1/t_pkey.c \
+ third_party/boringssl/crypto/asn1/tasn_dec.c \
+ third_party/boringssl/crypto/asn1/tasn_enc.c \
+ third_party/boringssl/crypto/asn1/tasn_fre.c \
+ third_party/boringssl/crypto/asn1/tasn_new.c \
+ third_party/boringssl/crypto/asn1/tasn_prn.c \
+ third_party/boringssl/crypto/asn1/tasn_typ.c \
+ third_party/boringssl/crypto/asn1/tasn_utl.c \
+ third_party/boringssl/crypto/asn1/x_bignum.c \
+ third_party/boringssl/crypto/asn1/x_long.c \
+ third_party/boringssl/crypto/base64/base64.c \
+ third_party/boringssl/crypto/bio/bio.c \
+ third_party/boringssl/crypto/bio/bio_mem.c \
+ third_party/boringssl/crypto/bio/buffer.c \
+ third_party/boringssl/crypto/bio/connect.c \
+ third_party/boringssl/crypto/bio/fd.c \
+ third_party/boringssl/crypto/bio/file.c \
+ third_party/boringssl/crypto/bio/hexdump.c \
+ third_party/boringssl/crypto/bio/pair.c \
+ third_party/boringssl/crypto/bio/printf.c \
+ third_party/boringssl/crypto/bio/socket.c \
+ third_party/boringssl/crypto/bio/socket_helper.c \
+ third_party/boringssl/crypto/bn/add.c \
+ third_party/boringssl/crypto/bn/asm/x86_64-gcc.c \
+ third_party/boringssl/crypto/bn/bn.c \
+ third_party/boringssl/crypto/bn/bn_asn1.c \
+ third_party/boringssl/crypto/bn/cmp.c \
+ third_party/boringssl/crypto/bn/convert.c \
+ third_party/boringssl/crypto/bn/ctx.c \
+ third_party/boringssl/crypto/bn/div.c \
+ third_party/boringssl/crypto/bn/exponentiation.c \
+ third_party/boringssl/crypto/bn/gcd.c \
+ third_party/boringssl/crypto/bn/generic.c \
+ third_party/boringssl/crypto/bn/kronecker.c \
+ third_party/boringssl/crypto/bn/montgomery.c \
+ third_party/boringssl/crypto/bn/mul.c \
+ third_party/boringssl/crypto/bn/prime.c \
+ third_party/boringssl/crypto/bn/random.c \
+ third_party/boringssl/crypto/bn/rsaz_exp.c \
+ third_party/boringssl/crypto/bn/shift.c \
+ third_party/boringssl/crypto/bn/sqrt.c \
+ third_party/boringssl/crypto/buf/buf.c \
+ third_party/boringssl/crypto/bytestring/ber.c \
+ third_party/boringssl/crypto/bytestring/cbb.c \
+ third_party/boringssl/crypto/bytestring/cbs.c \
+ third_party/boringssl/crypto/chacha/chacha_generic.c \
+ third_party/boringssl/crypto/chacha/chacha_vec.c \
+ third_party/boringssl/crypto/cipher/aead.c \
+ third_party/boringssl/crypto/cipher/cipher.c \
+ third_party/boringssl/crypto/cipher/derive_key.c \
+ third_party/boringssl/crypto/cipher/e_aes.c \
+ third_party/boringssl/crypto/cipher/e_chacha20poly1305.c \
+ third_party/boringssl/crypto/cipher/e_des.c \
+ third_party/boringssl/crypto/cipher/e_null.c \
+ third_party/boringssl/crypto/cipher/e_rc2.c \
+ third_party/boringssl/crypto/cipher/e_rc4.c \
+ third_party/boringssl/crypto/cipher/e_ssl3.c \
+ third_party/boringssl/crypto/cipher/e_tls.c \
+ third_party/boringssl/crypto/cipher/tls_cbc.c \
+ third_party/boringssl/crypto/cmac/cmac.c \
+ third_party/boringssl/crypto/conf/conf.c \
+ third_party/boringssl/crypto/cpu-arm.c \
+ third_party/boringssl/crypto/cpu-intel.c \
+ third_party/boringssl/crypto/crypto.c \
+ third_party/boringssl/crypto/curve25519/curve25519.c \
+ third_party/boringssl/crypto/des/des.c \
+ third_party/boringssl/crypto/dh/check.c \
+ third_party/boringssl/crypto/dh/dh.c \
+ third_party/boringssl/crypto/dh/dh_asn1.c \
+ third_party/boringssl/crypto/dh/params.c \
+ third_party/boringssl/crypto/digest/digest.c \
+ third_party/boringssl/crypto/digest/digests.c \
+ third_party/boringssl/crypto/directory_posix.c \
+ third_party/boringssl/crypto/directory_win.c \
+ third_party/boringssl/crypto/dsa/dsa.c \
+ third_party/boringssl/crypto/dsa/dsa_asn1.c \
+ third_party/boringssl/crypto/ec/ec.c \
+ third_party/boringssl/crypto/ec/ec_asn1.c \
+ third_party/boringssl/crypto/ec/ec_key.c \
+ third_party/boringssl/crypto/ec/ec_montgomery.c \
+ third_party/boringssl/crypto/ec/oct.c \
+ third_party/boringssl/crypto/ec/p224-64.c \
+ third_party/boringssl/crypto/ec/p256-64.c \
+ third_party/boringssl/crypto/ec/p256-x86_64.c \
+ third_party/boringssl/crypto/ec/simple.c \
+ third_party/boringssl/crypto/ec/util-64.c \
+ third_party/boringssl/crypto/ec/wnaf.c \
+ third_party/boringssl/crypto/ecdh/ecdh.c \
+ third_party/boringssl/crypto/ecdsa/ecdsa.c \
+ third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c \
+ third_party/boringssl/crypto/engine/engine.c \
+ third_party/boringssl/crypto/err/err.c \
+ third_party/boringssl/crypto/evp/algorithm.c \
+ third_party/boringssl/crypto/evp/digestsign.c \
+ third_party/boringssl/crypto/evp/evp.c \
+ third_party/boringssl/crypto/evp/evp_asn1.c \
+ third_party/boringssl/crypto/evp/evp_ctx.c \
+ third_party/boringssl/crypto/evp/p_dsa_asn1.c \
+ third_party/boringssl/crypto/evp/p_ec.c \
+ third_party/boringssl/crypto/evp/p_ec_asn1.c \
+ third_party/boringssl/crypto/evp/p_rsa.c \
+ third_party/boringssl/crypto/evp/p_rsa_asn1.c \
+ third_party/boringssl/crypto/evp/pbkdf.c \
+ third_party/boringssl/crypto/evp/sign.c \
+ third_party/boringssl/crypto/ex_data.c \
+ third_party/boringssl/crypto/hkdf/hkdf.c \
+ third_party/boringssl/crypto/hmac/hmac.c \
+ third_party/boringssl/crypto/lhash/lhash.c \
+ third_party/boringssl/crypto/md4/md4.c \
+ third_party/boringssl/crypto/md5/md5.c \
+ third_party/boringssl/crypto/mem.c \
+ third_party/boringssl/crypto/modes/cbc.c \
+ third_party/boringssl/crypto/modes/cfb.c \
+ third_party/boringssl/crypto/modes/ctr.c \
+ third_party/boringssl/crypto/modes/gcm.c \
+ third_party/boringssl/crypto/modes/ofb.c \
+ third_party/boringssl/crypto/obj/obj.c \
+ third_party/boringssl/crypto/obj/obj_xref.c \
+ third_party/boringssl/crypto/pem/pem_all.c \
+ third_party/boringssl/crypto/pem/pem_info.c \
+ third_party/boringssl/crypto/pem/pem_lib.c \
+ third_party/boringssl/crypto/pem/pem_oth.c \
+ third_party/boringssl/crypto/pem/pem_pk8.c \
+ third_party/boringssl/crypto/pem/pem_pkey.c \
+ third_party/boringssl/crypto/pem/pem_x509.c \
+ third_party/boringssl/crypto/pem/pem_xaux.c \
+ third_party/boringssl/crypto/pkcs8/p5_pbe.c \
+ third_party/boringssl/crypto/pkcs8/p5_pbev2.c \
+ third_party/boringssl/crypto/pkcs8/p8_pkey.c \
+ third_party/boringssl/crypto/pkcs8/pkcs8.c \
+ third_party/boringssl/crypto/poly1305/poly1305.c \
+ third_party/boringssl/crypto/poly1305/poly1305_arm.c \
+ third_party/boringssl/crypto/poly1305/poly1305_vec.c \
+ third_party/boringssl/crypto/rand/rand.c \
+ third_party/boringssl/crypto/rand/urandom.c \
+ third_party/boringssl/crypto/rand/windows.c \
+ third_party/boringssl/crypto/rc4/rc4.c \
+ third_party/boringssl/crypto/refcount_c11.c \
+ third_party/boringssl/crypto/refcount_lock.c \
+ third_party/boringssl/crypto/rsa/blinding.c \
+ third_party/boringssl/crypto/rsa/padding.c \
+ third_party/boringssl/crypto/rsa/rsa.c \
+ third_party/boringssl/crypto/rsa/rsa_asn1.c \
+ third_party/boringssl/crypto/rsa/rsa_impl.c \
+ third_party/boringssl/crypto/sha/sha1.c \
+ third_party/boringssl/crypto/sha/sha256.c \
+ third_party/boringssl/crypto/sha/sha512.c \
+ third_party/boringssl/crypto/stack/stack.c \
+ third_party/boringssl/crypto/thread.c \
+ third_party/boringssl/crypto/thread_none.c \
+ third_party/boringssl/crypto/thread_pthread.c \
+ third_party/boringssl/crypto/thread_win.c \
+ third_party/boringssl/crypto/time_support.c \
+ third_party/boringssl/crypto/x509/a_digest.c \
+ third_party/boringssl/crypto/x509/a_sign.c \
+ third_party/boringssl/crypto/x509/a_strex.c \
+ third_party/boringssl/crypto/x509/a_verify.c \
+ third_party/boringssl/crypto/x509/asn1_gen.c \
+ third_party/boringssl/crypto/x509/by_dir.c \
+ third_party/boringssl/crypto/x509/by_file.c \
+ third_party/boringssl/crypto/x509/i2d_pr.c \
+ third_party/boringssl/crypto/x509/pkcs7.c \
+ third_party/boringssl/crypto/x509/t_crl.c \
+ third_party/boringssl/crypto/x509/t_req.c \
+ third_party/boringssl/crypto/x509/t_x509.c \
+ third_party/boringssl/crypto/x509/t_x509a.c \
+ third_party/boringssl/crypto/x509/x509.c \
+ third_party/boringssl/crypto/x509/x509_att.c \
+ third_party/boringssl/crypto/x509/x509_cmp.c \
+ third_party/boringssl/crypto/x509/x509_d2.c \
+ third_party/boringssl/crypto/x509/x509_def.c \
+ third_party/boringssl/crypto/x509/x509_ext.c \
+ third_party/boringssl/crypto/x509/x509_lu.c \
+ third_party/boringssl/crypto/x509/x509_obj.c \
+ third_party/boringssl/crypto/x509/x509_r2x.c \
+ third_party/boringssl/crypto/x509/x509_req.c \
+ third_party/boringssl/crypto/x509/x509_set.c \
+ third_party/boringssl/crypto/x509/x509_trs.c \
+ third_party/boringssl/crypto/x509/x509_txt.c \
+ third_party/boringssl/crypto/x509/x509_v3.c \
+ third_party/boringssl/crypto/x509/x509_vfy.c \
+ third_party/boringssl/crypto/x509/x509_vpm.c \
+ third_party/boringssl/crypto/x509/x509cset.c \
+ third_party/boringssl/crypto/x509/x509name.c \
+ third_party/boringssl/crypto/x509/x509rset.c \
+ third_party/boringssl/crypto/x509/x509spki.c \
+ third_party/boringssl/crypto/x509/x509type.c \
+ third_party/boringssl/crypto/x509/x_algor.c \
+ third_party/boringssl/crypto/x509/x_all.c \
+ third_party/boringssl/crypto/x509/x_attrib.c \
+ third_party/boringssl/crypto/x509/x_crl.c \
+ third_party/boringssl/crypto/x509/x_exten.c \
+ third_party/boringssl/crypto/x509/x_info.c \
+ third_party/boringssl/crypto/x509/x_name.c \
+ third_party/boringssl/crypto/x509/x_pkey.c \
+ third_party/boringssl/crypto/x509/x_pubkey.c \
+ third_party/boringssl/crypto/x509/x_req.c \
+ third_party/boringssl/crypto/x509/x_sig.c \
+ third_party/boringssl/crypto/x509/x_spki.c \
+ third_party/boringssl/crypto/x509/x_val.c \
+ third_party/boringssl/crypto/x509/x_x509.c \
+ third_party/boringssl/crypto/x509/x_x509a.c \
+ third_party/boringssl/crypto/x509v3/pcy_cache.c \
+ third_party/boringssl/crypto/x509v3/pcy_data.c \
+ third_party/boringssl/crypto/x509v3/pcy_lib.c \
+ third_party/boringssl/crypto/x509v3/pcy_map.c \
+ third_party/boringssl/crypto/x509v3/pcy_node.c \
+ third_party/boringssl/crypto/x509v3/pcy_tree.c \
+ third_party/boringssl/crypto/x509v3/v3_akey.c \
+ third_party/boringssl/crypto/x509v3/v3_akeya.c \
+ third_party/boringssl/crypto/x509v3/v3_alt.c \
+ third_party/boringssl/crypto/x509v3/v3_bcons.c \
+ third_party/boringssl/crypto/x509v3/v3_bitst.c \
+ third_party/boringssl/crypto/x509v3/v3_conf.c \
+ third_party/boringssl/crypto/x509v3/v3_cpols.c \
+ third_party/boringssl/crypto/x509v3/v3_crld.c \
+ third_party/boringssl/crypto/x509v3/v3_enum.c \
+ third_party/boringssl/crypto/x509v3/v3_extku.c \
+ third_party/boringssl/crypto/x509v3/v3_genn.c \
+ third_party/boringssl/crypto/x509v3/v3_ia5.c \
+ third_party/boringssl/crypto/x509v3/v3_info.c \
+ third_party/boringssl/crypto/x509v3/v3_int.c \
+ third_party/boringssl/crypto/x509v3/v3_lib.c \
+ third_party/boringssl/crypto/x509v3/v3_ncons.c \
+ third_party/boringssl/crypto/x509v3/v3_pci.c \
+ third_party/boringssl/crypto/x509v3/v3_pcia.c \
+ third_party/boringssl/crypto/x509v3/v3_pcons.c \
+ third_party/boringssl/crypto/x509v3/v3_pku.c \
+ third_party/boringssl/crypto/x509v3/v3_pmaps.c \
+ third_party/boringssl/crypto/x509v3/v3_prn.c \
+ third_party/boringssl/crypto/x509v3/v3_purp.c \
+ third_party/boringssl/crypto/x509v3/v3_skey.c \
+ third_party/boringssl/crypto/x509v3/v3_sxnet.c \
+ third_party/boringssl/crypto/x509v3/v3_utl.c \
+ third_party/boringssl/ssl/custom_extensions.c \
+ third_party/boringssl/ssl/d1_both.c \
+ third_party/boringssl/ssl/d1_clnt.c \
+ third_party/boringssl/ssl/d1_lib.c \
+ third_party/boringssl/ssl/d1_meth.c \
+ third_party/boringssl/ssl/d1_pkt.c \
+ third_party/boringssl/ssl/d1_srtp.c \
+ third_party/boringssl/ssl/d1_srvr.c \
+ third_party/boringssl/ssl/dtls_record.c \
+ third_party/boringssl/ssl/pqueue/pqueue.c \
+ third_party/boringssl/ssl/s3_both.c \
+ third_party/boringssl/ssl/s3_clnt.c \
+ third_party/boringssl/ssl/s3_enc.c \
+ third_party/boringssl/ssl/s3_lib.c \
+ third_party/boringssl/ssl/s3_meth.c \
+ third_party/boringssl/ssl/s3_pkt.c \
+ third_party/boringssl/ssl/s3_srvr.c \
+ third_party/boringssl/ssl/ssl_aead_ctx.c \
+ third_party/boringssl/ssl/ssl_asn1.c \
+ third_party/boringssl/ssl/ssl_buffer.c \
+ third_party/boringssl/ssl/ssl_cert.c \
+ third_party/boringssl/ssl/ssl_cipher.c \
+ third_party/boringssl/ssl/ssl_file.c \
+ third_party/boringssl/ssl/ssl_lib.c \
+ third_party/boringssl/ssl/ssl_rsa.c \
+ third_party/boringssl/ssl/ssl_session.c \
+ third_party/boringssl/ssl/ssl_stat.c \
+ third_party/boringssl/ssl/t1_enc.c \
+ third_party/boringssl/ssl/t1_lib.c \
+ third_party/boringssl/ssl/tls_record.c \
+ third_party/zlib/adler32.c \
+ third_party/zlib/compress.c \
+ third_party/zlib/crc32.c \
+ third_party/zlib/deflate.c \
+ third_party/zlib/gzclose.c \
+ third_party/zlib/gzlib.c \
+ third_party/zlib/gzread.c \
+ third_party/zlib/gzwrite.c \
+ third_party/zlib/infback.c \
+ third_party/zlib/inffast.c \
+ third_party/zlib/inflate.c \
+ third_party/zlib/inftrees.c \
+ third_party/zlib/trees.c \
+ third_party/zlib/uncompr.c \
+ third_party/zlib/zutil.c \
+ , $ext_shared, , -Wall -Werror -std=c11 \
+ -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN \
+ -D_HAS_EXCEPTIONS=0 -DNOMINMAX)
+fi
diff --git a/gRPC.podspec b/gRPC.podspec
index b0b25ec819..d9c81ef88b 100644
--- a/gRPC.podspec
+++ b/gRPC.podspec
@@ -172,6 +172,7 @@ Pod::Spec.new do |s|
'src/core/client_config/client_config.h',
'src/core/client_config/connector.h',
'src/core/client_config/initial_connect_string.h',
+ 'src/core/client_config/lb_policies/load_balancer_api.h',
'src/core/client_config/lb_policies/pick_first.h',
'src/core/client_config/lb_policies/round_robin.h',
'src/core/client_config/lb_policy.h',
@@ -232,6 +233,7 @@ Pod::Spec.new do |s|
'src/core/json/json_common.h',
'src/core/json/json_reader.h',
'src/core/json/json_writer.h',
+ 'src/core/proto/grpc/lb/v0/load_balancer.pb.h',
'src/core/statistics/census_interface.h',
'src/core/statistics/census_rpc_stats.h',
'src/core/surface/api_trace.h',
@@ -288,6 +290,10 @@ Pod::Spec.new do |s|
'src/core/census/aggregation.h',
'src/core/census/mlog.h',
'src/core/census/rpc_metric_id.h',
+ 'third_party/nanopb/pb.h',
+ 'third_party/nanopb/pb_common.h',
+ 'third_party/nanopb/pb_decode.h',
+ 'third_party/nanopb/pb_encode.h',
'include/grpc/grpc_security.h',
'include/grpc/impl/codegen/byte_buffer.h',
'include/grpc/impl/codegen/compression_types.h',
@@ -316,6 +322,7 @@ Pod::Spec.new do |s|
'src/core/client_config/connector.c',
'src/core/client_config/default_initial_connect_string.c',
'src/core/client_config/initial_connect_string.c',
+ 'src/core/client_config/lb_policies/load_balancer_api.c',
'src/core/client_config/lb_policies/pick_first.c',
'src/core/client_config/lb_policies/round_robin.c',
'src/core/client_config/lb_policy.c',
@@ -380,6 +387,7 @@ Pod::Spec.new do |s|
'src/core/json/json_reader.c',
'src/core/json/json_string.c',
'src/core/json/json_writer.c',
+ 'src/core/proto/grpc/lb/v0/load_balancer.pb.c',
'src/core/surface/alarm.c',
'src/core/surface/api_trace.c',
'src/core/surface/byte_buffer.c',
@@ -455,7 +463,10 @@ Pod::Spec.new do |s|
'src/core/census/mlog.c',
'src/core/census/operation.c',
'src/core/census/placeholders.c',
- 'src/core/census/tracing.c'
+ 'src/core/census/tracing.c',
+ 'third_party/nanopb/pb_common.c',
+ 'third_party/nanopb/pb_decode.c',
+ 'third_party/nanopb/pb_encode.c'
ss.private_header_files = 'src/core/profiling/timers.h',
'src/core/support/block_annotate.h',
@@ -481,6 +492,7 @@ Pod::Spec.new do |s|
'src/core/client_config/client_config.h',
'src/core/client_config/connector.h',
'src/core/client_config/initial_connect_string.h',
+ 'src/core/client_config/lb_policies/load_balancer_api.h',
'src/core/client_config/lb_policies/pick_first.h',
'src/core/client_config/lb_policies/round_robin.h',
'src/core/client_config/lb_policy.h',
@@ -541,6 +553,7 @@ Pod::Spec.new do |s|
'src/core/json/json_common.h',
'src/core/json/json_reader.h',
'src/core/json/json_writer.h',
+ 'src/core/proto/grpc/lb/v0/load_balancer.pb.h',
'src/core/statistics/census_interface.h',
'src/core/statistics/census_rpc_stats.h',
'src/core/surface/api_trace.h',
@@ -596,7 +609,11 @@ Pod::Spec.new do |s|
'src/core/tsi/transport_security_interface.h',
'src/core/census/aggregation.h',
'src/core/census/mlog.h',
- 'src/core/census/rpc_metric_id.h'
+ 'src/core/census/rpc_metric_id.h',
+ 'third_party/nanopb/pb.h',
+ 'third_party/nanopb/pb_common.h',
+ 'third_party/nanopb/pb_decode.h',
+ 'third_party/nanopb/pb_encode.h'
ss.header_mappings_dir = '.'
# This isn't officially supported in Cocoapods. We've asked for an alternative:
diff --git a/grpc.gemspec b/grpc.gemspec
index 0b6d293e63..6a0cd6a934 100755
--- a/grpc.gemspec
+++ b/grpc.gemspec
@@ -168,6 +168,7 @@ Gem::Specification.new do |s|
s.files += %w( src/core/client_config/client_config.h )
s.files += %w( src/core/client_config/connector.h )
s.files += %w( src/core/client_config/initial_connect_string.h )
+ s.files += %w( src/core/client_config/lb_policies/load_balancer_api.h )
s.files += %w( src/core/client_config/lb_policies/pick_first.h )
s.files += %w( src/core/client_config/lb_policies/round_robin.h )
s.files += %w( src/core/client_config/lb_policy.h )
@@ -228,6 +229,7 @@ Gem::Specification.new do |s|
s.files += %w( src/core/json/json_common.h )
s.files += %w( src/core/json/json_reader.h )
s.files += %w( src/core/json/json_writer.h )
+ s.files += %w( src/core/proto/grpc/lb/v0/load_balancer.pb.h )
s.files += %w( src/core/statistics/census_interface.h )
s.files += %w( src/core/statistics/census_rpc_stats.h )
s.files += %w( src/core/surface/api_trace.h )
@@ -284,6 +286,10 @@ Gem::Specification.new do |s|
s.files += %w( src/core/census/aggregation.h )
s.files += %w( src/core/census/mlog.h )
s.files += %w( src/core/census/rpc_metric_id.h )
+ s.files += %w( third_party/nanopb/pb.h )
+ s.files += %w( third_party/nanopb/pb_common.h )
+ s.files += %w( third_party/nanopb/pb_decode.h )
+ s.files += %w( third_party/nanopb/pb_encode.h )
s.files += %w( src/core/census/grpc_context.c )
s.files += %w( src/core/census/grpc_filter.c )
s.files += %w( src/core/channel/channel_args.c )
@@ -299,6 +305,7 @@ Gem::Specification.new do |s|
s.files += %w( src/core/client_config/connector.c )
s.files += %w( src/core/client_config/default_initial_connect_string.c )
s.files += %w( src/core/client_config/initial_connect_string.c )
+ s.files += %w( src/core/client_config/lb_policies/load_balancer_api.c )
s.files += %w( src/core/client_config/lb_policies/pick_first.c )
s.files += %w( src/core/client_config/lb_policies/round_robin.c )
s.files += %w( src/core/client_config/lb_policy.c )
@@ -363,6 +370,7 @@ Gem::Specification.new do |s|
s.files += %w( src/core/json/json_reader.c )
s.files += %w( src/core/json/json_string.c )
s.files += %w( src/core/json/json_writer.c )
+ s.files += %w( src/core/proto/grpc/lb/v0/load_balancer.pb.c )
s.files += %w( src/core/surface/alarm.c )
s.files += %w( src/core/surface/api_trace.c )
s.files += %w( src/core/surface/byte_buffer.c )
@@ -439,6 +447,9 @@ Gem::Specification.new do |s|
s.files += %w( src/core/census/operation.c )
s.files += %w( src/core/census/placeholders.c )
s.files += %w( src/core/census/tracing.c )
+ s.files += %w( third_party/nanopb/pb_common.c )
+ s.files += %w( third_party/nanopb/pb_decode.c )
+ s.files += %w( third_party/nanopb/pb_encode.c )
s.files += %w( third_party/boringssl/crypto/aes/internal.h )
s.files += %w( third_party/boringssl/crypto/asn1/asn1_locl.h )
s.files += %w( third_party/boringssl/crypto/bio/internal.h )
diff --git a/package.json b/package.json
index b765b9a93f..bc58e3d337 100644
--- a/package.json
+++ b/package.json
@@ -113,6 +113,7 @@
"src/core/client_config/client_config.h",
"src/core/client_config/connector.h",
"src/core/client_config/initial_connect_string.h",
+ "src/core/client_config/lb_policies/load_balancer_api.h",
"src/core/client_config/lb_policies/pick_first.h",
"src/core/client_config/lb_policies/round_robin.h",
"src/core/client_config/lb_policy.h",
@@ -173,6 +174,7 @@
"src/core/json/json_common.h",
"src/core/json/json_reader.h",
"src/core/json/json_writer.h",
+ "src/core/proto/grpc/lb/v0/load_balancer.pb.h",
"src/core/statistics/census_interface.h",
"src/core/statistics/census_rpc_stats.h",
"src/core/surface/api_trace.h",
@@ -229,6 +231,10 @@
"src/core/census/aggregation.h",
"src/core/census/mlog.h",
"src/core/census/rpc_metric_id.h",
+ "third_party/nanopb/pb.h",
+ "third_party/nanopb/pb_common.h",
+ "third_party/nanopb/pb_decode.h",
+ "third_party/nanopb/pb_encode.h",
"src/core/census/grpc_context.c",
"src/core/census/grpc_filter.c",
"src/core/channel/channel_args.c",
@@ -244,6 +250,7 @@
"src/core/client_config/connector.c",
"src/core/client_config/default_initial_connect_string.c",
"src/core/client_config/initial_connect_string.c",
+ "src/core/client_config/lb_policies/load_balancer_api.c",
"src/core/client_config/lb_policies/pick_first.c",
"src/core/client_config/lb_policies/round_robin.c",
"src/core/client_config/lb_policy.c",
@@ -308,6 +315,7 @@
"src/core/json/json_reader.c",
"src/core/json/json_string.c",
"src/core/json/json_writer.c",
+ "src/core/proto/grpc/lb/v0/load_balancer.pb.c",
"src/core/surface/alarm.c",
"src/core/surface/api_trace.c",
"src/core/surface/byte_buffer.c",
@@ -384,6 +392,9 @@
"src/core/census/operation.c",
"src/core/census/placeholders.c",
"src/core/census/tracing.c",
+ "third_party/nanopb/pb_common.c",
+ "third_party/nanopb/pb_decode.c",
+ "third_party/nanopb/pb_encode.c",
"third_party/zlib/crc32.h",
"third_party/zlib/deflate.h",
"third_party/zlib/gzguts.h",
diff --git a/package.xml b/package.xml
new file mode 100644
index 0000000000..99109ada8f
--- /dev/null
+++ b/package.xml
@@ -0,0 +1,998 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package packagerversion="1.9.5" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
+ <name>grpc</name>
+ <channel>pecl.php.net</channel>
+ <summary>A high performance, open source, general RPC framework that puts mobile and HTTP/2 first.</summary>
+ <description>Remote Procedure Calls (RPCs) provide a useful abstraction for building distributed applications and services. The libraries in this repository provide a concrete implementation of the gRPC protocol, layered over HTTP/2. These libraries enable communication between clients and servers using any combination of the supported languages.</description>
+ <lead>
+ <name>Stanley Cheung</name>
+ <user>stanleycheung</user>
+ <email>grpc-packages@google.com</email>
+ <active>yes</active>
+ </lead>
+ <date>2016-02-23</date>
+ <time>16:06:07</time>
+ <version>
+ <release>0.8.0</release>
+ <api>0.8.0</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <license>BSD</license>
+ <notes>
+- Simplify gRPC PHP installation #4517
+ </notes>
+ <contents>
+ <dir baseinstalldir="/" name="/">
+ <file baseinstalldir="/" name="config.m4" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/CREDITS" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/LICENSE" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/README.md" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/byte_buffer.c" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/call.c" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/call_credentials.c" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/channel.c" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/channel_credentials.c" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/completion_queue.c" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/php_grpc.c" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/server.c" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/server_credentials.c" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/timeval.c" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/byte_buffer.h" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/call.h" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/call_credentials.h" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/channel.h" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/channel_credentials.h" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/completion_queue.h" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/php_grpc.h" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/server.h" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/server_credentials.h" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/timeval.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/alloc.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/atm.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/atm_gcc_atomic.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/atm_gcc_sync.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/atm_win32.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/avl.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/cmdline.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/cpu.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/histogram.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/host_port.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/log.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/log_win32.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/port_platform.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/slice.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/slice_buffer.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/string_util.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/subprocess.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/sync.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/sync_generic.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/sync_posix.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/sync_win32.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/thd.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/time.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/tls.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/tls_gcc.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/tls_msvc.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/tls_pthread.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/support/useful.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/impl/codegen/alloc.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/impl/codegen/atm.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/impl/codegen/atm_gcc_atomic.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/impl/codegen/atm_gcc_sync.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/impl/codegen/atm_win32.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/impl/codegen/log.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/impl/codegen/port_platform.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/impl/codegen/slice.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/impl/codegen/slice_buffer.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/impl/codegen/sync.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/impl/codegen/sync_generic.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/impl/codegen/sync_posix.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/impl/codegen/sync_win32.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/impl/codegen/time.h" role="src" />
+ <file baseinstalldir="/" name="src/core/profiling/timers.h" role="src" />
+ <file baseinstalldir="/" name="src/core/support/block_annotate.h" role="src" />
+ <file baseinstalldir="/" name="src/core/support/env.h" role="src" />
+ <file baseinstalldir="/" name="src/core/support/file.h" role="src" />
+ <file baseinstalldir="/" name="src/core/support/murmur_hash.h" role="src" />
+ <file baseinstalldir="/" name="src/core/support/stack_lockfree.h" role="src" />
+ <file baseinstalldir="/" name="src/core/support/string.h" role="src" />
+ <file baseinstalldir="/" name="src/core/support/string_win32.h" role="src" />
+ <file baseinstalldir="/" name="src/core/support/thd_internal.h" role="src" />
+ <file baseinstalldir="/" name="src/core/support/time_precise.h" role="src" />
+ <file baseinstalldir="/" name="src/core/profiling/basic_timers.c" role="src" />
+ <file baseinstalldir="/" name="src/core/profiling/stap_timers.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/alloc.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/avl.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/cmdline.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/cpu_iphone.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/cpu_linux.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/cpu_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/cpu_windows.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/env_linux.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/env_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/env_win32.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/file.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/file_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/file_win32.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/histogram.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/host_port.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/log.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/log_android.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/log_linux.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/log_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/log_win32.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/murmur_hash.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/slice.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/slice_buffer.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/stack_lockfree.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/string.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/string_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/string_win32.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/subprocess_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/subprocess_windows.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/sync.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/sync_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/sync_win32.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/thd.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/thd_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/thd_win32.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/time.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/time_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/time_precise.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/time_win32.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/tls_pthread.c" role="src" />
+ <file baseinstalldir="/" name="src/core/support/wrap_memcpy.c" role="src" />
+ <file baseinstalldir="/" name="include/grpc/grpc_security.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/impl/codegen/byte_buffer.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/impl/codegen/compression_types.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/impl/codegen/connectivity_state.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/impl/codegen/grpc_types.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/impl/codegen/propagation_bits.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/impl/codegen/status.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/byte_buffer.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/byte_buffer_reader.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/compression.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/grpc.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/status.h" role="src" />
+ <file baseinstalldir="/" name="include/grpc/census.h" role="src" />
+ <file baseinstalldir="/" name="src/core/census/grpc_filter.h" role="src" />
+ <file baseinstalldir="/" name="src/core/channel/channel_args.h" role="src" />
+ <file baseinstalldir="/" name="src/core/channel/channel_stack.h" role="src" />
+ <file baseinstalldir="/" name="src/core/channel/client_channel.h" role="src" />
+ <file baseinstalldir="/" name="src/core/channel/client_uchannel.h" role="src" />
+ <file baseinstalldir="/" name="src/core/channel/compress_filter.h" role="src" />
+ <file baseinstalldir="/" name="src/core/channel/connected_channel.h" role="src" />
+ <file baseinstalldir="/" name="src/core/channel/context.h" role="src" />
+ <file baseinstalldir="/" name="src/core/channel/http_client_filter.h" role="src" />
+ <file baseinstalldir="/" name="src/core/channel/http_server_filter.h" role="src" />
+ <file baseinstalldir="/" name="src/core/channel/subchannel_call_holder.h" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/client_config.h" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/connector.h" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/initial_connect_string.h" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/lb_policies/load_balancer_api.h" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/lb_policies/pick_first.h" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/lb_policies/round_robin.h" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/lb_policy.h" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/lb_policy_factory.h" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/lb_policy_registry.h" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/resolver.h" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/resolver_factory.h" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/resolver_registry.h" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/resolvers/dns_resolver.h" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/resolvers/sockaddr_resolver.h" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/subchannel.h" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/subchannel_factory.h" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/subchannel_index.h" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/uri_parser.h" role="src" />
+ <file baseinstalldir="/" name="src/core/compression/algorithm_metadata.h" role="src" />
+ <file baseinstalldir="/" name="src/core/compression/message_compress.h" role="src" />
+ <file baseinstalldir="/" name="src/core/debug/trace.h" role="src" />
+ <file baseinstalldir="/" name="src/core/httpcli/format_request.h" role="src" />
+ <file baseinstalldir="/" name="src/core/httpcli/httpcli.h" role="src" />
+ <file baseinstalldir="/" name="src/core/httpcli/parser.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/closure.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/endpoint.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/endpoint_pair.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/exec_ctx.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/executor.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/fd_posix.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/iocp_windows.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/iomgr.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/iomgr_internal.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/iomgr_posix.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/pollset.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/pollset_posix.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/pollset_set.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/pollset_set_posix.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/pollset_set_windows.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/pollset_windows.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/resolve_address.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/sockaddr.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/sockaddr_posix.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/sockaddr_utils.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/sockaddr_win32.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/socket_utils_posix.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/socket_windows.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/tcp_client.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/tcp_posix.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/tcp_server.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/tcp_windows.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/time_averaged_stats.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/timer.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/timer_heap.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/udp_server.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/wakeup_fd_pipe.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/wakeup_fd_posix.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/workqueue.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/workqueue_posix.h" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/workqueue_windows.h" role="src" />
+ <file baseinstalldir="/" name="src/core/json/json.h" role="src" />
+ <file baseinstalldir="/" name="src/core/json/json_common.h" role="src" />
+ <file baseinstalldir="/" name="src/core/json/json_reader.h" role="src" />
+ <file baseinstalldir="/" name="src/core/json/json_writer.h" role="src" />
+ <file baseinstalldir="/" name="src/core/proto/grpc/lb/v0/load_balancer.pb.h" role="src" />
+ <file baseinstalldir="/" name="src/core/statistics/census_interface.h" role="src" />
+ <file baseinstalldir="/" name="src/core/statistics/census_rpc_stats.h" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/api_trace.h" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/call.h" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/call_test_only.h" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/channel.h" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/completion_queue.h" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/event_string.h" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/init.h" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/server.h" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/surface_trace.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/byte_stream.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/alpn.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/bin_encoder.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/frame.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/frame_data.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/frame_goaway.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/frame_ping.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/frame_rst_stream.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/frame_settings.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/frame_window_update.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/hpack_encoder.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/hpack_parser.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/hpack_table.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/http2_errors.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/huffsyms.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/incoming_metadata.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/internal.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/status_conversion.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/stream_map.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/timeout_encoding.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/varint.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2_transport.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/connectivity_state.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/metadata.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/metadata_batch.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/static_metadata.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/transport.h" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/transport_impl.h" role="src" />
+ <file baseinstalldir="/" name="src/core/security/auth_filters.h" role="src" />
+ <file baseinstalldir="/" name="src/core/security/base64.h" role="src" />
+ <file baseinstalldir="/" name="src/core/security/credentials.h" role="src" />
+ <file baseinstalldir="/" name="src/core/security/handshake.h" role="src" />
+ <file baseinstalldir="/" name="src/core/security/json_token.h" role="src" />
+ <file baseinstalldir="/" name="src/core/security/jwt_verifier.h" role="src" />
+ <file baseinstalldir="/" name="src/core/security/secure_endpoint.h" role="src" />
+ <file baseinstalldir="/" name="src/core/security/security_connector.h" role="src" />
+ <file baseinstalldir="/" name="src/core/security/security_context.h" role="src" />
+ <file baseinstalldir="/" name="src/core/tsi/fake_transport_security.h" role="src" />
+ <file baseinstalldir="/" name="src/core/tsi/ssl_transport_security.h" role="src" />
+ <file baseinstalldir="/" name="src/core/tsi/ssl_types.h" role="src" />
+ <file baseinstalldir="/" name="src/core/tsi/transport_security.h" role="src" />
+ <file baseinstalldir="/" name="src/core/tsi/transport_security_interface.h" role="src" />
+ <file baseinstalldir="/" name="src/core/census/aggregation.h" role="src" />
+ <file baseinstalldir="/" name="src/core/census/mlog.h" role="src" />
+ <file baseinstalldir="/" name="src/core/census/rpc_metric_id.h" role="src" />
+ <file baseinstalldir="/" name="third_party/nanopb/pb.h" role="src" />
+ <file baseinstalldir="/" name="third_party/nanopb/pb_common.h" role="src" />
+ <file baseinstalldir="/" name="third_party/nanopb/pb_decode.h" role="src" />
+ <file baseinstalldir="/" name="third_party/nanopb/pb_encode.h" role="src" />
+ <file baseinstalldir="/" name="src/core/census/grpc_context.c" role="src" />
+ <file baseinstalldir="/" name="src/core/census/grpc_filter.c" role="src" />
+ <file baseinstalldir="/" name="src/core/channel/channel_args.c" role="src" />
+ <file baseinstalldir="/" name="src/core/channel/channel_stack.c" role="src" />
+ <file baseinstalldir="/" name="src/core/channel/client_channel.c" role="src" />
+ <file baseinstalldir="/" name="src/core/channel/client_uchannel.c" role="src" />
+ <file baseinstalldir="/" name="src/core/channel/compress_filter.c" role="src" />
+ <file baseinstalldir="/" name="src/core/channel/connected_channel.c" role="src" />
+ <file baseinstalldir="/" name="src/core/channel/http_client_filter.c" role="src" />
+ <file baseinstalldir="/" name="src/core/channel/http_server_filter.c" role="src" />
+ <file baseinstalldir="/" name="src/core/channel/subchannel_call_holder.c" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/client_config.c" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/connector.c" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/default_initial_connect_string.c" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/initial_connect_string.c" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/lb_policies/load_balancer_api.c" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/lb_policies/pick_first.c" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/lb_policies/round_robin.c" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/lb_policy.c" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/lb_policy_factory.c" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/lb_policy_registry.c" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/resolver.c" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/resolver_factory.c" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/resolver_registry.c" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/resolvers/dns_resolver.c" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/resolvers/sockaddr_resolver.c" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/subchannel.c" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/subchannel_factory.c" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/subchannel_index.c" role="src" />
+ <file baseinstalldir="/" name="src/core/client_config/uri_parser.c" role="src" />
+ <file baseinstalldir="/" name="src/core/compression/algorithm.c" role="src" />
+ <file baseinstalldir="/" name="src/core/compression/message_compress.c" role="src" />
+ <file baseinstalldir="/" name="src/core/debug/trace.c" role="src" />
+ <file baseinstalldir="/" name="src/core/httpcli/format_request.c" role="src" />
+ <file baseinstalldir="/" name="src/core/httpcli/httpcli.c" role="src" />
+ <file baseinstalldir="/" name="src/core/httpcli/parser.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/closure.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/endpoint.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/endpoint_pair_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/endpoint_pair_windows.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/exec_ctx.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/executor.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/fd_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/iocp_windows.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/iomgr.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/iomgr_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/iomgr_windows.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/pollset_multipoller_with_epoll.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/pollset_multipoller_with_poll_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/pollset_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/pollset_set_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/pollset_set_windows.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/pollset_windows.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/resolve_address_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/resolve_address_windows.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/sockaddr_utils.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/socket_utils_common_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/socket_utils_linux.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/socket_utils_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/socket_windows.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/tcp_client_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/tcp_client_windows.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/tcp_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/tcp_server_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/tcp_server_windows.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/tcp_windows.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/time_averaged_stats.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/timer.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/timer_heap.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/udp_server.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/wakeup_fd_eventfd.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/wakeup_fd_nospecial.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/wakeup_fd_pipe.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/wakeup_fd_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/workqueue_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/iomgr/workqueue_windows.c" role="src" />
+ <file baseinstalldir="/" name="src/core/json/json.c" role="src" />
+ <file baseinstalldir="/" name="src/core/json/json_reader.c" role="src" />
+ <file baseinstalldir="/" name="src/core/json/json_string.c" role="src" />
+ <file baseinstalldir="/" name="src/core/json/json_writer.c" role="src" />
+ <file baseinstalldir="/" name="src/core/proto/grpc/lb/v0/load_balancer.pb.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/alarm.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/api_trace.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/byte_buffer.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/byte_buffer_reader.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/call.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/call_details.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/call_log_batch.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/channel.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/channel_connectivity.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/channel_create.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/channel_ping.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/completion_queue.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/event_string.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/init.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/lame_client.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/metadata_array.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/server.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/server_chttp2.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/server_create.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/validate_metadata.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/version.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/byte_stream.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/alpn.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/bin_encoder.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/frame_data.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/frame_goaway.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/frame_ping.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/frame_rst_stream.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/frame_settings.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/frame_window_update.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/hpack_encoder.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/hpack_parser.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/hpack_table.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/huffsyms.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/incoming_metadata.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/parsing.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/status_conversion.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/stream_lists.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/stream_map.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/timeout_encoding.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/varint.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2/writing.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/chttp2_transport.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/connectivity_state.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/metadata.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/metadata_batch.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/static_metadata.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/transport.c" role="src" />
+ <file baseinstalldir="/" name="src/core/transport/transport_op_string.c" role="src" />
+ <file baseinstalldir="/" name="src/core/httpcli/httpcli_security_connector.c" role="src" />
+ <file baseinstalldir="/" name="src/core/security/base64.c" role="src" />
+ <file baseinstalldir="/" name="src/core/security/client_auth_filter.c" role="src" />
+ <file baseinstalldir="/" name="src/core/security/credentials.c" role="src" />
+ <file baseinstalldir="/" name="src/core/security/credentials_metadata.c" role="src" />
+ <file baseinstalldir="/" name="src/core/security/credentials_posix.c" role="src" />
+ <file baseinstalldir="/" name="src/core/security/credentials_win32.c" role="src" />
+ <file baseinstalldir="/" name="src/core/security/google_default_credentials.c" role="src" />
+ <file baseinstalldir="/" name="src/core/security/handshake.c" role="src" />
+ <file baseinstalldir="/" name="src/core/security/json_token.c" role="src" />
+ <file baseinstalldir="/" name="src/core/security/jwt_verifier.c" role="src" />
+ <file baseinstalldir="/" name="src/core/security/secure_endpoint.c" role="src" />
+ <file baseinstalldir="/" name="src/core/security/security_connector.c" role="src" />
+ <file baseinstalldir="/" name="src/core/security/security_context.c" role="src" />
+ <file baseinstalldir="/" name="src/core/security/server_auth_filter.c" role="src" />
+ <file baseinstalldir="/" name="src/core/security/server_secure_chttp2.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/init_secure.c" role="src" />
+ <file baseinstalldir="/" name="src/core/surface/secure_channel_create.c" role="src" />
+ <file baseinstalldir="/" name="src/core/tsi/fake_transport_security.c" role="src" />
+ <file baseinstalldir="/" name="src/core/tsi/ssl_transport_security.c" role="src" />
+ <file baseinstalldir="/" name="src/core/tsi/transport_security.c" role="src" />
+ <file baseinstalldir="/" name="src/core/census/context.c" role="src" />
+ <file baseinstalldir="/" name="src/core/census/initialize.c" role="src" />
+ <file baseinstalldir="/" name="src/core/census/mlog.c" role="src" />
+ <file baseinstalldir="/" name="src/core/census/operation.c" role="src" />
+ <file baseinstalldir="/" name="src/core/census/placeholders.c" role="src" />
+ <file baseinstalldir="/" name="src/core/census/tracing.c" role="src" />
+ <file baseinstalldir="/" name="third_party/nanopb/pb_common.c" role="src" />
+ <file baseinstalldir="/" name="third_party/nanopb/pb_decode.c" role="src" />
+ <file baseinstalldir="/" name="third_party/nanopb/pb_encode.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/aes/internal.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/asn1_locl.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bio/internal.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/internal.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/rsaz_exp.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bytestring/internal.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/cipher/internal.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/conf/conf_def.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/conf/internal.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/des/internal.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/dh/internal.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/digest/internal.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/digest/md32_common.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/directory.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/dsa/internal.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/ec/internal.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/ec/p256-x86_64-table.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/internal.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/internal.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/modes/internal.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/obj/obj_dat.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/obj/obj_xref.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/pkcs8/internal.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/rand/internal.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/rsa/internal.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/test/scoped_types.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/test/test_util.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/charmap.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/vpm_int.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/ext_dat.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/pcy_int.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/aead.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/aes.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/arm_arch.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/asn1.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/asn1_mac.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/asn1t.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/base.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/base64.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/bio.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/blowfish.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/bn.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/buf.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/buffer.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/bytestring.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/cast.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/chacha.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/cipher.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/cmac.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/conf.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/cpu.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/crypto.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/curve25519.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/des.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/dh.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/digest.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/dsa.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/dtls1.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/ec.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/ec_key.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/ecdh.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/ecdsa.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/engine.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/err.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/evp.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/ex_data.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/hkdf.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/hmac.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/lhash.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/lhash_macros.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/md4.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/md5.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/mem.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/obj.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/obj_mac.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/objects.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/opensslfeatures.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/opensslv.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/ossl_typ.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/pem.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/pkcs12.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/pkcs7.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/pkcs8.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/poly1305.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/pqueue.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/rand.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/rc4.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/rsa.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/safestack.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/sha.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/srtp.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/ssl.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/ssl3.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/stack.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/stack_macros.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/thread.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/time_support.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/tls1.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/type_check.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/x509.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/x509_vfy.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/include/openssl/x509v3.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/internal.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/test/async_bio.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/test/packeted_bio.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/test/scoped_types.h" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/test/test_config.h" role="src" />
+ <file baseinstalldir="/" name="src/boringssl/err_data.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/aes/aes.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/aes/mode_wrappers.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_bitstr.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_bool.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_bytes.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_d2i_fp.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_dup.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_enum.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_gentm.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_i2d_fp.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_int.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_mbstr.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_object.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_octet.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_print.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_strnid.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_time.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_type.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_utctm.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/a_utf8.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/asn1_lib.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/asn1_par.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/asn_pack.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/bio_asn1.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/bio_ndef.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/f_enum.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/f_int.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/f_string.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/t_bitst.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/t_pkey.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/tasn_dec.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/tasn_enc.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/tasn_fre.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/tasn_new.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/tasn_prn.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/tasn_typ.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/tasn_utl.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/x_bignum.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/asn1/x_long.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/base64/base64.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bio/bio.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bio/bio_mem.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bio/buffer.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bio/connect.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bio/fd.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bio/file.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bio/hexdump.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bio/pair.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bio/printf.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bio/socket.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bio/socket_helper.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/add.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/asm/x86_64-gcc.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/bn.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/bn_asn1.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/cmp.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/convert.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/ctx.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/div.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/exponentiation.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/gcd.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/generic.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/kronecker.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/montgomery.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/mul.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/prime.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/random.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/rsaz_exp.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/shift.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bn/sqrt.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/buf/buf.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bytestring/ber.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bytestring/cbb.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/bytestring/cbs.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/chacha/chacha_generic.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/chacha/chacha_vec.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/cipher/aead.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/cipher/cipher.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/cipher/derive_key.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/cipher/e_aes.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/cipher/e_chacha20poly1305.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/cipher/e_des.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/cipher/e_null.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/cipher/e_rc2.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/cipher/e_rc4.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/cipher/e_ssl3.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/cipher/e_tls.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/cipher/tls_cbc.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/cmac/cmac.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/conf/conf.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/cpu-arm.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/cpu-intel.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/crypto.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/curve25519/curve25519.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/des/des.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/dh/check.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/dh/dh.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/dh/dh_asn1.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/dh/params.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/digest/digest.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/digest/digests.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/directory_posix.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/directory_win.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/dsa/dsa.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/dsa/dsa_asn1.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/ec/ec.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/ec/ec_asn1.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/ec/ec_key.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/ec/ec_montgomery.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/ec/oct.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/ec/p224-64.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/ec/p256-64.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/ec/p256-x86_64.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/ec/simple.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/ec/util-64.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/ec/wnaf.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/ecdh/ecdh.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/ecdsa/ecdsa.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/engine/engine.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/err/err.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/algorithm.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/digestsign.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/evp.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/evp_asn1.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/evp_ctx.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/p_dsa_asn1.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/p_ec.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/p_ec_asn1.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/p_rsa.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/p_rsa_asn1.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/pbkdf.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/evp/sign.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/ex_data.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/hkdf/hkdf.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/hmac/hmac.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/lhash/lhash.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/md4/md4.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/md5/md5.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/mem.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/modes/cbc.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/modes/cfb.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/modes/ctr.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/modes/gcm.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/modes/ofb.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/obj/obj.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/obj/obj_xref.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/pem/pem_all.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/pem/pem_info.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/pem/pem_lib.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/pem/pem_oth.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/pem/pem_pk8.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/pem/pem_pkey.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/pem/pem_x509.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/pem/pem_xaux.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/pkcs8/p5_pbe.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/pkcs8/p5_pbev2.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/pkcs8/p8_pkey.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/pkcs8/pkcs8.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/poly1305/poly1305.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/poly1305/poly1305_arm.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/poly1305/poly1305_vec.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/rand/rand.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/rand/urandom.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/rand/windows.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/rc4/rc4.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/refcount_c11.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/refcount_lock.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/rsa/blinding.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/rsa/padding.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/rsa/rsa.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/rsa/rsa_asn1.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/rsa/rsa_impl.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/sha/sha1.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/sha/sha256.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/sha/sha512.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/stack/stack.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/thread.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/thread_none.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/thread_pthread.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/thread_win.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/time_support.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/a_digest.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/a_sign.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/a_strex.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/a_verify.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/asn1_gen.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/by_dir.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/by_file.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/i2d_pr.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/pkcs7.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/t_crl.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/t_req.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/t_x509.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/t_x509a.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x509.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x509_att.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x509_cmp.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x509_d2.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x509_def.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x509_ext.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x509_lu.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x509_obj.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x509_r2x.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x509_req.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x509_set.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x509_trs.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x509_txt.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x509_v3.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x509_vfy.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x509_vpm.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x509cset.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x509name.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x509rset.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x509spki.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x509type.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x_algor.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x_all.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x_attrib.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x_crl.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x_exten.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x_info.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x_name.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x_pkey.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x_pubkey.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x_req.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x_sig.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x_spki.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x_val.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x_x509.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509/x_x509a.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/pcy_cache.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/pcy_data.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/pcy_lib.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/pcy_map.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/pcy_node.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/pcy_tree.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_akey.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_akeya.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_alt.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_bcons.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_bitst.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_conf.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_cpols.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_crld.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_enum.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_extku.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_genn.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_ia5.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_info.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_int.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_lib.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_ncons.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_pci.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_pcia.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_pcons.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_pku.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_pmaps.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_prn.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_purp.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_skey.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_sxnet.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/crypto/x509v3/v3_utl.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/custom_extensions.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/d1_both.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/d1_clnt.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/d1_lib.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/d1_meth.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/d1_pkt.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/d1_srtp.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/d1_srvr.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/dtls_record.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/pqueue/pqueue.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/s3_both.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/s3_clnt.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/s3_enc.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/s3_lib.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/s3_meth.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/s3_pkt.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/s3_srvr.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/ssl_aead_ctx.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/ssl_asn1.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/ssl_buffer.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/ssl_cert.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/ssl_cipher.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/ssl_file.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/ssl_lib.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/ssl_rsa.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/ssl_session.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/ssl_stat.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/t1_enc.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/t1_lib.c" role="src" />
+ <file baseinstalldir="/" name="third_party/boringssl/ssl/tls_record.c" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/crc32.h" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/deflate.h" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/gzguts.h" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/inffast.h" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/inffixed.h" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/inflate.h" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/inftrees.h" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/trees.h" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/zconf.h" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/zlib.h" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/zutil.h" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/adler32.c" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/compress.c" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/crc32.c" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/deflate.c" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/gzclose.c" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/gzlib.c" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/gzread.c" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/gzwrite.c" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/infback.c" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/inffast.c" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/inflate.c" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/inftrees.c" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/trees.c" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/uncompr.c" role="src" />
+ <file baseinstalldir="/" name="third_party/zlib/zutil.c" role="src" />
+ </dir>
+ </contents>
+ <dependencies>
+ <required>
+ <php>
+ <min>5.5.0</min>
+ </php>
+ <pearinstaller>
+ <min>1.4.0</min>
+ </pearinstaller>
+ </required>
+ </dependencies>
+ <providesextension>grpc</providesextension>
+ <extsrcrelease />
+ <changelog>
+ <release>
+ <version>
+ <release>0.5.0</release>
+ <api>0.5.0</api>
+ </version>
+ <stability>
+ <release>alpha</release>
+ <api>alpha</api>
+ </stability>
+ <date>2015-06-16</date>
+ <license>BSD</license>
+ <notes>
+First alpha release
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>0.5.1</release>
+ <api>0.5.1</api>
+ </version>
+ <stability>
+ <release>alpha</release>
+ <api>alpha</api>
+ </stability>
+ <date>2015-07-09</date>
+ <license>BSD</license>
+ <notes>
+Update to wrap gRPC C Core version 0.10.0
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>0.6.0</release>
+ <api>0.6.0</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <date>2015-09-24</date>
+ <license>BSD</license>
+ <notes>
+- support per message compression disable
+- expose per-call host override option
+- expose connectivity API
+- expose channel target and call peer
+- add user-agent
+- update to wrap gRPC C core library beta version 0.11.0
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>0.6.1</release>
+ <api>0.6.0</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <date>2015-10-21</date>
+ <license>BSD</license>
+ <notes>
+- fixed undefined constant fatal error when run with apache/nginx #2275
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>0.7.0</release>
+ <api>0.7.0</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <date>2016-01-13</date>
+ <license>BSD</license>
+ <notes>
+- Breaking change to Credentials class (removed) #3765
+- Replaced by ChannelCredentials and CallCredentials class #3765
+- New plugin based metadata auth API #4394
+- Explicit ChannelCredentials::createInsecure() call
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>0.8.0</release>
+ <api>0.8.0</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <date>2016-02-23</date>
+ <license>BSD</license>
+ <notes>
+- Simplify gRPC PHP installation #4517
+ </notes>
+ </release>
+ </changelog>
+</package>
diff --git a/src/core/client_config/lb_policies/load_balancer_api.c b/src/core/client_config/lb_policies/load_balancer_api.c
new file mode 100644
index 0000000000..a6b5785fe4
--- /dev/null
+++ b/src/core/client_config/lb_policies/load_balancer_api.c
@@ -0,0 +1,163 @@
+/*
+ *
+ * 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 "src/core/client_config/lb_policies/load_balancer_api.h"
+#include "third_party/nanopb/pb_decode.h"
+#include "third_party/nanopb/pb_encode.h"
+
+#include <grpc/support/alloc.h>
+
+typedef struct decode_serverlist_arg {
+ int first_pass;
+ int i;
+ size_t num_servers;
+ grpc_grpclb_server **servers;
+} decode_serverlist_arg;
+
+/* invoked once for every Server in ServerList */
+static bool decode_serverlist(pb_istream_t *stream, const pb_field_t *field,
+ void **arg) {
+ decode_serverlist_arg *dec_arg = *arg;
+ if (dec_arg->first_pass != 0) { /* first pass */
+ grpc_grpclb_server server;
+ if (!pb_decode(stream, grpc_lb_v0_Server_fields, &server)) {
+ return false;
+ }
+ dec_arg->num_servers++;
+ } else { /* second pass */
+ grpc_grpclb_server *server = gpr_malloc(sizeof(grpc_grpclb_server));
+ GPR_ASSERT(dec_arg->num_servers > 0);
+ if (dec_arg->i == 0) { /* first iteration of second pass */
+ dec_arg->servers =
+ gpr_malloc(sizeof(grpc_grpclb_server *) * dec_arg->num_servers);
+ }
+ if (!pb_decode(stream, grpc_lb_v0_Server_fields, server)) {
+ return false;
+ }
+ dec_arg->servers[dec_arg->i++] = server;
+ }
+
+ return true;
+}
+
+grpc_grpclb_request *grpc_grpclb_request_create(const char *lb_service_name) {
+ grpc_grpclb_request *req = gpr_malloc(sizeof(grpc_grpclb_request));
+
+ req->has_client_stats = 0; /* TODO(dgq): add support for stats once defined */
+ req->has_initial_request = 1;
+ req->initial_request.has_name = 1;
+ strncpy(req->initial_request.name, lb_service_name,
+ GRPC_GRPCLB_SERVICE_NAME_MAX_LENGTH);
+ return req;
+}
+
+gpr_slice grpc_grpclb_request_encode(const grpc_grpclb_request *request) {
+ size_t encoded_length;
+ pb_ostream_t sizestream;
+ pb_ostream_t outputstream;
+ gpr_slice slice;
+ memset(&sizestream, 0, sizeof(pb_ostream_t));
+ pb_encode(&sizestream, grpc_lb_v0_LoadBalanceRequest_fields, request);
+ encoded_length = sizestream.bytes_written;
+
+ slice = gpr_slice_malloc(encoded_length);
+ outputstream =
+ pb_ostream_from_buffer(GPR_SLICE_START_PTR(slice), encoded_length);
+ GPR_ASSERT(pb_encode(&outputstream, grpc_lb_v0_LoadBalanceRequest_fields,
+ request) != 0);
+ return slice;
+}
+
+void grpc_grpclb_request_destroy(grpc_grpclb_request *request) {
+ gpr_free(request);
+}
+
+grpc_grpclb_response *grpc_grpclb_response_parse(gpr_slice encoded_response) {
+ bool status;
+ pb_istream_t stream =
+ pb_istream_from_buffer(GPR_SLICE_START_PTR(encoded_response),
+ GPR_SLICE_LENGTH(encoded_response));
+ grpc_grpclb_response *res = gpr_malloc(sizeof(grpc_grpclb_response));
+ memset(res, 0, sizeof(*res));
+ status = pb_decode(&stream, grpc_lb_v0_LoadBalanceResponse_fields, res);
+ GPR_ASSERT(status == true);
+ return res;
+}
+
+grpc_grpclb_serverlist *grpc_grpclb_response_parse_serverlist(
+ gpr_slice encoded_response) {
+ grpc_grpclb_serverlist *sl = gpr_malloc(sizeof(grpc_grpclb_serverlist));
+ bool status;
+ decode_serverlist_arg arg;
+ pb_istream_t stream =
+ pb_istream_from_buffer(GPR_SLICE_START_PTR(encoded_response),
+ GPR_SLICE_LENGTH(encoded_response));
+ pb_istream_t stream_at_start = stream;
+ grpc_grpclb_response *res = gpr_malloc(sizeof(grpc_grpclb_response));
+ memset(res, 0, sizeof(*res));
+ memset(&arg, 0, sizeof(decode_serverlist_arg));
+
+ res->server_list.servers.funcs.decode = decode_serverlist;
+ res->server_list.servers.arg = &arg;
+ arg.first_pass = 1;
+ status = pb_decode(&stream, grpc_lb_v0_LoadBalanceResponse_fields, res);
+ GPR_ASSERT(status == true);
+ GPR_ASSERT(arg.num_servers > 0);
+
+ arg.first_pass = 0;
+ status =
+ pb_decode(&stream_at_start, grpc_lb_v0_LoadBalanceResponse_fields, res);
+ GPR_ASSERT(status == true);
+ GPR_ASSERT(arg.servers != NULL);
+
+ sl->num_servers = arg.num_servers;
+ sl->servers = arg.servers;
+ if (res->server_list.has_expiration_interval) {
+ sl->expiration_interval = res->server_list.expiration_interval;
+ }
+ grpc_grpclb_response_destroy(res);
+ return sl;
+}
+
+void grpc_grpclb_destroy_serverlist(grpc_grpclb_serverlist *serverlist) {
+ size_t i;
+ for (i = 0; i < serverlist->num_servers; i++) {
+ gpr_free(serverlist->servers[i]);
+ }
+ gpr_free(serverlist->servers);
+ gpr_free(serverlist);
+}
+
+void grpc_grpclb_response_destroy(grpc_grpclb_response *response) {
+ gpr_free(response);
+}
diff --git a/src/core/client_config/lb_policies/load_balancer_api.h b/src/core/client_config/lb_policies/load_balancer_api.h
new file mode 100644
index 0000000000..4dbe1d6c22
--- /dev/null
+++ b/src/core/client_config/lb_policies/load_balancer_api.h
@@ -0,0 +1,85 @@
+/*
+ *
+ * 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.
+ *
+ */
+
+#ifndef GRPC_INTERNAL_CORE_CLIENT_CONFIG_LB_POLICIES_LOAD_BALANCER_API_H
+#define GRPC_INTERNAL_CORE_CLIENT_CONFIG_LB_POLICIES_LOAD_BALANCER_API_H
+
+#include <grpc/support/slice_buffer.h>
+
+#include "src/core/client_config/lb_policy_factory.h"
+#include "src/core/proto/grpc/lb/v0/load_balancer.pb.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define GRPC_GRPCLB_SERVICE_NAME_MAX_LENGTH 128
+
+typedef grpc_lb_v0_LoadBalanceRequest grpc_grpclb_request;
+typedef grpc_lb_v0_LoadBalanceResponse grpc_grpclb_response;
+typedef grpc_lb_v0_Server grpc_grpclb_server;
+typedef grpc_lb_v0_Duration grpc_grpclb_duration;
+typedef struct grpc_grpclb_serverlist {
+ grpc_grpclb_server **servers;
+ size_t num_servers;
+ grpc_grpclb_duration expiration_interval;
+} grpc_grpclb_serverlist;
+
+/** Create a request for a gRPC LB service under \a lb_service_name */
+grpc_grpclb_request *grpc_grpclb_request_create(const char *lb_service_name);
+
+/** Protocol Buffers v3-encode \a request */
+gpr_slice grpc_grpclb_request_encode(const grpc_grpclb_request *request);
+
+/** Destroy \a request */
+void grpc_grpclb_request_destroy(grpc_grpclb_request *request);
+
+/** Parse (ie, decode) the bytes in \a encoded_response as a \a
+ * grpc_grpclb_response */
+grpc_grpclb_response *grpc_grpclb_response_parse(gpr_slice encoded_response);
+
+/** Destroy \a serverlist */
+void grpc_grpclb_destroy_serverlist(grpc_grpclb_serverlist *serverlist);
+
+/** Parse the list of servers from an encoded \a grpc_grpclb_response */
+grpc_grpclb_serverlist *grpc_grpclb_response_parse_serverlist(
+ gpr_slice encoded_response);
+
+/** Destroy \a response */
+void grpc_grpclb_response_destroy(grpc_grpclb_response *response);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* GRPC_INTERNAL_CORE_CLIENT_CONFIG_LB_POLICIES_LOAD_BALANCER_API_H */
diff --git a/src/core/proto/grpc/lb/v0/load_balancer.pb.c b/src/core/proto/grpc/lb/v0/load_balancer.pb.c
new file mode 100644
index 0000000000..59aae30cff
--- /dev/null
+++ b/src/core/proto/grpc/lb/v0/load_balancer.pb.c
@@ -0,0 +1,119 @@
+/*
+ *
+ * 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.
+ *
+ */
+/* Automatically generated nanopb constant definitions */
+/* Generated by nanopb-0.3.5-dev */
+
+#include "src/core/proto/grpc/lb/v0/load_balancer.pb.h"
+
+#if PB_PROTO_HEADER_VERSION != 30
+#error Regenerate this file with the current version of nanopb generator.
+#endif
+
+
+
+const pb_field_t grpc_lb_v0_Duration_fields[3] = {
+ PB_FIELD( 1, INT64 , OPTIONAL, STATIC , FIRST, grpc_lb_v0_Duration, seconds, seconds, 0),
+ PB_FIELD( 2, INT32 , OPTIONAL, STATIC , OTHER, grpc_lb_v0_Duration, nanos, seconds, 0),
+ PB_LAST_FIELD
+};
+
+const pb_field_t grpc_lb_v0_LoadBalanceRequest_fields[3] = {
+ PB_FIELD( 1, MESSAGE , OPTIONAL, STATIC , FIRST, grpc_lb_v0_LoadBalanceRequest, initial_request, initial_request, &grpc_lb_v0_InitialLoadBalanceRequest_fields),
+ PB_FIELD( 2, MESSAGE , OPTIONAL, STATIC , OTHER, grpc_lb_v0_LoadBalanceRequest, client_stats, initial_request, &grpc_lb_v0_ClientStats_fields),
+ PB_LAST_FIELD
+};
+
+const pb_field_t grpc_lb_v0_InitialLoadBalanceRequest_fields[2] = {
+ PB_FIELD( 1, STRING , OPTIONAL, STATIC , FIRST, grpc_lb_v0_InitialLoadBalanceRequest, name, name, 0),
+ PB_LAST_FIELD
+};
+
+const pb_field_t grpc_lb_v0_ClientStats_fields[4] = {
+ PB_FIELD( 1, INT64 , OPTIONAL, STATIC , FIRST, grpc_lb_v0_ClientStats, total_requests, total_requests, 0),
+ PB_FIELD( 2, INT64 , OPTIONAL, STATIC , OTHER, grpc_lb_v0_ClientStats, client_rpc_errors, total_requests, 0),
+ PB_FIELD( 3, INT64 , OPTIONAL, STATIC , OTHER, grpc_lb_v0_ClientStats, dropped_requests, client_rpc_errors, 0),
+ PB_LAST_FIELD
+};
+
+const pb_field_t grpc_lb_v0_LoadBalanceResponse_fields[3] = {
+ PB_FIELD( 1, MESSAGE , OPTIONAL, STATIC , FIRST, grpc_lb_v0_LoadBalanceResponse, initial_response, initial_response, &grpc_lb_v0_InitialLoadBalanceResponse_fields),
+ PB_FIELD( 2, MESSAGE , OPTIONAL, STATIC , OTHER, grpc_lb_v0_LoadBalanceResponse, server_list, initial_response, &grpc_lb_v0_ServerList_fields),
+ PB_LAST_FIELD
+};
+
+const pb_field_t grpc_lb_v0_InitialLoadBalanceResponse_fields[4] = {
+ PB_FIELD( 1, STRING , OPTIONAL, STATIC , FIRST, grpc_lb_v0_InitialLoadBalanceResponse, client_config, client_config, 0),
+ PB_FIELD( 2, STRING , OPTIONAL, STATIC , OTHER, grpc_lb_v0_InitialLoadBalanceResponse, load_balancer_delegate, client_config, 0),
+ PB_FIELD( 3, MESSAGE , OPTIONAL, STATIC , OTHER, grpc_lb_v0_InitialLoadBalanceResponse, client_stats_report_interval, load_balancer_delegate, &grpc_lb_v0_Duration_fields),
+ PB_LAST_FIELD
+};
+
+const pb_field_t grpc_lb_v0_ServerList_fields[3] = {
+ PB_FIELD( 1, MESSAGE , REPEATED, CALLBACK, FIRST, grpc_lb_v0_ServerList, servers, servers, &grpc_lb_v0_Server_fields),
+ PB_FIELD( 3, MESSAGE , OPTIONAL, STATIC , OTHER, grpc_lb_v0_ServerList, expiration_interval, servers, &grpc_lb_v0_Duration_fields),
+ PB_LAST_FIELD
+};
+
+const pb_field_t grpc_lb_v0_Server_fields[5] = {
+ PB_FIELD( 1, STRING , OPTIONAL, STATIC , FIRST, grpc_lb_v0_Server, ip_address, ip_address, 0),
+ PB_FIELD( 2, INT32 , OPTIONAL, STATIC , OTHER, grpc_lb_v0_Server, port, ip_address, 0),
+ PB_FIELD( 3, BYTES , OPTIONAL, STATIC , OTHER, grpc_lb_v0_Server, load_balance_token, port, 0),
+ PB_FIELD( 4, BOOL , OPTIONAL, STATIC , OTHER, grpc_lb_v0_Server, drop_request, load_balance_token, 0),
+ PB_LAST_FIELD
+};
+
+
+/* Check that field information fits in pb_field_t */
+#if !defined(PB_FIELD_32BIT)
+/* If you get an error here, it means that you need to define PB_FIELD_32BIT
+ * compile-time option. You can do that in pb.h or on compiler command line.
+ *
+ * The reason you need to do this is that some of your messages contain tag
+ * numbers or field sizes that are larger than what can fit in 8 or 16 bit
+ * field descriptors.
+ */
+PB_STATIC_ASSERT((pb_membersize(grpc_lb_v0_LoadBalanceRequest, initial_request) < 65536 && pb_membersize(grpc_lb_v0_LoadBalanceRequest, client_stats) < 65536 && pb_membersize(grpc_lb_v0_LoadBalanceResponse, initial_response) < 65536 && pb_membersize(grpc_lb_v0_LoadBalanceResponse, server_list) < 65536 && pb_membersize(grpc_lb_v0_InitialLoadBalanceResponse, client_stats_report_interval) < 65536 && pb_membersize(grpc_lb_v0_ServerList, servers) < 65536 && pb_membersize(grpc_lb_v0_ServerList, expiration_interval) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_grpc_lb_v0_Duration_grpc_lb_v0_LoadBalanceRequest_grpc_lb_v0_InitialLoadBalanceRequest_grpc_lb_v0_ClientStats_grpc_lb_v0_LoadBalanceResponse_grpc_lb_v0_InitialLoadBalanceResponse_grpc_lb_v0_ServerList_grpc_lb_v0_Server)
+#endif
+
+#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT)
+/* If you get an error here, it means that you need to define PB_FIELD_16BIT
+ * compile-time option. You can do that in pb.h or on compiler command line.
+ *
+ * The reason you need to do this is that some of your messages contain tag
+ * numbers or field sizes that are larger than what can fit in the default
+ * 8 bit descriptors.
+ */
+PB_STATIC_ASSERT((pb_membersize(grpc_lb_v0_LoadBalanceRequest, initial_request) < 256 && pb_membersize(grpc_lb_v0_LoadBalanceRequest, client_stats) < 256 && pb_membersize(grpc_lb_v0_LoadBalanceResponse, initial_response) < 256 && pb_membersize(grpc_lb_v0_LoadBalanceResponse, server_list) < 256 && pb_membersize(grpc_lb_v0_InitialLoadBalanceResponse, client_stats_report_interval) < 256 && pb_membersize(grpc_lb_v0_ServerList, servers) < 256 && pb_membersize(grpc_lb_v0_ServerList, expiration_interval) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_grpc_lb_v0_Duration_grpc_lb_v0_LoadBalanceRequest_grpc_lb_v0_InitialLoadBalanceRequest_grpc_lb_v0_ClientStats_grpc_lb_v0_LoadBalanceResponse_grpc_lb_v0_InitialLoadBalanceResponse_grpc_lb_v0_ServerList_grpc_lb_v0_Server)
+#endif
+
+
diff --git a/src/core/proto/grpc/lb/v0/load_balancer.pb.h b/src/core/proto/grpc/lb/v0/load_balancer.pb.h
new file mode 100644
index 0000000000..3599f881bb
--- /dev/null
+++ b/src/core/proto/grpc/lb/v0/load_balancer.pb.h
@@ -0,0 +1,182 @@
+/*
+ *
+ * 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.
+ *
+ */
+/* Automatically generated nanopb header */
+/* Generated by nanopb-0.3.5-dev */
+
+#ifndef PB_LOAD_BALANCER_PB_H_INCLUDED
+#define PB_LOAD_BALANCER_PB_H_INCLUDED
+#include "third_party/nanopb/pb.h"
+#if PB_PROTO_HEADER_VERSION != 30
+#error Regenerate this file with the current version of nanopb generator.
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Struct definitions */
+typedef struct _grpc_lb_v0_ClientStats {
+ bool has_total_requests;
+ int64_t total_requests;
+ bool has_client_rpc_errors;
+ int64_t client_rpc_errors;
+ bool has_dropped_requests;
+ int64_t dropped_requests;
+} grpc_lb_v0_ClientStats;
+
+typedef struct _grpc_lb_v0_Duration {
+ bool has_seconds;
+ int64_t seconds;
+ bool has_nanos;
+ int32_t nanos;
+} grpc_lb_v0_Duration;
+
+typedef struct _grpc_lb_v0_InitialLoadBalanceRequest {
+ bool has_name;
+ char name[128];
+} grpc_lb_v0_InitialLoadBalanceRequest;
+
+typedef PB_BYTES_ARRAY_T(64) grpc_lb_v0_Server_load_balance_token_t;
+typedef struct _grpc_lb_v0_Server {
+ bool has_ip_address;
+ char ip_address[46];
+ bool has_port;
+ int32_t port;
+ bool has_load_balance_token;
+ grpc_lb_v0_Server_load_balance_token_t load_balance_token;
+ bool has_drop_request;
+ bool drop_request;
+} grpc_lb_v0_Server;
+
+typedef struct _grpc_lb_v0_InitialLoadBalanceResponse {
+ bool has_client_config;
+ char client_config[64];
+ bool has_load_balancer_delegate;
+ char load_balancer_delegate[64];
+ bool has_client_stats_report_interval;
+ grpc_lb_v0_Duration client_stats_report_interval;
+} grpc_lb_v0_InitialLoadBalanceResponse;
+
+typedef struct _grpc_lb_v0_LoadBalanceRequest {
+ bool has_initial_request;
+ grpc_lb_v0_InitialLoadBalanceRequest initial_request;
+ bool has_client_stats;
+ grpc_lb_v0_ClientStats client_stats;
+} grpc_lb_v0_LoadBalanceRequest;
+
+typedef struct _grpc_lb_v0_ServerList {
+ pb_callback_t servers;
+ bool has_expiration_interval;
+ grpc_lb_v0_Duration expiration_interval;
+} grpc_lb_v0_ServerList;
+
+typedef struct _grpc_lb_v0_LoadBalanceResponse {
+ bool has_initial_response;
+ grpc_lb_v0_InitialLoadBalanceResponse initial_response;
+ bool has_server_list;
+ grpc_lb_v0_ServerList server_list;
+} grpc_lb_v0_LoadBalanceResponse;
+
+/* Default values for struct fields */
+
+/* Initializer values for message structs */
+#define grpc_lb_v0_Duration_init_default {false, 0, false, 0}
+#define grpc_lb_v0_LoadBalanceRequest_init_default {false, grpc_lb_v0_InitialLoadBalanceRequest_init_default, false, grpc_lb_v0_ClientStats_init_default}
+#define grpc_lb_v0_InitialLoadBalanceRequest_init_default {false, ""}
+#define grpc_lb_v0_ClientStats_init_default {false, 0, false, 0, false, 0}
+#define grpc_lb_v0_LoadBalanceResponse_init_default {false, grpc_lb_v0_InitialLoadBalanceResponse_init_default, false, grpc_lb_v0_ServerList_init_default}
+#define grpc_lb_v0_InitialLoadBalanceResponse_init_default {false, "", false, "", false, grpc_lb_v0_Duration_init_default}
+#define grpc_lb_v0_ServerList_init_default {{{NULL}, NULL}, false, grpc_lb_v0_Duration_init_default}
+#define grpc_lb_v0_Server_init_default {false, "", false, 0, false, {0, {0}}, false, 0}
+#define grpc_lb_v0_Duration_init_zero {false, 0, false, 0}
+#define grpc_lb_v0_LoadBalanceRequest_init_zero {false, grpc_lb_v0_InitialLoadBalanceRequest_init_zero, false, grpc_lb_v0_ClientStats_init_zero}
+#define grpc_lb_v0_InitialLoadBalanceRequest_init_zero {false, ""}
+#define grpc_lb_v0_ClientStats_init_zero {false, 0, false, 0, false, 0}
+#define grpc_lb_v0_LoadBalanceResponse_init_zero {false, grpc_lb_v0_InitialLoadBalanceResponse_init_zero, false, grpc_lb_v0_ServerList_init_zero}
+#define grpc_lb_v0_InitialLoadBalanceResponse_init_zero {false, "", false, "", false, grpc_lb_v0_Duration_init_zero}
+#define grpc_lb_v0_ServerList_init_zero {{{NULL}, NULL}, false, grpc_lb_v0_Duration_init_zero}
+#define grpc_lb_v0_Server_init_zero {false, "", false, 0, false, {0, {0}}, false, 0}
+
+/* Field tags (for use in manual encoding/decoding) */
+#define grpc_lb_v0_ClientStats_total_requests_tag 1
+#define grpc_lb_v0_ClientStats_client_rpc_errors_tag 2
+#define grpc_lb_v0_ClientStats_dropped_requests_tag 3
+#define grpc_lb_v0_Duration_seconds_tag 1
+#define grpc_lb_v0_Duration_nanos_tag 2
+#define grpc_lb_v0_InitialLoadBalanceRequest_name_tag 1
+#define grpc_lb_v0_Server_ip_address_tag 1
+#define grpc_lb_v0_Server_port_tag 2
+#define grpc_lb_v0_Server_load_balance_token_tag 3
+#define grpc_lb_v0_Server_drop_request_tag 4
+#define grpc_lb_v0_InitialLoadBalanceResponse_client_config_tag 1
+#define grpc_lb_v0_InitialLoadBalanceResponse_load_balancer_delegate_tag 2
+#define grpc_lb_v0_InitialLoadBalanceResponse_client_stats_report_interval_tag 3
+#define grpc_lb_v0_LoadBalanceRequest_initial_request_tag 1
+#define grpc_lb_v0_LoadBalanceRequest_client_stats_tag 2
+#define grpc_lb_v0_ServerList_servers_tag 1
+#define grpc_lb_v0_ServerList_expiration_interval_tag 3
+#define grpc_lb_v0_LoadBalanceResponse_initial_response_tag 1
+#define grpc_lb_v0_LoadBalanceResponse_server_list_tag 2
+
+/* Struct field encoding specification for nanopb */
+extern const pb_field_t grpc_lb_v0_Duration_fields[3];
+extern const pb_field_t grpc_lb_v0_LoadBalanceRequest_fields[3];
+extern const pb_field_t grpc_lb_v0_InitialLoadBalanceRequest_fields[2];
+extern const pb_field_t grpc_lb_v0_ClientStats_fields[4];
+extern const pb_field_t grpc_lb_v0_LoadBalanceResponse_fields[3];
+extern const pb_field_t grpc_lb_v0_InitialLoadBalanceResponse_fields[4];
+extern const pb_field_t grpc_lb_v0_ServerList_fields[3];
+extern const pb_field_t grpc_lb_v0_Server_fields[5];
+
+/* Maximum encoded size of messages (where known) */
+#define grpc_lb_v0_Duration_size 22
+#define grpc_lb_v0_LoadBalanceRequest_size 169
+#define grpc_lb_v0_InitialLoadBalanceRequest_size 131
+#define grpc_lb_v0_ClientStats_size 33
+#define grpc_lb_v0_LoadBalanceResponse_size (165 + grpc_lb_v0_ServerList_size)
+#define grpc_lb_v0_InitialLoadBalanceResponse_size 156
+#define grpc_lb_v0_Server_size 127
+
+/* Message IDs (where set with "msgid" option) */
+#ifdef PB_MSGID
+
+#define LOAD_BALANCER_MESSAGES \
+
+
+#endif
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif
diff --git a/src/csharp/Grpc.IntegrationTesting/Control.cs b/src/csharp/Grpc.IntegrationTesting/Control.cs
index b90243c2bd..291bc75397 100644
--- a/src/csharp/Grpc.IntegrationTesting/Control.cs
+++ b/src/csharp/Grpc.IntegrationTesting/Control.cs
@@ -38,7 +38,7 @@ namespace Grpc.Testing {
"LmdycGMudGVzdGluZy5EZXRlcm1pbmlzdGljUGFyYW1zSAASLAoGcGFyZXRv",
"GAUgASgLMhouZ3JwYy50ZXN0aW5nLlBhcmV0b1BhcmFtc0gAQgYKBGxvYWQi",
"QwoOU2VjdXJpdHlQYXJhbXMSEwoLdXNlX3Rlc3RfY2EYASABKAgSHAoUc2Vy",
- "dmVyX2hvc3Rfb3ZlcnJpZGUYAiABKAkirwMKDENsaWVudENvbmZpZxIWCg5z",
+ "dmVyX2hvc3Rfb3ZlcnJpZGUYAiABKAki1gMKDENsaWVudENvbmZpZxIWCg5z",
"ZXJ2ZXJfdGFyZ2V0cxgBIAMoCRItCgtjbGllbnRfdHlwZRgCIAEoDjIYLmdy",
"cGMudGVzdGluZy5DbGllbnRUeXBlEjUKD3NlY3VyaXR5X3BhcmFtcxgDIAEo",
"CzIcLmdycGMudGVzdGluZy5TZWN1cml0eVBhcmFtcxIkChxvdXRzdGFuZGlu",
@@ -48,24 +48,27 @@ namespace Grpc.Testing {
"GAogASgLMhguZ3JwYy50ZXN0aW5nLkxvYWRQYXJhbXMSMwoOcGF5bG9hZF9j",
"b25maWcYCyABKAsyGy5ncnBjLnRlc3RpbmcuUGF5bG9hZENvbmZpZxI3ChBo",
"aXN0b2dyYW1fcGFyYW1zGAwgASgLMh0uZ3JwYy50ZXN0aW5nLkhpc3RvZ3Jh",
- "bVBhcmFtcyI4CgxDbGllbnRTdGF0dXMSKAoFc3RhdHMYASABKAsyGS5ncnBj",
- "LnRlc3RpbmcuQ2xpZW50U3RhdHMiFQoETWFyaxINCgVyZXNldBgBIAEoCCJo",
- "CgpDbGllbnRBcmdzEisKBXNldHVwGAEgASgLMhouZ3JwYy50ZXN0aW5nLkNs",
- "aWVudENvbmZpZ0gAEiIKBG1hcmsYAiABKAsyEi5ncnBjLnRlc3RpbmcuTWFy",
- "a0gAQgkKB2FyZ3R5cGUi9wEKDFNlcnZlckNvbmZpZxItCgtzZXJ2ZXJfdHlw",
- "ZRgBIAEoDjIYLmdycGMudGVzdGluZy5TZXJ2ZXJUeXBlEjUKD3NlY3VyaXR5",
- "X3BhcmFtcxgCIAEoCzIcLmdycGMudGVzdGluZy5TZWN1cml0eVBhcmFtcxIM",
- "CgRob3N0GAMgASgJEgwKBHBvcnQYBCABKAUSHAoUYXN5bmNfc2VydmVyX3Ro",
- "cmVhZHMYByABKAUSEgoKY29yZV9saW1pdBgIIAEoBRIzCg5wYXlsb2FkX2Nv",
- "bmZpZxgJIAEoCzIbLmdycGMudGVzdGluZy5QYXlsb2FkQ29uZmlnImgKClNl",
- "cnZlckFyZ3MSKwoFc2V0dXAYASABKAsyGi5ncnBjLnRlc3RpbmcuU2VydmVy",
- "Q29uZmlnSAASIgoEbWFyaxgCIAEoCzISLmdycGMudGVzdGluZy5NYXJrSABC",
- "CQoHYXJndHlwZSJVCgxTZXJ2ZXJTdGF0dXMSKAoFc3RhdHMYASABKAsyGS5n",
- "cnBjLnRlc3RpbmcuU2VydmVyU3RhdHMSDAoEcG9ydBgCIAEoBRINCgVjb3Jl",
- "cxgDIAEoBSovCgpDbGllbnRUeXBlEg8KC1NZTkNfQ0xJRU5UEAASEAoMQVNZ",
- "TkNfQ0xJRU5UEAEqLwoKU2VydmVyVHlwZRIPCgtTWU5DX1NFUlZFUhAAEhAK",
- "DEFTWU5DX1NFUlZFUhABKiMKB1JwY1R5cGUSCQoFVU5BUlkQABINCglTVFJF",
- "QU1JTkcQAWIGcHJvdG8z"));
+ "bVBhcmFtcxIRCgljb3JlX2xpc3QYDSADKAUSEgoKY29yZV9saW1pdBgOIAEo",
+ "BSI4CgxDbGllbnRTdGF0dXMSKAoFc3RhdHMYASABKAsyGS5ncnBjLnRlc3Rp",
+ "bmcuQ2xpZW50U3RhdHMiFQoETWFyaxINCgVyZXNldBgBIAEoCCJoCgpDbGll",
+ "bnRBcmdzEisKBXNldHVwGAEgASgLMhouZ3JwYy50ZXN0aW5nLkNsaWVudENv",
+ "bmZpZ0gAEiIKBG1hcmsYAiABKAsyEi5ncnBjLnRlc3RpbmcuTWFya0gAQgkK",
+ "B2FyZ3R5cGUi/AEKDFNlcnZlckNvbmZpZxItCgtzZXJ2ZXJfdHlwZRgBIAEo",
+ "DjIYLmdycGMudGVzdGluZy5TZXJ2ZXJUeXBlEjUKD3NlY3VyaXR5X3BhcmFt",
+ "cxgCIAEoCzIcLmdycGMudGVzdGluZy5TZWN1cml0eVBhcmFtcxIMCgRwb3J0",
+ "GAQgASgFEhwKFGFzeW5jX3NlcnZlcl90aHJlYWRzGAcgASgFEhIKCmNvcmVf",
+ "bGltaXQYCCABKAUSMwoOcGF5bG9hZF9jb25maWcYCSABKAsyGy5ncnBjLnRl",
+ "c3RpbmcuUGF5bG9hZENvbmZpZxIRCgljb3JlX2xpc3QYCiADKAUiaAoKU2Vy",
+ "dmVyQXJncxIrCgVzZXR1cBgBIAEoCzIaLmdycGMudGVzdGluZy5TZXJ2ZXJD",
+ "b25maWdIABIiCgRtYXJrGAIgASgLMhIuZ3JwYy50ZXN0aW5nLk1hcmtIAEIJ",
+ "Cgdhcmd0eXBlIlUKDFNlcnZlclN0YXR1cxIoCgVzdGF0cxgBIAEoCzIZLmdy",
+ "cGMudGVzdGluZy5TZXJ2ZXJTdGF0cxIMCgRwb3J0GAIgASgFEg0KBWNvcmVz",
+ "GAMgASgFIg0KC0NvcmVSZXF1ZXN0Ih0KDENvcmVSZXNwb25zZRINCgVjb3Jl",
+ "cxgBIAEoBSIGCgRWb2lkKi8KCkNsaWVudFR5cGUSDwoLU1lOQ19DTElFTlQQ",
+ "ABIQCgxBU1lOQ19DTElFTlQQASpJCgpTZXJ2ZXJUeXBlEg8KC1NZTkNfU0VS",
+ "VkVSEAASEAoMQVNZTkNfU0VSVkVSEAESGAoUQVNZTkNfR0VORVJJQ19TRVJW",
+ "RVIQAiojCgdScGNUeXBlEgkKBVVOQVJZEAASDQoJU1RSRUFNSU5HEAFiBnBy",
+ "b3RvMw=="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Grpc.Testing.PayloadsReflection.Descriptor, global::Grpc.Testing.StatsReflection.Descriptor, },
new pbr::GeneratedCodeInfo(new[] {typeof(global::Grpc.Testing.ClientType), typeof(global::Grpc.Testing.ServerType), typeof(global::Grpc.Testing.RpcType), }, new pbr::GeneratedCodeInfo[] {
@@ -76,13 +79,16 @@ namespace Grpc.Testing {
new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.ClosedLoopParams), global::Grpc.Testing.ClosedLoopParams.Parser, null, null, null, null),
new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.LoadParams), global::Grpc.Testing.LoadParams.Parser, new[]{ "ClosedLoop", "Poisson", "Uniform", "Determ", "Pareto" }, new[]{ "Load" }, null, null),
new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.SecurityParams), global::Grpc.Testing.SecurityParams.Parser, new[]{ "UseTestCa", "ServerHostOverride" }, null, null, null),
- new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.ClientConfig), global::Grpc.Testing.ClientConfig.Parser, new[]{ "ServerTargets", "ClientType", "SecurityParams", "OutstandingRpcsPerChannel", "ClientChannels", "AsyncClientThreads", "RpcType", "LoadParams", "PayloadConfig", "HistogramParams" }, null, null, null),
+ new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.ClientConfig), global::Grpc.Testing.ClientConfig.Parser, new[]{ "ServerTargets", "ClientType", "SecurityParams", "OutstandingRpcsPerChannel", "ClientChannels", "AsyncClientThreads", "RpcType", "LoadParams", "PayloadConfig", "HistogramParams", "CoreList", "CoreLimit" }, null, null, null),
new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.ClientStatus), global::Grpc.Testing.ClientStatus.Parser, new[]{ "Stats" }, null, null, null),
new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.Mark), global::Grpc.Testing.Mark.Parser, new[]{ "Reset" }, null, null, null),
new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.ClientArgs), global::Grpc.Testing.ClientArgs.Parser, new[]{ "Setup", "Mark" }, new[]{ "Argtype" }, null, null),
- new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.ServerConfig), global::Grpc.Testing.ServerConfig.Parser, new[]{ "ServerType", "SecurityParams", "Host", "Port", "AsyncServerThreads", "CoreLimit", "PayloadConfig" }, null, null, null),
+ new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.ServerConfig), global::Grpc.Testing.ServerConfig.Parser, new[]{ "ServerType", "SecurityParams", "Port", "AsyncServerThreads", "CoreLimit", "PayloadConfig", "CoreList" }, null, null, null),
new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.ServerArgs), global::Grpc.Testing.ServerArgs.Parser, new[]{ "Setup", "Mark" }, new[]{ "Argtype" }, null, null),
- new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.ServerStatus), global::Grpc.Testing.ServerStatus.Parser, new[]{ "Stats", "Port", "Cores" }, null, null, null)
+ new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.ServerStatus), global::Grpc.Testing.ServerStatus.Parser, new[]{ "Stats", "Port", "Cores" }, null, null, null),
+ new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.CoreRequest), global::Grpc.Testing.CoreRequest.Parser, null, null, null, null),
+ new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.CoreResponse), global::Grpc.Testing.CoreResponse.Parser, new[]{ "Cores" }, null, null, null),
+ new pbr::GeneratedCodeInfo(typeof(global::Grpc.Testing.Void), global::Grpc.Testing.Void.Parser, null, null, null, null)
}));
}
#endregion
@@ -97,6 +103,7 @@ namespace Grpc.Testing {
public enum ServerType {
SYNC_SERVER = 0,
ASYNC_SERVER = 1,
+ ASYNC_GENERIC_SERVER = 2,
}
public enum RpcType {
@@ -1097,6 +1104,8 @@ namespace Grpc.Testing {
LoadParams = other.loadParams_ != null ? other.LoadParams.Clone() : null;
PayloadConfig = other.payloadConfig_ != null ? other.PayloadConfig.Clone() : null;
HistogramParams = other.histogramParams_ != null ? other.HistogramParams.Clone() : null;
+ coreList_ = other.coreList_.Clone();
+ coreLimit_ = other.coreLimit_;
}
public ClientConfig Clone() {
@@ -1219,6 +1228,28 @@ namespace Grpc.Testing {
}
}
+ /// <summary>Field number for the "core_list" field.</summary>
+ public const int CoreListFieldNumber = 13;
+ private static readonly pb::FieldCodec<int> _repeated_coreList_codec
+ = pb::FieldCodec.ForInt32(106);
+ private readonly pbc::RepeatedField<int> coreList_ = new pbc::RepeatedField<int>();
+ /// <summary>
+ /// Specify the cores we should run the client on, if desired
+ /// </summary>
+ public pbc::RepeatedField<int> CoreList {
+ get { return coreList_; }
+ }
+
+ /// <summary>Field number for the "core_limit" field.</summary>
+ public const int CoreLimitFieldNumber = 14;
+ private int coreLimit_;
+ public int CoreLimit {
+ get { return coreLimit_; }
+ set {
+ coreLimit_ = value;
+ }
+ }
+
public override bool Equals(object other) {
return Equals(other as ClientConfig);
}
@@ -1240,6 +1271,8 @@ namespace Grpc.Testing {
if (!object.Equals(LoadParams, other.LoadParams)) return false;
if (!object.Equals(PayloadConfig, other.PayloadConfig)) return false;
if (!object.Equals(HistogramParams, other.HistogramParams)) return false;
+ if(!coreList_.Equals(other.coreList_)) return false;
+ if (CoreLimit != other.CoreLimit) return false;
return true;
}
@@ -1255,6 +1288,8 @@ namespace Grpc.Testing {
if (loadParams_ != null) hash ^= LoadParams.GetHashCode();
if (payloadConfig_ != null) hash ^= PayloadConfig.GetHashCode();
if (histogramParams_ != null) hash ^= HistogramParams.GetHashCode();
+ hash ^= coreList_.GetHashCode();
+ if (CoreLimit != 0) hash ^= CoreLimit.GetHashCode();
return hash;
}
@@ -1300,6 +1335,11 @@ namespace Grpc.Testing {
output.WriteRawTag(98);
output.WriteMessage(HistogramParams);
}
+ coreList_.WriteTo(output, _repeated_coreList_codec);
+ if (CoreLimit != 0) {
+ output.WriteRawTag(112);
+ output.WriteInt32(CoreLimit);
+ }
}
public int CalculateSize() {
@@ -1332,6 +1372,10 @@ namespace Grpc.Testing {
if (histogramParams_ != null) {
size += 1 + pb::CodedOutputStream.ComputeMessageSize(HistogramParams);
}
+ size += coreList_.CalculateSize(_repeated_coreList_codec);
+ if (CoreLimit != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeInt32Size(CoreLimit);
+ }
return size;
}
@@ -1379,6 +1423,10 @@ namespace Grpc.Testing {
}
HistogramParams.MergeFrom(other.HistogramParams);
}
+ coreList_.Add(other.coreList_);
+ if (other.CoreLimit != 0) {
+ CoreLimit = other.CoreLimit;
+ }
}
public void MergeFrom(pb::CodedInputStream input) {
@@ -1440,6 +1488,15 @@ namespace Grpc.Testing {
input.ReadMessage(histogramParams_);
break;
}
+ case 106:
+ case 104: {
+ coreList_.AddEntriesFrom(input, _repeated_coreList_codec);
+ break;
+ }
+ case 112: {
+ CoreLimit = input.ReadInt32();
+ break;
+ }
}
}
}
@@ -1855,11 +1912,11 @@ namespace Grpc.Testing {
public ServerConfig(ServerConfig other) : this() {
serverType_ = other.serverType_;
SecurityParams = other.securityParams_ != null ? other.SecurityParams.Clone() : null;
- host_ = other.host_;
port_ = other.port_;
asyncServerThreads_ = other.asyncServerThreads_;
coreLimit_ = other.coreLimit_;
PayloadConfig = other.payloadConfig_ != null ? other.PayloadConfig.Clone() : null;
+ coreList_ = other.coreList_.Clone();
}
public ServerConfig Clone() {
@@ -1886,19 +1943,6 @@ namespace Grpc.Testing {
}
}
- /// <summary>Field number for the "host" field.</summary>
- public const int HostFieldNumber = 3;
- private string host_ = "";
- /// <summary>
- /// Host on which to listen.
- /// </summary>
- public string Host {
- get { return host_; }
- set {
- host_ = pb::Preconditions.CheckNotNull(value, "value");
- }
- }
-
/// <summary>Field number for the "port" field.</summary>
public const int PortFieldNumber = 4;
private int port_;
@@ -1929,7 +1973,7 @@ namespace Grpc.Testing {
public const int CoreLimitFieldNumber = 8;
private int coreLimit_;
/// <summary>
- /// restrict core usage, currently unused
+ /// Specify the number of cores to limit server to, if desired
/// </summary>
public int CoreLimit {
get { return coreLimit_; }
@@ -1941,6 +1985,9 @@ namespace Grpc.Testing {
/// <summary>Field number for the "payload_config" field.</summary>
public const int PayloadConfigFieldNumber = 9;
private global::Grpc.Testing.PayloadConfig payloadConfig_;
+ /// <summary>
+ /// payload config, used in generic server
+ /// </summary>
public global::Grpc.Testing.PayloadConfig PayloadConfig {
get { return payloadConfig_; }
set {
@@ -1948,6 +1995,18 @@ namespace Grpc.Testing {
}
}
+ /// <summary>Field number for the "core_list" field.</summary>
+ public const int CoreListFieldNumber = 10;
+ private static readonly pb::FieldCodec<int> _repeated_coreList_codec
+ = pb::FieldCodec.ForInt32(82);
+ private readonly pbc::RepeatedField<int> coreList_ = new pbc::RepeatedField<int>();
+ /// <summary>
+ /// Specify the cores we should run the server on, if desired
+ /// </summary>
+ public pbc::RepeatedField<int> CoreList {
+ get { return coreList_; }
+ }
+
public override bool Equals(object other) {
return Equals(other as ServerConfig);
}
@@ -1961,11 +2020,11 @@ namespace Grpc.Testing {
}
if (ServerType != other.ServerType) return false;
if (!object.Equals(SecurityParams, other.SecurityParams)) return false;
- if (Host != other.Host) return false;
if (Port != other.Port) return false;
if (AsyncServerThreads != other.AsyncServerThreads) return false;
if (CoreLimit != other.CoreLimit) return false;
if (!object.Equals(PayloadConfig, other.PayloadConfig)) return false;
+ if(!coreList_.Equals(other.coreList_)) return false;
return true;
}
@@ -1973,11 +2032,11 @@ namespace Grpc.Testing {
int hash = 1;
if (ServerType != global::Grpc.Testing.ServerType.SYNC_SERVER) hash ^= ServerType.GetHashCode();
if (securityParams_ != null) hash ^= SecurityParams.GetHashCode();
- if (Host.Length != 0) hash ^= Host.GetHashCode();
if (Port != 0) hash ^= Port.GetHashCode();
if (AsyncServerThreads != 0) hash ^= AsyncServerThreads.GetHashCode();
if (CoreLimit != 0) hash ^= CoreLimit.GetHashCode();
if (payloadConfig_ != null) hash ^= PayloadConfig.GetHashCode();
+ hash ^= coreList_.GetHashCode();
return hash;
}
@@ -1994,10 +2053,6 @@ namespace Grpc.Testing {
output.WriteRawTag(18);
output.WriteMessage(SecurityParams);
}
- if (Host.Length != 0) {
- output.WriteRawTag(26);
- output.WriteString(Host);
- }
if (Port != 0) {
output.WriteRawTag(32);
output.WriteInt32(Port);
@@ -2014,6 +2069,7 @@ namespace Grpc.Testing {
output.WriteRawTag(74);
output.WriteMessage(PayloadConfig);
}
+ coreList_.WriteTo(output, _repeated_coreList_codec);
}
public int CalculateSize() {
@@ -2024,9 +2080,6 @@ namespace Grpc.Testing {
if (securityParams_ != null) {
size += 1 + pb::CodedOutputStream.ComputeMessageSize(SecurityParams);
}
- if (Host.Length != 0) {
- size += 1 + pb::CodedOutputStream.ComputeStringSize(Host);
- }
if (Port != 0) {
size += 1 + pb::CodedOutputStream.ComputeInt32Size(Port);
}
@@ -2039,6 +2092,7 @@ namespace Grpc.Testing {
if (payloadConfig_ != null) {
size += 1 + pb::CodedOutputStream.ComputeMessageSize(PayloadConfig);
}
+ size += coreList_.CalculateSize(_repeated_coreList_codec);
return size;
}
@@ -2055,9 +2109,6 @@ namespace Grpc.Testing {
}
SecurityParams.MergeFrom(other.SecurityParams);
}
- if (other.Host.Length != 0) {
- Host = other.Host;
- }
if (other.Port != 0) {
Port = other.Port;
}
@@ -2073,6 +2124,7 @@ namespace Grpc.Testing {
}
PayloadConfig.MergeFrom(other.PayloadConfig);
}
+ coreList_.Add(other.coreList_);
}
public void MergeFrom(pb::CodedInputStream input) {
@@ -2093,10 +2145,6 @@ namespace Grpc.Testing {
input.ReadMessage(securityParams_);
break;
}
- case 26: {
- Host = input.ReadString();
- break;
- }
case 32: {
Port = input.ReadInt32();
break;
@@ -2116,6 +2164,11 @@ namespace Grpc.Testing {
input.ReadMessage(payloadConfig_);
break;
}
+ case 82:
+ case 80: {
+ coreList_.AddEntriesFrom(input, _repeated_coreList_codec);
+ break;
+ }
}
}
}
@@ -2347,7 +2400,7 @@ namespace Grpc.Testing {
public const int CoresFieldNumber = 3;
private int cores_;
/// <summary>
- /// Number of cores on the server. See gpr_cpu_num_cores.
+ /// Number of cores available to the server
/// </summary>
public int Cores {
get { return cores_; }
@@ -2460,6 +2513,264 @@ namespace Grpc.Testing {
}
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public sealed partial class CoreRequest : pb::IMessage<CoreRequest> {
+ private static readonly pb::MessageParser<CoreRequest> _parser = new pb::MessageParser<CoreRequest>(() => new CoreRequest());
+ public static pb::MessageParser<CoreRequest> Parser { get { return _parser; } }
+
+ public static pbr::MessageDescriptor Descriptor {
+ get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[14]; }
+ }
+
+ pbr::MessageDescriptor pb::IMessage.Descriptor {
+ get { return Descriptor; }
+ }
+
+ public CoreRequest() {
+ OnConstruction();
+ }
+
+ partial void OnConstruction();
+
+ public CoreRequest(CoreRequest other) : this() {
+ }
+
+ public CoreRequest Clone() {
+ return new CoreRequest(this);
+ }
+
+ public override bool Equals(object other) {
+ return Equals(other as CoreRequest);
+ }
+
+ public bool Equals(CoreRequest other) {
+ if (ReferenceEquals(other, null)) {
+ return false;
+ }
+ if (ReferenceEquals(other, this)) {
+ return true;
+ }
+ return true;
+ }
+
+ public override int GetHashCode() {
+ int hash = 1;
+ return hash;
+ }
+
+ public override string ToString() {
+ return pb::JsonFormatter.ToDiagnosticString(this);
+ }
+
+ public void WriteTo(pb::CodedOutputStream output) {
+ }
+
+ public int CalculateSize() {
+ int size = 0;
+ return size;
+ }
+
+ public void MergeFrom(CoreRequest other) {
+ if (other == null) {
+ return;
+ }
+ }
+
+ public void MergeFrom(pb::CodedInputStream input) {
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ input.SkipLastField();
+ break;
+ }
+ }
+ }
+
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public sealed partial class CoreResponse : pb::IMessage<CoreResponse> {
+ private static readonly pb::MessageParser<CoreResponse> _parser = new pb::MessageParser<CoreResponse>(() => new CoreResponse());
+ public static pb::MessageParser<CoreResponse> Parser { get { return _parser; } }
+
+ public static pbr::MessageDescriptor Descriptor {
+ get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[15]; }
+ }
+
+ pbr::MessageDescriptor pb::IMessage.Descriptor {
+ get { return Descriptor; }
+ }
+
+ public CoreResponse() {
+ OnConstruction();
+ }
+
+ partial void OnConstruction();
+
+ public CoreResponse(CoreResponse other) : this() {
+ cores_ = other.cores_;
+ }
+
+ public CoreResponse Clone() {
+ return new CoreResponse(this);
+ }
+
+ /// <summary>Field number for the "cores" field.</summary>
+ public const int CoresFieldNumber = 1;
+ private int cores_;
+ /// <summary>
+ /// Number of cores available on the server
+ /// </summary>
+ public int Cores {
+ get { return cores_; }
+ set {
+ cores_ = value;
+ }
+ }
+
+ public override bool Equals(object other) {
+ return Equals(other as CoreResponse);
+ }
+
+ public bool Equals(CoreResponse other) {
+ if (ReferenceEquals(other, null)) {
+ return false;
+ }
+ if (ReferenceEquals(other, this)) {
+ return true;
+ }
+ if (Cores != other.Cores) return false;
+ return true;
+ }
+
+ public override int GetHashCode() {
+ int hash = 1;
+ if (Cores != 0) hash ^= Cores.GetHashCode();
+ return hash;
+ }
+
+ public override string ToString() {
+ return pb::JsonFormatter.ToDiagnosticString(this);
+ }
+
+ public void WriteTo(pb::CodedOutputStream output) {
+ if (Cores != 0) {
+ output.WriteRawTag(8);
+ output.WriteInt32(Cores);
+ }
+ }
+
+ public int CalculateSize() {
+ int size = 0;
+ if (Cores != 0) {
+ size += 1 + pb::CodedOutputStream.ComputeInt32Size(Cores);
+ }
+ return size;
+ }
+
+ public void MergeFrom(CoreResponse other) {
+ if (other == null) {
+ return;
+ }
+ if (other.Cores != 0) {
+ Cores = other.Cores;
+ }
+ }
+
+ public void MergeFrom(pb::CodedInputStream input) {
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ input.SkipLastField();
+ break;
+ case 8: {
+ Cores = input.ReadInt32();
+ break;
+ }
+ }
+ }
+ }
+
+ }
+
+ [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+ public sealed partial class Void : pb::IMessage<Void> {
+ private static readonly pb::MessageParser<Void> _parser = new pb::MessageParser<Void>(() => new Void());
+ public static pb::MessageParser<Void> Parser { get { return _parser; } }
+
+ public static pbr::MessageDescriptor Descriptor {
+ get { return global::Grpc.Testing.ControlReflection.Descriptor.MessageTypes[16]; }
+ }
+
+ pbr::MessageDescriptor pb::IMessage.Descriptor {
+ get { return Descriptor; }
+ }
+
+ public Void() {
+ OnConstruction();
+ }
+
+ partial void OnConstruction();
+
+ public Void(Void other) : this() {
+ }
+
+ public Void Clone() {
+ return new Void(this);
+ }
+
+ public override bool Equals(object other) {
+ return Equals(other as Void);
+ }
+
+ public bool Equals(Void other) {
+ if (ReferenceEquals(other, null)) {
+ return false;
+ }
+ if (ReferenceEquals(other, this)) {
+ return true;
+ }
+ return true;
+ }
+
+ public override int GetHashCode() {
+ int hash = 1;
+ return hash;
+ }
+
+ public override string ToString() {
+ return pb::JsonFormatter.ToDiagnosticString(this);
+ }
+
+ public void WriteTo(pb::CodedOutputStream output) {
+ }
+
+ public int CalculateSize() {
+ int size = 0;
+ return size;
+ }
+
+ public void MergeFrom(Void other) {
+ if (other == null) {
+ return;
+ }
+ }
+
+ public void MergeFrom(pb::CodedInputStream input) {
+ uint tag;
+ while ((tag = input.ReadTag()) != 0) {
+ switch(tag) {
+ default:
+ input.SkipLastField();
+ break;
+ }
+ }
+ }
+
+ }
+
#endregion
}
diff --git a/src/csharp/Grpc.IntegrationTesting/QpsWorker.cs b/src/csharp/Grpc.IntegrationTesting/QpsWorker.cs
index 686b484345..e407792c4b 100644
--- a/src/csharp/Grpc.IntegrationTesting/QpsWorker.cs
+++ b/src/csharp/Grpc.IntegrationTesting/QpsWorker.cs
@@ -1,6 +1,6 @@
#region Copyright notice and license
-// Copyright 2015, Google Inc.
+// Copyright 2015-2016, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
@@ -85,24 +85,27 @@ namespace Grpc.IntegrationTesting
}
var workerServer = new QpsWorker(options);
- workerServer.Run();
+ workerServer.RunAsync().Wait();
}
- private void Run()
+ private async Task RunAsync()
{
string host = "0.0.0.0";
int port = options.DriverPort;
+ var tcs = new TaskCompletionSource<object>();
+ var workerServiceImpl = new WorkerServiceImpl(() => { Task.Run(() => tcs.SetResult(null)); });
+
var server = new Server
{
- Services = { WorkerService.BindService(new WorkerServiceImpl()) },
+ Services = { WorkerService.BindService(workerServiceImpl) },
Ports = { new ServerPort(host, options.DriverPort, ServerCredentials.Insecure )}
};
int boundPort = server.Ports.Single().BoundPort;
Console.WriteLine("Running qps worker server on " + string.Format("{0}:{1}", host, boundPort));
server.Start();
-
- server.ShutdownTask.Wait();
+ await tcs.Task;
+ await server.ShutdownAsync();
}
}
}
diff --git a/src/csharp/Grpc.IntegrationTesting/RunnerClientServerTest.cs b/src/csharp/Grpc.IntegrationTesting/RunnerClientServerTest.cs
index 3dd91b7948..06d5ee93d8 100644
--- a/src/csharp/Grpc.IntegrationTesting/RunnerClientServerTest.cs
+++ b/src/csharp/Grpc.IntegrationTesting/RunnerClientServerTest.cs
@@ -1,6 +1,6 @@
#region Copyright notice and license
-// Copyright 2015, Google Inc.
+// Copyright 2015-2016, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
@@ -48,7 +48,6 @@ namespace Grpc.IntegrationTesting
/// </summary>
public class RunnerClientServerTest
{
- const string Host = "localhost";
IServerRunner serverRunner;
[TestFixtureSetUp]
@@ -57,7 +56,6 @@ namespace Grpc.IntegrationTesting
var serverConfig = new ServerConfig
{
ServerType = ServerType.ASYNC_SERVER,
- Host = Host,
PayloadConfig = new PayloadConfig
{
SimpleParams = new SimpleProtoParams
@@ -83,7 +81,7 @@ namespace Grpc.IntegrationTesting
{
var config = new ClientConfig
{
- ServerTargets = { string.Format("{0}:{1}", Host, serverRunner.BoundPort) },
+ ServerTargets = { string.Format("{0}:{1}", "localhost", serverRunner.BoundPort) },
RpcType = RpcType.UNARY,
LoadParams = new LoadParams { ClosedLoop = new ClosedLoopParams() },
PayloadConfig = new PayloadConfig
diff --git a/src/csharp/Grpc.IntegrationTesting/ServerRunners.cs b/src/csharp/Grpc.IntegrationTesting/ServerRunners.cs
index 9b09b9bdd3..4a73645e6c 100644
--- a/src/csharp/Grpc.IntegrationTesting/ServerRunners.cs
+++ b/src/csharp/Grpc.IntegrationTesting/ServerRunners.cs
@@ -65,7 +65,7 @@ namespace Grpc.IntegrationTesting
var server = new Server
{
Services = { BenchmarkService.BindService(new BenchmarkServiceImpl(responseSize)) },
- Ports = { new ServerPort(config.Host, config.Port, credentials) }
+ Ports = { new ServerPort("[::]", config.Port, credentials) }
};
server.Start();
diff --git a/src/csharp/Grpc.IntegrationTesting/Services.cs b/src/csharp/Grpc.IntegrationTesting/Services.cs
index 04a092ccd7..a8475c1817 100644
--- a/src/csharp/Grpc.IntegrationTesting/Services.cs
+++ b/src/csharp/Grpc.IntegrationTesting/Services.cs
@@ -29,11 +29,14 @@ namespace Grpc.Testing {
"QmVuY2htYXJrU2VydmljZRJGCglVbmFyeUNhbGwSGy5ncnBjLnRlc3Rpbmcu",
"U2ltcGxlUmVxdWVzdBocLmdycGMudGVzdGluZy5TaW1wbGVSZXNwb25zZRJO",
"Cg1TdHJlYW1pbmdDYWxsEhsuZ3JwYy50ZXN0aW5nLlNpbXBsZVJlcXVlc3Qa",
- "HC5ncnBjLnRlc3RpbmcuU2ltcGxlUmVzcG9uc2UoATABMp0BCg1Xb3JrZXJT",
+ "HC5ncnBjLnRlc3RpbmcuU2ltcGxlUmVzcG9uc2UoATABMpcCCg1Xb3JrZXJT",
"ZXJ2aWNlEkUKCVJ1blNlcnZlchIYLmdycGMudGVzdGluZy5TZXJ2ZXJBcmdz",
"GhouZ3JwYy50ZXN0aW5nLlNlcnZlclN0YXR1cygBMAESRQoJUnVuQ2xpZW50",
"EhguZ3JwYy50ZXN0aW5nLkNsaWVudEFyZ3MaGi5ncnBjLnRlc3RpbmcuQ2xp",
- "ZW50U3RhdHVzKAEwAWIGcHJvdG8z"));
+ "ZW50U3RhdHVzKAEwARJCCglDb3JlQ291bnQSGS5ncnBjLnRlc3RpbmcuQ29y",
+ "ZVJlcXVlc3QaGi5ncnBjLnRlc3RpbmcuQ29yZVJlc3BvbnNlEjQKClF1aXRX",
+ "b3JrZXISEi5ncnBjLnRlc3RpbmcuVm9pZBoSLmdycGMudGVzdGluZy5Wb2lk",
+ "YgZwcm90bzM="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Grpc.Testing.MessagesReflection.Descriptor, global::Grpc.Testing.ControlReflection.Descriptor, },
new pbr::GeneratedCodeInfo(null, null));
diff --git a/src/csharp/Grpc.IntegrationTesting/ServicesGrpc.cs b/src/csharp/Grpc.IntegrationTesting/ServicesGrpc.cs
index dd30afb427..996439afbf 100644
--- a/src/csharp/Grpc.IntegrationTesting/ServicesGrpc.cs
+++ b/src/csharp/Grpc.IntegrationTesting/ServicesGrpc.cs
@@ -114,6 +114,9 @@ namespace Grpc.Testing {
static readonly Marshaller<global::Grpc.Testing.ServerStatus> __Marshaller_ServerStatus = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.ServerStatus.Parser.ParseFrom);
static readonly Marshaller<global::Grpc.Testing.ClientArgs> __Marshaller_ClientArgs = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.ClientArgs.Parser.ParseFrom);
static readonly Marshaller<global::Grpc.Testing.ClientStatus> __Marshaller_ClientStatus = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.ClientStatus.Parser.ParseFrom);
+ static readonly Marshaller<global::Grpc.Testing.CoreRequest> __Marshaller_CoreRequest = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.CoreRequest.Parser.ParseFrom);
+ static readonly Marshaller<global::Grpc.Testing.CoreResponse> __Marshaller_CoreResponse = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.CoreResponse.Parser.ParseFrom);
+ static readonly Marshaller<global::Grpc.Testing.Void> __Marshaller_Void = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Grpc.Testing.Void.Parser.ParseFrom);
static readonly Method<global::Grpc.Testing.ServerArgs, global::Grpc.Testing.ServerStatus> __Method_RunServer = new Method<global::Grpc.Testing.ServerArgs, global::Grpc.Testing.ServerStatus>(
MethodType.DuplexStreaming,
@@ -129,6 +132,20 @@ namespace Grpc.Testing {
__Marshaller_ClientArgs,
__Marshaller_ClientStatus);
+ static readonly Method<global::Grpc.Testing.CoreRequest, global::Grpc.Testing.CoreResponse> __Method_CoreCount = new Method<global::Grpc.Testing.CoreRequest, global::Grpc.Testing.CoreResponse>(
+ MethodType.Unary,
+ __ServiceName,
+ "CoreCount",
+ __Marshaller_CoreRequest,
+ __Marshaller_CoreResponse);
+
+ static readonly Method<global::Grpc.Testing.Void, global::Grpc.Testing.Void> __Method_QuitWorker = new Method<global::Grpc.Testing.Void, global::Grpc.Testing.Void>(
+ MethodType.Unary,
+ __ServiceName,
+ "QuitWorker",
+ __Marshaller_Void,
+ __Marshaller_Void);
+
// service descriptor
public static global::Google.Protobuf.Reflection.ServiceDescriptor Descriptor
{
@@ -142,6 +159,14 @@ namespace Grpc.Testing {
AsyncDuplexStreamingCall<global::Grpc.Testing.ServerArgs, global::Grpc.Testing.ServerStatus> RunServer(CallOptions options);
AsyncDuplexStreamingCall<global::Grpc.Testing.ClientArgs, global::Grpc.Testing.ClientStatus> RunClient(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken));
AsyncDuplexStreamingCall<global::Grpc.Testing.ClientArgs, global::Grpc.Testing.ClientStatus> RunClient(CallOptions options);
+ global::Grpc.Testing.CoreResponse CoreCount(global::Grpc.Testing.CoreRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken));
+ global::Grpc.Testing.CoreResponse CoreCount(global::Grpc.Testing.CoreRequest request, CallOptions options);
+ AsyncUnaryCall<global::Grpc.Testing.CoreResponse> CoreCountAsync(global::Grpc.Testing.CoreRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken));
+ AsyncUnaryCall<global::Grpc.Testing.CoreResponse> CoreCountAsync(global::Grpc.Testing.CoreRequest request, CallOptions options);
+ global::Grpc.Testing.Void QuitWorker(global::Grpc.Testing.Void request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken));
+ global::Grpc.Testing.Void QuitWorker(global::Grpc.Testing.Void request, CallOptions options);
+ AsyncUnaryCall<global::Grpc.Testing.Void> QuitWorkerAsync(global::Grpc.Testing.Void request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken));
+ AsyncUnaryCall<global::Grpc.Testing.Void> QuitWorkerAsync(global::Grpc.Testing.Void request, CallOptions options);
}
// server-side interface
@@ -149,6 +174,8 @@ namespace Grpc.Testing {
{
Task RunServer(IAsyncStreamReader<global::Grpc.Testing.ServerArgs> requestStream, IServerStreamWriter<global::Grpc.Testing.ServerStatus> responseStream, ServerCallContext context);
Task RunClient(IAsyncStreamReader<global::Grpc.Testing.ClientArgs> requestStream, IServerStreamWriter<global::Grpc.Testing.ClientStatus> responseStream, ServerCallContext context);
+ Task<global::Grpc.Testing.CoreResponse> CoreCount(global::Grpc.Testing.CoreRequest request, ServerCallContext context);
+ Task<global::Grpc.Testing.Void> QuitWorker(global::Grpc.Testing.Void request, ServerCallContext context);
}
// client stub
@@ -177,6 +204,46 @@ namespace Grpc.Testing {
var call = CreateCall(__Method_RunClient, options);
return Calls.AsyncDuplexStreamingCall(call);
}
+ public global::Grpc.Testing.CoreResponse CoreCount(global::Grpc.Testing.CoreRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+ {
+ var call = CreateCall(__Method_CoreCount, new CallOptions(headers, deadline, cancellationToken));
+ return Calls.BlockingUnaryCall(call, request);
+ }
+ public global::Grpc.Testing.CoreResponse CoreCount(global::Grpc.Testing.CoreRequest request, CallOptions options)
+ {
+ var call = CreateCall(__Method_CoreCount, options);
+ return Calls.BlockingUnaryCall(call, request);
+ }
+ public AsyncUnaryCall<global::Grpc.Testing.CoreResponse> CoreCountAsync(global::Grpc.Testing.CoreRequest request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+ {
+ var call = CreateCall(__Method_CoreCount, new CallOptions(headers, deadline, cancellationToken));
+ return Calls.AsyncUnaryCall(call, request);
+ }
+ public AsyncUnaryCall<global::Grpc.Testing.CoreResponse> CoreCountAsync(global::Grpc.Testing.CoreRequest request, CallOptions options)
+ {
+ var call = CreateCall(__Method_CoreCount, options);
+ return Calls.AsyncUnaryCall(call, request);
+ }
+ public global::Grpc.Testing.Void QuitWorker(global::Grpc.Testing.Void request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+ {
+ var call = CreateCall(__Method_QuitWorker, new CallOptions(headers, deadline, cancellationToken));
+ return Calls.BlockingUnaryCall(call, request);
+ }
+ public global::Grpc.Testing.Void QuitWorker(global::Grpc.Testing.Void request, CallOptions options)
+ {
+ var call = CreateCall(__Method_QuitWorker, options);
+ return Calls.BlockingUnaryCall(call, request);
+ }
+ public AsyncUnaryCall<global::Grpc.Testing.Void> QuitWorkerAsync(global::Grpc.Testing.Void request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+ {
+ var call = CreateCall(__Method_QuitWorker, new CallOptions(headers, deadline, cancellationToken));
+ return Calls.AsyncUnaryCall(call, request);
+ }
+ public AsyncUnaryCall<global::Grpc.Testing.Void> QuitWorkerAsync(global::Grpc.Testing.Void request, CallOptions options)
+ {
+ var call = CreateCall(__Method_QuitWorker, options);
+ return Calls.AsyncUnaryCall(call, request);
+ }
}
// creates service definition that can be registered with a server
@@ -184,7 +251,9 @@ namespace Grpc.Testing {
{
return ServerServiceDefinition.CreateBuilder(__ServiceName)
.AddMethod(__Method_RunServer, serviceImpl.RunServer)
- .AddMethod(__Method_RunClient, serviceImpl.RunClient).Build();
+ .AddMethod(__Method_RunClient, serviceImpl.RunClient)
+ .AddMethod(__Method_CoreCount, serviceImpl.CoreCount)
+ .AddMethod(__Method_QuitWorker, serviceImpl.QuitWorker).Build();
}
// creates a new client
diff --git a/src/csharp/Grpc.IntegrationTesting/WorkerServiceImpl.cs b/src/csharp/Grpc.IntegrationTesting/WorkerServiceImpl.cs
index 59ecebf5a2..cab299a137 100644
--- a/src/csharp/Grpc.IntegrationTesting/WorkerServiceImpl.cs
+++ b/src/csharp/Grpc.IntegrationTesting/WorkerServiceImpl.cs
@@ -47,6 +47,13 @@ namespace Grpc.Testing
/// </summary>
public class WorkerServiceImpl : WorkerService.IWorkerService
{
+ readonly Action stopRequestHandler;
+
+ public WorkerServiceImpl(Action stopRequestHandler)
+ {
+ this.stopRequestHandler = GrpcPreconditions.CheckNotNull(stopRequestHandler);
+ }
+
public async Task RunServer(IAsyncStreamReader<ServerArgs> requestStream, IServerStreamWriter<ServerStatus> responseStream, ServerCallContext context)
{
GrpcPreconditions.CheckState(await requestStream.MoveNext());
@@ -92,5 +99,16 @@ namespace Grpc.Testing
}
await runner.StopAsync();
}
+
+ public Task<CoreResponse> CoreCount(CoreRequest request, ServerCallContext context)
+ {
+ return Task.FromResult(new CoreResponse { Cores = Environment.ProcessorCount });
+ }
+
+ public Task<Void> QuitWorker(Void request, ServerCallContext context)
+ {
+ stopRequestHandler();
+ return Task.FromResult(new Void());
+ }
}
}
diff --git a/src/proto/grpc/lb/v0/load_balancer.options b/src/proto/grpc/lb/v0/load_balancer.options
new file mode 100644
index 0000000000..6d4528f838
--- /dev/null
+++ b/src/proto/grpc/lb/v0/load_balancer.options
@@ -0,0 +1,6 @@
+grpc.lb.v0.InitialLoadBalanceRequest.name max_size:128
+grpc.lb.v0.InitialLoadBalanceResponse.client_config max_size:64
+grpc.lb.v0.InitialLoadBalanceResponse.load_balancer_delegate max_size:64
+grpc.lb.v0.Server.ip_address max_size:46
+grpc.lb.v0.Server.load_balance_token max_size:64
+load_balancer.proto no_unions:true
diff --git a/src/proto/grpc/lb/v0/load_balancer.proto b/src/proto/grpc/lb/v0/load_balancer.proto
new file mode 100644
index 0000000000..e88a4f8c4a
--- /dev/null
+++ b/src/proto/grpc/lb/v0/load_balancer.proto
@@ -0,0 +1,144 @@
+// 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.
+
+syntax = "proto3";
+
+package grpc.lb.v0;
+
+message Duration {
+
+ // Signed seconds of the span of time. Must be from -315,576,000,000
+ // to +315,576,000,000 inclusive.
+ int64 seconds = 1;
+
+ // Signed fractions of a second at nanosecond resolution of the span
+ // of time. Durations less than one second are represented with a 0
+ // `seconds` field and a positive or negative `nanos` field. For durations
+ // of one second or more, a non-zero value for the `nanos` field must be
+ // of the same sign as the `seconds` field. Must be from -999,999,999
+ // to +999,999,999 inclusive.
+ int32 nanos = 2;
+}
+
+service LoadBalancer {
+ // Bidirectional rpc to get a list of servers.
+ rpc BalanceLoad(stream LoadBalanceRequest)
+ returns (stream LoadBalanceResponse);
+}
+
+message LoadBalanceRequest {
+ oneof load_balance_request_type {
+ // This message should be sent on the first request to the load balancer.
+ InitialLoadBalanceRequest initial_request = 1;
+
+ // The client stats should be periodically reported to the load balancer
+ // based on the duration defined in the InitialLoadBalanceResponse.
+ ClientStats client_stats = 2;
+ }
+}
+
+message InitialLoadBalanceRequest {
+ // Name of load balanced service (IE, service.grpc.gslb.google.com)
+ string name = 1;
+}
+
+// Contains client level statistics that are useful to load balancing. Each
+// count should be reset to zero after reporting the stats.
+message ClientStats {
+ // The total number of requests sent by the client since the last report.
+ int64 total_requests = 1;
+
+ // The number of client rpc errors since the last report.
+ int64 client_rpc_errors = 2;
+
+ // The number of dropped requests since the last report.
+ int64 dropped_requests = 3;
+}
+
+message LoadBalanceResponse {
+ oneof load_balance_response_type {
+ // This message should be sent on the first response to the client.
+ InitialLoadBalanceResponse initial_response = 1;
+
+ // Contains the list of servers selected by the load balancer. The client
+ // should send requests to these servers in the specified order.
+ ServerList server_list = 2;
+ }
+}
+
+message InitialLoadBalanceResponse {
+ oneof initial_response_type {
+ // Contains gRPC config options like RPC deadline or flow control.
+ // TODO(yetianx): Change to ClientConfig after it is defined.
+ string client_config = 1;
+
+ // This is an application layer redirect that indicates the client should
+ // use the specified server for load balancing. When this field is set in
+ // the response, the client should open a separate connection to the
+ // load_balancer_delegate and call the BalanceLoad method.
+ string load_balancer_delegate = 2;
+ }
+
+ // This interval defines how often the client should send the client stats
+ // to the load balancer. Stats should only be reported when the duration is
+ // positive.
+ Duration client_stats_report_interval = 3;
+}
+
+message ServerList {
+ // Contains a list of servers selected by the load balancer. The list will
+ // be updated when server resolutions change or as needed to balance load
+ // across more servers. The client should consume the server list in order
+ // unless instructed otherwise via the client_config.
+ repeated Server servers = 1;
+
+ // Indicates the amount of time that the client should consider this server
+ // list as valid. It may be considered stale after waiting this interval of
+ // time after receiving the list. If the interval is not positive, the
+ // client can assume the list is valid until the next list is received.
+ Duration expiration_interval = 3;
+}
+
+message Server {
+ // A resolved address and port for the server. The IP address string may
+ // either be an IPv4 or IPv6 address.
+ string ip_address = 1;
+ int32 port = 2;
+
+ // An opaque token that is passed from the client to the server in metadata.
+ // The server may expect this token to indicate that the request from the
+ // client was load balanced.
+ // TODO(yetianx): Not used right now, and will be used after implementing
+ // load report.
+ bytes load_balance_token = 3;
+
+ // Indicates whether this particular request should be dropped by the client
+ // when this server is chosen from the list.
+ bool drop_request = 4;
+}
diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py
index a002a5a0a8..c020fda284 100644
--- a/src/python/grpcio/grpc_core_dependencies.py
+++ b/src/python/grpcio/grpc_core_dependencies.py
@@ -88,6 +88,7 @@ CORE_SOURCE_FILES = [
'src/core/client_config/connector.c',
'src/core/client_config/default_initial_connect_string.c',
'src/core/client_config/initial_connect_string.c',
+ 'src/core/client_config/lb_policies/load_balancer_api.c',
'src/core/client_config/lb_policies/pick_first.c',
'src/core/client_config/lb_policies/round_robin.c',
'src/core/client_config/lb_policy.c',
@@ -152,6 +153,7 @@ CORE_SOURCE_FILES = [
'src/core/json/json_reader.c',
'src/core/json/json_string.c',
'src/core/json/json_writer.c',
+ 'src/core/proto/grpc/lb/v0/load_balancer.pb.c',
'src/core/surface/alarm.c',
'src/core/surface/api_trace.c',
'src/core/surface/byte_buffer.c',
@@ -228,6 +230,9 @@ CORE_SOURCE_FILES = [
'src/core/census/operation.c',
'src/core/census/placeholders.c',
'src/core/census/tracing.c',
+ 'third_party/nanopb/pb_common.c',
+ 'third_party/nanopb/pb_decode.c',
+ 'third_party/nanopb/pb_encode.c',
'src/boringssl/err_data.c',
'third_party/boringssl/crypto/aes/aes.c',
'third_party/boringssl/crypto/aes/mode_wrappers.c',
diff --git a/summerofcode/ideas.md b/summerofcode/ideas.md
index b14d3f7b6a..c7f368e7cc 100644
--- a/summerofcode/ideas.md
+++ b/summerofcode/ideas.md
@@ -1,22 +1,52 @@
# gRPC Summer of Code Project Ideas
-C Core:
+Hello students!
-1. Port gRPC to one of (Free, Net, Open) BSD platforms and create packages for them. Add kqueue support in the process.
-2. Fix gRPC C-core's URI parser. The current parser does not qualify as a standard parser according to [RFC3986]( https://tools.ietf.org/html/rfc3986). Write test suites to verify this and make changes necessary to make the URI parser compliant.
-3. HPACK compression efficiency evaluation - Figure out how to benchmark gRPC's compression efficiency (both in terms of bytes on the wire and cpu cycles). Implement benchmarks. Potentially extend this to other standalone implementations -- Java and Go.
+We want gRPC to be the universal remote procedure call protocol for all
+computing platforms and paradigms, so while these are our ideas of what we
+think would make good projects for the summer, we're eager to hear your ideas
+and proposals as well.
+[Try us out](https://github.com/grpc/grpc/blob/master/CONTRIBUTING.md) and get
+to know the gRPC code and team!
+
+**Required skills for all projects:** git version control, collaborative
+software development on github.com, and software development in at least one
+of gRPC's ten languages on at least one of Linux, Mac OS X, and Windows.
+
+-------------------------------------
+
+gRPC C Core:
+
+1. Port gRPC to one of the major BSD platforms ([FreeBSD](https://freebsd.org), [NetBSD](https://netbsd.org), and [OpenBSD](https://openbsd.org)) and create packages for them. Add [kqueue](https://www.freebsd.org/cgi/man.cgi?query=kqueue) support in the process.
+ * **Required skills:** C programming language, BSD operating system.
+ * **Likely mentors:** [Craig Tiller](https://github.com/ctiller), [Nicolas Noble](https://github.com/nicolasnoble).
+1. Fix gRPC C-core's URI parser. The current parser does not qualify as a standard parser according to [RFC3986]( https://tools.ietf.org/html/rfc3986). Write test suites to verify this and make changes necessary to make the URI parser compliant.
+ * **Required skills:** C programming language, HTTP standard compliance.
+ * **Likely mentors:** [Craig Tiller](https://github.com/ctiller).
+1. HPACK compression efficiency evaluation - Figure out how to benchmark gRPC's compression efficiency (both in terms of bytes on the wire and cpu cycles). Implement benchmarks. Potentially extend this to other full-stack gRPC implementations (Java and Go).
+ * **Required skills:** C programming language, software performance benchmarking, potentially Java and Go.
+ * **Likely mentors:** [Craig Tiller](https://github.com/ctiller).
gRPC Python:
- 1. Evaluate the port of gRPC's Python implementation to PyPy. Investigate the state of [Cython support](http://docs.cython.org/src/userguide/pypy.html) to do this or potentially explore cffi
- 2. Develop and test Python 3.5 Support for gRPC. Make necessary changes to port gRPC and package it for supported platforms.
+1. Port gRPC Python to [PyPy](http://pypy.org). Investigate the state of [Cython support](http://docs.cython.org/src/userguide/pypy.html) to do this or potentially explore [cffi](https://cffi.readthedocs.org/en/latest/).
+ * **Required skills:** Python programming language, PyPy Python interpreter.
+ * **Likely mentors:** [Nathaniel Manista](https://github.com/nathanielmanistaatgoogle), [Masood Malekghassemi](https://github.com/soltanmm).
+1. Develop and test Python 3.5 Support for gRPC. Make necessary changes to port gRPC and package it for supported platforms.
+ * **Required skills:** Python programming language, PyPy Python interpreter.
+ * **Likely mentors:** [Nathaniel Manista](https://github.com/nathanielmanistaatgoogle), [Masood Malekghassemi](https://github.com/soltanmm).
gRPC Ruby/Java:
-1. jRuby support for gRPC. Develop a jRuby wrapper for gRPC based on grpc-java and ensure that it is API compatible with the existing Ruby implementation and passes all tests.
+1. [jRuby](http://jruby.org) support for gRPC. Develop a jRuby wrapper for gRPC based on grpc-java and ensure that it is API compatible with the existing Ruby implementation and passes all tests.
+ * **Required skills:** Java programming language, Ruby programming language.
+ * **Likely mentors:** [Michael Lumish](https://github.com/murgatroid99), [Eric Anderson](https://github.com/ejona86).
-Other:
+gRPC Wire Protocol:
-1. Develop a Wireshark plugin for the gRPC protocol. Provide documentation and tutorials for this plugin. Bonus: consider set-up and use with the mobile clients.
+1. Develop a [Wireshark](https://wireshark.org) plugin for the gRPC protocol. Provide documentation and tutorials for this plugin.
+ * **Bonus:** consider set-up and use with mobile clients.
+ * **Required skills:** Wireshark software.
+ * **Likely mentors:** [Nicolas Noble](https://github.com/nicolasnoble).
diff --git a/templates/config.m4.template b/templates/config.m4.template
new file mode 100644
index 0000000000..dbc12188dc
--- /dev/null
+++ b/templates/config.m4.template
@@ -0,0 +1,44 @@
+%YAML 1.2
+--- |
+ PHP_ARG_ENABLE(grpc, whether to enable grpc support,
+ [ --enable-grpc Enable grpc support])
+
+ if test "$PHP_GRPC" != "no"; then
+ dnl Write more examples of tests here...
+
+ dnl # --with-grpc -> add include path
+ PHP_ADD_INCLUDE(../../grpc/include)
+ PHP_ADD_INCLUDE(../../grpc/src/php/ext/grpc)
+ PHP_ADD_INCLUDE(../../grpc/third_party/boringssl/include)
+
+ LIBS="-lpthread $LIBS"
+
+ GRPC_SHARED_LIBADD="-lpthread $GRPC_SHARED_LIBADD"
+ PHP_ADD_LIBRARY(pthread)
+
+ PHP_ADD_LIBRARY(dl,,GRPC_SHARED_LIBADD)
+ PHP_ADD_LIBRARY(dl)
+
+ case $host in
+ *darwin*) ;;
+ *)
+ PHP_ADD_LIBRARY(rt,,GRPC_SHARED_LIBADD)
+ PHP_ADD_LIBRARY(rt)
+ ;;
+ esac
+
+ PHP_NEW_EXTENSION(grpc,
+ % for source in php_config_m4.src:
+ ${source} ${"\\"}
+ % endfor
+ % for lib in libs:
+ % if lib.name in php_config_m4.get('deps', []):
+ % for source in lib.src:
+ ${source} ${"\\"}
+ % endfor
+ % endif
+ % endfor
+ , $ext_shared, , -Wall -Werror -std=c11 ${"\\"}
+ -fvisibility=hidden -DOPENSSL_NO_ASM -D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN ${"\\"}
+ -D_HAS_EXCEPTIONS=0 -DNOMINMAX)
+ fi
diff --git a/templates/package.xml.template b/templates/package.xml.template
new file mode 100644
index 0000000000..455b002e64
--- /dev/null
+++ b/templates/package.xml.template
@@ -0,0 +1,159 @@
+%YAML 1.2
+--- |
+ <?xml version="1.0" encoding="UTF-8"?>
+ <package packagerversion="1.9.5" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
+ <name>grpc</name>
+ <channel>pecl.php.net</channel>
+ <summary>A high performance, open source, general RPC framework that puts mobile and HTTP/2 first.</summary>
+ <description>Remote Procedure Calls (RPCs) provide a useful abstraction for building distributed applications and services. The libraries in this repository provide a concrete implementation of the gRPC protocol, layered over HTTP/2. These libraries enable communication between clients and servers using any combination of the supported languages.</description>
+ <lead>
+ <name>Stanley Cheung</name>
+ <user>stanleycheung</user>
+ <email>grpc-packages@google.com</email>
+ <active>yes</active>
+ </lead>
+ <%! from time import strftime %><date>${"%Y-%m-%d" | strftime}</date>
+ <time>16:06:07</time>
+ <version>
+ <release>0.8.0</release>
+ <api>0.8.0</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <license>BSD</license>
+ <notes>
+ - Simplify gRPC PHP installation #4517
+ </notes>
+ <contents>
+ <dir baseinstalldir="/" name="/">
+ <file baseinstalldir="/" name="config.m4" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/CREDITS" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/LICENSE" role="src" />
+ <file baseinstalldir="/" name="src/php/ext/grpc/README.md" role="src" />
+ % for source in php_config_m4.src + php_config_m4.headers:
+ <file baseinstalldir="/" name="${source}" role="src" />
+ % endfor
+ % for lib in libs:
+ % if lib.name in php_config_m4.get('deps', []):
+ % for source in lib.get('public_headers', []) + lib.headers + lib.src:
+ <file baseinstalldir="/" name="${source}" role="src" />
+ % endfor
+ % endif
+ % endfor
+ </dir>
+ </contents>
+ <dependencies>
+ <required>
+ <php>
+ <min>5.5.0</min>
+ </php>
+ <pearinstaller>
+ <min>1.4.0</min>
+ </pearinstaller>
+ </required>
+ </dependencies>
+ <providesextension>grpc</providesextension>
+ <extsrcrelease />
+ <changelog>
+ <release>
+ <version>
+ <release>0.5.0</release>
+ <api>0.5.0</api>
+ </version>
+ <stability>
+ <release>alpha</release>
+ <api>alpha</api>
+ </stability>
+ <date>2015-06-16</date>
+ <license>BSD</license>
+ <notes>
+ First alpha release
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>0.5.1</release>
+ <api>0.5.1</api>
+ </version>
+ <stability>
+ <release>alpha</release>
+ <api>alpha</api>
+ </stability>
+ <date>2015-07-09</date>
+ <license>BSD</license>
+ <notes>
+ Update to wrap gRPC C Core version 0.10.0
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>0.6.0</release>
+ <api>0.6.0</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <date>2015-09-24</date>
+ <license>BSD</license>
+ <notes>
+ - support per message compression disable
+ - expose per-call host override option
+ - expose connectivity API
+ - expose channel target and call peer
+ - add user-agent
+ - update to wrap gRPC C core library beta version 0.11.0
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>0.6.1</release>
+ <api>0.6.0</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <date>2015-10-21</date>
+ <license>BSD</license>
+ <notes>
+ - fixed undefined constant fatal error when run with apache/nginx #2275
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>0.7.0</release>
+ <api>0.7.0</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <date>2016-01-13</date>
+ <license>BSD</license>
+ <notes>
+ - Breaking change to Credentials class (removed) #3765
+ - Replaced by ChannelCredentials and CallCredentials class #3765
+ - New plugin based metadata auth API #4394
+ - Explicit ChannelCredentials::createInsecure() call
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>0.8.0</release>
+ <api>0.8.0</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <date>${"%Y-%m-%d" | strftime}</date>
+ <license>BSD</license>
+ <notes>
+ - Simplify gRPC PHP installation #4517
+ </notes>
+ </release>
+ </changelog>
+ </package>
diff --git a/templates/tools/dockerfile/apt_get_basic.include b/templates/tools/dockerfile/apt_get_basic.include
index 9237e7dace..547ce01a30 100644
--- a/templates/tools/dockerfile/apt_get_basic.include
+++ b/templates/tools/dockerfile/apt_get_basic.include
@@ -1,3 +1,4 @@
+<%page args="skip_golang=False"/>\
# Install Git and basic packages.
RUN apt-get update && apt-get install -y ${'\\'}
autoconf ${'\\'}
@@ -9,7 +10,9 @@ RUN apt-get update && apt-get install -y ${'\\'}
gcc ${'\\'}
gcc-multilib ${'\\'}
git ${'\\'}
+% if not skip_golang:
golang ${'\\'}
+% endif
gyp ${'\\'}
lcov ${'\\'}
libc6 ${'\\'}
diff --git a/templates/tools/dockerfile/run_tests_addons.include b/templates/tools/dockerfile/run_tests_addons.include
index 27ac67f5d8..30d22be298 100644
--- a/templates/tools/dockerfile/run_tests_addons.include
+++ b/templates/tools/dockerfile/run_tests_addons.include
@@ -1,7 +1,10 @@
+<%page args="skip_zookeeper=False"/>\
<%include file="ccache_setup.include"/>
+% if not skip_zookeeper:
#======================
# Zookeeper dependencies
# TODO(jtattermusch): is zookeeper still needed?
RUN apt-get install -y libzookeeper-mt-dev
+% endif
RUN mkdir /var/local/jenkins
diff --git a/templates/tools/dockerfile/test/cxx_squeeze_x64/Dockerfile.template b/templates/tools/dockerfile/test/cxx_squeeze_x64/Dockerfile.template
new file mode 100644
index 0000000000..294ae00b4c
--- /dev/null
+++ b/templates/tools/dockerfile/test/cxx_squeeze_x64/Dockerfile.template
@@ -0,0 +1,45 @@
+%YAML 1.2
+--- |
+ # 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.
+
+ FROM debian:squeeze
+
+ <%include file="../../apt_get_basic.include" args="skip_golang=True"/>
+
+ # libgflags-dev is not available on squeezy
+ RUN apt-get update && apt-get -y install libgtest-dev libc++-dev clang && apt-get clean
+
+ RUN apt-get update && apt-get -y install python-pip && apt-get clean
+ RUN pip install argparse
+
+ <%include file="../../run_tests_addons.include" args="skip_zookeeper=True"/>
+ # Define the default command.
+ CMD ["bash"]
+ \ No newline at end of file
diff --git a/templates/tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile.template b/templates/tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile.template
new file mode 100644
index 0000000000..6b30274892
--- /dev/null
+++ b/templates/tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile.template
@@ -0,0 +1,39 @@
+%YAML 1.2
+--- |
+ # 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.
+
+ FROM ubuntu:16.04
+
+ <%include file="../../apt_get_basic.include"/>
+ <%include file="../../cxx_deps.include"/>
+ <%include file="../../run_tests_addons.include"/>
+ # Define the default command.
+ CMD ["bash"]
+ \ No newline at end of file
diff --git a/templates/tools/run_tests/sources_and_headers.json.template b/templates/tools/run_tests/sources_and_headers.json.template
index 04802772af..78363ff1fa 100644
--- a/templates/tools/run_tests/sources_and_headers.json.template
+++ b/templates/tools/run_tests/sources_and_headers.json.template
@@ -12,20 +12,27 @@
out.extend(fmt % name for fmt in ['%s.grpc.pb.h', '%s.pb.h'])
return out
- def no_protos(src):
+ def no_protos_filter(src):
+ return os.path.splitext(src)[1] != '.proto'
+
+ def no_third_party_filter(src):
+ return not src.startswith('third_party/')
+
+ def filter_srcs(srcs, filters):
out = []
- for f in src:
- if os.path.splitext(f)[1] != '.proto':
- out.append(f)
+ for s in srcs:
+ filter_passes = (f(s) for f in filters)
+ if all(filter_passes):
+ out.append(s)
return out
%>
${json.dumps([{"name": tgt.name,
"language": tgt.language,
"src": sorted(
- no_protos(tgt.src) +
- tgt.get('public_headers', []) +
- tgt.get('headers', [])),
+ filter_srcs(tgt.src, (no_protos_filter, no_third_party_filter)) +
+ filter_srcs(tgt.get('public_headers', []), (no_protos_filter, no_third_party_filter)) +
+ filter_srcs(tgt.get('headers', []), (no_third_party_filter,))),
"headers": sorted(
tgt.get('public_headers', []) +
tgt.get('headers', []) +
diff --git a/templates/vsprojects/protoc.props.template b/templates/vsprojects/protoc.props.template
index a869005dae..ced6028a4b 100644
--- a/templates/vsprojects/protoc.props.template
+++ b/templates/vsprojects/protoc.props.template
@@ -4,6 +4,9 @@
<PropertyGroup Label="UserMacros" />
<PropertyGroup />
<ItemDefinitionGroup>
+ <ClCompile>
+ <DisableSpecificWarnings>4244;4267;%(DisableSpecificWarnings)</DisableSpecificWarnings>
+ </ClCompile>
<Link>
<AdditionalDependencies>libprotoc.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalLibraryDirectories>$(SolutionDir)\..\third_party\protobuf\cmake\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
diff --git a/test/cpp/common/alarm_cpp_test.cc b/test/cpp/common/alarm_cpp_test.cc
index 4745ef14ec..5d7344046c 100644
--- a/test/cpp/common/alarm_cpp_test.cc
+++ b/test/cpp/common/alarm_cpp_test.cc
@@ -55,6 +55,36 @@ TEST(AlarmTest, RegularExpiry) {
EXPECT_EQ(junk, output_tag);
}
+TEST(AlarmTest, ZeroExpiry) {
+ CompletionQueue cq;
+ void* junk = reinterpret_cast<void*>(1618033);
+ Alarm alarm(&cq, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(0), junk);
+
+ void* output_tag;
+ bool ok;
+ const CompletionQueue::NextStatus status = cq.AsyncNext(
+ (void**)&output_tag, &ok, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(0));
+
+ EXPECT_EQ(status, CompletionQueue::GOT_EVENT);
+ EXPECT_TRUE(ok);
+ EXPECT_EQ(junk, output_tag);
+}
+
+TEST(AlarmTest, NegativeExpiry) {
+ CompletionQueue cq;
+ void* junk = reinterpret_cast<void*>(1618033);
+ Alarm alarm(&cq, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(-1), junk);
+
+ void* output_tag;
+ bool ok;
+ const CompletionQueue::NextStatus status = cq.AsyncNext(
+ (void**)&output_tag, &ok, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(0));
+
+ EXPECT_EQ(status, CompletionQueue::GOT_EVENT);
+ EXPECT_TRUE(ok);
+ EXPECT_EQ(junk, output_tag);
+}
+
TEST(AlarmTest, Cancellation) {
CompletionQueue cq;
void* junk = reinterpret_cast<void*>(1618033);
diff --git a/test/cpp/grpclb/grpclb_api_test.cc b/test/cpp/grpclb/grpclb_api_test.cc
new file mode 100644
index 0000000000..bd4885fb4c
--- /dev/null
+++ b/test/cpp/grpclb/grpclb_api_test.cc
@@ -0,0 +1,133 @@
+/*
+ *
+ * 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 <gtest/gtest.h>
+#include <string>
+
+#include "src/core/client_config/lb_policies/load_balancer_api.h"
+#include "src/proto/grpc/lb/v0/load_balancer.pb.h" // C++ version
+
+namespace grpc {
+namespace {
+
+using grpc::lb::v0::LoadBalanceRequest;
+using grpc::lb::v0::LoadBalanceResponse;
+
+class GrpclbTest : public ::testing::Test {};
+
+TEST_F(GrpclbTest, CreateRequest) {
+ const std::string service_name = "AServiceName";
+ LoadBalanceRequest request;
+ grpc_grpclb_request* c_req = grpc_grpclb_request_create(service_name.c_str());
+ gpr_slice slice = grpc_grpclb_request_encode(c_req);
+ const int num_bytes_written = GPR_SLICE_LENGTH(slice);
+ EXPECT_GT(num_bytes_written, 0);
+ request.ParseFromArray(GPR_SLICE_START_PTR(slice), num_bytes_written);
+ EXPECT_EQ(request.initial_request().name(), service_name);
+ gpr_slice_unref(slice);
+ grpc_grpclb_request_destroy(c_req);
+}
+
+TEST_F(GrpclbTest, ParseResponse) {
+ LoadBalanceResponse response;
+ const std::string client_config_str = "I'm a client config";
+ auto* initial_response = response.mutable_initial_response();
+ initial_response->set_client_config(client_config_str);
+ auto* client_stats_report_interval =
+ initial_response->mutable_client_stats_report_interval();
+ client_stats_report_interval->set_seconds(123);
+ client_stats_report_interval->set_nanos(456);
+
+ const std::string encoded_response = response.SerializeAsString();
+ gpr_slice encoded_slice =
+ gpr_slice_from_copied_string(encoded_response.c_str());
+ grpc_grpclb_response* c_response = grpc_grpclb_response_parse(encoded_slice);
+ EXPECT_TRUE(c_response->has_initial_response);
+ EXPECT_TRUE(c_response->initial_response.has_client_config);
+ EXPECT_FALSE(c_response->initial_response.has_load_balancer_delegate);
+ EXPECT_TRUE(strcmp(c_response->initial_response.client_config,
+ client_config_str.c_str()) == 0);
+ EXPECT_EQ(c_response->initial_response.client_stats_report_interval.seconds,
+ 123);
+ EXPECT_EQ(c_response->initial_response.client_stats_report_interval.nanos,
+ 456);
+ gpr_slice_unref(encoded_slice);
+ grpc_grpclb_response_destroy(c_response);
+}
+
+TEST_F(GrpclbTest, ParseResponseServerList) {
+ LoadBalanceResponse response;
+ auto* serverlist = response.mutable_server_list();
+ auto* server = serverlist->add_servers();
+ server->set_ip_address("127.0.0.1");
+ server->set_port(12345);
+ server->set_drop_request(true);
+ server = response.mutable_server_list()->add_servers();
+ server->set_ip_address("10.0.0.1");
+ server->set_port(54321);
+ server->set_drop_request(false);
+ auto* expiration_interval = serverlist->mutable_expiration_interval();
+ expiration_interval->set_seconds(888);
+ expiration_interval->set_nanos(999);
+
+ const std::string encoded_response = response.SerializeAsString();
+ gpr_slice encoded_slice =
+ gpr_slice_from_copied_string(encoded_response.c_str());
+ grpc_grpclb_serverlist* c_serverlist =
+ grpc_grpclb_response_parse_serverlist(encoded_slice);
+ ASSERT_EQ(c_serverlist->num_servers, 2ul);
+ EXPECT_TRUE(c_serverlist->servers[0]->has_ip_address);
+ EXPECT_TRUE(strcmp(c_serverlist->servers[0]->ip_address, "127.0.0.1") == 0);
+ EXPECT_EQ(c_serverlist->servers[0]->port, 12345);
+ EXPECT_TRUE(c_serverlist->servers[0]->drop_request);
+ EXPECT_TRUE(c_serverlist->servers[1]->has_ip_address);
+ EXPECT_TRUE(strcmp(c_serverlist->servers[1]->ip_address, "10.0.0.1") == 0);
+ EXPECT_EQ(c_serverlist->servers[1]->port, 54321);
+ EXPECT_FALSE(c_serverlist->servers[1]->drop_request);
+
+ EXPECT_TRUE(c_serverlist->expiration_interval.has_seconds);
+ EXPECT_EQ(c_serverlist->expiration_interval.seconds, 888);
+ EXPECT_TRUE(c_serverlist->expiration_interval.has_nanos);
+ EXPECT_EQ(c_serverlist->expiration_interval.nanos, 999);
+
+ gpr_slice_unref(encoded_slice);
+ grpc_grpclb_destroy_serverlist(c_serverlist);
+}
+
+} // namespace
+} // namespace grpc
+
+int main(int argc, char** argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}
diff --git a/test/cpp/qps/qps_openloop_test.cc b/test/cpp/qps/qps_openloop_test.cc
index 0ac41d9f96..27f266b32b 100644
--- a/test/cpp/qps/qps_openloop_test.cc
+++ b/test/cpp/qps/qps_openloop_test.cc
@@ -35,6 +35,7 @@
#include <grpc/support/log.h>
+#include "test/core/util/test_config.h"
#include "test/cpp/qps/driver.h"
#include "test/cpp/qps/report.h"
#include "test/cpp/util/benchmark_config.h"
@@ -55,11 +56,11 @@ static void RunQPS() {
client_config.set_async_client_threads(8);
client_config.set_rpc_type(STREAMING);
client_config.mutable_load_params()->mutable_poisson()->set_offered_load(
- 1000.0);
+ 1000.0 / GRPC_TEST_SLOWDOWN_FACTOR);
ServerConfig server_config;
server_config.set_server_type(ASYNC_SERVER);
- server_config.set_async_server_threads(4);
+ server_config.set_async_server_threads(8);
const auto result =
RunScenario(client_config, 1, server_config, 1, WARMUP, BENCHMARK, -2);
diff --git a/test/distrib/php/distribtest.php b/test/distrib/php/distribtest.php
new file mode 100644
index 0000000000..318c6f9cf0
--- /dev/null
+++ b/test/distrib/php/distribtest.php
@@ -0,0 +1,13 @@
+<?php
+
+$channel = new Grpc\Channel('localhost:1000', [
+ 'credentials' => Grpc\ChannelCredentials::createInsecure()
+]);
+
+$deadline = Grpc\Timeval::infFuture();
+$call = new Grpc\Call($channel,
+ 'dummy_method',
+ $deadline);
+
+$call->cancel();
+$channel->close();
diff --git a/test/distrib/php/run_distrib_test.sh b/test/distrib/php/run_distrib_test.sh
new file mode 100755
index 0000000000..43b28d8429
--- /dev/null
+++ b/test/distrib/php/run_distrib_test.sh
@@ -0,0 +1,39 @@
+#!/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)
+
+cp -r $EXTERNAL_GIT_ROOT/input_artifacts/grpc-php.tgz .
+
+pecl install grpc-php.tgz
+
+php -d extension=grpc.so -d max_execution_time=300 distribtest.php
diff --git a/third_party/nanopb b/third_party/nanopb
new file mode 160000
+Subproject f8ac463766281625ad710900479130c7fcb4d63
diff --git a/tools/codegen/core/gen_load_balancing_proto.sh b/tools/codegen/core/gen_load_balancing_proto.sh
new file mode 100755
index 0000000000..fb6a468ee0
--- /dev/null
+++ b/tools/codegen/core/gen_load_balancing_proto.sh
@@ -0,0 +1,138 @@
+#!/bin/bash
+
+# Copyright 2016, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#
+# Example usage:
+# tools/codegen/core/gen_load_balancing_proto.sh \
+# src/proto/grpc/lb/v0/load_balancer.proto
+
+read -r -d '' COPYRIGHT <<'EOF'
+/*
+ *
+ * Copyright <YEAR>, 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.
+ *
+ */
+
+EOF
+
+CURRENT_YEAR=$(date +%Y)
+COPYRIGHT_FILE=$(mktemp)
+echo "${COPYRIGHT/<YEAR>/$CURRENT_YEAR}" > $COPYRIGHT_FILE
+
+set -ex
+if [ $# -eq 0 ]; then
+ echo "Usage: $0 <load_balancer.proto> [output dir]"
+ exit 1
+fi
+
+readonly GRPC_ROOT=$PWD
+
+OUTPUT_DIR="$GRPC_ROOT/src/core/proto/grpc/lb/v0"
+if [ $# -eq 2 ]; then
+ mkdir -p "$2"
+ if [ $? != 0 ]; then
+ echo "Error creating output directory $2"
+ exit 2
+ fi
+ OUTPUT_DIR="$2"
+fi
+
+readonly EXPECTED_OPTIONS_FILE_PATH="${1%.*}.options"
+
+if [[ ! -f "$1" ]]; then
+ echo "Input proto file '$1' doesn't exist."
+ exit 3
+fi
+if [[ ! -f "${EXPECTED_OPTIONS_FILE_PATH}" ]]; then
+ echo "Expected nanopb options file '${EXPECTED_OPTIONS_FILE_PATH}' missing"
+ exit 4
+fi
+
+readonly VENV_DIR=$(mktemp -d)
+readonly VENV_NAME="nanopb-$(date '+%Y%m%d_%H%M%S_%N')"
+pushd $VENV_DIR
+virtualenv $VENV_NAME
+. $VENV_NAME/bin/activate
+popd
+
+# this should be the same version as the submodule we compile against
+# ideally we'd update this as a template to ensure that
+pip install protobuf==3.0.0b2
+
+pushd "$(dirname $1)" > /dev/null
+
+protoc \
+--plugin=protoc-gen-nanopb="$GRPC_ROOT/third_party/nanopb/generator/protoc-gen-nanopb" \
+--nanopb_out='-T -L#include\ \"third_party/nanopb/pb.h\"'":$OUTPUT_DIR" \
+"$(basename $1)"
+
+readonly PROTO_BASENAME=$(basename $1 .proto)
+sed -i "s:$PROTO_BASENAME.pb.h:src/core/proto/grpc/lb/v0/$PROTO_BASENAME.pb.h:g" \
+ "$OUTPUT_DIR/$PROTO_BASENAME.pb.c"
+
+# prepend copyright
+TMPFILE=$(mktemp)
+cat $COPYRIGHT_FILE "$OUTPUT_DIR/$PROTO_BASENAME.pb.c" > $TMPFILE
+mv -v $TMPFILE "$OUTPUT_DIR/$PROTO_BASENAME.pb.c"
+cat $COPYRIGHT_FILE "$OUTPUT_DIR/$PROTO_BASENAME.pb.h" > $TMPFILE
+mv -v $TMPFILE "$OUTPUT_DIR/$PROTO_BASENAME.pb.h"
+
+deactivate
+rm -rf $VENV_DIR
+
+popd > /dev/null
diff --git a/tools/distrib/check_nanopb_output.sh b/tools/distrib/check_nanopb_output.sh
new file mode 100755
index 0000000000..5f49ebb93e
--- /dev/null
+++ b/tools/distrib/check_nanopb_output.sh
@@ -0,0 +1,68 @@
+#!/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
+
+apt-get install -y autoconf automake libtool curl python-virtualenv
+
+readonly NANOPB_TMP_OUTPUT="$(mktemp -d)"
+
+# install protoc version 3
+pushd third_party/protobuf
+./autogen.sh
+./configure
+make
+make install
+ldconfig
+popd
+
+if [ ! -x "/usr/local/bin/protoc" ]; then
+ echo "Error: protoc not found in path"
+ exit 1
+fi
+readonly PROTOC_PATH='/usr/local/bin'
+# stack up and change to nanopb's proto generator directory
+pushd third_party/nanopb/generator/proto
+PATH="$PROTOC_PATH:$PATH" make
+
+# back to the root directory
+popd
+
+
+# nanopb-compile the proto to a temp location
+PATH="$PROTOC_PATH:$PATH" ./tools/codegen/core/gen_load_balancing_proto.sh \
+ src/proto/grpc/lb/v0/load_balancer.proto \
+ $NANOPB_TMP_OUTPUT
+
+# compare outputs to checked compiled code
+if ! diff -r $NANOPB_TMP_OUTPUT src/core/proto/grpc/lb/v0; then
+ echo "Outputs differ: $NANOPB_TMP_OUTPUT vs src/core/proto/grpc/lb/v0"
+ exit 2
+fi
diff --git a/tools/dockerfile/distribtest/php_jessie_x64/Dockerfile b/tools/dockerfile/distribtest/php_jessie_x64/Dockerfile
new file mode 100644
index 0000000000..d5d3fd626f
--- /dev/null
+++ b/tools/dockerfile/distribtest/php_jessie_x64/Dockerfile
@@ -0,0 +1,32 @@
+# 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.
+
+FROM debian:jessie
+
+RUN apt-get update && apt-get install -y php5 php5-dev php-pear phpunit
diff --git a/tools/dockerfile/grpc_artifact_linux_x64/Dockerfile b/tools/dockerfile/grpc_artifact_linux_x64/Dockerfile
index 41dc427454..d048b725c8 100644
--- a/tools/dockerfile/grpc_artifact_linux_x64/Dockerfile
+++ b/tools/dockerfile/grpc_artifact_linux_x64/Dockerfile
@@ -91,6 +91,13 @@ RUN /bin/bash -l -c "echo 'export PATH=/usr/local/rvm/bin:$PATH' >> ~/.bashrc"
RUN /bin/bash -l -c "echo 'rvm --default use ruby-2.1' >> ~/.bashrc"
RUN /bin/bash -l -c "gem install bundler --no-ri --no-rdoc"
+
+##################
+# PHP dependencies
+
+RUN apt-get update && apt-get install -y \
+ php5 php5-dev php-pear phpunit
+
RUN mkdir /var/local/jenkins
# Define the default command.
diff --git a/tools/dockerfile/grpc_artifact_protoc/Dockerfile b/tools/dockerfile/grpc_artifact_protoc/Dockerfile
new file mode 100644
index 0000000000..1bbc6e021b
--- /dev/null
+++ b/tools/dockerfile/grpc_artifact_protoc/Dockerfile
@@ -0,0 +1,63 @@
+# 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.
+
+# Docker file for building protoc and gRPC protoc plugin artifacts.
+# forked from https://github.com/google/protobuf/blob/master/protoc-artifacts/Dockerfile
+
+FROM centos:6.6
+
+RUN yum install -y git \
+ tar \
+ wget \
+ make \
+ autoconf \
+ curl-devel \
+ unzip \
+ automake \
+ libtool \
+ glibc-static.i686 \
+ glibc-devel \
+ glibc-devel.i686
+
+# Install GCC 4.7 to support -static-libstdc++
+RUN wget http://people.centos.org/tru/devtools-1.1/devtools-1.1.repo -P /etc/yum.repos.d
+RUN bash -c 'echo "enabled=1" >> /etc/yum.repos.d/devtools-1.1.repo'
+RUN bash -c "sed -e 's/\$basearch/i386/g' /etc/yum.repos.d/devtools-1.1.repo > /etc/yum.repos.d/devtools-i386-1.1.repo"
+RUN sed -e 's/testing-/testing-i386-/g' -i /etc/yum.repos.d/devtools-i386-1.1.repo
+
+# We'll get and "Rpmdb checksum is invalid: dCDPT(pkg checksums)" error caused by
+# docker issue when using overlay storage driver, but all the stuff we need
+# will be installed, so for now we just ignore the error.
+# https://github.com/docker/docker/issues/10180
+RUN yum install -y devtoolset-1.1 \
+ devtoolset-1.1-libstdc++-devel \
+ devtoolset-1.1-libstdc++-devel.i686 || true
+
+# Start in devtoolset environment that uses GCC 4.7
+CMD ["scl", "enable", "devtoolset-1.1", "bash"]
diff --git a/tools/dockerfile/grpc_clang_format/clang_format_all_the_things.sh b/tools/dockerfile/grpc_clang_format/clang_format_all_the_things.sh
index dd8ea1ac30..d56bc01831 100755
--- a/tools/dockerfile/grpc_clang_format/clang_format_all_the_things.sh
+++ b/tools/dockerfile/grpc_clang_format/clang_format_all_the_things.sh
@@ -44,7 +44,7 @@ for dir in $DIRS
do
for glob in $GLOB
do
- files="$files `find /local-code/$dir -name $glob -and -not -name *.generated.*`"
+ files="$files `find /local-code/$dir -name $glob -and -not -name *.generated.* -and -not -name *.pb.h -and -not -name *.pb.c`"
done
done
diff --git a/tools/dockerfile/test/cxx_squeeze_x64/Dockerfile b/tools/dockerfile/test/cxx_squeeze_x64/Dockerfile
new file mode 100644
index 0000000000..0848887434
--- /dev/null
+++ b/tools/dockerfile/test/cxx_squeeze_x64/Dockerfile
@@ -0,0 +1,84 @@
+# 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.
+
+FROM debian:squeeze
+
+# Install Git and basic packages.
+RUN apt-get update && apt-get install -y \
+ autoconf \
+ autotools-dev \
+ build-essential \
+ bzip2 \
+ ccache \
+ curl \
+ gcc \
+ gcc-multilib \
+ git \
+ gyp \
+ lcov \
+ libc6 \
+ libc6-dbg \
+ libc6-dev \
+ libgtest-dev \
+ libtool \
+ make \
+ perl \
+ strace \
+ python-dev \
+ python-setuptools \
+ python-yaml \
+ telnet \
+ unzip \
+ wget \
+ zip && apt-get clean
+
+#================
+# Build profiling
+RUN apt-get update && apt-get install -y time && apt-get clean
+
+
+# libgflags-dev is not available on squeezy
+RUN apt-get update && apt-get -y install libgtest-dev libc++-dev clang && apt-get clean
+
+RUN apt-get update && apt-get -y install python-pip && apt-get clean
+RUN pip install argparse
+
+# Prepare ccache
+RUN ln -s /usr/bin/ccache /usr/local/bin/gcc
+RUN ln -s /usr/bin/ccache /usr/local/bin/g++
+RUN ln -s /usr/bin/ccache /usr/local/bin/cc
+RUN ln -s /usr/bin/ccache /usr/local/bin/c++
+RUN ln -s /usr/bin/ccache /usr/local/bin/clang
+RUN ln -s /usr/bin/ccache /usr/local/bin/clang++
+
+
+RUN mkdir /var/local/jenkins
+
+# Define the default command.
+CMD ["bash"]
diff --git a/tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile b/tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile
new file mode 100644
index 0000000000..c6fe79b42c
--- /dev/null
+++ b/tools/dockerfile/test/cxx_ubuntu1604_x64/Dockerfile
@@ -0,0 +1,86 @@
+# 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.
+
+FROM ubuntu:16.04
+
+# Install Git and basic packages.
+RUN apt-get update && apt-get install -y \
+ autoconf \
+ autotools-dev \
+ build-essential \
+ bzip2 \
+ ccache \
+ curl \
+ gcc \
+ gcc-multilib \
+ git \
+ golang \
+ gyp \
+ lcov \
+ libc6 \
+ libc6-dbg \
+ libc6-dev \
+ libgtest-dev \
+ libtool \
+ make \
+ perl \
+ strace \
+ python-dev \
+ python-setuptools \
+ python-yaml \
+ telnet \
+ unzip \
+ wget \
+ zip && apt-get clean
+
+#================
+# Build profiling
+RUN apt-get update && apt-get install -y time && apt-get clean
+
+#=================
+# C++ dependencies
+RUN apt-get update && apt-get -y install libgflags-dev libgtest-dev libc++-dev clang && apt-get clean
+
+# Prepare ccache
+RUN ln -s /usr/bin/ccache /usr/local/bin/gcc
+RUN ln -s /usr/bin/ccache /usr/local/bin/g++
+RUN ln -s /usr/bin/ccache /usr/local/bin/cc
+RUN ln -s /usr/bin/ccache /usr/local/bin/c++
+RUN ln -s /usr/bin/ccache /usr/local/bin/clang
+RUN ln -s /usr/bin/ccache /usr/local/bin/clang++
+
+#======================
+# Zookeeper dependencies
+# TODO(jtattermusch): is zookeeper still needed?
+RUN apt-get install -y libzookeeper-mt-dev
+
+RUN mkdir /var/local/jenkins
+
+# Define the default command.
+CMD ["bash"]
diff --git a/tools/doxygen/Doxyfile.core.internal b/tools/doxygen/Doxyfile.core.internal
index 1f9b9ecc18..b0a1561df9 100644
--- a/tools/doxygen/Doxyfile.core.internal
+++ b/tools/doxygen/Doxyfile.core.internal
@@ -787,6 +787,7 @@ src/core/channel/subchannel_call_holder.h \
src/core/client_config/client_config.h \
src/core/client_config/connector.h \
src/core/client_config/initial_connect_string.h \
+src/core/client_config/lb_policies/load_balancer_api.h \
src/core/client_config/lb_policies/pick_first.h \
src/core/client_config/lb_policies/round_robin.h \
src/core/client_config/lb_policy.h \
@@ -847,6 +848,7 @@ src/core/json/json.h \
src/core/json/json_common.h \
src/core/json/json_reader.h \
src/core/json/json_writer.h \
+src/core/proto/grpc/lb/v0/load_balancer.pb.h \
src/core/statistics/census_interface.h \
src/core/statistics/census_rpc_stats.h \
src/core/surface/api_trace.h \
@@ -903,6 +905,10 @@ src/core/tsi/transport_security_interface.h \
src/core/census/aggregation.h \
src/core/census/mlog.h \
src/core/census/rpc_metric_id.h \
+third_party/nanopb/pb.h \
+third_party/nanopb/pb_common.h \
+third_party/nanopb/pb_decode.h \
+third_party/nanopb/pb_encode.h \
src/core/census/grpc_context.c \
src/core/census/grpc_filter.c \
src/core/channel/channel_args.c \
@@ -918,6 +924,7 @@ src/core/client_config/client_config.c \
src/core/client_config/connector.c \
src/core/client_config/default_initial_connect_string.c \
src/core/client_config/initial_connect_string.c \
+src/core/client_config/lb_policies/load_balancer_api.c \
src/core/client_config/lb_policies/pick_first.c \
src/core/client_config/lb_policies/round_robin.c \
src/core/client_config/lb_policy.c \
@@ -982,6 +989,7 @@ src/core/json/json.c \
src/core/json/json_reader.c \
src/core/json/json_string.c \
src/core/json/json_writer.c \
+src/core/proto/grpc/lb/v0/load_balancer.pb.c \
src/core/surface/alarm.c \
src/core/surface/api_trace.c \
src/core/surface/byte_buffer.c \
@@ -1058,6 +1066,9 @@ src/core/census/mlog.c \
src/core/census/operation.c \
src/core/census/placeholders.c \
src/core/census/tracing.c \
+third_party/nanopb/pb_common.c \
+third_party/nanopb/pb_decode.c \
+third_party/nanopb/pb_encode.c \
include/grpc/support/alloc.h \
include/grpc/support/atm.h \
include/grpc/support/atm_gcc_atomic.h \
diff --git a/tools/jenkins/build_docker_and_run_tests.sh b/tools/jenkins/build_docker_and_run_tests.sh
index e2ac7518f0..458e8ca0c7 100755
--- a/tools/jenkins/build_docker_and_run_tests.sh
+++ b/tools/jenkins/build_docker_and_run_tests.sh
@@ -60,6 +60,9 @@ docker build -t $DOCKER_IMAGE_NAME $DOCKERFILE_DIR
# Choose random name for docker container
CONTAINER_NAME="run_tests_$(uuidgen)"
+# Git root as seen by the docker instance
+docker_instance_git_root=/var/local/jenkins/grpc
+
# Run tests inside docker
docker run \
-e "RUN_TESTS_COMMAND=$RUN_TESTS_COMMAND" \
@@ -69,9 +72,10 @@ docker run \
-e XDG_CACHE_HOME=/tmp/xdg-cache-home \
-e THIS_IS_REALLY_NEEDED='see https://github.com/docker/docker/issues/14203 for why docker is awful' \
-e HOST_GIT_ROOT=$git_root \
+ -e LOCAL_GIT_ROOT=$docker_instance_git_root \
-e "BUILD_ID=$BUILD_ID" \
-i $TTY_FLAG \
- -v "$git_root:/var/local/jenkins/grpc" \
+ -v "$git_root:$docker_instance_git_root" \
-v /tmp/ccache:/tmp/ccache \
-v /tmp/npm-cache:/tmp/npm-cache \
-v /tmp/xdg-cache-home:/tmp/xdg-cache-home \
@@ -82,11 +86,6 @@ docker run \
$DOCKER_IMAGE_NAME \
bash -l "/var/local/jenkins/grpc/$DOCKER_RUN_SCRIPT" || DOCKER_FAILED="true"
-if [ "$XML_REPORT" != "" ]
-then
- docker cp "$CONTAINER_NAME:/var/local/git/grpc/$XML_REPORT" $git_root || true
-fi
-
docker cp "$CONTAINER_NAME:/var/local/git/grpc/reports.zip" $git_root || true
unzip -o $git_root/reports.zip -d $git_root || true
rm -f reports.zip
diff --git a/tools/jenkins/docker_run_tests.sh b/tools/jenkins/docker_run_tests.sh
index 282b857351..2e40f8fd65 100755
--- a/tools/jenkins/docker_run_tests.sh
+++ b/tools/jenkins/docker_run_tests.sh
@@ -60,5 +60,6 @@ echo '</body></html>' >> index.html
cd ..
zip -r reports.zip reports
+find . -name reports.xml | xargs zip reports.zip
exit $exit_code
diff --git a/tools/jenkins/run_performance.sh b/tools/jenkins/run_performance.sh
index c80685b23a..fbc078330f 100755
--- a/tools/jenkins/run_performance.sh
+++ b/tools/jenkins/run_performance.sh
@@ -47,6 +47,11 @@ PID1=$!
bins/$config/qps_worker -driver_port 10010 &
PID2=$!
+#
+# Put a timeout on these tests
+#
+((sleep 900; kill $$ && killall qps_worker && rm -f /tmp/qps-test.$$ )&)
+
export QPS_WORKERS="localhost:10000,localhost:10010"
# big is the size in bytes of large messages (0 is the size otherwise)
diff --git a/tools/run_tests/artifact_targets.py b/tools/run_tests/artifact_targets.py
index b565fbb3f0..803d3d106b 100644
--- a/tools/run_tests/artifact_targets.py
+++ b/tools/run_tests/artifact_targets.py
@@ -79,6 +79,12 @@ def macos_arch_env(arch):
raise Exception('Unsupported arch')
return {'CFLAGS': arch_arg, 'LDFLAGS': arch_arg}
+_MACOS_COMPAT_FLAG = '-mmacosx-version-min=10.7'
+
+_ARCH_FLAG_MAP = {
+ 'x86': '-m32',
+ 'x64': '-m64'
+}
python_version_arch_map = {
'x86': 'Python27_32bits',
@@ -199,6 +205,7 @@ class CSharpExtArtifact:
def __str__(self):
return self.name
+
node_gyp_arch_map = {
'x86': 'ia32',
'x64': 'x64'
@@ -234,11 +241,72 @@ class NodeExtArtifact:
['tools/run_tests/build_artifact_node.sh',
self.gyp_arch])
+class PHPArtifact:
+ """Builds PHP PECL package"""
+
+ def __init__(self, platform, arch):
+ self.name = 'php_pecl_package_{0}_{1}'.format(platform, arch)
+ self.platform = platform
+ self.arch = arch
+ self.labels = ['artifact', 'php', platform, arch]
+
+ def pre_build_jobspecs(self):
+ return []
+
+ def build_jobspec(self):
+ return create_docker_jobspec(
+ self.name,
+ 'tools/dockerfile/grpc_artifact_linux_{}'.format(self.arch),
+ 'tools/run_tests/build_artifact_php.sh')
+
+class ProtocArtifact:
+ """Builds protoc and protoc-plugin artifacts"""
+
+ def __init__(self, platform, arch):
+ self.name = 'protoc_%s_%s' % (platform, arch)
+ self.platform = platform
+ self.arch = arch
+ self.labels = ['artifact', 'protoc', platform, arch]
+
+ def pre_build_jobspecs(self):
+ return []
+
+ def build_jobspec(self):
+ if self.platform != 'windows':
+ cxxflags = '-DNDEBUG %s' % _ARCH_FLAG_MAP[self.arch]
+ ldflags = '%s' % _ARCH_FLAG_MAP[self.arch]
+ if self.platform != 'macos':
+ ldflags += ' -static-libgcc -static-libstdc++ -s'
+ environ={'CONFIG': 'opt',
+ 'CXXFLAGS': cxxflags,
+ 'LDFLAGS': ldflags,
+ 'PROTOBUF_LDFLAGS_EXTRA': ldflags}
+ if self.platform == 'linux':
+ return create_docker_jobspec(self.name,
+ 'tools/dockerfile/grpc_artifact_protoc',
+ 'tools/run_tests/build_artifact_protoc.sh',
+ environ=environ)
+ else:
+ environ['CXXFLAGS'] += ' -std=c++11 -stdlib=libc++ %s' % _MACOS_COMPAT_FLAG
+ return create_jobspec(self.name,
+ ['tools/run_tests/build_artifact_protoc.sh'],
+ environ=environ)
+ else:
+ generator = 'Visual Studio 12 Win64' if self.arch == 'x64' else 'Visual Studio 12'
+ vcplatform = 'x64' if self.arch == 'x64' else 'Win32'
+ return create_jobspec(self.name,
+ ['tools\\run_tests\\build_artifact_protoc.bat'],
+ environ={'generator': generator,
+ 'Platform': vcplatform})
+
+ def __str__(self):
+ return self.name
+
def targets():
"""Gets list of supported targets"""
return ([Cls(platform, arch)
- for Cls in (CSharpExtArtifact, NodeExtArtifact)
+ for Cls in (CSharpExtArtifact, NodeExtArtifact, ProtocArtifact)
for platform in ('linux', 'macos', 'windows')
for arch in ('x86', 'x64')] +
[PythonArtifact('linux', 'x86'),
@@ -248,4 +316,6 @@ def targets():
PythonArtifact('windows', 'x64'),
RubyArtifact('linux', 'x86'),
RubyArtifact('linux', 'x64'),
- RubyArtifact('macos', 'x64')])
+ RubyArtifact('macos', 'x64'),
+ PHPArtifact('linux', 'x64'),
+ PHPArtifact('macos', 'x64')])
diff --git a/tools/run_tests/build_artifact_php.sh b/tools/run_tests/build_artifact_php.sh
new file mode 100755
index 0000000000..50bf0ea821
--- /dev/null
+++ b/tools/run_tests/build_artifact_php.sh
@@ -0,0 +1,40 @@
+#!/bin/bash
+# Copyright 2016, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+PHP_TARGET_ARCH=$1
+set -ex
+
+cd $(dirname $0)/../..
+
+mkdir -p artifacts
+
+pear package
+
+cp -r grpc-*.tgz artifacts/grpc-php.tgz
diff --git a/tools/run_tests/build_artifact_protoc.bat b/tools/run_tests/build_artifact_protoc.bat
new file mode 100644
index 0000000000..e1dc032188
--- /dev/null
+++ b/tools/run_tests/build_artifact_protoc.bat
@@ -0,0 +1,51 @@
+@rem Copyright 2016, Google Inc.
+@rem All rights reserved.
+@rem
+@rem Redistribution and use in source and binary forms, with or without
+@rem modification, are permitted provided that the following conditions are
+@rem met:
+@rem
+@rem * Redistributions of source code must retain the above copyright
+@rem notice, this list of conditions and the following disclaimer.
+@rem * Redistributions in binary form must reproduce the above
+@rem copyright notice, this list of conditions and the following disclaimer
+@rem in the documentation and/or other materials provided with the
+@rem distribution.
+@rem * Neither the name of Google Inc. nor the names of its
+@rem contributors may be used to endorse or promote products derived from
+@rem this software without specific prior written permission.
+@rem
+@rem THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+@rem "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+@rem LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+@rem A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+@rem OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+@rem SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+@rem LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+@rem DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+@rem THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+@rem (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+@rem OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+mkdir artifacts
+
+setlocal
+cd third_party/protobuf
+
+powershell -Command "Invoke-WebRequest https://googlemock.googlecode.com/files/gmock-1.7.0.zip -OutFile gmock.zip"
+powershell -Command "Add-Type -Assembly 'System.IO.Compression.FileSystem'; [System.IO.Compression.ZipFile]::ExtractToDirectory('gmock.zip', '.');"
+rename gmock-1.7.0 gmock
+
+cd cmake
+cmake -G "%generator%" || goto :error
+endlocal
+
+call vsprojects/build_plugins.bat || goto :error
+
+xcopy /Y third_party\protobuf\cmake\Release\protoc.exe artifacts\ || goto :error
+xcopy /Y vsprojects\Release\*_plugin.exe artifacts\ || xcopy /Y vsprojects\x64\Release\*_plugin.exe artifacts\ || goto :error
+
+goto :EOF
+
+:error
+exit /b 1 \ No newline at end of file
diff --git a/tools/run_tests/build_artifact_protoc.sh b/tools/run_tests/build_artifact_protoc.sh
new file mode 100755
index 0000000000..161d3a84d6
--- /dev/null
+++ b/tools/run_tests/build_artifact_protoc.sh
@@ -0,0 +1,41 @@
+#!/bin/bash
+# Copyright 2016, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Use devtoolset environment that has GCC 4.7 before set -ex
+source scl_source enable devtoolset-1.1
+
+set -ex
+
+cd $(dirname $0)/../..
+
+make plugins
+
+mkdir -p artifacts
+cp bins/opt/protobuf/protoc bins/opt/*_plugin artifacts/
diff --git a/tools/run_tests/build_package_php.sh b/tools/run_tests/build_package_php.sh
new file mode 100755
index 0000000000..56e3319ed9
--- /dev/null
+++ b/tools/run_tests/build_package_php.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+# Copyright 2016, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+# * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+set -ex
+
+cd $(dirname $0)/../..
+
+mkdir -p artifacts/
+cp -r $EXTERNAL_GIT_ROOT/architecture={x86,x64},language=php,platform={windows,linux,macos}/artifacts/* artifacts/ || true
diff --git a/tools/run_tests/configs.json b/tools/run_tests/configs.json
index 9d7b8a3c72..cbb8ec57b6 100644
--- a/tools/run_tests/configs.json
+++ b/tools/run_tests/configs.json
@@ -18,7 +18,7 @@
"environ": {
"ASAN_OPTIONS": "detect_leaks=0:color=always"
},
- "timeout_multiplier": 1.5
+ "timeout_multiplier": 3
},
{
"config": "ubsan",
@@ -48,18 +48,18 @@
"ASAN_OPTIONS": "detect_leaks=1:color=always",
"LSAN_OPTIONS": "suppressions=tools/lsan_suppressions.txt:report_objects=1"
},
- "timeout_multiplier": 1.5
+ "timeout_multiplier": 3
},
{
"config": "tsan",
"environ": {
"TSAN_OPTIONS": "suppressions=tools/tsan_suppressions.txt:halt_on_error=1:second_deadlock_stack=1"
},
- "timeout_multiplier": 2
+ "timeout_multiplier": 5
},
{
"config": "msan",
- "timeout_multiplier": 2
+ "timeout_multiplier": 4
},
{
"config": "mutrace"
diff --git a/tools/run_tests/distribtest_targets.py b/tools/run_tests/distribtest_targets.py
index 261f44bc6d..0c02344d90 100644
--- a/tools/run_tests/distribtest_targets.py
+++ b/tools/run_tests/distribtest_targets.py
@@ -198,6 +198,33 @@ class RubyDistribTest(object):
return self.name
+class PHPDistribTest(object):
+ """Tests PHP package"""
+
+ def __init__(self, platform, arch, docker_suffix):
+ self.name = 'php_%s_%s_%s' % (platform, arch, docker_suffix)
+ self.platform = platform
+ self.arch = arch
+ self.docker_suffix = docker_suffix
+ self.labels = ['distribtest', 'php', platform, arch, docker_suffix]
+
+ def pre_build_jobspecs(self):
+ return []
+
+ def build_jobspec(self):
+ if not self.platform == 'linux':
+ raise Exception("Not supported yet.")
+
+ return create_docker_jobspec(self.name,
+ 'tools/dockerfile/distribtest/php_%s_%s' % (
+ self.docker_suffix,
+ self.arch),
+ 'test/distrib/php/run_distrib_test.sh')
+
+ def __str__(self):
+ return self.name
+
+
def targets():
"""Gets list of supported targets"""
return [CSharpDistribTest('linux', 'x64', 'wheezy'),
@@ -241,7 +268,9 @@ def targets():
RubyDistribTest('linux', 'x64', 'ubuntu1510'),
RubyDistribTest('linux', 'x64', 'ubuntu1604'),
NodeDistribTest('macos', 'x64', None, '4'),
- NodeDistribTest('linux', 'x86', 'jessie', '4')
+ NodeDistribTest('macos', 'x64', None, '5'),
+ NodeDistribTest('linux', 'x86', 'jessie', '4'),
+ PHPDistribTest('linux', 'x64', 'jessie'),
] + [
NodeDistribTest('linux', 'x64', os, version)
for os in ('wheezy', 'jessie', 'ubuntu1204', 'ubuntu1404',
diff --git a/tools/run_tests/package_targets.py b/tools/run_tests/package_targets.py
index 4ca8279f1b..87bc4865ce 100644
--- a/tools/run_tests/package_targets.py
+++ b/tools/run_tests/package_targets.py
@@ -139,9 +139,27 @@ class PythonPackage:
'tools/run_tests/build_package_python.sh')
+class PHPPackage:
+ """Copy PHP PECL package artifact"""
+
+ def __init__(self):
+ self.name = 'php_package'
+ self.labels = ['package', 'php', 'linux']
+
+ def pre_build_jobspecs(self):
+ return []
+
+ def build_jobspec(self):
+ return create_docker_jobspec(
+ self.name,
+ 'tools/dockerfile/grpc_artifact_linux_x64',
+ 'tools/run_tests/build_package_php.sh')
+
+
def targets():
"""Gets list of supported targets"""
return [CSharpPackage(),
NodePackage(),
RubyPackage(),
- PythonPackage()]
+ PythonPackage(),
+ PHPPackage()]
diff --git a/tools/run_tests/run_tests.py b/tools/run_tests/run_tests.py
index 0b3efa29e3..7b2bc53716 100755
--- a/tools/run_tests/run_tests.py
+++ b/tools/run_tests/run_tests.py
@@ -55,8 +55,8 @@ import report_utils
import watch_dirs
-ROOT = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), '../..'))
-os.chdir(ROOT)
+_ROOT = os.path.abspath(os.path.join(os.path.dirname(sys.argv[0]), '../..'))
+os.chdir(_ROOT)
_FORCE_ENVIRON_FOR_WRAPPERS = {}
@@ -118,6 +118,16 @@ def get_c_tests(travis, test_lang) :
not (travis and tgt['flaky'])]
+def _check_compiler(compiler, supported_compilers):
+ if compiler not in supported_compilers:
+ raise Exception('Compiler %s not supported.' % compiler)
+
+
+def _is_use_docker_child():
+ """Returns True if running running as a --use_docker child."""
+ return True if os.getenv('RUN_TESTS_COMMAND') else False
+
+
class CLanguage(object):
def __init__(self, make_target, test_lang):
@@ -125,44 +135,55 @@ class CLanguage(object):
self.platform = platform_string()
self.test_lang = test_lang
- def test_specs(self, config, args):
+ def configure(self, config, args):
+ self.config = config
+ self.args = args
+ if self.platform == 'windows':
+ self._make_options = [_windows_toolset_option(self.args.compiler),
+ _windows_arch_option(self.args.arch)]
+ else:
+ self._make_options = []
+ self._docker_distro = self._get_docker_distro(self.args.use_docker,
+ self.args.compiler)
+
+ def test_specs(self):
out = []
- binaries = get_c_tests(args.travis, self.test_lang)
+ binaries = get_c_tests(self.args.travis, self.test_lang)
for target in binaries:
- if config.build_config in target['exclude_configs']:
+ if self.config.build_config in target['exclude_configs']:
continue
if self.platform == 'windows':
binary = 'vsprojects/%s%s/%s.exe' % (
- 'x64/' if args.arch == 'x64' else '',
- _WINDOWS_CONFIG[config.build_config],
+ 'x64/' if self.args.arch == 'x64' else '',
+ _MSBUILD_CONFIG[self.config.build_config],
target['name'])
else:
- binary = 'bins/%s/%s' % (config.build_config, target['name'])
+ binary = 'bins/%s/%s' % (self.config.build_config, target['name'])
if os.path.isfile(binary):
cmdline = [binary] + target['args']
- out.append(config.job_spec(cmdline, [binary],
- shortname=' '.join(cmdline),
- cpu_cost=target['cpu_cost'],
- environ={'GRPC_DEFAULT_SSL_ROOTS_FILE_PATH':
- os.path.abspath(os.path.dirname(
- sys.argv[0]) + '/../../src/core/tsi/test_creds/ca.pem')}))
- elif args.regex == '.*' or platform_string() == 'windows':
+ out.append(self.config.job_spec(cmdline, [binary],
+ shortname=' '.join(cmdline),
+ cpu_cost=target['cpu_cost'],
+ environ={'GRPC_DEFAULT_SSL_ROOTS_FILE_PATH':
+ _ROOT + '/src/core/tsi/test_creds/ca.pem'}))
+ elif self.args.regex == '.*' or self.platform == 'windows':
print '\nWARNING: binary not found, skipping', binary
return sorted(out)
- def make_targets(self, test_regex):
- if platform_string() != 'windows' and test_regex != '.*':
+ def make_targets(self):
+ test_regex = self.args.regex
+ if self.platform != 'windows' and self.args.regex != '.*':
# use the regex to minimize the number of things to build
return [os.path.basename(target['name'])
for target in get_c_tests(False, self.test_lang)
if re.search(test_regex, '/' + target['name'])]
- if platform_string() == 'windows':
+ if self.platform == 'windows':
# don't build tools on windows just yet
return ['buildtests_%s' % self.make_target]
return ['buildtests_%s' % self.make_target, 'tools_%s' % self.make_target]
def make_options(self):
- return []
+ return self._make_options;
def pre_build_steps(self):
if self.platform == 'windows':
@@ -182,11 +203,24 @@ class CLanguage(object):
def makefile_name(self):
return 'Makefile'
- def supports_multi_config(self):
- return True
+ def _get_docker_distro(self, use_docker, compiler):
+ if _is_use_docker_child():
+ return "already_under_docker"
+ if not use_docker:
+ _check_compiler(compiler, ['default'])
+
+ if compiler == 'gcc4.9' or compiler == 'default':
+ return 'jessie'
+ elif compiler == 'gcc4.4':
+ return 'squeeze'
+ elif compiler == 'gcc5.3':
+ return 'ubuntu1604'
+ else:
+ raise Exception('Compiler %s not supported.' % compiler)
- def dockerfile_dir(self, config, arch):
- return 'tools/dockerfile/test/cxx_jessie_%s' % _docker_arch_suffix(arch)
+ def dockerfile_dir(self):
+ return 'tools/dockerfile/test/cxx_%s_%s' % (self._docker_distro,
+ _docker_arch_suffix(self.args.arch))
def __str__(self):
return self.make_target
@@ -198,13 +232,18 @@ class NodeLanguage(object):
self.platform = platform_string()
self.node_version = '0.12'
- def test_specs(self, config, args):
+ def configure(self, config, args):
+ self.config = config
+ self.args = args
+ _check_compiler(self.args.compiler, ['default'])
+
+ def test_specs(self):
if self.platform == 'windows':
- return [config.job_spec(['tools\\run_tests\\run_node.bat'], None)]
+ return [self.config.job_spec(['tools\\run_tests\\run_node.bat'], None)]
else:
- return [config.job_spec(['tools/run_tests/run_node.sh', self.node_version],
- None,
- environ=_FORCE_ENVIRON_FOR_WRAPPERS)]
+ return [self.config.job_spec(['tools/run_tests/run_node.sh', self.node_version],
+ None,
+ environ=_FORCE_ENVIRON_FOR_WRAPPERS)]
def pre_build_steps(self):
if self.platform == 'windows':
@@ -212,7 +251,7 @@ class NodeLanguage(object):
else:
return [['tools/run_tests/pre_build_node.sh', self.node_version]]
- def make_targets(self, test_regex):
+ def make_targets(self):
return []
def make_options(self):
@@ -230,11 +269,8 @@ class NodeLanguage(object):
def makefile_name(self):
return 'Makefile'
- def supports_multi_config(self):
- return False
-
- def dockerfile_dir(self, config, arch):
- return 'tools/dockerfile/test/node_jessie_%s' % _docker_arch_suffix(arch)
+ def dockerfile_dir(self):
+ return 'tools/dockerfile/test/node_jessie_%s' % _docker_arch_suffix(self.args.arch)
def __str__(self):
return 'node'
@@ -242,14 +278,19 @@ class NodeLanguage(object):
class PhpLanguage(object):
- def test_specs(self, config, args):
- return [config.job_spec(['src/php/bin/run_tests.sh'], None,
- environ=_FORCE_ENVIRON_FOR_WRAPPERS)]
+ def configure(self, config, args):
+ self.config = config
+ self.args = args
+ _check_compiler(self.args.compiler, ['default'])
+
+ def test_specs(self):
+ return [self.config.job_spec(['src/php/bin/run_tests.sh'], None,
+ environ=_FORCE_ENVIRON_FOR_WRAPPERS)]
def pre_build_steps(self):
return []
- def make_targets(self, test_regex):
+ def make_targets(self):
return ['static_c', 'shared_c']
def make_options(self):
@@ -264,11 +305,8 @@ class PhpLanguage(object):
def makefile_name(self):
return 'Makefile'
- def supports_multi_config(self):
- return False
-
- def dockerfile_dir(self, config, arch):
- return 'tools/dockerfile/test/php_jessie_%s' % _docker_arch_suffix(arch)
+ def dockerfile_dir(self):
+ return 'tools/dockerfile/test/php_jessie_%s' % _docker_arch_suffix(self.args.arch)
def __str__(self):
return 'php'
@@ -280,10 +318,15 @@ class PythonLanguage(object):
self._build_python_versions = ['2.7']
self._has_python_versions = []
- def test_specs(self, config, args):
+ def configure(self, config, args):
+ self.config = config
+ self.args = args
+ _check_compiler(self.args.compiler, ['default'])
+
+ def test_specs(self):
environment = dict(_FORCE_ENVIRON_FOR_WRAPPERS)
environment['PYVER'] = '2.7'
- return [config.job_spec(
+ return [self.config.job_spec(
['tools/run_tests/run_python.sh'],
None,
environ=environment,
@@ -294,7 +337,7 @@ class PythonLanguage(object):
def pre_build_steps(self):
return []
- def make_targets(self, test_regex):
+ def make_targets(self):
return ['static_c', 'grpc_python_plugin', 'shared_c']
def make_options(self):
@@ -320,11 +363,8 @@ class PythonLanguage(object):
def makefile_name(self):
return 'Makefile'
- def supports_multi_config(self):
- return False
-
- def dockerfile_dir(self, config, arch):
- return 'tools/dockerfile/test/python_jessie_%s' % _docker_arch_suffix(arch)
+ def dockerfile_dir(self):
+ return 'tools/dockerfile/test/python_jessie_%s' % _docker_arch_suffix(self.args.arch)
def __str__(self):
return 'python'
@@ -332,15 +372,20 @@ class PythonLanguage(object):
class RubyLanguage(object):
- def test_specs(self, config, args):
- return [config.job_spec(['tools/run_tests/run_ruby.sh'], None,
- timeout_seconds=10*60,
- environ=_FORCE_ENVIRON_FOR_WRAPPERS)]
+ def configure(self, config, args):
+ self.config = config
+ self.args = args
+ _check_compiler(self.args.compiler, ['default'])
+
+ def test_specs(self):
+ return [self.config.job_spec(['tools/run_tests/run_ruby.sh'], None,
+ timeout_seconds=10*60,
+ environ=_FORCE_ENVIRON_FOR_WRAPPERS)]
def pre_build_steps(self):
return [['tools/run_tests/pre_build_ruby.sh']]
- def make_targets(self, test_regex):
+ def make_targets(self):
return []
def make_options(self):
@@ -355,27 +400,30 @@ class RubyLanguage(object):
def makefile_name(self):
return 'Makefile'
- def supports_multi_config(self):
- return False
-
- def dockerfile_dir(self, config, arch):
- return 'tools/dockerfile/test/ruby_jessie_%s' % _docker_arch_suffix(arch)
+ def dockerfile_dir(self):
+ return 'tools/dockerfile/test/ruby_jessie_%s' % _docker_arch_suffix(self.args.arch)
def __str__(self):
return 'ruby'
class CSharpLanguage(object):
+
def __init__(self):
self.platform = platform_string()
- def test_specs(self, config, args):
+ def configure(self, config, args):
+ self.config = config
+ self.args = args
+ _check_compiler(self.args.compiler, ['default'])
+
+ def test_specs(self):
with open('src/csharp/tests.json') as f:
tests_json = json.load(f)
assemblies = tests_json['assemblies']
tests = tests_json['tests']
- msbuild_config = _WINDOWS_CONFIG[config.build_config]
+ msbuild_config = _MSBUILD_CONFIG[self.config.build_config]
assembly_files = ['%s/bin/%s/%s.dll' % (a, msbuild_config, a)
for a in assemblies]
@@ -387,13 +435,13 @@ class CSharpLanguage(object):
else:
script_name = 'tools/run_tests/run_csharp.sh'
- if config.build_config == 'gcov':
+ if self.config.build_config == 'gcov':
# On Windows, we only collect C# code coverage.
# On Linux, we only collect coverage for native extension.
# For code coverage all tests need to run as one suite.
- return [config.job_spec([script_name] + extra_args, None,
- shortname='csharp.coverage',
- environ=_FORCE_ENVIRON_FOR_WRAPPERS)]
+ return [self.config.job_spec([script_name] + extra_args, None,
+ shortname='csharp.coverage',
+ environ=_FORCE_ENVIRON_FOR_WRAPPERS)]
else:
specs = []
for test in tests:
@@ -402,9 +450,9 @@ class CSharpLanguage(object):
# use different output directory for each test to prevent
# TestResult.xml clash between parallel test runs.
cmdline += ['-work=test-result/%s' % uuid.uuid4()]
- specs.append(config.job_spec(cmdline, None,
- shortname='csharp.%s' % test,
- environ=_FORCE_ENVIRON_FOR_WRAPPERS))
+ specs.append(self.config.job_spec(cmdline, None,
+ shortname='csharp.%s' % test,
+ environ=_FORCE_ENVIRON_FOR_WRAPPERS))
return specs
def pre_build_steps(self):
@@ -413,7 +461,7 @@ class CSharpLanguage(object):
else:
return [['tools/run_tests/pre_build_csharp.sh']]
- def make_targets(self, test_regex):
+ def make_targets(self):
# For Windows, this target doesn't really build anything,
# everything is build by buildall script later.
if self.platform == 'windows':
@@ -440,11 +488,8 @@ class CSharpLanguage(object):
def makefile_name(self):
return 'Makefile'
- def supports_multi_config(self):
- return False
-
- def dockerfile_dir(self, config, arch):
- return 'tools/dockerfile/test/csharp_jessie_%s' % _docker_arch_suffix(arch)
+ def dockerfile_dir(self):
+ return 'tools/dockerfile/test/csharp_jessie_%s' % _docker_arch_suffix(self.args.arch)
def __str__(self):
return 'csharp'
@@ -452,14 +497,19 @@ class CSharpLanguage(object):
class ObjCLanguage(object):
- def test_specs(self, config, args):
- return [config.job_spec(['src/objective-c/tests/run_tests.sh'], None,
- environ=_FORCE_ENVIRON_FOR_WRAPPERS)]
+ def configure(self, config, args):
+ self.config = config
+ self.args = args
+ _check_compiler(self.args.compiler, ['default'])
+
+ def test_specs(self):
+ return [self.config.job_spec(['src/objective-c/tests/run_tests.sh'], None,
+ environ=_FORCE_ENVIRON_FOR_WRAPPERS)]
def pre_build_steps(self):
return []
- def make_targets(self, test_regex):
+ def make_targets(self):
return ['grpc_objective_c_plugin', 'interop_server']
def make_options(self):
@@ -474,10 +524,7 @@ class ObjCLanguage(object):
def makefile_name(self):
return 'Makefile'
- def supports_multi_config(self):
- return False
-
- def dockerfile_dir(self, config, arch):
+ def dockerfile_dir(self):
return None
def __str__(self):
@@ -486,18 +533,23 @@ class ObjCLanguage(object):
class Sanity(object):
- def test_specs(self, config, args):
+ def configure(self, config, args):
+ self.config = config
+ self.args = args
+ _check_compiler(self.args.compiler, ['default'])
+
+ def test_specs(self):
import yaml
with open('tools/run_tests/sanity/sanity_tests.yaml', 'r') as f:
- return [config.job_spec(cmd['script'].split(), None,
- timeout_seconds=None, environ={'TEST': 'true'},
- cpu_cost=cmd.get('cpu_cost', 1))
+ return [self.config.job_spec(cmd['script'].split(), None,
+ timeout_seconds=None, environ={'TEST': 'true'},
+ cpu_cost=cmd.get('cpu_cost', 1))
for cmd in yaml.load(f)]
def pre_build_steps(self):
return []
- def make_targets(self, test_regex):
+ def make_targets(self):
return ['run_dep_checks']
def make_options(self):
@@ -512,55 +564,18 @@ class Sanity(object):
def makefile_name(self):
return 'Makefile'
- def supports_multi_config(self):
- return False
-
- def dockerfile_dir(self, config, arch):
+ def dockerfile_dir(self):
return 'tools/dockerfile/test/sanity'
def __str__(self):
return 'sanity'
-class Build(object):
-
- def test_specs(self, config, args):
- return []
-
- def pre_build_steps(self):
- return []
-
- def make_targets(self, test_regex):
- return ['static']
-
- def make_options(self):
- return []
-
- def build_steps(self):
- return []
-
- def post_tests_steps(self):
- return []
-
- def makefile_name(self):
- return 'Makefile'
-
- def supports_multi_config(self):
- return True
-
- def dockerfile_dir(self, config, arch):
- return None
-
- def __str__(self):
- return self.make_target
-
-
# different configurations we can run under
with open('tools/run_tests/configs.json') as f:
_CONFIGS = dict((cfg['config'], Config(**cfg)) for cfg in ast.literal_eval(f.read()))
-_DEFAULT = ['opt']
_LANGUAGES = {
'c++': CLanguage('cxx', 'c++'),
'c': CLanguage('c', 'c'),
@@ -570,11 +585,11 @@ _LANGUAGES = {
'ruby': RubyLanguage(),
'csharp': CSharpLanguage(),
'objc' : ObjCLanguage(),
- 'sanity': Sanity(),
- 'build': Build(),
+ 'sanity': Sanity()
}
-_WINDOWS_CONFIG = {
+
+_MSBUILD_CONFIG = {
'dbg': 'Debug',
'opt': 'Release',
'gcov': 'Debug',
@@ -651,14 +666,6 @@ def _docker_arch_suffix(arch):
sys.exit(1)
-def _get_dockerfile_dir(language, cfg, arch):
- """Returns dockerfile to use"""
- custom = language.dockerfile_dir(cfg, arch)
- if custom:
- return custom
- else:
- return 'tools/dockerfile/grpc_tests_multilang_%s' % _docker_arch_suffix(arch)
-
def runs_per_test_type(arg_str):
"""Auxilary function to parse the "runs_per_test" flag.
@@ -682,9 +689,8 @@ def runs_per_test_type(arg_str):
# parse command line
argp = argparse.ArgumentParser(description='Run grpc tests.')
argp.add_argument('-c', '--config',
- choices=['all'] + sorted(_CONFIGS.keys()),
- nargs='+',
- default=_DEFAULT)
+ choices=sorted(_CONFIGS.keys()),
+ default='opt')
argp.add_argument('-n', '--runs_per_test', default=1, type=runs_per_test_type,
help='A positive integer or "inf". If "inf", all tests will run in an '
'infinite loop. Especially useful in combination with "-f"')
@@ -728,9 +734,11 @@ argp.add_argument('--arch',
default='default',
help='Selects architecture to target. For some platforms "default" is the only supported choice.')
argp.add_argument('--compiler',
- choices=['default', 'vs2010', 'vs2013', 'vs2015'],
+ choices=['default',
+ 'gcc4.4', 'gcc4.9', 'gcc5.3',
+ 'vs2010', 'vs2013', 'vs2015'],
default='default',
- help='Selects compiler to use. For some platforms "default" is the only supported choice.')
+ help='Selects compiler to use. Allowed values depend on the platform and language.')
argp.add_argument('--build_only',
default=False,
action='store_const',
@@ -776,11 +784,8 @@ if need_to_regenerate_projects:
# grab config
-run_configs = set(_CONFIGS[cfg]
- for cfg in itertools.chain.from_iterable(
- _CONFIGS.iterkeys() if x == 'all' else [x]
- for x in args.config))
-build_configs = set(cfg.build_config for cfg in run_configs)
+run_config = _CONFIGS[args.config]
+build_config = run_config.build_config
if args.travis:
_FORCE_ENVIRON_FOR_WRAPPERS = {'GRPC_TRACE': 'api'}
@@ -791,17 +796,13 @@ else:
lang_list = args.language
# We don't support code coverage on some languages
if 'gcov' in args.config:
- for bad in ['objc', 'sanity', 'build']:
+ for bad in ['objc', 'sanity']:
if bad in lang_list:
lang_list.remove(bad)
languages = set(_LANGUAGES[l] for l in lang_list)
-
-if len(build_configs) > 1:
- for language in languages:
- if not language.supports_multi_config():
- print language, 'does not support multiple build configurations'
- sys.exit(1)
+for l in languages:
+ l.configure(run_config, args)
language_make_options=[]
if any(language.make_options() for language in languages):
@@ -811,10 +812,6 @@ if any(language.make_options() for language in languages):
else:
language_make_options = next(iter(languages)).make_options()
-if len(languages) != 1 or len(build_configs) != 1:
- print 'Multi-language and multi-config testing is not supported.'
- sys.exit(1)
-
if args.use_docker:
if not args.travis:
print 'Seen --use_docker flag, will run tests under docker.'
@@ -824,14 +821,18 @@ if args.use_docker:
print 'copied to the docker environment.'
time.sleep(5)
+ dockerfile_dirs = set([l.dockerfile_dir() for l in languages])
+ if len(dockerfile_dirs) > 1:
+ print 'Languages to be tested require running under different docker images.'
+ sys.exit(1)
+ dockerfile_dir = next(iter(dockerfile_dirs))
+
child_argv = [ arg for arg in sys.argv if not arg == '--use_docker' ]
run_tests_cmd = 'python tools/run_tests/run_tests.py %s' % ' '.join(child_argv[1:])
env = os.environ.copy()
env['RUN_TESTS_COMMAND'] = run_tests_cmd
- env['DOCKERFILE_DIR'] = _get_dockerfile_dir(next(iter(languages)),
- next(iter(build_configs)),
- args.arch)
+ env['DOCKERFILE_DIR'] = dockerfile_dir
env['DOCKER_RUN_SCRIPT'] = 'tools/jenkins/docker_run_tests.sh'
if args.xml_report:
env['XML_REPORT'] = args.xml_report
@@ -843,10 +844,6 @@ if args.use_docker:
env=env)
sys.exit(0)
-if platform_string() != 'windows' and args.compiler != 'default':
- print 'Compiler %s not supported on current platform.' % args.compiler
- sys.exit(1)
-
_check_arch_option(args.arch)
def make_jobspec(cfg, targets, makefile='Makefile'):
@@ -861,9 +858,7 @@ def make_jobspec(cfg, targets, makefile='Makefile'):
return [
jobset.JobSpec([_windows_build_bat(args.compiler),
'vsprojects\\%s.sln' % target,
- '/p:Configuration=%s' % _WINDOWS_CONFIG[cfg],
- _windows_toolset_option(args.compiler),
- _windows_arch_option(args.arch)] +
+ '/p:Configuration=%s' % _MSBUILD_CONFIG[cfg]] +
extra_args +
language_make_options,
shell=True, timeout_seconds=None)
@@ -886,32 +881,29 @@ make_targets = {}
for l in languages:
makefile = l.makefile_name()
make_targets[makefile] = make_targets.get(makefile, set()).union(
- set(l.make_targets(args.regex)))
+ set(l.make_targets()))
def build_step_environ(cfg):
environ = {'CONFIG': cfg}
- msbuild_cfg = _WINDOWS_CONFIG.get(cfg)
+ msbuild_cfg = _MSBUILD_CONFIG.get(cfg)
if msbuild_cfg:
environ['MSBUILD_CONFIG'] = msbuild_cfg
return environ
build_steps = list(set(
- jobset.JobSpec(cmdline, environ=build_step_environ(cfg), flake_retries=5)
- for cfg in build_configs
+ jobset.JobSpec(cmdline, environ=build_step_environ(build_config), flake_retries=5)
for l in languages
for cmdline in l.pre_build_steps()))
if make_targets:
- make_commands = itertools.chain.from_iterable(make_jobspec(cfg, list(targets), makefile) for cfg in build_configs for (makefile, targets) in make_targets.iteritems())
+ make_commands = itertools.chain.from_iterable(make_jobspec(build_config, list(targets), makefile) for (makefile, targets) in make_targets.iteritems())
build_steps.extend(set(make_commands))
build_steps.extend(set(
- jobset.JobSpec(cmdline, environ=build_step_environ(cfg), timeout_seconds=None)
- for cfg in build_configs
+ jobset.JobSpec(cmdline, environ=build_step_environ(build_config), timeout_seconds=None)
for l in languages
for cmdline in l.build_steps()))
post_tests_steps = list(set(
- jobset.JobSpec(cmdline, environ=build_step_environ(cfg))
- for cfg in build_configs
+ jobset.JobSpec(cmdline, environ=build_step_environ(build_config))
for l in languages
for cmdline in l.post_tests_steps()))
runs_per_test = args.runs_per_test
@@ -1024,7 +1016,7 @@ def _start_port_server(port_server_port):
print 'last ditch attempt to contact port server succeeded'
break
except:
- traceback.print_exc();
+ traceback.print_exc()
port_log = open(logfile, 'r').read()
print port_log
sys.exit(1)
@@ -1044,7 +1036,7 @@ def _start_port_server(port_server_port):
time.sleep(1)
waits += 1
except:
- traceback.print_exc();
+ traceback.print_exc()
port_server.kill()
raise
@@ -1102,9 +1094,8 @@ def _build_and_run(
infinite_runs = runs_per_test == 0
one_run = set(
spec
- for config in run_configs
for language in languages
- for spec in language.test_specs(config, args)
+ for spec in language.test_specs()
if re.search(args.regex, spec.shortname))
# When running on travis, we want out test runs to be as similar as possible
# for reproducibility purposes.
diff --git a/tools/run_tests/sanity/check_submodules.sh b/tools/run_tests/sanity/check_submodules.sh
index f49230e49a..3c6dbb9ea1 100755
--- a/tools/run_tests/sanity/check_submodules.sh
+++ b/tools/run_tests/sanity/check_submodules.sh
@@ -44,6 +44,7 @@ cat << EOF | awk '{ print $1 }' | sort > $want_submodules
9f897b25800d2f54f5c442ef01a60721aeca6d87 third_party/boringssl (version_for_cocoapods_1.0-67-g9f897b2)
05b155ff59114735ec8cd089f669c4c3d8f59029 third_party/gflags (v2.1.0-45-g05b155f)
c99458533a9b4c743ed51537e25989ea55944908 third_party/googletest (release-1.7.0)
+ f8ac463766281625ad710900479130c7fcb4d63b third_party/nanopb (nanopb-0.3.4-29-gf8ac463)
d5fb408ddc281ffcadeb08699e65bb694656d0bd third_party/protobuf (v3.0.0-beta-2)
50893291621658f355bc5b4d450a8d06a563053d third_party/zlib (v1.2.8)
EOF
diff --git a/tools/run_tests/sanity/check_version.py b/tools/run_tests/sanity/check_version.py
new file mode 100755
index 0000000000..41dd5efe38
--- /dev/null
+++ b/tools/run_tests/sanity/check_version.py
@@ -0,0 +1,97 @@
+#!/usr/bin/env python2.7
+
+# 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.
+
+import sys
+import yaml
+import os
+import re
+import subprocess
+
+errors = 0
+
+os.chdir(os.path.join(os.path.dirname(sys.argv[0]), '../../..'))
+
+# hack import paths to pick up extra code
+sys.path.insert(0, os.path.abspath('tools/buildgen/plugins'))
+from expand_version import Version
+
+try:
+ branch_name = subprocess.check_output(
+ 'git rev-parse --abbrev-ref HEAD',
+ shell=True)
+except:
+ print 'WARNING: not a git repository'
+ branch_name = None
+
+if branch_name is not None:
+ m = re.match(r'^release-([0-9]+)_([0-9]+)$', branch_name)
+ if m:
+ print 'RELEASE branch'
+ # version number should align with the branched version
+ check_version = lambda version: (
+ version.major == int(m.group(1)) and
+ version.minor == int(m.group(2)))
+ warning = 'Version key "%%s" value "%%s" should have a major version %s and minor version %s' % (m.group(1), m.group(2))
+ elif re.match(r'^debian/.*$', branch_name):
+ # no additional version checks for debian branches
+ check_version = lambda version: True
+ else:
+ # all other branches should have a -dev tag
+ check_version = lambda version: version.tag == 'dev'
+ warning = 'Version key "%s" value "%s" should have a -dev tag'
+else:
+ check_version = lambda version: True
+
+with open('build.yaml', 'r') as f:
+ build_yaml = yaml.load(f.read())
+
+settings = build_yaml['settings']
+
+top_version = Version(settings['version'])
+if not check_version(top_version):
+ errors += 1
+ print warning % ('version', top_version)
+
+for tag, value in settings.iteritems():
+ if re.match(r'^[a-z]+_version$', tag):
+ value = Version(value)
+ if value.major != top_version.major:
+ errors += 1
+ print 'major version mismatch on %s: %d vs %d' % (tag, value.major, top_version.major)
+ if value.minor != top_version.minor:
+ errors += 1
+ print 'minor version mismatch on %s: %d vs %d' % (tag, value.minor, top_version.minor)
+ if not check_version(value):
+ errors += 1
+ print warning % (tag, value)
+
+sys.exit(errors)
+
diff --git a/tools/run_tests/sanity/sanity_tests.yaml b/tools/run_tests/sanity/sanity_tests.yaml
index 809e6ce645..cffc180fb0 100644
--- a/tools/run_tests/sanity/sanity_tests.yaml
+++ b/tools/run_tests/sanity/sanity_tests.yaml
@@ -1,9 +1,11 @@
# a set of tests that are run in parallel for sanity tests
+- script: tools/run_tests/sanity/check_cache_mk.sh
- script: tools/run_tests/sanity/check_sources_and_headers.py
- script: tools/run_tests/sanity/check_submodules.sh
-- script: tools/run_tests/sanity/check_cache_mk.sh
+- script: tools/run_tests/sanity/check_version.py
- script: tools/buildgen/generate_projects.sh -j 3
cpu_cost: 3
- script: tools/distrib/check_copyright.py
- script: tools/distrib/clang_format_code.sh
- script: tools/distrib/check_trailing_newlines.sh
+- script: tools/distrib/check_nanopb_output.sh
diff --git a/tools/run_tests/sources_and_headers.json b/tools/run_tests/sources_and_headers.json
index e44a7bc79e..88e7343399 100644
--- a/tools/run_tests/sources_and_headers.json
+++ b/tools/run_tests/sources_and_headers.json
@@ -1660,6 +1660,23 @@
},
{
"deps": [
+ "grpc",
+ "grpc++",
+ "grpc++_test_util",
+ "grpc_test_util"
+ ],
+ "headers": [
+ "src/proto/grpc/lb/v0/load_balancer.grpc.pb.h",
+ "src/proto/grpc/lb/v0/load_balancer.pb.h"
+ ],
+ "language": "c++",
+ "name": "grpclb_api_test",
+ "src": [
+ "test/cpp/grpclb/grpclb_api_test.cc"
+ ]
+ },
+ {
+ "deps": [
"gpr",
"gpr_test_util",
"grpc",
@@ -2998,6 +3015,7 @@
"src/core/client_config/client_config.h",
"src/core/client_config/connector.h",
"src/core/client_config/initial_connect_string.h",
+ "src/core/client_config/lb_policies/load_balancer_api.h",
"src/core/client_config/lb_policies/pick_first.h",
"src/core/client_config/lb_policies/round_robin.h",
"src/core/client_config/lb_policy.h",
@@ -3058,6 +3076,7 @@
"src/core/json/json_common.h",
"src/core/json/json_reader.h",
"src/core/json/json_writer.h",
+ "src/core/proto/grpc/lb/v0/load_balancer.pb.h",
"src/core/security/auth_filters.h",
"src/core/security/base64.h",
"src/core/security/credentials.h",
@@ -3110,7 +3129,11 @@
"src/core/tsi/ssl_transport_security.h",
"src/core/tsi/ssl_types.h",
"src/core/tsi/transport_security.h",
- "src/core/tsi/transport_security_interface.h"
+ "src/core/tsi/transport_security_interface.h",
+ "third_party/nanopb/pb.h",
+ "third_party/nanopb/pb_common.h",
+ "third_party/nanopb/pb_decode.h",
+ "third_party/nanopb/pb_encode.h"
],
"language": "c",
"name": "grpc",
@@ -3166,6 +3189,8 @@
"src/core/client_config/default_initial_connect_string.c",
"src/core/client_config/initial_connect_string.c",
"src/core/client_config/initial_connect_string.h",
+ "src/core/client_config/lb_policies/load_balancer_api.c",
+ "src/core/client_config/lb_policies/load_balancer_api.h",
"src/core/client_config/lb_policies/pick_first.c",
"src/core/client_config/lb_policies/pick_first.h",
"src/core/client_config/lb_policies/round_robin.c",
@@ -3291,6 +3316,8 @@
"src/core/json/json_string.c",
"src/core/json/json_writer.c",
"src/core/json/json_writer.h",
+ "src/core/proto/grpc/lb/v0/load_balancer.pb.c",
+ "src/core/proto/grpc/lb/v0/load_balancer.pb.h",
"src/core/security/auth_filters.h",
"src/core/security/base64.c",
"src/core/security/base64.h",
@@ -3537,6 +3564,7 @@
"src/core/client_config/client_config.h",
"src/core/client_config/connector.h",
"src/core/client_config/initial_connect_string.h",
+ "src/core/client_config/lb_policies/load_balancer_api.h",
"src/core/client_config/lb_policies/pick_first.h",
"src/core/client_config/lb_policies/round_robin.h",
"src/core/client_config/lb_policy.h",
@@ -3597,6 +3625,7 @@
"src/core/json/json_common.h",
"src/core/json/json_reader.h",
"src/core/json/json_writer.h",
+ "src/core/proto/grpc/lb/v0/load_balancer.pb.h",
"src/core/statistics/census_interface.h",
"src/core/statistics/census_rpc_stats.h",
"src/core/surface/api_trace.h",
@@ -3635,7 +3664,11 @@
"src/core/transport/metadata_batch.h",
"src/core/transport/static_metadata.h",
"src/core/transport/transport.h",
- "src/core/transport/transport_impl.h"
+ "src/core/transport/transport_impl.h",
+ "third_party/nanopb/pb.h",
+ "third_party/nanopb/pb_common.h",
+ "third_party/nanopb/pb_decode.h",
+ "third_party/nanopb/pb_encode.h"
],
"language": "c",
"name": "grpc_unsecure",
@@ -3690,6 +3723,8 @@
"src/core/client_config/default_initial_connect_string.c",
"src/core/client_config/initial_connect_string.c",
"src/core/client_config/initial_connect_string.h",
+ "src/core/client_config/lb_policies/load_balancer_api.c",
+ "src/core/client_config/lb_policies/load_balancer_api.h",
"src/core/client_config/lb_policies/pick_first.c",
"src/core/client_config/lb_policies/pick_first.h",
"src/core/client_config/lb_policies/round_robin.c",
@@ -3814,6 +3849,8 @@
"src/core/json/json_string.c",
"src/core/json/json_writer.c",
"src/core/json/json_writer.h",
+ "src/core/proto/grpc/lb/v0/load_balancer.pb.c",
+ "src/core/proto/grpc/lb/v0/load_balancer.pb.h",
"src/core/statistics/census_interface.h",
"src/core/statistics/census_rpc_stats.h",
"src/core/surface/alarm.c",
diff --git a/tools/run_tests/tests.json b/tools/run_tests/tests.json
index ea9c129101..8868e2a93e 100644
--- a/tools/run_tests/tests.json
+++ b/tools/run_tests/tests.json
@@ -2051,6 +2051,26 @@
"exclude_configs": [],
"flaky": false,
"language": "c++",
+ "name": "grpclb_api_test",
+ "platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ]
+ },
+ {
+ "args": [],
+ "ci_platforms": [
+ "linux",
+ "mac",
+ "posix",
+ "windows"
+ ],
+ "cpu_cost": 1.0,
+ "exclude_configs": [],
+ "flaky": false,
+ "language": "c++",
"name": "hybrid_end2end_test",
"platforms": [
"linux",
@@ -2104,7 +2124,7 @@
"mac",
"posix"
],
- "cpu_cost": 1.0,
+ "cpu_cost": 10,
"exclude_configs": [],
"flaky": false,
"language": "c++",
@@ -2123,9 +2143,7 @@
"posix"
],
"cpu_cost": 10,
- "exclude_configs": [
- "tsan"
- ],
+ "exclude_configs": [],
"flaky": false,
"language": "c++",
"name": "qps_test",
diff --git a/vsprojects/protoc.props b/vsprojects/protoc.props
index ecaf248446..1bdc07193b 100644
--- a/vsprojects/protoc.props
+++ b/vsprojects/protoc.props
@@ -1 +1 @@
-<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ImportGroup Label="PropertySheets" /> <PropertyGroup Label="UserMacros" /> <PropertyGroup /> <ItemDefinitionGroup> <Link> <AdditionalDependencies>libprotoc.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalLibraryDirectories>$(SolutionDir)\..\third_party\protobuf\cmake\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> </ItemDefinitionGroup> <ItemGroup /> </Project> \ No newline at end of file
+<?xml version="1.0" encoding="utf-8"?> <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ImportGroup Label="PropertySheets" /> <PropertyGroup Label="UserMacros" /> <PropertyGroup /> <ItemDefinitionGroup> <ClCompile> <DisableSpecificWarnings>4244;4267;%(DisableSpecificWarnings)</DisableSpecificWarnings> </ClCompile> <Link> <AdditionalDependencies>libprotoc.lib;%(AdditionalDependencies)</AdditionalDependencies> <AdditionalLibraryDirectories>$(SolutionDir)\..\third_party\protobuf\cmake\$(Configuration);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> </Link> </ItemDefinitionGroup> <ItemGroup /> </Project> \ No newline at end of file
diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj b/vsprojects/vcxproj/grpc/grpc.vcxproj
index c8e73ef633..4b39ff284f 100644
--- a/vsprojects/vcxproj/grpc/grpc.vcxproj
+++ b/vsprojects/vcxproj/grpc/grpc.vcxproj
@@ -296,6 +296,7 @@
<ClInclude Include="$(SolutionDir)\..\src\core\client_config\client_config.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\client_config\connector.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\client_config\initial_connect_string.h" />
+ <ClInclude Include="$(SolutionDir)\..\src\core\client_config\lb_policies\load_balancer_api.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\client_config\lb_policies\pick_first.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\client_config\lb_policies\round_robin.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\client_config\lb_policy.h" />
@@ -356,6 +357,7 @@
<ClInclude Include="$(SolutionDir)\..\src\core\json\json_common.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\json\json_reader.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\json\json_writer.h" />
+ <ClInclude Include="$(SolutionDir)\..\src\core\proto\grpc\lb\v0\load_balancer.pb.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\statistics\census_interface.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\statistics\census_rpc_stats.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\surface\api_trace.h" />
@@ -412,6 +414,10 @@
<ClInclude Include="$(SolutionDir)\..\src\core\census\aggregation.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\census\mlog.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\census\rpc_metric_id.h" />
+ <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb.h" />
+ <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb_common.h" />
+ <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb_decode.h" />
+ <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb_encode.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="$(SolutionDir)\..\src\core\census\grpc_context.c">
@@ -444,6 +450,8 @@
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\client_config\initial_connect_string.c">
</ClCompile>
+ <ClCompile Include="$(SolutionDir)\..\src\core\client_config\lb_policies\load_balancer_api.c">
+ </ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\client_config\lb_policies\pick_first.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\client_config\lb_policies\round_robin.c">
@@ -572,6 +580,8 @@
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\json\json_writer.c">
</ClCompile>
+ <ClCompile Include="$(SolutionDir)\..\src\core\proto\grpc\lb\v0\load_balancer.pb.c">
+ </ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\surface\alarm.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\surface\api_trace.c">
@@ -724,6 +734,12 @@
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\census\tracing.c">
</ClCompile>
+ <ClCompile Include="$(SolutionDir)\..\third_party\nanopb\pb_common.c">
+ </ClCompile>
+ <ClCompile Include="$(SolutionDir)\..\third_party\nanopb\pb_decode.c">
+ </ClCompile>
+ <ClCompile Include="$(SolutionDir)\..\third_party\nanopb\pb_encode.c">
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\gpr\gpr.vcxproj">
diff --git a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters
index 6c37894a4e..1989a47059 100644
--- a/vsprojects/vcxproj/grpc/grpc.vcxproj.filters
+++ b/vsprojects/vcxproj/grpc/grpc.vcxproj.filters
@@ -46,6 +46,9 @@
<ClCompile Include="$(SolutionDir)\..\src\core\client_config\initial_connect_string.c">
<Filter>src\core\client_config</Filter>
</ClCompile>
+ <ClCompile Include="$(SolutionDir)\..\src\core\client_config\lb_policies\load_balancer_api.c">
+ <Filter>src\core\client_config\lb_policies</Filter>
+ </ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\client_config\lb_policies\pick_first.c">
<Filter>src\core\client_config\lb_policies</Filter>
</ClCompile>
@@ -238,6 +241,9 @@
<ClCompile Include="$(SolutionDir)\..\src\core\json\json_writer.c">
<Filter>src\core\json</Filter>
</ClCompile>
+ <ClCompile Include="$(SolutionDir)\..\src\core\proto\grpc\lb\v0\load_balancer.pb.c">
+ <Filter>src\core\proto\grpc\lb\v0</Filter>
+ </ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\surface\alarm.c">
<Filter>src\core\surface</Filter>
</ClCompile>
@@ -466,6 +472,15 @@
<ClCompile Include="$(SolutionDir)\..\src\core\census\tracing.c">
<Filter>src\core\census</Filter>
</ClCompile>
+ <ClCompile Include="$(SolutionDir)\..\third_party\nanopb\pb_common.c">
+ <Filter>third_party\nanopb</Filter>
+ </ClCompile>
+ <ClCompile Include="$(SolutionDir)\..\third_party\nanopb\pb_decode.c">
+ <Filter>third_party\nanopb</Filter>
+ </ClCompile>
+ <ClCompile Include="$(SolutionDir)\..\third_party\nanopb\pb_encode.c">
+ <Filter>third_party\nanopb</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="$(SolutionDir)\..\include\grpc\grpc_security.h">
@@ -551,6 +566,9 @@
<ClInclude Include="$(SolutionDir)\..\src\core\client_config\initial_connect_string.h">
<Filter>src\core\client_config</Filter>
</ClInclude>
+ <ClInclude Include="$(SolutionDir)\..\src\core\client_config\lb_policies\load_balancer_api.h">
+ <Filter>src\core\client_config\lb_policies</Filter>
+ </ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\client_config\lb_policies\pick_first.h">
<Filter>src\core\client_config\lb_policies</Filter>
</ClInclude>
@@ -731,6 +749,9 @@
<ClInclude Include="$(SolutionDir)\..\src\core\json\json_writer.h">
<Filter>src\core\json</Filter>
</ClInclude>
+ <ClInclude Include="$(SolutionDir)\..\src\core\proto\grpc\lb\v0\load_balancer.pb.h">
+ <Filter>src\core\proto\grpc\lb\v0</Filter>
+ </ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\statistics\census_interface.h">
<Filter>src\core\statistics</Filter>
</ClInclude>
@@ -899,6 +920,18 @@
<ClInclude Include="$(SolutionDir)\..\src\core\census\rpc_metric_id.h">
<Filter>src\core\census</Filter>
</ClInclude>
+ <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb.h">
+ <Filter>third_party\nanopb</Filter>
+ </ClInclude>
+ <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb_common.h">
+ <Filter>third_party\nanopb</Filter>
+ </ClInclude>
+ <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb_decode.h">
+ <Filter>third_party\nanopb</Filter>
+ </ClInclude>
+ <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb_encode.h">
+ <Filter>third_party\nanopb</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
@@ -950,6 +983,18 @@
<Filter Include="src\core\json">
<UniqueIdentifier>{e665cc0e-b994-d7c5-cc18-2007392019f0}</UniqueIdentifier>
</Filter>
+ <Filter Include="src\core\proto">
+ <UniqueIdentifier>{1ff04466-0905-8a5d-d6f4-7ff2df4c13b5}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\core\proto\grpc">
+ <UniqueIdentifier>{7c7ad0b3-bf85-5bd3-e0c8-4f5468a8e2e6}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\core\proto\grpc\lb">
+ <UniqueIdentifier>{3d533dad-8100-e8a3-b7c3-1fc13a4d60da}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\core\proto\grpc\lb\v0">
+ <UniqueIdentifier>{0ffcf868-7617-5fed-b6ce-2162d9d09148}</UniqueIdentifier>
+ </Filter>
<Filter Include="src\core\security">
<UniqueIdentifier>{1d850ac6-e639-4eab-5338-4ba40272fcc9}</UniqueIdentifier>
</Filter>
@@ -968,6 +1013,12 @@
<Filter Include="src\core\tsi">
<UniqueIdentifier>{0b0f9ab1-efa4-7f03-e446-6fb9b5227e84}</UniqueIdentifier>
</Filter>
+ <Filter Include="third_party">
+ <UniqueIdentifier>{aaab30a4-2a15-732e-c141-3fbc0f0f5a7a}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="third_party\nanopb">
+ <UniqueIdentifier>{93d6596d-330c-1d27-6f84-3c840e57869e}</UniqueIdentifier>
+ </Filter>
</ItemGroup>
</Project>
diff --git a/vsprojects/vcxproj/grpc_plugin_support/grpc_plugin_support.vcxproj b/vsprojects/vcxproj/grpc_plugin_support/grpc_plugin_support.vcxproj
index 89183902d7..a76c883903 100644
--- a/vsprojects/vcxproj/grpc_plugin_support/grpc_plugin_support.vcxproj
+++ b/vsprojects/vcxproj/grpc_plugin_support/grpc_plugin_support.vcxproj
@@ -53,6 +53,7 @@
<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\protoc.props" />
<Import Project="$(SolutionDir)\..\vsprojects\winsock.props" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj
index 92de26ce8b..d61c5a7574 100644
--- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj
+++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj
@@ -286,6 +286,7 @@
<ClInclude Include="$(SolutionDir)\..\src\core\client_config\client_config.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\client_config\connector.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\client_config\initial_connect_string.h" />
+ <ClInclude Include="$(SolutionDir)\..\src\core\client_config\lb_policies\load_balancer_api.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\client_config\lb_policies\pick_first.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\client_config\lb_policies\round_robin.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\client_config\lb_policy.h" />
@@ -346,6 +347,7 @@
<ClInclude Include="$(SolutionDir)\..\src\core\json\json_common.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\json\json_reader.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\json\json_writer.h" />
+ <ClInclude Include="$(SolutionDir)\..\src\core\proto\grpc\lb\v0\load_balancer.pb.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\statistics\census_interface.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\statistics\census_rpc_stats.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\surface\api_trace.h" />
@@ -388,6 +390,10 @@
<ClInclude Include="$(SolutionDir)\..\src\core\census\aggregation.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\census\mlog.h" />
<ClInclude Include="$(SolutionDir)\..\src\core\census\rpc_metric_id.h" />
+ <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb.h" />
+ <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb_common.h" />
+ <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb_decode.h" />
+ <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb_encode.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="$(SolutionDir)\..\src\core\surface\init_unsecure.c">
@@ -422,6 +428,8 @@
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\client_config\initial_connect_string.c">
</ClCompile>
+ <ClCompile Include="$(SolutionDir)\..\src\core\client_config\lb_policies\load_balancer_api.c">
+ </ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\client_config\lb_policies\pick_first.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\client_config\lb_policies\round_robin.c">
@@ -550,6 +558,8 @@
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\json\json_writer.c">
</ClCompile>
+ <ClCompile Include="$(SolutionDir)\..\src\core\proto\grpc\lb\v0\load_balancer.pb.c">
+ </ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\surface\alarm.c">
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\surface\api_trace.c">
@@ -660,6 +670,12 @@
</ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\census\tracing.c">
</ClCompile>
+ <ClCompile Include="$(SolutionDir)\..\third_party\nanopb\pb_common.c">
+ </ClCompile>
+ <ClCompile Include="$(SolutionDir)\..\third_party\nanopb\pb_decode.c">
+ </ClCompile>
+ <ClCompile Include="$(SolutionDir)\..\third_party\nanopb\pb_encode.c">
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\gpr\gpr.vcxproj">
diff --git a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters
index 75600a1d59..ee51cafd25 100644
--- a/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters
+++ b/vsprojects/vcxproj/grpc_unsecure/grpc_unsecure.vcxproj.filters
@@ -49,6 +49,9 @@
<ClCompile Include="$(SolutionDir)\..\src\core\client_config\initial_connect_string.c">
<Filter>src\core\client_config</Filter>
</ClCompile>
+ <ClCompile Include="$(SolutionDir)\..\src\core\client_config\lb_policies\load_balancer_api.c">
+ <Filter>src\core\client_config\lb_policies</Filter>
+ </ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\client_config\lb_policies\pick_first.c">
<Filter>src\core\client_config\lb_policies</Filter>
</ClCompile>
@@ -241,6 +244,9 @@
<ClCompile Include="$(SolutionDir)\..\src\core\json\json_writer.c">
<Filter>src\core\json</Filter>
</ClCompile>
+ <ClCompile Include="$(SolutionDir)\..\src\core\proto\grpc\lb\v0\load_balancer.pb.c">
+ <Filter>src\core\proto\grpc\lb\v0</Filter>
+ </ClCompile>
<ClCompile Include="$(SolutionDir)\..\src\core\surface\alarm.c">
<Filter>src\core\surface</Filter>
</ClCompile>
@@ -406,6 +412,15 @@
<ClCompile Include="$(SolutionDir)\..\src\core\census\tracing.c">
<Filter>src\core\census</Filter>
</ClCompile>
+ <ClCompile Include="$(SolutionDir)\..\third_party\nanopb\pb_common.c">
+ <Filter>third_party\nanopb</Filter>
+ </ClCompile>
+ <ClCompile Include="$(SolutionDir)\..\third_party\nanopb\pb_decode.c">
+ <Filter>third_party\nanopb</Filter>
+ </ClCompile>
+ <ClCompile Include="$(SolutionDir)\..\third_party\nanopb\pb_encode.c">
+ <Filter>third_party\nanopb</Filter>
+ </ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="$(SolutionDir)\..\include\grpc\byte_buffer.h">
@@ -488,6 +503,9 @@
<ClInclude Include="$(SolutionDir)\..\src\core\client_config\initial_connect_string.h">
<Filter>src\core\client_config</Filter>
</ClInclude>
+ <ClInclude Include="$(SolutionDir)\..\src\core\client_config\lb_policies\load_balancer_api.h">
+ <Filter>src\core\client_config\lb_policies</Filter>
+ </ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\client_config\lb_policies\pick_first.h">
<Filter>src\core\client_config\lb_policies</Filter>
</ClInclude>
@@ -668,6 +686,9 @@
<ClInclude Include="$(SolutionDir)\..\src\core\json\json_writer.h">
<Filter>src\core\json</Filter>
</ClInclude>
+ <ClInclude Include="$(SolutionDir)\..\src\core\proto\grpc\lb\v0\load_balancer.pb.h">
+ <Filter>src\core\proto\grpc\lb\v0</Filter>
+ </ClInclude>
<ClInclude Include="$(SolutionDir)\..\src\core\statistics\census_interface.h">
<Filter>src\core\statistics</Filter>
</ClInclude>
@@ -794,6 +815,18 @@
<ClInclude Include="$(SolutionDir)\..\src\core\census\rpc_metric_id.h">
<Filter>src\core\census</Filter>
</ClInclude>
+ <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb.h">
+ <Filter>third_party\nanopb</Filter>
+ </ClInclude>
+ <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb_common.h">
+ <Filter>third_party\nanopb</Filter>
+ </ClInclude>
+ <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb_decode.h">
+ <Filter>third_party\nanopb</Filter>
+ </ClInclude>
+ <ClInclude Include="$(SolutionDir)\..\third_party\nanopb\pb_encode.h">
+ <Filter>third_party\nanopb</Filter>
+ </ClInclude>
</ItemGroup>
<ItemGroup>
@@ -845,6 +878,18 @@
<Filter Include="src\core\json">
<UniqueIdentifier>{443ffc61-1bea-2477-6e54-1ddf8c139264}</UniqueIdentifier>
</Filter>
+ <Filter Include="src\core\proto">
+ <UniqueIdentifier>{7f4bb22a-65ba-0f8f-6387-66b1f6677a80}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\core\proto\grpc">
+ <UniqueIdentifier>{9c2bd164-c317-8a13-564d-3b28b0fd79cf}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\core\proto\grpc\lb">
+ <UniqueIdentifier>{2bad8e10-4fc5-d8b3-e026-4abbd0c25cda}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\core\proto\grpc\lb\v0">
+ <UniqueIdentifier>{4475c8ed-e01b-8906-47d0-8a504189c0d5}</UniqueIdentifier>
+ </Filter>
<Filter Include="src\core\statistics">
<UniqueIdentifier>{e084164c-a069-00e3-db35-4e0b1cd6f0b7}</UniqueIdentifier>
</Filter>
@@ -857,6 +902,12 @@
<Filter Include="src\core\transport\chttp2">
<UniqueIdentifier>{5fcd6206-f774-9ae6-4b85-305d6a723843}</UniqueIdentifier>
</Filter>
+ <Filter Include="third_party">
+ <UniqueIdentifier>{025c051e-8eba-125b-67f9-173f95176eb2}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="third_party\nanopb">
+ <UniqueIdentifier>{6511f77d-f28c-80e0-0889-8975e688e344}</UniqueIdentifier>
+ </Filter>
</ItemGroup>
</Project>
diff --git a/vsprojects/vcxproj/test/grpclb_api_test/grpclb_api_test.vcxproj b/vsprojects/vcxproj/test/grpclb_api_test/grpclb_api_test.vcxproj
new file mode 100644
index 0000000000..1509ece9f9
--- /dev/null
+++ b/vsprojects/vcxproj/test/grpclb_api_test/grpclb_api_test.vcxproj
@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.props" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\1.0.204.1.props')" />
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{990AF023-17D7-8DBF-EB6E-14C7C016C77E}</ProjectGuid>
+ <IgnoreWarnIntDirInTempDetected>true</IgnoreWarnIntDirInTempDetected>
+ <IntDir>$(SolutionDir)IntDir\$(MSBuildProjectName)\</IntDir>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(VisualStudioVersion)' == '10.0'" Label="Configuration">
+ <PlatformToolset>v100</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(VisualStudioVersion)' == '11.0'" Label="Configuration">
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(VisualStudioVersion)' == '12.0'" Label="Configuration">
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(VisualStudioVersion)' == '14.0'" Label="Configuration">
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>true</UseDebugLibraries>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <UseDebugLibraries>false</UseDebugLibraries>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ <Import Project="$(SolutionDir)\..\vsprojects\cpptest.props" />
+ <Import Project="$(SolutionDir)\..\vsprojects\global.props" />
+ <Import Project="$(SolutionDir)\..\vsprojects\openssl.props" />
+ <Import Project="$(SolutionDir)\..\vsprojects\protobuf.props" />
+ <Import Project="$(SolutionDir)\..\vsprojects\winsock.props" />
+ <Import Project="$(SolutionDir)\..\vsprojects\zlib.props" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup Condition="'$(Configuration)'=='Debug'">
+ <TargetName>grpclb_api_test</TargetName>
+ <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
+ <Configuration-grpc_dependencies_zlib>Debug</Configuration-grpc_dependencies_zlib>
+ <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
+ <Configuration-grpc_dependencies_openssl>Debug</Configuration-grpc_dependencies_openssl>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)'=='Release'">
+ <TargetName>grpclb_api_test</TargetName>
+ <Linkage-grpc_dependencies_zlib>static</Linkage-grpc_dependencies_zlib>
+ <Configuration-grpc_dependencies_zlib>Release</Configuration-grpc_dependencies_zlib>
+ <Linkage-grpc_dependencies_openssl>static</Linkage-grpc_dependencies_openssl>
+ <Configuration-grpc_dependencies_openssl>Release</Configuration-grpc_dependencies_openssl>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat>
+ <MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation>
+ <GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>Disabled</Optimization>
+ <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <SDLCheck>true</SDLCheck>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat>
+ <MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation>
+ <GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation>
+ </Link>
+ </ItemDefinitionGroup>
+
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>MaxSpeed</Optimization>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <SDLCheck>true</SDLCheck>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat>
+ <MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation>
+ <GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <PrecompiledHeader>NotUsing</PrecompiledHeader>
+ <WarningLevel>Level3</WarningLevel>
+ <Optimization>MaxSpeed</Optimization>
+ <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <IntrinsicFunctions>true</IntrinsicFunctions>
+ <SDLCheck>true</SDLCheck>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <TreatWarningAsError>true</TreatWarningAsError>
+ <DebugInformationFormat Condition="$(Jenkins)">None</DebugInformationFormat>
+ <MinimalRebuild Condition="$(Jenkins)">false</MinimalRebuild>
+ </ClCompile>
+ <Link>
+ <SubSystem>Console</SubSystem>
+ <GenerateDebugInformation Condition="!$(Jenkins)">true</GenerateDebugInformation>
+ <GenerateDebugInformation Condition="$(Jenkins)">false</GenerateDebugInformation>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <OptimizeReferences>true</OptimizeReferences>
+ </Link>
+ </ItemDefinitionGroup>
+
+ <ItemGroup>
+ <ClCompile Include="$(SolutionDir)\..\src\proto\grpc\lb\v0\load_balancer.pb.cc">
+ </ClCompile>
+ <ClInclude Include="$(SolutionDir)\..\src\proto\grpc\lb\v0\load_balancer.pb.h">
+ </ClInclude>
+ <ClCompile Include="$(SolutionDir)\..\src\proto\grpc\lb\v0\load_balancer.grpc.pb.cc">
+ </ClCompile>
+ <ClInclude Include="$(SolutionDir)\..\src\proto\grpc\lb\v0\load_balancer.grpc.pb.h">
+ </ClInclude>
+ <ClCompile Include="$(SolutionDir)\..\test\cpp\grpclb\grpclb_api_test.cc">
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc++_test_util\grpc++_test_util.vcxproj">
+ <Project>{0BE77741-552A-929B-A497-4EF7ECE17A64}</Project>
+ </ProjectReference>
+ <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc_test_util\grpc_test_util.vcxproj">
+ <Project>{17BCAFC0-5FDC-4C94-AEB9-95F3E220614B}</Project>
+ </ProjectReference>
+ <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc++\grpc++.vcxproj">
+ <Project>{C187A093-A0FE-489D-A40A-6E33DE0F9FEB}</Project>
+ </ProjectReference>
+ <ProjectReference Include="$(SolutionDir)\..\vsprojects\vcxproj\.\grpc\grpc.vcxproj">
+ <Project>{29D16885-7228-4C31-81ED-5F9187C7F2A9}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="packages.config" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies.zlib.redist.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies\grpc.dependencies.zlib.targets')" />
+ <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies.zlib.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies\grpc.dependencies.zlib.targets')" />
+ <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies.openssl.redist.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies\grpc.dependencies.openssl.targets')" />
+ <Import Project="$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.targets" Condition="Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies\grpc.dependencies.openssl.targets')" />
+ </ImportGroup>
+ <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+ <PropertyGroup>
+ <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
+ </PropertyGroup>
+ <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies.zlib.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.redist.1.2.8.10\build\native\grpc.dependencies.zlib.redist.targets')" />
+ <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies.zlib.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.zlib.1.2.8.10\build\native\grpc.dependencies.zlib.targets')" />
+ <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies.openssl.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.redist.1.0.204.1\build\native\grpc.dependencies.openssl.redist.targets')" />
+ <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.props')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.props')" />
+ <Error Condition="!Exists('$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\..\vsprojects\packages\grpc.dependencies.openssl.1.0.204.1\build\native\grpc.dependencies.openssl.targets')" />
+ </Target>
+</Project>
+
diff --git a/vsprojects/vcxproj/test/grpclb_api_test/grpclb_api_test.vcxproj.filters b/vsprojects/vcxproj/test/grpclb_api_test/grpclb_api_test.vcxproj.filters
new file mode 100644
index 0000000000..6c57b8c162
--- /dev/null
+++ b/vsprojects/vcxproj/test/grpclb_api_test/grpclb_api_test.vcxproj.filters
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <ClCompile Include="$(SolutionDir)\..\src\proto\grpc\lb\v0\load_balancer.proto">
+ <Filter>src\proto\grpc\lb\v0</Filter>
+ </ClCompile>
+ <ClCompile Include="$(SolutionDir)\..\test\cpp\grpclb\grpclb_api_test.cc">
+ <Filter>test\cpp\grpclb</Filter>
+ </ClCompile>
+ </ItemGroup>
+
+ <ItemGroup>
+ <Filter Include="src">
+ <UniqueIdentifier>{a31d21fb-c6ab-75ce-43dc-7d6f506765e6}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\proto">
+ <UniqueIdentifier>{10d49c90-8503-9b10-6678-eed983bc25d9}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\proto\grpc">
+ <UniqueIdentifier>{8b6be783-e071-44cc-2096-f1c476012556}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\proto\grpc\lb">
+ <UniqueIdentifier>{2981699e-c196-c599-bc17-c177770f89ee}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="src\proto\grpc\lb\v0">
+ <UniqueIdentifier>{3d04774a-1c2f-e100-435e-08af5d539250}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="test">
+ <UniqueIdentifier>{64736e1d-eb77-664f-34ab-6cf41263d3d8}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="test\cpp">
+ <UniqueIdentifier>{c86e9cb1-bed4-3697-40f2-9ecff6297fa5}</UniqueIdentifier>
+ </Filter>
+ <Filter Include="test\cpp\grpclb">
+ <UniqueIdentifier>{6b5ba83a-6cf2-5a7b-0ab8-62de31882705}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+</Project>
+