Browse Source

Merge github.com:grpc/grpc into come-out-of-the-shadow

Craig Tiller 10 years ago
parent
commit
f8b14ca5f2
100 changed files with 15642 additions and 1313 deletions
  1. 4 0
      .gitignore
  2. 1 1
      .gitmodules
  3. 24 4
      BUILD
  4. 9 5
      Makefile
  5. 61 52
      build.yaml
  6. 3 2
      doc/PROTOCOL-HTTP2.md
  7. 42 42
      examples/csharp/route_guide/RouteGuide/RouteGuide.cs
  8. 36 36
      examples/csharp/route_guide/RouteGuide/RouteGuideGrpc.cs
  9. 1 1
      examples/csharp/route_guide/RouteGuide/RouteGuideUtil.cs
  10. 1 1
      examples/csharp/route_guide/RouteGuideClient/Program.cs
  11. 1 1
      examples/csharp/route_guide/RouteGuideServer/Program.cs
  12. 1 1
      examples/csharp/route_guide/RouteGuideServer/RouteGuideImpl.cs
  13. 17 8
      gRPC.podspec
  14. 12641 0
      grpc.gyp
  15. 1 1
      include/grpc++/security/auth_metadata_processor.h
  16. 21 0
      include/grpc++/security/credentials.h
  17. 40 0
      include/grpc/grpc_security.h
  18. 1 1
      src/core/channel/channel_args.h
  19. 6 2
      src/core/channel/http_client_filter.c
  20. 4 2
      src/core/channel/http_server_filter.c
  21. 4 0
      src/core/client_config/connector.c
  22. 6 0
      src/core/client_config/connector.h
  23. 23 7
      src/core/client_config/lb_policies/pick_first.c
  24. 4 5
      src/core/client_config/lb_policies/pick_first.h
  25. 549 0
      src/core/client_config/lb_policies/round_robin.c
  26. 47 0
      src/core/client_config/lb_policies/round_robin.h
  27. 47 0
      src/core/client_config/lb_policy_factory.c
  28. 73 0
      src/core/client_config/lb_policy_factory.h
  29. 88 0
      src/core/client_config/lb_policy_registry.c
  30. 54 0
      src/core/client_config/lb_policy_registry.h
  31. 11 10
      src/core/client_config/resolvers/dns_resolver.c
  32. 30 10
      src/core/client_config/resolvers/sockaddr_resolver.c
  33. 12 11
      src/core/client_config/resolvers/zookeeper_resolver.c
  34. 4 0
      src/core/client_config/subchannel.c
  35. 17 10
      src/core/httpcli/httpcli_security_connector.c
  36. 1 2
      src/core/iomgr/fd_posix.c
  37. 7 3
      src/core/iomgr/iomgr.c
  38. 1 1
      src/core/iomgr/pollset_multipoller_with_epoll.c
  39. 6 6
      src/core/iomgr/pollset_posix.c
  40. 16 0
      src/core/iomgr/tcp_client_posix.c
  41. 2 5
      src/core/iomgr/tcp_client_windows.c
  42. 3 3
      src/core/iomgr/tcp_server.h
  43. 19 14
      src/core/iomgr/tcp_server_posix.c
  44. 18 16
      src/core/iomgr/tcp_server_windows.c
  45. 2 2
      src/core/iomgr/tcp_windows.c
  46. 7 13
      src/core/iomgr/udp_server.c
  47. 3 9
      src/core/iomgr/udp_server.h
  48. 22 20
      src/core/security/client_auth_filter.c
  49. 92 0
      src/core/security/credentials.c
  50. 9 0
      src/core/security/credentials.h
  51. 106 110
      src/core/security/handshake.c
  52. 9 14
      src/core/security/handshake.h
  53. 59 30
      src/core/security/security_connector.c
  54. 14 5
      src/core/security/security_connector.h
  55. 5 7
      src/core/security/server_secure_chttp2.c
  56. 1 1
      src/core/support/log_posix.c
  57. 1 1
      src/core/support/string.c
  58. 12 4
      src/core/surface/channel_connectivity.c
  59. 3 1
      src/core/surface/channel_create.c
  60. 6 0
      src/core/surface/init.c
  61. 41 10
      src/core/surface/secure_channel_create.c
  62. 2 2
      src/core/transport/chttp2/parsing.c
  63. 60 0
      src/cpp/client/secure_credentials.cc
  64. 19 0
      src/cpp/client/secure_credentials.h
  65. 38 14
      src/csharp/Grpc.Core/Logging/ConsoleLogger.cs
  66. 18 6
      src/csharp/Grpc.Core/Logging/ILogger.cs
  67. 1 1
      src/csharp/Grpc.Core/VersionInfo.cs
  68. 1 1
      src/csharp/Grpc.IntegrationTesting/InteropClient.cs
  69. 0 1
      src/csharp/Grpc.IntegrationTesting/proto/test.proto
  70. 3 3
      src/csharp/build_packages.bat
  71. 1 1
      src/csharp/ext/grpc_csharp_ext.c
  72. 0 1
      src/node/binding.gyp
  73. 19 17
      src/node/ext/byte_buffer.cc
  74. 3 3
      src/node/ext/byte_buffer.h
  75. 248 202
      src/node/ext/call.cc
  76. 23 36
      src/node/ext/call.h
  77. 95 83
      src/node/ext/channel.cc
  78. 5 5
      src/node/ext/channel.h
  79. 13 14
      src/node/ext/completion_queue_async_worker.cc
  80. 2 2
      src/node/ext/completion_queue_async_worker.h
  81. 109 83
      src/node/ext/credentials.cc
  82. 6 6
      src/node/ext/credentials.h
  83. 171 148
      src/node/ext/node_grpc.cc
  84. 105 97
      src/node/ext/server.cc
  85. 5 5
      src/node/ext/server.h
  86. 87 66
      src/node/ext/server_credentials.cc
  87. 6 6
      src/node/ext/server_credentials.h
  88. 0 1
      src/node/interop/test.proto
  89. 2 2
      src/node/package.json
  90. 4 2
      src/node/src/server.js
  91. 1 1
      src/objective-c/GRPCClient/private/GRPCRequestHeaders.h
  92. 0 1
      src/objective-c/GRPCClient/private/GRPCRequestHeaders.m
  93. 0 1
      src/objective-c/examples/RemoteTestClient/test.proto
  94. 0 1
      src/objective-c/generated_libraries/RemoteTestClient/test.proto
  95. 136 6
      src/php/README.md
  96. 5 1
      src/php/bin/run_tests.sh
  97. 102 0
      src/php/tests/generated_code/math_client.php
  98. 0 1
      src/php/tests/interop/test.proto
  99. 2 2
      src/php/tests/unit_tests/EndToEndTest.php
  100. 1 1
      src/python/grpcio/grpc/beta/implementations.py

+ 4 - 0
.gitignore

@@ -39,3 +39,7 @@ report.xml
 
 
 # port server log
 # port server log
 portlog.txt
 portlog.txt
+
+# gyp generated make files
+*-gyp.mk
+out

+ 1 - 1
.gitmodules

@@ -8,7 +8,7 @@
 [submodule "third_party/protobuf"]
 [submodule "third_party/protobuf"]
 	path = third_party/protobuf
 	path = third_party/protobuf
 	url = https://github.com/google/protobuf.git
 	url = https://github.com/google/protobuf.git
-	branch = v3.0.0-beta-1
+	branch = v3.0.0-alpha-4.1
 [submodule "third_party/gflags"]
 [submodule "third_party/gflags"]
 	path = third_party/gflags
 	path = third_party/gflags
 	url = https://github.com/gflags/gflags.git
 	url = https://github.com/gflags/gflags.git

+ 24 - 4
BUILD

@@ -134,10 +134,10 @@ cc_library(
     "src/core/security/auth_filters.h",
     "src/core/security/auth_filters.h",
     "src/core/security/base64.h",
     "src/core/security/base64.h",
     "src/core/security/credentials.h",
     "src/core/security/credentials.h",
+    "src/core/security/handshake.h",
     "src/core/security/json_token.h",
     "src/core/security/json_token.h",
     "src/core/security/jwt_verifier.h",
     "src/core/security/jwt_verifier.h",
     "src/core/security/secure_endpoint.h",
     "src/core/security/secure_endpoint.h",
-    "src/core/security/secure_transport_setup.h",
     "src/core/security/security_connector.h",
     "src/core/security/security_connector.h",
     "src/core/security/security_context.h",
     "src/core/security/security_context.h",
     "src/core/tsi/fake_transport_security.h",
     "src/core/tsi/fake_transport_security.h",
@@ -157,7 +157,10 @@ cc_library(
     "src/core/client_config/client_config.h",
     "src/core/client_config/client_config.h",
     "src/core/client_config/connector.h",
     "src/core/client_config/connector.h",
     "src/core/client_config/lb_policies/pick_first.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",
     "src/core/client_config/lb_policy.h",
+    "src/core/client_config/lb_policy_factory.h",
+    "src/core/client_config/lb_policy_registry.h",
     "src/core/client_config/resolver.h",
     "src/core/client_config/resolver.h",
     "src/core/client_config/resolver_factory.h",
     "src/core/client_config/resolver_factory.h",
     "src/core/client_config/resolver_registry.h",
     "src/core/client_config/resolver_registry.h",
@@ -256,10 +259,10 @@ cc_library(
     "src/core/security/credentials_posix.c",
     "src/core/security/credentials_posix.c",
     "src/core/security/credentials_win32.c",
     "src/core/security/credentials_win32.c",
     "src/core/security/google_default_credentials.c",
     "src/core/security/google_default_credentials.c",
+    "src/core/security/handshake.c",
     "src/core/security/json_token.c",
     "src/core/security/json_token.c",
     "src/core/security/jwt_verifier.c",
     "src/core/security/jwt_verifier.c",
     "src/core/security/secure_endpoint.c",
     "src/core/security/secure_endpoint.c",
-    "src/core/security/secure_transport_setup.c",
     "src/core/security/security_connector.c",
     "src/core/security/security_connector.c",
     "src/core/security/security_context.c",
     "src/core/security/security_context.c",
     "src/core/security/server_auth_filter.c",
     "src/core/security/server_auth_filter.c",
@@ -282,7 +285,10 @@ cc_library(
     "src/core/client_config/client_config.c",
     "src/core/client_config/client_config.c",
     "src/core/client_config/connector.c",
     "src/core/client_config/connector.c",
     "src/core/client_config/lb_policies/pick_first.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.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.c",
     "src/core/client_config/resolver_factory.c",
     "src/core/client_config/resolver_factory.c",
     "src/core/client_config/resolver_registry.c",
     "src/core/client_config/resolver_registry.c",
@@ -427,7 +433,10 @@ cc_library(
     "src/core/client_config/client_config.h",
     "src/core/client_config/client_config.h",
     "src/core/client_config/connector.h",
     "src/core/client_config/connector.h",
     "src/core/client_config/lb_policies/pick_first.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",
     "src/core/client_config/lb_policy.h",
+    "src/core/client_config/lb_policy_factory.h",
+    "src/core/client_config/lb_policy_registry.h",
     "src/core/client_config/resolver.h",
     "src/core/client_config/resolver.h",
     "src/core/client_config/resolver_factory.h",
     "src/core/client_config/resolver_factory.h",
     "src/core/client_config/resolver_registry.h",
     "src/core/client_config/resolver_registry.h",
@@ -532,7 +541,10 @@ cc_library(
     "src/core/client_config/client_config.c",
     "src/core/client_config/client_config.c",
     "src/core/client_config/connector.c",
     "src/core/client_config/connector.c",
     "src/core/client_config/lb_policies/pick_first.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.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.c",
     "src/core/client_config/resolver_factory.c",
     "src/core/client_config/resolver_factory.c",
     "src/core/client_config/resolver_registry.c",
     "src/core/client_config/resolver_registry.c",
@@ -729,6 +741,7 @@ cc_library(
     "include/grpc++/create_channel.h",
     "include/grpc++/create_channel.h",
     "include/grpc++/generic/async_generic_service.h",
     "include/grpc++/generic/async_generic_service.h",
     "include/grpc++/generic/generic_stub.h",
     "include/grpc++/generic/generic_stub.h",
+    "include/grpc++/grpc++.h",
     "include/grpc++/impl/call.h",
     "include/grpc++/impl/call.h",
     "include/grpc++/impl/client_unary_call.h",
     "include/grpc++/impl/client_unary_call.h",
     "include/grpc++/impl/grpc_library.h",
     "include/grpc++/impl/grpc_library.h",
@@ -820,6 +833,7 @@ cc_library(
     "include/grpc++/create_channel.h",
     "include/grpc++/create_channel.h",
     "include/grpc++/generic/async_generic_service.h",
     "include/grpc++/generic/async_generic_service.h",
     "include/grpc++/generic/generic_stub.h",
     "include/grpc++/generic/generic_stub.h",
+    "include/grpc++/grpc++.h",
     "include/grpc++/impl/call.h",
     "include/grpc++/impl/call.h",
     "include/grpc++/impl/client_unary_call.h",
     "include/grpc++/impl/client_unary_call.h",
     "include/grpc++/impl/grpc_library.h",
     "include/grpc++/impl/grpc_library.h",
@@ -1020,10 +1034,10 @@ objc_library(
     "src/core/security/credentials_posix.c",
     "src/core/security/credentials_posix.c",
     "src/core/security/credentials_win32.c",
     "src/core/security/credentials_win32.c",
     "src/core/security/google_default_credentials.c",
     "src/core/security/google_default_credentials.c",
+    "src/core/security/handshake.c",
     "src/core/security/json_token.c",
     "src/core/security/json_token.c",
     "src/core/security/jwt_verifier.c",
     "src/core/security/jwt_verifier.c",
     "src/core/security/secure_endpoint.c",
     "src/core/security/secure_endpoint.c",
-    "src/core/security/secure_transport_setup.c",
     "src/core/security/security_connector.c",
     "src/core/security/security_connector.c",
     "src/core/security/security_context.c",
     "src/core/security/security_context.c",
     "src/core/security/server_auth_filter.c",
     "src/core/security/server_auth_filter.c",
@@ -1046,7 +1060,10 @@ objc_library(
     "src/core/client_config/client_config.c",
     "src/core/client_config/client_config.c",
     "src/core/client_config/connector.c",
     "src/core/client_config/connector.c",
     "src/core/client_config/lb_policies/pick_first.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.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.c",
     "src/core/client_config/resolver_factory.c",
     "src/core/client_config/resolver_factory.c",
     "src/core/client_config/resolver_registry.c",
     "src/core/client_config/resolver_registry.c",
@@ -1165,10 +1182,10 @@ objc_library(
     "src/core/security/auth_filters.h",
     "src/core/security/auth_filters.h",
     "src/core/security/base64.h",
     "src/core/security/base64.h",
     "src/core/security/credentials.h",
     "src/core/security/credentials.h",
+    "src/core/security/handshake.h",
     "src/core/security/json_token.h",
     "src/core/security/json_token.h",
     "src/core/security/jwt_verifier.h",
     "src/core/security/jwt_verifier.h",
     "src/core/security/secure_endpoint.h",
     "src/core/security/secure_endpoint.h",
-    "src/core/security/secure_transport_setup.h",
     "src/core/security/security_connector.h",
     "src/core/security/security_connector.h",
     "src/core/security/security_context.h",
     "src/core/security/security_context.h",
     "src/core/tsi/fake_transport_security.h",
     "src/core/tsi/fake_transport_security.h",
@@ -1188,7 +1205,10 @@ objc_library(
     "src/core/client_config/client_config.h",
     "src/core/client_config/client_config.h",
     "src/core/client_config/connector.h",
     "src/core/client_config/connector.h",
     "src/core/client_config/lb_policies/pick_first.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",
     "src/core/client_config/lb_policy.h",
+    "src/core/client_config/lb_policy_factory.h",
+    "src/core/client_config/lb_policy_registry.h",
     "src/core/client_config/resolver.h",
     "src/core/client_config/resolver.h",
     "src/core/client_config/resolver_factory.h",
     "src/core/client_config/resolver_factory.h",
     "src/core/client_config/resolver_registry.h",
     "src/core/client_config/resolver_registry.h",

File diff suppressed because it is too large
+ 9 - 5
Makefile


+ 61 - 52
build.yaml

@@ -13,9 +13,9 @@ filegroups:
 - name: grpc++_base
 - name: grpc++_base
   public_headers: [include/grpc++/channel.h, include/grpc++/client_context.h, include/grpc++/completion_queue.h,
   public_headers: [include/grpc++/channel.h, include/grpc++/client_context.h, include/grpc++/completion_queue.h,
     include/grpc++/create_channel.h, include/grpc++/generic/async_generic_service.h,
     include/grpc++/create_channel.h, include/grpc++/generic/async_generic_service.h,
-    include/grpc++/generic/generic_stub.h, include/grpc++/impl/call.h, include/grpc++/impl/client_unary_call.h,
-    include/grpc++/impl/grpc_library.h, include/grpc++/impl/proto_utils.h, include/grpc++/impl/rpc_method.h,
-    include/grpc++/impl/rpc_service_method.h, include/grpc++/impl/serialization_traits.h,
+    include/grpc++/generic/generic_stub.h, include/grpc++/grpc++.h, include/grpc++/impl/call.h,
+    include/grpc++/impl/client_unary_call.h, include/grpc++/impl/grpc_library.h, include/grpc++/impl/proto_utils.h,
+    include/grpc++/impl/rpc_method.h, include/grpc++/impl/rpc_service_method.h, include/grpc++/impl/serialization_traits.h,
     include/grpc++/impl/service_type.h, include/grpc++/impl/sync.h, include/grpc++/impl/sync_cxx11.h,
     include/grpc++/impl/service_type.h, include/grpc++/impl/sync.h, include/grpc++/impl/sync_cxx11.h,
     include/grpc++/impl/sync_no_cxx11.h, include/grpc++/impl/thd.h, include/grpc++/impl/thd_cxx11.h,
     include/grpc++/impl/sync_no_cxx11.h, include/grpc++/impl/thd.h, include/grpc++/impl/thd_cxx11.h,
     include/grpc++/impl/thd_no_cxx11.h, include/grpc++/security/auth_context.h, include/grpc++/security/auth_metadata_processor.h,
     include/grpc++/impl/thd_no_cxx11.h, include/grpc++/security/auth_context.h, include/grpc++/security/auth_metadata_processor.h,
@@ -45,55 +45,58 @@ filegroups:
     src/core/channel/client_channel.h, src/core/channel/compress_filter.h, src/core/channel/connected_channel.h,
     src/core/channel/client_channel.h, src/core/channel/compress_filter.h, src/core/channel/connected_channel.h,
     src/core/channel/context.h, src/core/channel/http_client_filter.h, src/core/channel/http_server_filter.h,
     src/core/channel/context.h, src/core/channel/http_client_filter.h, src/core/channel/http_server_filter.h,
     src/core/channel/noop_filter.h, src/core/client_config/client_config.h, src/core/client_config/connector.h,
     src/core/channel/noop_filter.h, src/core/client_config/client_config.h, src/core/client_config/connector.h,
-    src/core/client_config/lb_policies/pick_first.h, src/core/client_config/lb_policy.h,
-    src/core/client_config/resolver.h, src/core/client_config/resolver_factory.h,
-    src/core/client_config/resolver_registry.h, src/core/client_config/resolvers/dns_resolver.h,
-    src/core/client_config/resolvers/sockaddr_resolver.h, src/core/client_config/subchannel.h,
-    src/core/client_config/subchannel_factory.h, src/core/client_config/subchannel_factory_decorators/add_channel_arg.h,
-    src/core/client_config/subchannel_factory_decorators/merge_channel_args.h, src/core/client_config/uri_parser.h,
-    src/core/compression/message_compress.h, src/core/debug/trace.h, src/core/httpcli/format_request.h,
-    src/core/httpcli/httpcli.h, src/core/httpcli/parser.h, src/core/iomgr/alarm.h,
-    src/core/iomgr/alarm_heap.h, src/core/iomgr/alarm_internal.h, src/core/iomgr/endpoint.h,
-    src/core/iomgr/endpoint_pair.h, src/core/iomgr/fd_posix.h, src/core/iomgr/iocp_windows.h,
-    src/core/iomgr/iomgr.h, src/core/iomgr/iomgr_internal.h, src/core/iomgr/iomgr_posix.h,
-    src/core/iomgr/pollset.h, src/core/iomgr/pollset_posix.h, src/core/iomgr/pollset_set.h,
-    src/core/iomgr/pollset_set_posix.h, src/core/iomgr/pollset_set_windows.h, src/core/iomgr/pollset_windows.h,
-    src/core/iomgr/resolve_address.h, src/core/iomgr/sockaddr.h, src/core/iomgr/sockaddr_posix.h,
-    src/core/iomgr/sockaddr_utils.h, src/core/iomgr/sockaddr_win32.h, src/core/iomgr/socket_utils_posix.h,
-    src/core/iomgr/socket_windows.h, src/core/iomgr/tcp_client.h, src/core/iomgr/tcp_posix.h,
-    src/core/iomgr/tcp_server.h, src/core/iomgr/tcp_windows.h, src/core/iomgr/time_averaged_stats.h,
-    src/core/iomgr/udp_server.h, src/core/iomgr/wakeup_fd_pipe.h, src/core/iomgr/wakeup_fd_posix.h,
-    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/profiling/timers.h, src/core/statistics/census_interface.h,
-    src/core/statistics/census_rpc_stats.h, src/core/surface/byte_buffer_queue.h,
-    src/core/surface/call.h, src/core/surface/channel.h, src/core/surface/completion_queue.h,
-    src/core/surface/event_string.h, src/core/surface/init.h, src/core/surface/server.h,
-    src/core/surface/surface_trace.h, src/core/transport/chttp2/alpn.h, src/core/transport/chttp2/bin_encoder.h,
-    src/core/transport/chttp2/frame.h, src/core/transport/chttp2/frame_data.h, src/core/transport/chttp2/frame_goaway.h,
-    src/core/transport/chttp2/frame_ping.h, src/core/transport/chttp2/frame_rst_stream.h,
-    src/core/transport/chttp2/frame_settings.h, src/core/transport/chttp2/frame_window_update.h,
-    src/core/transport/chttp2/hpack_parser.h, src/core/transport/chttp2/hpack_table.h,
-    src/core/transport/chttp2/http2_errors.h, src/core/transport/chttp2/huffsyms.h,
-    src/core/transport/chttp2/incoming_metadata.h, src/core/transport/chttp2/internal.h,
-    src/core/transport/chttp2/status_conversion.h, src/core/transport/chttp2/stream_encoder.h,
-    src/core/transport/chttp2/stream_map.h, src/core/transport/chttp2/timeout_encoding.h,
-    src/core/transport/chttp2/varint.h, src/core/transport/chttp2_transport.h, src/core/transport/connectivity_state.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, src/core/client_config/lb_policy_factory.h,
+    src/core/client_config/lb_policy_registry.h, src/core/client_config/resolver.h,
+    src/core/client_config/resolver_factory.h, src/core/client_config/resolver_registry.h,
+    src/core/client_config/resolvers/dns_resolver.h, src/core/client_config/resolvers/sockaddr_resolver.h,
+    src/core/client_config/subchannel.h, src/core/client_config/subchannel_factory.h,
+    src/core/client_config/subchannel_factory_decorators/add_channel_arg.h, src/core/client_config/subchannel_factory_decorators/merge_channel_args.h,
+    src/core/client_config/uri_parser.h, src/core/compression/message_compress.h,
+    src/core/debug/trace.h, src/core/httpcli/format_request.h, src/core/httpcli/httpcli.h,
+    src/core/httpcli/parser.h, src/core/iomgr/alarm.h, src/core/iomgr/alarm_heap.h,
+    src/core/iomgr/alarm_internal.h, src/core/iomgr/endpoint.h, src/core/iomgr/endpoint_pair.h,
+    src/core/iomgr/fd_posix.h, src/core/iomgr/iocp_windows.h, src/core/iomgr/iomgr.h,
+    src/core/iomgr/iomgr_internal.h, src/core/iomgr/iomgr_posix.h, src/core/iomgr/pollset.h,
+    src/core/iomgr/pollset_posix.h, src/core/iomgr/pollset_set.h, src/core/iomgr/pollset_set_posix.h,
+    src/core/iomgr/pollset_set_windows.h, src/core/iomgr/pollset_windows.h, src/core/iomgr/resolve_address.h,
+    src/core/iomgr/sockaddr.h, src/core/iomgr/sockaddr_posix.h, src/core/iomgr/sockaddr_utils.h,
+    src/core/iomgr/sockaddr_win32.h, src/core/iomgr/socket_utils_posix.h, src/core/iomgr/socket_windows.h,
+    src/core/iomgr/tcp_client.h, src/core/iomgr/tcp_posix.h, src/core/iomgr/tcp_server.h,
+    src/core/iomgr/tcp_windows.h, src/core/iomgr/time_averaged_stats.h, src/core/iomgr/udp_server.h,
+    src/core/iomgr/wakeup_fd_pipe.h, src/core/iomgr/wakeup_fd_posix.h, 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/profiling/timers.h, src/core/statistics/census_interface.h, src/core/statistics/census_rpc_stats.h,
+    src/core/surface/byte_buffer_queue.h, src/core/surface/call.h, src/core/surface/channel.h,
+    src/core/surface/completion_queue.h, src/core/surface/event_string.h, src/core/surface/init.h,
+    src/core/surface/server.h, src/core/surface/surface_trace.h, src/core/transport/chttp2/alpn.h,
+    src/core/transport/chttp2/bin_encoder.h, src/core/transport/chttp2/frame.h, src/core/transport/chttp2/frame_data.h,
+    src/core/transport/chttp2/frame_goaway.h, src/core/transport/chttp2/frame_ping.h,
+    src/core/transport/chttp2/frame_rst_stream.h, src/core/transport/chttp2/frame_settings.h,
+    src/core/transport/chttp2/frame_window_update.h, src/core/transport/chttp2/hpack_parser.h,
+    src/core/transport/chttp2/hpack_table.h, src/core/transport/chttp2/http2_errors.h,
+    src/core/transport/chttp2/huffsyms.h, src/core/transport/chttp2/incoming_metadata.h,
+    src/core/transport/chttp2/internal.h, src/core/transport/chttp2/status_conversion.h,
+    src/core/transport/chttp2/stream_encoder.h, src/core/transport/chttp2/stream_map.h,
+    src/core/transport/chttp2/timeout_encoding.h, src/core/transport/chttp2/varint.h,
+    src/core/transport/chttp2_transport.h, src/core/transport/connectivity_state.h,
     src/core/transport/metadata.h, src/core/transport/stream_op.h, src/core/transport/transport.h,
     src/core/transport/metadata.h, src/core/transport/stream_op.h, src/core/transport/transport.h,
     src/core/transport/transport_impl.h]
     src/core/transport/transport_impl.h]
   src: [src/core/census/grpc_context.c, src/core/census/grpc_filter.c, src/core/channel/channel_args.c,
   src: [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/compress_filter.c,
     src/core/channel/channel_stack.c, src/core/channel/client_channel.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/connected_channel.c, src/core/channel/http_client_filter.c, src/core/channel/http_server_filter.c,
     src/core/channel/noop_filter.c, src/core/client_config/client_config.c, src/core/client_config/connector.c,
     src/core/channel/noop_filter.c, src/core/client_config/client_config.c, src/core/client_config/connector.c,
-    src/core/client_config/lb_policies/pick_first.c, src/core/client_config/lb_policy.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_factory_decorators/add_channel_arg.c,
-    src/core/client_config/subchannel_factory_decorators/merge_channel_args.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/alarm.c, src/core/iomgr/alarm_heap.c, src/core/iomgr/endpoint.c,
-    src/core/iomgr/endpoint_pair_posix.c, src/core/iomgr/endpoint_pair_windows.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_factory_decorators/add_channel_arg.c, src/core/client_config/subchannel_factory_decorators/merge_channel_args.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/alarm.c, src/core/iomgr/alarm_heap.c,
+    src/core/iomgr/endpoint.c, src/core/iomgr/endpoint_pair_posix.c, src/core/iomgr/endpoint_pair_windows.c,
     src/core/iomgr/fd_posix.c, src/core/iomgr/iocp_windows.c, src/core/iomgr/iomgr.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/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_multipoller_with_poll_posix.c, src/core/iomgr/pollset_posix.c,
@@ -176,15 +179,15 @@ libs:
   language: c
   language: c
   public_headers: [include/grpc/grpc_security.h]
   public_headers: [include/grpc/grpc_security.h]
   headers: [src/core/security/auth_filters.h, src/core/security/base64.h, src/core/security/credentials.h,
   headers: [src/core/security/auth_filters.h, src/core/security/base64.h, src/core/security/credentials.h,
-    src/core/security/json_token.h, src/core/security/jwt_verifier.h, src/core/security/secure_endpoint.h,
-    src/core/security/secure_transport_setup.h, src/core/security/security_connector.h,
-    src/core/security/security_context.h, src/core/tsi/fake_transport_security.h,
-    src/core/tsi/ssl_transport_security.h, src/core/tsi/transport_security.h, src/core/tsi/transport_security_interface.h]
+    src/core/security/handshake.h, src/core/security/json_token.h, src/core/security/jwt_verifier.h,
+    src/core/security/secure_endpoint.h, src/core/security/security_connector.h, src/core/security/security_context.h,
+    src/core/tsi/fake_transport_security.h, src/core/tsi/ssl_transport_security.h,
+    src/core/tsi/transport_security.h, src/core/tsi/transport_security_interface.h]
   src: [src/core/httpcli/httpcli_security_connector.c, src/core/security/base64.c,
   src: [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/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/credentials_posix.c, src/core/security/credentials_win32.c,
-    src/core/security/google_default_credentials.c, src/core/security/json_token.c,
-    src/core/security/jwt_verifier.c, src/core/security/secure_endpoint.c, src/core/security/secure_transport_setup.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/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/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/surface/init_secure.c, src/core/surface/secure_channel_create.c, src/core/tsi/fake_transport_security.c,
@@ -640,6 +643,11 @@ targets:
   language: c
   language: c
   src: [test/core/surface/lame_client_test.c]
   src: [test/core/surface/lame_client_test.c]
   deps: [grpc_test_util, grpc, gpr_test_util, gpr]
   deps: [grpc_test_util, grpc, gpr_test_util, gpr]
+- name: lb_policies_test
+  build: test
+  language: c
+  src: [test/core/client_config/lb_policies_test.c]
+  deps: [grpc_test_util, grpc, gpr_test_util, gpr]
 - name: low_level_ping_pong_benchmark
 - name: low_level_ping_pong_benchmark
   build: benchmark
   build: benchmark
   language: c
   language: c
@@ -995,6 +1003,7 @@ targets:
   deps: [grpc++_test_util, grpc_test_util, grpc++, grpc, gpr_test_util, gpr]
   deps: [grpc++_test_util, grpc_test_util, grpc++, grpc, gpr_test_util, gpr]
 - name: zookeeper_test
 - name: zookeeper_test
   build: test
   build: test
+  run: false
   language: c++
   language: c++
   src: [test/cpp/end2end/zookeeper_test.cc]
   src: [test/cpp/end2end/zookeeper_test.cc]
   deps: [grpc++_test_util, grpc_test_util, grpc++, grpc_zookeeper, grpc, gpr_test_util,
   deps: [grpc++_test_util, grpc_test_util, grpc++, grpc_zookeeper, grpc, gpr_test_util,

+ 3 - 2
doc/PROTOCOL-HTTP2.md

@@ -43,8 +43,9 @@ Request-Headers are delivered as HTTP2 headers in HEADERS + CONTINUATION frames.
 * **User-Agent** → “user-agent” {_structured user-agent string_}
 * **User-Agent** → “user-agent” {_structured user-agent string_}
 * **Message-Type** → “grpc-message-type” {_type name for message schema_}
 * **Message-Type** → “grpc-message-type” {_type name for message schema_}
 * **Custom-Metadata** → Binary-Header / ASCII-Header
 * **Custom-Metadata** → Binary-Header / ASCII-Header
-* **Binary-Header** → {lowercase ASCII header name ending in “-bin” } {_base64 encoded value_}
-* **ASCII-Header** → {lowercase ASCII header name} {_value_}
+* **Binary-Header** → {Header-Name “-bin” } {_base64 encoded value_}
+* **ASCII-Header** → Header-Name {_value_}
+* **Header-Name** → 1*( %x30-39 / %x61-7A / “_” / “-”) ; 0-9 a-z 
 
 
 
 
 HTTP2 requires that reserved headers, ones starting with “:” appear before all other headers. Additionally implementations should send **Timeout** immediately after the reserved headers and they should send the **Call-Definition** headers before sending **Custom-Metadata**.
 HTTP2 requires that reserved headers, ones starting with “:” appear before all other headers. Additionally implementations should send **Timeout** immediately after the reserved headers and they should send the **Call-Definition** headers before sending **Custom-Metadata**.

+ 42 - 42
examples/csharp/route_guide/RouteGuide/RouteGuide.cs

@@ -7,7 +7,7 @@ using pb = global::Google.Protobuf;
 using pbc = global::Google.Protobuf.Collections;
 using pbc = global::Google.Protobuf.Collections;
 using pbr = global::Google.Protobuf.Reflection;
 using pbr = global::Google.Protobuf.Reflection;
 using scg = global::System.Collections.Generic;
 using scg = global::System.Collections.Generic;
-namespace Examples {
+namespace Routeguide {
 
 
   namespace Proto {
   namespace Proto {
 
 
@@ -23,29 +23,29 @@ namespace Examples {
       static RouteGuide() {
       static RouteGuide() {
         byte[] descriptorData = global::System.Convert.FromBase64String(
         byte[] descriptorData = global::System.Convert.FromBase64String(
             string.Concat(
             string.Concat(
-              "ChFyb3V0ZV9ndWlkZS5wcm90bxIIZXhhbXBsZXMiLAoFUG9pbnQSEAoIbGF0", 
-              "aXR1ZGUYASABKAUSEQoJbG9uZ2l0dWRlGAIgASgFIkUKCVJlY3RhbmdsZRIb", 
-              "CgJsbxgBIAEoCzIPLmV4YW1wbGVzLlBvaW50EhsKAmhpGAIgASgLMg8uZXhh", 
-              "bXBsZXMuUG9pbnQiOgoHRmVhdHVyZRIMCgRuYW1lGAEgASgJEiEKCGxvY2F0", 
-              "aW9uGAIgASgLMg8uZXhhbXBsZXMuUG9pbnQiPwoJUm91dGVOb3RlEiEKCGxv", 
-              "Y2F0aW9uGAEgASgLMg8uZXhhbXBsZXMuUG9pbnQSDwoHbWVzc2FnZRgCIAEo", 
-              "CSJiCgxSb3V0ZVN1bW1hcnkSEwoLcG9pbnRfY291bnQYASABKAUSFQoNZmVh", 
-              "dHVyZV9jb3VudBgCIAEoBRIQCghkaXN0YW5jZRgDIAEoBRIUCgxlbGFwc2Vk", 
-              "X3RpbWUYBCABKAUy9QEKClJvdXRlR3VpZGUSMgoKR2V0RmVhdHVyZRIPLmV4", 
-              "YW1wbGVzLlBvaW50GhEuZXhhbXBsZXMuRmVhdHVyZSIAEjoKDExpc3RGZWF0", 
-              "dXJlcxITLmV4YW1wbGVzLlJlY3RhbmdsZRoRLmV4YW1wbGVzLkZlYXR1cmUi", 
-              "ADABEjoKC1JlY29yZFJvdXRlEg8uZXhhbXBsZXMuUG9pbnQaFi5leGFtcGxl", 
-              "cy5Sb3V0ZVN1bW1hcnkiACgBEjsKCVJvdXRlQ2hhdBITLmV4YW1wbGVzLlJv", 
-              "dXRlTm90ZRoTLmV4YW1wbGVzLlJvdXRlTm90ZSIAKAEwAUIPCgdleC5ncnBj", 
-              "ogIDUlRHYgZwcm90bzM="));
+              "ChFyb3V0ZV9ndWlkZS5wcm90bxIKcm91dGVndWlkZSIsCgVQb2ludBIQCghs", 
+              "YXRpdHVkZRgBIAEoBRIRCglsb25naXR1ZGUYAiABKAUiSQoJUmVjdGFuZ2xl", 
+              "Eh0KAmxvGAEgASgLMhEucm91dGVndWlkZS5Qb2ludBIdCgJoaRgCIAEoCzIR", 
+              "LnJvdXRlZ3VpZGUuUG9pbnQiPAoHRmVhdHVyZRIMCgRuYW1lGAEgASgJEiMK", 
+              "CGxvY2F0aW9uGAIgASgLMhEucm91dGVndWlkZS5Qb2ludCJBCglSb3V0ZU5v", 
+              "dGUSIwoIbG9jYXRpb24YASABKAsyES5yb3V0ZWd1aWRlLlBvaW50Eg8KB21l", 
+              "c3NhZ2UYAiABKAkiYgoMUm91dGVTdW1tYXJ5EhMKC3BvaW50X2NvdW50GAEg", 
+              "ASgFEhUKDWZlYXR1cmVfY291bnQYAiABKAUSEAoIZGlzdGFuY2UYAyABKAUS", 
+              "FAoMZWxhcHNlZF90aW1lGAQgASgFMoUCCgpSb3V0ZUd1aWRlEjYKCkdldEZl", 
+              "YXR1cmUSES5yb3V0ZWd1aWRlLlBvaW50GhMucm91dGVndWlkZS5GZWF0dXJl", 
+              "IgASPgoMTGlzdEZlYXR1cmVzEhUucm91dGVndWlkZS5SZWN0YW5nbGUaEy5y", 
+              "b3V0ZWd1aWRlLkZlYXR1cmUiADABEj4KC1JlY29yZFJvdXRlEhEucm91dGVn", 
+              "dWlkZS5Qb2ludBoYLnJvdXRlZ3VpZGUuUm91dGVTdW1tYXJ5IgAoARI/CglS", 
+              "b3V0ZUNoYXQSFS5yb3V0ZWd1aWRlLlJvdXRlTm90ZRoVLnJvdXRlZ3VpZGUu", 
+              "Um91dGVOb3RlIgAoATABQg8KB2V4LmdycGOiAgNSVEdiBnByb3RvMw=="));
         descriptor = pbr::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
         descriptor = pbr::FileDescriptor.InternalBuildGeneratedFileFrom(descriptorData,
             new pbr::FileDescriptor[] { },
             new pbr::FileDescriptor[] { },
             new pbr::GeneratedCodeInfo(null, new pbr::GeneratedCodeInfo[] {
             new pbr::GeneratedCodeInfo(null, new pbr::GeneratedCodeInfo[] {
-              new pbr::GeneratedCodeInfo(typeof(global::Examples.Point), new[]{ "Latitude", "Longitude" }, null, null, null),
-              new pbr::GeneratedCodeInfo(typeof(global::Examples.Rectangle), new[]{ "Lo", "Hi" }, null, null, null),
-              new pbr::GeneratedCodeInfo(typeof(global::Examples.Feature), new[]{ "Name", "Location" }, null, null, null),
-              new pbr::GeneratedCodeInfo(typeof(global::Examples.RouteNote), new[]{ "Location", "Message" }, null, null, null),
-              new pbr::GeneratedCodeInfo(typeof(global::Examples.RouteSummary), new[]{ "PointCount", "FeatureCount", "Distance", "ElapsedTime" }, null, null, null)
+              new pbr::GeneratedCodeInfo(typeof(global::Routeguide.Point), new[]{ "Latitude", "Longitude" }, null, null, null),
+              new pbr::GeneratedCodeInfo(typeof(global::Routeguide.Rectangle), new[]{ "Lo", "Hi" }, null, null, null),
+              new pbr::GeneratedCodeInfo(typeof(global::Routeguide.Feature), new[]{ "Name", "Location" }, null, null, null),
+              new pbr::GeneratedCodeInfo(typeof(global::Routeguide.RouteNote), new[]{ "Location", "Message" }, null, null, null),
+              new pbr::GeneratedCodeInfo(typeof(global::Routeguide.RouteSummary), new[]{ "PointCount", "FeatureCount", "Distance", "ElapsedTime" }, null, null, null)
             }));
             }));
       }
       }
       #endregion
       #endregion
@@ -59,7 +59,7 @@ namespace Examples {
     public static pb::MessageParser<Point> Parser { get { return _parser; } }
     public static pb::MessageParser<Point> Parser { get { return _parser; } }
 
 
     public static pbr::MessageDescriptor Descriptor {
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Examples.Proto.RouteGuide.Descriptor.MessageTypes[0]; }
+      get { return global::Routeguide.Proto.RouteGuide.Descriptor.MessageTypes[0]; }
     }
     }
 
 
     pbr::MessageDescriptor pb::IMessage.Descriptor {
     pbr::MessageDescriptor pb::IMessage.Descriptor {
@@ -187,7 +187,7 @@ namespace Examples {
     public static pb::MessageParser<Rectangle> Parser { get { return _parser; } }
     public static pb::MessageParser<Rectangle> Parser { get { return _parser; } }
 
 
     public static pbr::MessageDescriptor Descriptor {
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Examples.Proto.RouteGuide.Descriptor.MessageTypes[1]; }
+      get { return global::Routeguide.Proto.RouteGuide.Descriptor.MessageTypes[1]; }
     }
     }
 
 
     pbr::MessageDescriptor pb::IMessage.Descriptor {
     pbr::MessageDescriptor pb::IMessage.Descriptor {
@@ -210,8 +210,8 @@ namespace Examples {
     }
     }
 
 
     public const int LoFieldNumber = 1;
     public const int LoFieldNumber = 1;
-    private global::Examples.Point lo_;
-    public global::Examples.Point Lo {
+    private global::Routeguide.Point lo_;
+    public global::Routeguide.Point Lo {
       get { return lo_; }
       get { return lo_; }
       set {
       set {
         lo_ = value;
         lo_ = value;
@@ -219,8 +219,8 @@ namespace Examples {
     }
     }
 
 
     public const int HiFieldNumber = 2;
     public const int HiFieldNumber = 2;
-    private global::Examples.Point hi_;
-    public global::Examples.Point Hi {
+    private global::Routeguide.Point hi_;
+    public global::Routeguide.Point Hi {
       get { return hi_; }
       get { return hi_; }
       set {
       set {
         hi_ = value;
         hi_ = value;
@@ -282,13 +282,13 @@ namespace Examples {
       }
       }
       if (other.lo_ != null) {
       if (other.lo_ != null) {
         if (lo_ == null) {
         if (lo_ == null) {
-          lo_ = new global::Examples.Point();
+          lo_ = new global::Routeguide.Point();
         }
         }
         Lo.MergeFrom(other.Lo);
         Lo.MergeFrom(other.Lo);
       }
       }
       if (other.hi_ != null) {
       if (other.hi_ != null) {
         if (hi_ == null) {
         if (hi_ == null) {
-          hi_ = new global::Examples.Point();
+          hi_ = new global::Routeguide.Point();
         }
         }
         Hi.MergeFrom(other.Hi);
         Hi.MergeFrom(other.Hi);
       }
       }
@@ -303,14 +303,14 @@ namespace Examples {
             break;
             break;
           case 10: {
           case 10: {
             if (lo_ == null) {
             if (lo_ == null) {
-              lo_ = new global::Examples.Point();
+              lo_ = new global::Routeguide.Point();
             }
             }
             input.ReadMessage(lo_);
             input.ReadMessage(lo_);
             break;
             break;
           }
           }
           case 18: {
           case 18: {
             if (hi_ == null) {
             if (hi_ == null) {
-              hi_ = new global::Examples.Point();
+              hi_ = new global::Routeguide.Point();
             }
             }
             input.ReadMessage(hi_);
             input.ReadMessage(hi_);
             break;
             break;
@@ -327,7 +327,7 @@ namespace Examples {
     public static pb::MessageParser<Feature> Parser { get { return _parser; } }
     public static pb::MessageParser<Feature> Parser { get { return _parser; } }
 
 
     public static pbr::MessageDescriptor Descriptor {
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Examples.Proto.RouteGuide.Descriptor.MessageTypes[2]; }
+      get { return global::Routeguide.Proto.RouteGuide.Descriptor.MessageTypes[2]; }
     }
     }
 
 
     pbr::MessageDescriptor pb::IMessage.Descriptor {
     pbr::MessageDescriptor pb::IMessage.Descriptor {
@@ -359,8 +359,8 @@ namespace Examples {
     }
     }
 
 
     public const int LocationFieldNumber = 2;
     public const int LocationFieldNumber = 2;
-    private global::Examples.Point location_;
-    public global::Examples.Point Location {
+    private global::Routeguide.Point location_;
+    public global::Routeguide.Point Location {
       get { return location_; }
       get { return location_; }
       set {
       set {
         location_ = value;
         location_ = value;
@@ -425,7 +425,7 @@ namespace Examples {
       }
       }
       if (other.location_ != null) {
       if (other.location_ != null) {
         if (location_ == null) {
         if (location_ == null) {
-          location_ = new global::Examples.Point();
+          location_ = new global::Routeguide.Point();
         }
         }
         Location.MergeFrom(other.Location);
         Location.MergeFrom(other.Location);
       }
       }
@@ -444,7 +444,7 @@ namespace Examples {
           }
           }
           case 18: {
           case 18: {
             if (location_ == null) {
             if (location_ == null) {
-              location_ = new global::Examples.Point();
+              location_ = new global::Routeguide.Point();
             }
             }
             input.ReadMessage(location_);
             input.ReadMessage(location_);
             break;
             break;
@@ -461,7 +461,7 @@ namespace Examples {
     public static pb::MessageParser<RouteNote> Parser { get { return _parser; } }
     public static pb::MessageParser<RouteNote> Parser { get { return _parser; } }
 
 
     public static pbr::MessageDescriptor Descriptor {
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Examples.Proto.RouteGuide.Descriptor.MessageTypes[3]; }
+      get { return global::Routeguide.Proto.RouteGuide.Descriptor.MessageTypes[3]; }
     }
     }
 
 
     pbr::MessageDescriptor pb::IMessage.Descriptor {
     pbr::MessageDescriptor pb::IMessage.Descriptor {
@@ -484,8 +484,8 @@ namespace Examples {
     }
     }
 
 
     public const int LocationFieldNumber = 1;
     public const int LocationFieldNumber = 1;
-    private global::Examples.Point location_;
-    public global::Examples.Point Location {
+    private global::Routeguide.Point location_;
+    public global::Routeguide.Point Location {
       get { return location_; }
       get { return location_; }
       set {
       set {
         location_ = value;
         location_ = value;
@@ -556,7 +556,7 @@ namespace Examples {
       }
       }
       if (other.location_ != null) {
       if (other.location_ != null) {
         if (location_ == null) {
         if (location_ == null) {
-          location_ = new global::Examples.Point();
+          location_ = new global::Routeguide.Point();
         }
         }
         Location.MergeFrom(other.Location);
         Location.MergeFrom(other.Location);
       }
       }
@@ -574,7 +574,7 @@ namespace Examples {
             break;
             break;
           case 10: {
           case 10: {
             if (location_ == null) {
             if (location_ == null) {
-              location_ = new global::Examples.Point();
+              location_ = new global::Routeguide.Point();
             }
             }
             input.ReadMessage(location_);
             input.ReadMessage(location_);
             break;
             break;
@@ -595,7 +595,7 @@ namespace Examples {
     public static pb::MessageParser<RouteSummary> Parser { get { return _parser; } }
     public static pb::MessageParser<RouteSummary> Parser { get { return _parser; } }
 
 
     public static pbr::MessageDescriptor Descriptor {
     public static pbr::MessageDescriptor Descriptor {
-      get { return global::Examples.Proto.RouteGuide.Descriptor.MessageTypes[4]; }
+      get { return global::Routeguide.Proto.RouteGuide.Descriptor.MessageTypes[4]; }
     }
     }
 
 
     pbr::MessageDescriptor pb::IMessage.Descriptor {
     pbr::MessageDescriptor pb::IMessage.Descriptor {

+ 36 - 36
examples/csharp/route_guide/RouteGuide/RouteGuideGrpc.cs

@@ -7,39 +7,39 @@ using System.Threading;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 using Grpc.Core;
 using Grpc.Core;
 
 
-namespace Examples {
+namespace Routeguide {
   public static class RouteGuide
   public static class RouteGuide
   {
   {
-    static readonly string __ServiceName = "examples.RouteGuide";
+    static readonly string __ServiceName = "routeguide.RouteGuide";
 
 
-    static readonly Marshaller<global::Examples.Point> __Marshaller_Point = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Examples.Point.Parser.ParseFrom);
-    static readonly Marshaller<global::Examples.Feature> __Marshaller_Feature = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Examples.Feature.Parser.ParseFrom);
-    static readonly Marshaller<global::Examples.Rectangle> __Marshaller_Rectangle = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Examples.Rectangle.Parser.ParseFrom);
-    static readonly Marshaller<global::Examples.RouteSummary> __Marshaller_RouteSummary = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Examples.RouteSummary.Parser.ParseFrom);
-    static readonly Marshaller<global::Examples.RouteNote> __Marshaller_RouteNote = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Examples.RouteNote.Parser.ParseFrom);
+    static readonly Marshaller<global::Routeguide.Point> __Marshaller_Point = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Routeguide.Point.Parser.ParseFrom);
+    static readonly Marshaller<global::Routeguide.Feature> __Marshaller_Feature = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Routeguide.Feature.Parser.ParseFrom);
+    static readonly Marshaller<global::Routeguide.Rectangle> __Marshaller_Rectangle = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Routeguide.Rectangle.Parser.ParseFrom);
+    static readonly Marshaller<global::Routeguide.RouteSummary> __Marshaller_RouteSummary = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Routeguide.RouteSummary.Parser.ParseFrom);
+    static readonly Marshaller<global::Routeguide.RouteNote> __Marshaller_RouteNote = Marshallers.Create((arg) => global::Google.Protobuf.MessageExtensions.ToByteArray(arg), global::Routeguide.RouteNote.Parser.ParseFrom);
 
 
-    static readonly Method<global::Examples.Point, global::Examples.Feature> __Method_GetFeature = new Method<global::Examples.Point, global::Examples.Feature>(
+    static readonly Method<global::Routeguide.Point, global::Routeguide.Feature> __Method_GetFeature = new Method<global::Routeguide.Point, global::Routeguide.Feature>(
         MethodType.Unary,
         MethodType.Unary,
         __ServiceName,
         __ServiceName,
         "GetFeature",
         "GetFeature",
         __Marshaller_Point,
         __Marshaller_Point,
         __Marshaller_Feature);
         __Marshaller_Feature);
 
 
-    static readonly Method<global::Examples.Rectangle, global::Examples.Feature> __Method_ListFeatures = new Method<global::Examples.Rectangle, global::Examples.Feature>(
+    static readonly Method<global::Routeguide.Rectangle, global::Routeguide.Feature> __Method_ListFeatures = new Method<global::Routeguide.Rectangle, global::Routeguide.Feature>(
         MethodType.ServerStreaming,
         MethodType.ServerStreaming,
         __ServiceName,
         __ServiceName,
         "ListFeatures",
         "ListFeatures",
         __Marshaller_Rectangle,
         __Marshaller_Rectangle,
         __Marshaller_Feature);
         __Marshaller_Feature);
 
 
-    static readonly Method<global::Examples.Point, global::Examples.RouteSummary> __Method_RecordRoute = new Method<global::Examples.Point, global::Examples.RouteSummary>(
+    static readonly Method<global::Routeguide.Point, global::Routeguide.RouteSummary> __Method_RecordRoute = new Method<global::Routeguide.Point, global::Routeguide.RouteSummary>(
         MethodType.ClientStreaming,
         MethodType.ClientStreaming,
         __ServiceName,
         __ServiceName,
         "RecordRoute",
         "RecordRoute",
         __Marshaller_Point,
         __Marshaller_Point,
         __Marshaller_RouteSummary);
         __Marshaller_RouteSummary);
 
 
-    static readonly Method<global::Examples.RouteNote, global::Examples.RouteNote> __Method_RouteChat = new Method<global::Examples.RouteNote, global::Examples.RouteNote>(
+    static readonly Method<global::Routeguide.RouteNote, global::Routeguide.RouteNote> __Method_RouteChat = new Method<global::Routeguide.RouteNote, global::Routeguide.RouteNote>(
         MethodType.DuplexStreaming,
         MethodType.DuplexStreaming,
         __ServiceName,
         __ServiceName,
         "RouteChat",
         "RouteChat",
@@ -49,31 +49,31 @@ namespace Examples {
     // service descriptor
     // service descriptor
     public static global::Google.Protobuf.Reflection.ServiceDescriptor Descriptor
     public static global::Google.Protobuf.Reflection.ServiceDescriptor Descriptor
     {
     {
-      get { return global::Examples.Proto.RouteGuide.Descriptor.Services[0]; }
+      get { return global::Routeguide.Proto.RouteGuide.Descriptor.Services[0]; }
     }
     }
 
 
     // client interface
     // client interface
     public interface IRouteGuideClient
     public interface IRouteGuideClient
     {
     {
-      global::Examples.Feature GetFeature(global::Examples.Point request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken));
-      global::Examples.Feature GetFeature(global::Examples.Point request, CallOptions options);
-      AsyncUnaryCall<global::Examples.Feature> GetFeatureAsync(global::Examples.Point request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken));
-      AsyncUnaryCall<global::Examples.Feature> GetFeatureAsync(global::Examples.Point request, CallOptions options);
-      AsyncServerStreamingCall<global::Examples.Feature> ListFeatures(global::Examples.Rectangle request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken));
-      AsyncServerStreamingCall<global::Examples.Feature> ListFeatures(global::Examples.Rectangle request, CallOptions options);
-      AsyncClientStreamingCall<global::Examples.Point, global::Examples.RouteSummary> RecordRoute(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken));
-      AsyncClientStreamingCall<global::Examples.Point, global::Examples.RouteSummary> RecordRoute(CallOptions options);
-      AsyncDuplexStreamingCall<global::Examples.RouteNote, global::Examples.RouteNote> RouteChat(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken));
-      AsyncDuplexStreamingCall<global::Examples.RouteNote, global::Examples.RouteNote> RouteChat(CallOptions options);
+      global::Routeguide.Feature GetFeature(global::Routeguide.Point request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken));
+      global::Routeguide.Feature GetFeature(global::Routeguide.Point request, CallOptions options);
+      AsyncUnaryCall<global::Routeguide.Feature> GetFeatureAsync(global::Routeguide.Point request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken));
+      AsyncUnaryCall<global::Routeguide.Feature> GetFeatureAsync(global::Routeguide.Point request, CallOptions options);
+      AsyncServerStreamingCall<global::Routeguide.Feature> ListFeatures(global::Routeguide.Rectangle request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken));
+      AsyncServerStreamingCall<global::Routeguide.Feature> ListFeatures(global::Routeguide.Rectangle request, CallOptions options);
+      AsyncClientStreamingCall<global::Routeguide.Point, global::Routeguide.RouteSummary> RecordRoute(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken));
+      AsyncClientStreamingCall<global::Routeguide.Point, global::Routeguide.RouteSummary> RecordRoute(CallOptions options);
+      AsyncDuplexStreamingCall<global::Routeguide.RouteNote, global::Routeguide.RouteNote> RouteChat(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken));
+      AsyncDuplexStreamingCall<global::Routeguide.RouteNote, global::Routeguide.RouteNote> RouteChat(CallOptions options);
     }
     }
 
 
     // server-side interface
     // server-side interface
     public interface IRouteGuide
     public interface IRouteGuide
     {
     {
-      Task<global::Examples.Feature> GetFeature(global::Examples.Point request, ServerCallContext context);
-      Task ListFeatures(global::Examples.Rectangle request, IServerStreamWriter<global::Examples.Feature> responseStream, ServerCallContext context);
-      Task<global::Examples.RouteSummary> RecordRoute(IAsyncStreamReader<global::Examples.Point> requestStream, ServerCallContext context);
-      Task RouteChat(IAsyncStreamReader<global::Examples.RouteNote> requestStream, IServerStreamWriter<global::Examples.RouteNote> responseStream, ServerCallContext context);
+      Task<global::Routeguide.Feature> GetFeature(global::Routeguide.Point request, ServerCallContext context);
+      Task ListFeatures(global::Routeguide.Rectangle request, IServerStreamWriter<global::Routeguide.Feature> responseStream, ServerCallContext context);
+      Task<global::Routeguide.RouteSummary> RecordRoute(IAsyncStreamReader<global::Routeguide.Point> requestStream, ServerCallContext context);
+      Task RouteChat(IAsyncStreamReader<global::Routeguide.RouteNote> requestStream, IServerStreamWriter<global::Routeguide.RouteNote> responseStream, ServerCallContext context);
     }
     }
 
 
     // client stub
     // client stub
@@ -82,52 +82,52 @@ namespace Examples {
       public RouteGuideClient(Channel channel) : base(channel)
       public RouteGuideClient(Channel channel) : base(channel)
       {
       {
       }
       }
-      public global::Examples.Feature GetFeature(global::Examples.Point request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+      public global::Routeguide.Feature GetFeature(global::Routeguide.Point request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
       {
       {
         var call = CreateCall(__Method_GetFeature, new CallOptions(headers, deadline, cancellationToken));
         var call = CreateCall(__Method_GetFeature, new CallOptions(headers, deadline, cancellationToken));
         return Calls.BlockingUnaryCall(call, request);
         return Calls.BlockingUnaryCall(call, request);
       }
       }
-      public global::Examples.Feature GetFeature(global::Examples.Point request, CallOptions options)
+      public global::Routeguide.Feature GetFeature(global::Routeguide.Point request, CallOptions options)
       {
       {
         var call = CreateCall(__Method_GetFeature, options);
         var call = CreateCall(__Method_GetFeature, options);
         return Calls.BlockingUnaryCall(call, request);
         return Calls.BlockingUnaryCall(call, request);
       }
       }
-      public AsyncUnaryCall<global::Examples.Feature> GetFeatureAsync(global::Examples.Point request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+      public AsyncUnaryCall<global::Routeguide.Feature> GetFeatureAsync(global::Routeguide.Point request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
       {
       {
         var call = CreateCall(__Method_GetFeature, new CallOptions(headers, deadline, cancellationToken));
         var call = CreateCall(__Method_GetFeature, new CallOptions(headers, deadline, cancellationToken));
         return Calls.AsyncUnaryCall(call, request);
         return Calls.AsyncUnaryCall(call, request);
       }
       }
-      public AsyncUnaryCall<global::Examples.Feature> GetFeatureAsync(global::Examples.Point request, CallOptions options)
+      public AsyncUnaryCall<global::Routeguide.Feature> GetFeatureAsync(global::Routeguide.Point request, CallOptions options)
       {
       {
         var call = CreateCall(__Method_GetFeature, options);
         var call = CreateCall(__Method_GetFeature, options);
         return Calls.AsyncUnaryCall(call, request);
         return Calls.AsyncUnaryCall(call, request);
       }
       }
-      public AsyncServerStreamingCall<global::Examples.Feature> ListFeatures(global::Examples.Rectangle request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+      public AsyncServerStreamingCall<global::Routeguide.Feature> ListFeatures(global::Routeguide.Rectangle request, Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
       {
       {
         var call = CreateCall(__Method_ListFeatures, new CallOptions(headers, deadline, cancellationToken));
         var call = CreateCall(__Method_ListFeatures, new CallOptions(headers, deadline, cancellationToken));
         return Calls.AsyncServerStreamingCall(call, request);
         return Calls.AsyncServerStreamingCall(call, request);
       }
       }
-      public AsyncServerStreamingCall<global::Examples.Feature> ListFeatures(global::Examples.Rectangle request, CallOptions options)
+      public AsyncServerStreamingCall<global::Routeguide.Feature> ListFeatures(global::Routeguide.Rectangle request, CallOptions options)
       {
       {
         var call = CreateCall(__Method_ListFeatures, options);
         var call = CreateCall(__Method_ListFeatures, options);
         return Calls.AsyncServerStreamingCall(call, request);
         return Calls.AsyncServerStreamingCall(call, request);
       }
       }
-      public AsyncClientStreamingCall<global::Examples.Point, global::Examples.RouteSummary> RecordRoute(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+      public AsyncClientStreamingCall<global::Routeguide.Point, global::Routeguide.RouteSummary> RecordRoute(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
       {
       {
         var call = CreateCall(__Method_RecordRoute, new CallOptions(headers, deadline, cancellationToken));
         var call = CreateCall(__Method_RecordRoute, new CallOptions(headers, deadline, cancellationToken));
         return Calls.AsyncClientStreamingCall(call);
         return Calls.AsyncClientStreamingCall(call);
       }
       }
-      public AsyncClientStreamingCall<global::Examples.Point, global::Examples.RouteSummary> RecordRoute(CallOptions options)
+      public AsyncClientStreamingCall<global::Routeguide.Point, global::Routeguide.RouteSummary> RecordRoute(CallOptions options)
       {
       {
         var call = CreateCall(__Method_RecordRoute, options);
         var call = CreateCall(__Method_RecordRoute, options);
         return Calls.AsyncClientStreamingCall(call);
         return Calls.AsyncClientStreamingCall(call);
       }
       }
-      public AsyncDuplexStreamingCall<global::Examples.RouteNote, global::Examples.RouteNote> RouteChat(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
+      public AsyncDuplexStreamingCall<global::Routeguide.RouteNote, global::Routeguide.RouteNote> RouteChat(Metadata headers = null, DateTime? deadline = null, CancellationToken cancellationToken = default(CancellationToken))
       {
       {
         var call = CreateCall(__Method_RouteChat, new CallOptions(headers, deadline, cancellationToken));
         var call = CreateCall(__Method_RouteChat, new CallOptions(headers, deadline, cancellationToken));
         return Calls.AsyncDuplexStreamingCall(call);
         return Calls.AsyncDuplexStreamingCall(call);
       }
       }
-      public AsyncDuplexStreamingCall<global::Examples.RouteNote, global::Examples.RouteNote> RouteChat(CallOptions options)
+      public AsyncDuplexStreamingCall<global::Routeguide.RouteNote, global::Routeguide.RouteNote> RouteChat(CallOptions options)
       {
       {
         var call = CreateCall(__Method_RouteChat, options);
         var call = CreateCall(__Method_RouteChat, options);
         return Calls.AsyncDuplexStreamingCall(call);
         return Calls.AsyncDuplexStreamingCall(call);

+ 1 - 1
examples/csharp/route_guide/RouteGuide/RouteGuideUtil.cs

@@ -7,7 +7,7 @@ using System.Linq;
 using System.Text;
 using System.Text;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 
 
-namespace Examples
+namespace Routeguide
 {
 {
     /// <summary>
     /// <summary>
     /// Utility methods for the route guide example.
     /// Utility methods for the route guide example.

+ 1 - 1
examples/csharp/route_guide/RouteGuideClient/Program.cs

@@ -5,7 +5,7 @@ using System.Linq;
 using System.Text;
 using System.Text;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 
 
-namespace Examples
+namespace Routeguide
 {
 {
     class Program
     class Program
     {
     {

+ 1 - 1
examples/csharp/route_guide/RouteGuideServer/Program.cs

@@ -5,7 +5,7 @@ using System.Linq;
 using System.Text;
 using System.Text;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 
 
-namespace Examples
+namespace Routeguide
 {
 {
     class Program
     class Program
     {
     {

+ 1 - 1
examples/csharp/route_guide/RouteGuideServer/RouteGuideImpl.cs

@@ -8,7 +8,7 @@ using System.Threading.Tasks;
 
 
 using Grpc.Core.Utils;
 using Grpc.Core.Utils;
 
 
-namespace Examples
+namespace Routeguide
 {
 {
     /// <summary>
     /// <summary>
     /// Example implementation of RouteGuide server.
     /// Example implementation of RouteGuide server.

+ 17 - 8
gRPC.podspec

@@ -36,17 +36,17 @@
 
 
 Pod::Spec.new do |s|
 Pod::Spec.new do |s|
   s.name     = 'gRPC'
   s.name     = 'gRPC'
-  s.version  = '0.7.0'
+  s.version  = '0.11.0'
   s.summary  = 'gRPC client library for iOS/OSX'
   s.summary  = 'gRPC client library for iOS/OSX'
   s.homepage = 'http://www.grpc.io'
   s.homepage = 'http://www.grpc.io'
   s.license  = 'New BSD'
   s.license  = 'New BSD'
   s.authors  = { 'The gRPC contributors' => 'grpc-packages@google.com' }
   s.authors  = { 'The gRPC contributors' => 'grpc-packages@google.com' }
 
 
   # s.source = { :git => 'https://github.com/grpc/grpc.git',
   # s.source = { :git => 'https://github.com/grpc/grpc.git',
-  #              :tag => 'release-0_10_0-objectivec-0.6.0' }
+  #              :tag => 'release-0_11_0-objectivec-0.11.0' }
 
 
-  s.ios.deployment_target = '6.0'
-  s.osx.deployment_target = '10.8'
+  s.ios.deployment_target = '7.1'
+  s.osx.deployment_target = '10.9'
   s.requires_arc = true
   s.requires_arc = true
 
 
   objc_dir = 'src/objective-c'
   objc_dir = 'src/objective-c'
@@ -136,10 +136,10 @@ Pod::Spec.new do |s|
                       'src/core/security/auth_filters.h',
                       'src/core/security/auth_filters.h',
                       'src/core/security/base64.h',
                       'src/core/security/base64.h',
                       'src/core/security/credentials.h',
                       'src/core/security/credentials.h',
+                      'src/core/security/handshake.h',
                       'src/core/security/json_token.h',
                       'src/core/security/json_token.h',
                       'src/core/security/jwt_verifier.h',
                       'src/core/security/jwt_verifier.h',
                       'src/core/security/secure_endpoint.h',
                       'src/core/security/secure_endpoint.h',
-                      'src/core/security/secure_transport_setup.h',
                       'src/core/security/security_connector.h',
                       'src/core/security/security_connector.h',
                       'src/core/security/security_context.h',
                       'src/core/security/security_context.h',
                       'src/core/tsi/fake_transport_security.h',
                       'src/core/tsi/fake_transport_security.h',
@@ -159,7 +159,10 @@ Pod::Spec.new do |s|
                       'src/core/client_config/client_config.h',
                       'src/core/client_config/client_config.h',
                       'src/core/client_config/connector.h',
                       'src/core/client_config/connector.h',
                       'src/core/client_config/lb_policies/pick_first.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',
                       'src/core/client_config/lb_policy.h',
+                      'src/core/client_config/lb_policy_factory.h',
+                      'src/core/client_config/lb_policy_registry.h',
                       'src/core/client_config/resolver.h',
                       'src/core/client_config/resolver.h',
                       'src/core/client_config/resolver_factory.h',
                       'src/core/client_config/resolver_factory.h',
                       'src/core/client_config/resolver_registry.h',
                       'src/core/client_config/resolver_registry.h',
@@ -265,10 +268,10 @@ Pod::Spec.new do |s|
                       'src/core/security/credentials_posix.c',
                       'src/core/security/credentials_posix.c',
                       'src/core/security/credentials_win32.c',
                       'src/core/security/credentials_win32.c',
                       'src/core/security/google_default_credentials.c',
                       'src/core/security/google_default_credentials.c',
+                      'src/core/security/handshake.c',
                       'src/core/security/json_token.c',
                       'src/core/security/json_token.c',
                       'src/core/security/jwt_verifier.c',
                       'src/core/security/jwt_verifier.c',
                       'src/core/security/secure_endpoint.c',
                       'src/core/security/secure_endpoint.c',
-                      'src/core/security/secure_transport_setup.c',
                       'src/core/security/security_connector.c',
                       'src/core/security/security_connector.c',
                       'src/core/security/security_context.c',
                       'src/core/security/security_context.c',
                       'src/core/security/server_auth_filter.c',
                       'src/core/security/server_auth_filter.c',
@@ -291,7 +294,10 @@ Pod::Spec.new do |s|
                       'src/core/client_config/client_config.c',
                       'src/core/client_config/client_config.c',
                       'src/core/client_config/connector.c',
                       'src/core/client_config/connector.c',
                       'src/core/client_config/lb_policies/pick_first.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.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.c',
                       'src/core/client_config/resolver_factory.c',
                       'src/core/client_config/resolver_factory.c',
                       'src/core/client_config/resolver_registry.c',
                       'src/core/client_config/resolver_registry.c',
@@ -410,10 +416,10 @@ Pod::Spec.new do |s|
                               'src/core/security/auth_filters.h',
                               'src/core/security/auth_filters.h',
                               'src/core/security/base64.h',
                               'src/core/security/base64.h',
                               'src/core/security/credentials.h',
                               'src/core/security/credentials.h',
+                              'src/core/security/handshake.h',
                               'src/core/security/json_token.h',
                               'src/core/security/json_token.h',
                               'src/core/security/jwt_verifier.h',
                               'src/core/security/jwt_verifier.h',
                               'src/core/security/secure_endpoint.h',
                               'src/core/security/secure_endpoint.h',
-                              'src/core/security/secure_transport_setup.h',
                               'src/core/security/security_connector.h',
                               'src/core/security/security_connector.h',
                               'src/core/security/security_context.h',
                               'src/core/security/security_context.h',
                               'src/core/tsi/fake_transport_security.h',
                               'src/core/tsi/fake_transport_security.h',
@@ -433,7 +439,10 @@ Pod::Spec.new do |s|
                               'src/core/client_config/client_config.h',
                               'src/core/client_config/client_config.h',
                               'src/core/client_config/connector.h',
                               'src/core/client_config/connector.h',
                               'src/core/client_config/lb_policies/pick_first.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',
                               'src/core/client_config/lb_policy.h',
+                              'src/core/client_config/lb_policy_factory.h',
+                              'src/core/client_config/lb_policy_registry.h',
                               'src/core/client_config/resolver.h',
                               'src/core/client_config/resolver.h',
                               'src/core/client_config/resolver_factory.h',
                               'src/core/client_config/resolver_factory.h',
                               'src/core/client_config/resolver_registry.h',
                               'src/core/client_config/resolver_registry.h',
@@ -585,6 +594,6 @@ Pod::Spec.new do |s|
 
 
     ss.dependency 'gRPC/GRPCClient'
     ss.dependency 'gRPC/GRPCClient'
     ss.dependency 'gRPC/RxLibrary'
     ss.dependency 'gRPC/RxLibrary'
-    ss.dependency 'Protobuf', '~> 3.0.0-alpha-3'
+    ss.dependency 'Protobuf', '~> 3.0.0-alpha-4'
   end
   end
 end
 end

+ 12641 - 0
grpc.gyp

@@ -0,0 +1,12641 @@
+# GRPC gyp file
+# This currently builds C code.
+# This file has been automatically generated from a template file.
+# Please look at the templates directory instead.
+# This file can be regenerated from the template by running
+# tools/buildgen/generate_projects.sh
+
+# Copyright 2015, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Some of this file is built with the help of
+# https://n8.io/converting-a-c-library-to-gyp/
+{
+  # TODO: Finish windows support
+  'target_defaults': {
+    'default_configuration': 'Debug',
+    'configurations': {
+      'Debug': {
+        'defines': [ 'DEBUG', '_DEBUG' ],
+        'msvs_settings': {
+          'VCCLCompilerTool': {
+            'RuntimeLibrary': 1, # static debug
+          },
+        },
+      },
+      'Release': {
+        'defines': [ 'NDEBUG' ],
+        'msvs_settings': {
+          'VCCLCompilerTool': {
+            'RuntimeLibrary': 0, # static release
+          },
+        },
+      }
+    },
+    'msvs_settings': {
+      'VCLinkerTool': {
+        'GenerateDebugInformation': 'true',
+      },
+    },
+    # TODO: Add fallback for Windows, and if pkg-config is not available
+    'defines': [
+      'TSI_OPENSSL_ALPN_SUPPORT=<!(pkg-config --atleast-version=1.0.2 openssl >/dev/null 2>&1 && echo 1 || echo 0)'
+    ],
+    'include_dirs': [
+      '.',
+      'include'
+    ],
+    # TODO: Check for libraries with pkg-config
+    'libraries': [
+      '-lcrypto',
+      '-lssl',
+      '-ldl',
+      '-lpthread',
+      '-lz'
+    ]
+  },
+  'targets': [
+    # TODO: Add C++ targets
+    {
+      'target_name': 'gpr',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+      ],
+      'sources': [
+        'src/core/support/alloc.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/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_win32.c',
+        'src/core/support/tls_pthread.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'gpr_test_util',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'gpr',
+      ],
+      'sources': [
+        'test/core/util/test_config.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'grpc',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'gpr',
+      ],
+      'sources': [
+        '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/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/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/noop_filter.c',
+        'src/core/client_config/client_config.c',
+        'src/core/client_config/connector.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_factory_decorators/add_channel_arg.c',
+        'src/core/client_config/subchannel_factory_decorators/merge_channel_args.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/alarm.c',
+        'src/core/iomgr/alarm_heap.c',
+        'src/core/iomgr/endpoint.c',
+        'src/core/iomgr/endpoint_pair_posix.c',
+        'src/core/iomgr/endpoint_pair_windows.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/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/json/json.c',
+        'src/core/json/json_reader.c',
+        'src/core/json/json_string.c',
+        'src/core/json/json_writer.c',
+        'src/core/profiling/basic_timers.c',
+        'src/core/profiling/stap_timers.c',
+        'src/core/surface/byte_buffer.c',
+        'src/core/surface/byte_buffer_queue.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/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/surface_trace.c',
+        'src/core/surface/version.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_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_encoder.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/stream_op.c',
+        'src/core/transport/transport.c',
+        'src/core/transport/transport_op_string.c',
+        'src/core/census/context.c',
+        'src/core/census/initialize.c',
+        'src/core/census/operation.c',
+        'src/core/census/tracing.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'grpc_test_util',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'gpr',
+        'gpr_test_util',
+        'grpc',
+      ],
+      'sources': [
+        'test/core/end2end/data/server1_cert.c',
+        'test/core/end2end/data/server1_key.c',
+        'test/core/end2end/data/test_root_cert.c',
+        'test/core/end2end/cq_verifier.c',
+        'test/core/end2end/fixtures/proxy.c',
+        'test/core/iomgr/endpoint_tests.c',
+        'test/core/security/oauth2_utils.c',
+        'test/core/util/grpc_profiler.c',
+        'test/core/util/parse_hexstring.c',
+        'test/core/util/port_posix.c',
+        'test/core/util/port_windows.c',
+        'test/core/util/slice_splitter.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'grpc_test_util_unsecure',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'gpr',
+        'gpr_test_util',
+        'grpc',
+      ],
+      'sources': [
+        'test/core/end2end/cq_verifier.c',
+        'test/core/end2end/fixtures/proxy.c',
+        'test/core/iomgr/endpoint_tests.c',
+        'test/core/security/oauth2_utils.c',
+        'test/core/util/grpc_profiler.c',
+        'test/core/util/parse_hexstring.c',
+        'test/core/util/port_posix.c',
+        'test/core/util/port_windows.c',
+        'test/core/util/slice_splitter.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'grpc_unsecure',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'gpr',
+      ],
+      'sources': [
+        'src/core/surface/init_unsecure.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/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/noop_filter.c',
+        'src/core/client_config/client_config.c',
+        'src/core/client_config/connector.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_factory_decorators/add_channel_arg.c',
+        'src/core/client_config/subchannel_factory_decorators/merge_channel_args.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/alarm.c',
+        'src/core/iomgr/alarm_heap.c',
+        'src/core/iomgr/endpoint.c',
+        'src/core/iomgr/endpoint_pair_posix.c',
+        'src/core/iomgr/endpoint_pair_windows.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/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/json/json.c',
+        'src/core/json/json_reader.c',
+        'src/core/json/json_string.c',
+        'src/core/json/json_writer.c',
+        'src/core/profiling/basic_timers.c',
+        'src/core/profiling/stap_timers.c',
+        'src/core/surface/byte_buffer.c',
+        'src/core/surface/byte_buffer_queue.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/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/surface_trace.c',
+        'src/core/surface/version.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_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_encoder.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/stream_op.c',
+        'src/core/transport/transport.c',
+        'src/core/transport/transport_op_string.c',
+        'src/core/census/context.c',
+        'src/core/census/initialize.c',
+        'src/core/census/operation.c',
+        'src/core/census/tracing.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'grpc_zookeeper',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'gpr',
+        'grpc',
+      ],
+      'sources': [
+        'src/core/client_config/resolvers/zookeeper_resolver.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'reconnect_server',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/util/reconnect_server.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    # TODO: Add C++ targets
+    # TODO: Add C++ targets
+    # TODO: Add C++ targets
+    # TODO: Add C++ targets
+    # TODO: Add C++ targets
+    # TODO: Add C++ targets
+    # TODO: Add C++ targets
+    # TODO: Add C++ targets
+    # TODO: Add C++ targets
+    # TODO: Add C++ targets
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_fixture_h2_compress',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/fixtures/h2_compress.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_fixture_h2_fakesec',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/fixtures/h2_fakesec.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_fixture_h2_full',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/fixtures/h2_full.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_fixture_h2_full+poll',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/fixtures/h2_full+poll.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_fixture_h2_oauth2',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/fixtures/h2_oauth2.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_fixture_h2_proxy',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/fixtures/h2_proxy.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_fixture_h2_sockpair',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/fixtures/h2_sockpair.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_fixture_h2_sockpair+trace',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/fixtures/h2_sockpair+trace.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_fixture_h2_sockpair_1byte',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/fixtures/h2_sockpair_1byte.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_fixture_h2_ssl',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/fixtures/h2_ssl.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_fixture_h2_ssl+poll',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/fixtures/h2_ssl+poll.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_fixture_h2_ssl_proxy',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/fixtures/h2_ssl_proxy.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_fixture_h2_uds',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/fixtures/h2_uds.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_fixture_h2_uds+poll',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/fixtures/h2_uds+poll.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_bad_hostname',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/bad_hostname.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_binary_metadata',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/binary_metadata.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_call_creds',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/call_creds.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_cancel_after_accept',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/cancel_after_accept.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_cancel_after_client_done',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/cancel_after_client_done.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_cancel_after_invoke',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/cancel_after_invoke.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_cancel_before_invoke',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/cancel_before_invoke.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_cancel_in_a_vacuum',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/cancel_in_a_vacuum.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_census_simple_request',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/census_simple_request.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_channel_connectivity',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/channel_connectivity.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_compressed_payload',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/compressed_payload.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_default_host',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/default_host.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_disappearing_server',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/disappearing_server.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_empty_batch',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/empty_batch.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_graceful_server_shutdown',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/graceful_server_shutdown.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_high_initial_seqno',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/high_initial_seqno.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_invoke_large_request',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/invoke_large_request.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_large_metadata',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/large_metadata.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_max_concurrent_streams',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/max_concurrent_streams.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_max_message_length',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/max_message_length.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_metadata',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/metadata.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_no_op',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/no_op.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_payload',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/payload.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_ping_pong_streaming',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/ping_pong_streaming.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_registered_call',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/registered_call.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_request_with_flags',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/request_with_flags.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_request_with_payload',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/request_with_payload.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_server_finishes_request',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/server_finishes_request.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_shutdown_finishes_calls',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/shutdown_finishes_calls.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_shutdown_finishes_tags',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/shutdown_finishes_tags.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_simple_delayed_request',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/simple_delayed_request.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_simple_request',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/simple_request.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_test_trailing_metadata',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/tests/trailing_metadata.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'end2end_certs',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+      ],
+      'sources': [
+        'test/core/end2end/data/test_root_cert.c',
+        'test/core/end2end/data/server1_cert.c',
+        'test/core/end2end/data/server1_key.c',
+      ],
+    },
+    # TODO: Add C++ targets
+    {
+      'target_name': 'bad_client_test',
+      'product_prefix': 'lib',
+      'type': 'static_library',
+      'dependencies': [
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/bad_client/bad_client.c',
+      ],
+    },
+    {
+      'target_name': 'alarm_heap_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/iomgr/alarm_heap_test.c',
+      ]
+    },
+    {
+      'target_name': 'alarm_list_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/iomgr/alarm_list_test.c',
+      ]
+    },
+    {
+      'target_name': 'alarm_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/iomgr/alarm_test.c',
+      ]
+    },
+    {
+      'target_name': 'alpn_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/transport/chttp2/alpn_test.c',
+      ]
+    },
+    {
+      'target_name': 'bin_encoder_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/transport/chttp2/bin_encoder_test.c',
+      ]
+    },
+    {
+      'target_name': 'chttp2_status_conversion_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/transport/chttp2/status_conversion_test.c',
+      ]
+    },
+    {
+      'target_name': 'chttp2_stream_encoder_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/transport/chttp2/stream_encoder_test.c',
+      ]
+    },
+    {
+      'target_name': 'chttp2_stream_map_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/transport/chttp2/stream_map_test.c',
+      ]
+    },
+    {
+      'target_name': 'compression_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/compression/compression_test.c',
+      ]
+    },
+    {
+      'target_name': 'dualstack_socket_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/dualstack_socket_test.c',
+      ]
+    },
+    {
+      'target_name': 'endpoint_pair_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/iomgr/endpoint_pair_test.c',
+      ]
+    },
+    {
+      'target_name': 'fd_conservation_posix_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/iomgr/fd_conservation_posix_test.c',
+      ]
+    },
+    {
+      'target_name': 'fd_posix_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/iomgr/fd_posix_test.c',
+      ]
+    },
+    {
+      'target_name': 'fling_client',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/fling/client.c',
+      ]
+    },
+    {
+      'target_name': 'fling_server',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/fling/server.c',
+      ]
+    },
+    {
+      'target_name': 'fling_stream_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/fling/fling_stream_test.c',
+      ]
+    },
+    {
+      'target_name': 'fling_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/fling/fling_test.c',
+      ]
+    },
+    {
+      'target_name': 'gen_hpack_tables',
+      'type': 'executable',
+      'dependencies': [
+        'gpr',
+        'grpc',
+      ],
+      'sources': [
+        'tools/codegen/core/gen_hpack_tables.c',
+      ]
+    },
+    {
+      'target_name': 'gen_legal_metadata_characters',
+      'type': 'executable',
+      'dependencies': [
+      ],
+      'sources': [
+        'tools/codegen/core/gen_legal_metadata_characters.c',
+      ]
+    },
+    {
+      'target_name': 'gpr_cmdline_test',
+      'type': 'executable',
+      'dependencies': [
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/support/cmdline_test.c',
+      ]
+    },
+    {
+      'target_name': 'gpr_env_test',
+      'type': 'executable',
+      'dependencies': [
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/support/env_test.c',
+      ]
+    },
+    {
+      'target_name': 'gpr_file_test',
+      'type': 'executable',
+      'dependencies': [
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/support/file_test.c',
+      ]
+    },
+    {
+      'target_name': 'gpr_histogram_test',
+      'type': 'executable',
+      'dependencies': [
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/support/histogram_test.c',
+      ]
+    },
+    {
+      'target_name': 'gpr_host_port_test',
+      'type': 'executable',
+      'dependencies': [
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/support/host_port_test.c',
+      ]
+    },
+    {
+      'target_name': 'gpr_log_test',
+      'type': 'executable',
+      'dependencies': [
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/support/log_test.c',
+      ]
+    },
+    {
+      'target_name': 'gpr_slice_buffer_test',
+      'type': 'executable',
+      'dependencies': [
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/support/slice_buffer_test.c',
+      ]
+    },
+    {
+      'target_name': 'gpr_slice_test',
+      'type': 'executable',
+      'dependencies': [
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/support/slice_test.c',
+      ]
+    },
+    {
+      'target_name': 'gpr_stack_lockfree_test',
+      'type': 'executable',
+      'dependencies': [
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/support/stack_lockfree_test.c',
+      ]
+    },
+    {
+      'target_name': 'gpr_string_test',
+      'type': 'executable',
+      'dependencies': [
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/support/string_test.c',
+      ]
+    },
+    {
+      'target_name': 'gpr_sync_test',
+      'type': 'executable',
+      'dependencies': [
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/support/sync_test.c',
+      ]
+    },
+    {
+      'target_name': 'gpr_thd_test',
+      'type': 'executable',
+      'dependencies': [
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/support/thd_test.c',
+      ]
+    },
+    {
+      'target_name': 'gpr_time_test',
+      'type': 'executable',
+      'dependencies': [
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/support/time_test.c',
+      ]
+    },
+    {
+      'target_name': 'gpr_tls_test',
+      'type': 'executable',
+      'dependencies': [
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/support/tls_test.c',
+      ]
+    },
+    {
+      'target_name': 'gpr_useful_test',
+      'type': 'executable',
+      'dependencies': [
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/support/useful_test.c',
+      ]
+    },
+    {
+      'target_name': 'grpc_auth_context_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/security/auth_context_test.c',
+      ]
+    },
+    {
+      'target_name': 'grpc_base64_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/security/base64_test.c',
+      ]
+    },
+    {
+      'target_name': 'grpc_byte_buffer_reader_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/surface/byte_buffer_reader_test.c',
+      ]
+    },
+    {
+      'target_name': 'grpc_channel_args_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/channel/channel_args_test.c',
+      ]
+    },
+    {
+      'target_name': 'grpc_channel_stack_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/channel/channel_stack_test.c',
+      ]
+    },
+    {
+      'target_name': 'grpc_completion_queue_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/surface/completion_queue_test.c',
+      ]
+    },
+    {
+      'target_name': 'grpc_create_jwt',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/security/create_jwt.c',
+      ]
+    },
+    {
+      'target_name': 'grpc_credentials_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/security/credentials_test.c',
+      ]
+    },
+    {
+      'target_name': 'grpc_fetch_oauth2',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/security/fetch_oauth2.c',
+      ]
+    },
+    {
+      'target_name': 'grpc_json_token_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/security/json_token_test.c',
+      ]
+    },
+    {
+      'target_name': 'grpc_jwt_verifier_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/security/jwt_verifier_test.c',
+      ]
+    },
+    {
+      'target_name': 'grpc_print_google_default_creds_token',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/security/print_google_default_creds_token.c',
+      ]
+    },
+    {
+      'target_name': 'grpc_security_connector_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/security/security_connector_test.c',
+      ]
+    },
+    {
+      'target_name': 'grpc_stream_op_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/transport/stream_op_test.c',
+      ]
+    },
+    {
+      'target_name': 'grpc_verify_jwt',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/security/verify_jwt.c',
+      ]
+    },
+    {
+      'target_name': 'hpack_parser_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/transport/chttp2/hpack_parser_test.c',
+      ]
+    },
+    {
+      'target_name': 'hpack_table_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/transport/chttp2/hpack_table_test.c',
+      ]
+    },
+    {
+      'target_name': 'httpcli_format_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/httpcli/format_request_test.c',
+      ]
+    },
+    {
+      'target_name': 'httpcli_parser_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/httpcli/parser_test.c',
+      ]
+    },
+    {
+      'target_name': 'httpcli_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/httpcli/httpcli_test.c',
+      ]
+    },
+    {
+      'target_name': 'json_rewrite',
+      'type': 'executable',
+      'dependencies': [
+        'grpc',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/json/json_rewrite.c',
+      ]
+    },
+    {
+      'target_name': 'json_rewrite_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/json/json_rewrite_test.c',
+      ]
+    },
+    {
+      'target_name': 'json_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/json/json_test.c',
+      ]
+    },
+    {
+      'target_name': 'lame_client_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/surface/lame_client_test.c',
+      ]
+    },
+    {
+      'target_name': 'lb_policies_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/client_config/lb_policies_test.c',
+      ]
+    },
+    {
+      'target_name': 'low_level_ping_pong_benchmark',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/network_benchmarks/low_level_ping_pong.c',
+      ]
+    },
+    {
+      'target_name': 'message_compress_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/compression/message_compress_test.c',
+      ]
+    },
+    {
+      'target_name': 'multi_init_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/surface/multi_init_test.c',
+      ]
+    },
+    {
+      'target_name': 'multiple_server_queues_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/multiple_server_queues_test.c',
+      ]
+    },
+    {
+      'target_name': 'murmur_hash_test',
+      'type': 'executable',
+      'dependencies': [
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/support/murmur_hash_test.c',
+      ]
+    },
+    {
+      'target_name': 'no_server_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/end2end/no_server_test.c',
+      ]
+    },
+    {
+      'target_name': 'resolve_address_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/iomgr/resolve_address_test.c',
+      ]
+    },
+    {
+      'target_name': 'secure_endpoint_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/security/secure_endpoint_test.c',
+      ]
+    },
+    {
+      'target_name': 'sockaddr_utils_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/iomgr/sockaddr_utils_test.c',
+      ]
+    },
+    {
+      'target_name': 'tcp_client_posix_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/iomgr/tcp_client_posix_test.c',
+      ]
+    },
+    {
+      'target_name': 'tcp_posix_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/iomgr/tcp_posix_test.c',
+      ]
+    },
+    {
+      'target_name': 'tcp_server_posix_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/iomgr/tcp_server_posix_test.c',
+      ]
+    },
+    {
+      'target_name': 'time_averaged_stats_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/iomgr/time_averaged_stats_test.c',
+      ]
+    },
+    {
+      'target_name': 'timeout_encoding_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/transport/chttp2/timeout_encoding_test.c',
+      ]
+    },
+    {
+      'target_name': 'timers_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/profiling/timers_test.c',
+      ]
+    },
+    {
+      'target_name': 'transport_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/transport/metadata_test.c',
+      ]
+    },
+    {
+      'target_name': 'transport_security_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/tsi/transport_security_test.c',
+      ]
+    },
+    {
+      'target_name': 'udp_server_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/iomgr/udp_server_test.c',
+      ]
+    },
+    {
+      'target_name': 'uri_parser_test',
+      'type': 'executable',
+      'dependencies': [
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/client_config/uri_parser_test.c',
+      ]
+    },
+    {
+      'target_name': 'h2_compress_bad_hostname_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_bad_hostname',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_binary_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_binary_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_call_creds_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_call_creds',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_cancel_after_accept_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_cancel_after_accept',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_cancel_after_client_done_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_cancel_after_client_done',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_cancel_after_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_cancel_after_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_cancel_before_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_cancel_before_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_cancel_in_a_vacuum_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_cancel_in_a_vacuum',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_census_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_census_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_channel_connectivity_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_channel_connectivity',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_compressed_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_compressed_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_default_host_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_default_host',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_disappearing_server_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_disappearing_server',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_empty_batch_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_empty_batch',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_graceful_server_shutdown_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_graceful_server_shutdown',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_high_initial_seqno_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_high_initial_seqno',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_invoke_large_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_invoke_large_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_large_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_large_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_max_concurrent_streams_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_max_concurrent_streams',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_max_message_length_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_max_message_length',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_no_op_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_no_op',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_ping_pong_streaming_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_ping_pong_streaming',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_registered_call_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_registered_call',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_request_with_flags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_request_with_flags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_request_with_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_request_with_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_server_finishes_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_server_finishes_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_shutdown_finishes_calls_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_shutdown_finishes_calls',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_shutdown_finishes_tags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_shutdown_finishes_tags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_simple_delayed_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_simple_delayed_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_trailing_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_trailing_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_bad_hostname_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_bad_hostname',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_binary_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_binary_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_call_creds_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_call_creds',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_cancel_after_accept_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_cancel_after_accept',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_cancel_after_client_done_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_cancel_after_client_done',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_cancel_after_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_cancel_after_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_cancel_before_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_cancel_before_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_cancel_in_a_vacuum_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_cancel_in_a_vacuum',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_census_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_census_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_channel_connectivity_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_channel_connectivity',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_compressed_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_compressed_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_default_host_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_default_host',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_disappearing_server_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_disappearing_server',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_empty_batch_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_empty_batch',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_graceful_server_shutdown_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_graceful_server_shutdown',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_high_initial_seqno_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_high_initial_seqno',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_invoke_large_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_invoke_large_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_large_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_large_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_max_concurrent_streams_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_max_concurrent_streams',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_max_message_length_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_max_message_length',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_no_op_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_no_op',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_ping_pong_streaming_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_ping_pong_streaming',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_registered_call_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_registered_call',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_request_with_flags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_request_with_flags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_request_with_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_request_with_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_server_finishes_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_server_finishes_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_shutdown_finishes_calls_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_shutdown_finishes_calls',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_shutdown_finishes_tags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_shutdown_finishes_tags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_simple_delayed_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_simple_delayed_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_fakesec_trailing_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_fakesec',
+        'end2end_test_trailing_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_bad_hostname_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_bad_hostname',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_binary_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_binary_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_call_creds_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_call_creds',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_cancel_after_accept_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_cancel_after_accept',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_cancel_after_client_done_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_cancel_after_client_done',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_cancel_after_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_cancel_after_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_cancel_before_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_cancel_before_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_cancel_in_a_vacuum_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_cancel_in_a_vacuum',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_census_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_census_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_channel_connectivity_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_channel_connectivity',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_compressed_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_compressed_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_default_host_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_default_host',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_disappearing_server_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_disappearing_server',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_empty_batch_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_empty_batch',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_graceful_server_shutdown_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_graceful_server_shutdown',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_high_initial_seqno_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_high_initial_seqno',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_invoke_large_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_invoke_large_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_large_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_large_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_max_concurrent_streams_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_max_concurrent_streams',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_max_message_length_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_max_message_length',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_no_op_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_no_op',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_ping_pong_streaming_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_ping_pong_streaming',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_registered_call_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_registered_call',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_request_with_flags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_request_with_flags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_request_with_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_request_with_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_server_finishes_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_server_finishes_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_shutdown_finishes_calls_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_shutdown_finishes_calls',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_shutdown_finishes_tags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_shutdown_finishes_tags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_simple_delayed_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_simple_delayed_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_trailing_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_trailing_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_bad_hostname_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_bad_hostname',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_binary_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_binary_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_call_creds_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_call_creds',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_cancel_after_accept_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_cancel_after_accept',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_cancel_after_client_done_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_cancel_after_client_done',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_cancel_after_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_cancel_after_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_cancel_before_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_cancel_before_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_cancel_in_a_vacuum_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_cancel_in_a_vacuum',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_census_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_census_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_channel_connectivity_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_channel_connectivity',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_compressed_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_compressed_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_default_host_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_default_host',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_disappearing_server_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_disappearing_server',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_empty_batch_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_empty_batch',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_graceful_server_shutdown_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_graceful_server_shutdown',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_high_initial_seqno_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_high_initial_seqno',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_invoke_large_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_invoke_large_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_large_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_large_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_max_concurrent_streams_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_max_concurrent_streams',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_max_message_length_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_max_message_length',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_no_op_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_no_op',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_ping_pong_streaming_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_ping_pong_streaming',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_registered_call_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_registered_call',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_request_with_flags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_request_with_flags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_request_with_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_request_with_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_server_finishes_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_server_finishes_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_shutdown_finishes_calls_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_shutdown_finishes_calls',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_shutdown_finishes_tags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_shutdown_finishes_tags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_simple_delayed_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_simple_delayed_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_trailing_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_trailing_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_bad_hostname_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_bad_hostname',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_binary_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_binary_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_call_creds_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_call_creds',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_cancel_after_accept_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_cancel_after_accept',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_cancel_after_client_done_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_cancel_after_client_done',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_cancel_after_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_cancel_after_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_cancel_before_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_cancel_before_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_cancel_in_a_vacuum_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_cancel_in_a_vacuum',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_census_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_census_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_channel_connectivity_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_channel_connectivity',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_compressed_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_compressed_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_default_host_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_default_host',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_disappearing_server_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_disappearing_server',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_empty_batch_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_empty_batch',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_graceful_server_shutdown_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_graceful_server_shutdown',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_high_initial_seqno_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_high_initial_seqno',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_invoke_large_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_invoke_large_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_large_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_large_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_max_concurrent_streams_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_max_concurrent_streams',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_max_message_length_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_max_message_length',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_no_op_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_no_op',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_ping_pong_streaming_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_ping_pong_streaming',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_registered_call_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_registered_call',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_request_with_flags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_request_with_flags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_request_with_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_request_with_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_server_finishes_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_server_finishes_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_shutdown_finishes_calls_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_shutdown_finishes_calls',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_shutdown_finishes_tags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_shutdown_finishes_tags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_simple_delayed_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_simple_delayed_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_oauth2_trailing_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_oauth2',
+        'end2end_test_trailing_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_bad_hostname_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_bad_hostname',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_binary_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_binary_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_call_creds_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_call_creds',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_cancel_after_accept_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_cancel_after_accept',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_cancel_after_client_done_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_cancel_after_client_done',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_cancel_after_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_cancel_after_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_cancel_before_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_cancel_before_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_cancel_in_a_vacuum_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_cancel_in_a_vacuum',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_census_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_census_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_default_host_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_default_host',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_disappearing_server_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_disappearing_server',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_empty_batch_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_empty_batch',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_graceful_server_shutdown_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_graceful_server_shutdown',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_high_initial_seqno_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_high_initial_seqno',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_invoke_large_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_invoke_large_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_large_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_large_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_max_message_length_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_max_message_length',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_no_op_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_no_op',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_ping_pong_streaming_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_ping_pong_streaming',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_registered_call_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_registered_call',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_request_with_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_request_with_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_server_finishes_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_server_finishes_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_shutdown_finishes_calls_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_shutdown_finishes_calls',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_shutdown_finishes_tags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_shutdown_finishes_tags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_simple_delayed_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_simple_delayed_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_trailing_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_trailing_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_bad_hostname_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_bad_hostname',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_binary_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_binary_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_call_creds_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_call_creds',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_cancel_after_accept_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_cancel_after_accept',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_cancel_after_client_done_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_cancel_after_client_done',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_cancel_after_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_cancel_after_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_cancel_before_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_cancel_before_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_cancel_in_a_vacuum_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_cancel_in_a_vacuum',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_census_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_census_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_compressed_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_compressed_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_empty_batch_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_empty_batch',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_graceful_server_shutdown_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_graceful_server_shutdown',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_high_initial_seqno_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_high_initial_seqno',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_invoke_large_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_invoke_large_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_large_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_large_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_max_concurrent_streams_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_max_concurrent_streams',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_max_message_length_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_max_message_length',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_no_op_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_no_op',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_ping_pong_streaming_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_ping_pong_streaming',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_registered_call_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_registered_call',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_request_with_flags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_request_with_flags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_request_with_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_request_with_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_server_finishes_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_server_finishes_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_shutdown_finishes_calls_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_shutdown_finishes_calls',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_shutdown_finishes_tags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_shutdown_finishes_tags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_trailing_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_trailing_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_bad_hostname_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_bad_hostname',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_binary_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_binary_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_call_creds_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_call_creds',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_cancel_after_accept_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_cancel_after_accept',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_cancel_after_client_done_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_cancel_after_client_done',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_cancel_after_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_cancel_after_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_cancel_before_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_cancel_before_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_cancel_in_a_vacuum_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_cancel_in_a_vacuum',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_census_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_census_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_compressed_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_compressed_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_empty_batch_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_empty_batch',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_graceful_server_shutdown_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_graceful_server_shutdown',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_high_initial_seqno_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_high_initial_seqno',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_invoke_large_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_invoke_large_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_large_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_large_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_max_concurrent_streams_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_max_concurrent_streams',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_max_message_length_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_max_message_length',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_no_op_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_no_op',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_ping_pong_streaming_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_ping_pong_streaming',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_registered_call_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_registered_call',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_request_with_flags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_request_with_flags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_request_with_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_request_with_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_server_finishes_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_server_finishes_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_shutdown_finishes_calls_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_shutdown_finishes_calls',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_shutdown_finishes_tags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_shutdown_finishes_tags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_trailing_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_trailing_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_bad_hostname_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_bad_hostname',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_binary_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_binary_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_call_creds_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_call_creds',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_cancel_after_accept_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_cancel_after_accept',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_cancel_after_client_done_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_cancel_after_client_done',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_cancel_after_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_cancel_after_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_cancel_before_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_cancel_before_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_cancel_in_a_vacuum_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_cancel_in_a_vacuum',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_census_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_census_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_compressed_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_compressed_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_empty_batch_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_empty_batch',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_graceful_server_shutdown_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_graceful_server_shutdown',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_high_initial_seqno_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_high_initial_seqno',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_invoke_large_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_invoke_large_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_large_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_large_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_max_concurrent_streams_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_max_concurrent_streams',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_max_message_length_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_max_message_length',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_no_op_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_no_op',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_ping_pong_streaming_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_ping_pong_streaming',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_registered_call_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_registered_call',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_request_with_flags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_request_with_flags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_request_with_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_request_with_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_server_finishes_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_server_finishes_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_shutdown_finishes_calls_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_shutdown_finishes_calls',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_shutdown_finishes_tags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_shutdown_finishes_tags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_trailing_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_trailing_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_bad_hostname_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_bad_hostname',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_binary_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_binary_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_call_creds_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_call_creds',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_cancel_after_accept_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_cancel_after_accept',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_cancel_after_client_done_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_cancel_after_client_done',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_cancel_after_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_cancel_after_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_cancel_before_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_cancel_before_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_cancel_in_a_vacuum_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_cancel_in_a_vacuum',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_census_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_census_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_channel_connectivity_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_channel_connectivity',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_compressed_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_compressed_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_default_host_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_default_host',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_disappearing_server_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_disappearing_server',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_empty_batch_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_empty_batch',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_graceful_server_shutdown_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_graceful_server_shutdown',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_high_initial_seqno_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_high_initial_seqno',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_invoke_large_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_invoke_large_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_large_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_large_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_max_concurrent_streams_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_max_concurrent_streams',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_max_message_length_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_max_message_length',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_no_op_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_no_op',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_ping_pong_streaming_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_ping_pong_streaming',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_registered_call_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_registered_call',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_request_with_flags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_request_with_flags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_request_with_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_request_with_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_server_finishes_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_server_finishes_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_shutdown_finishes_calls_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_shutdown_finishes_calls',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_shutdown_finishes_tags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_shutdown_finishes_tags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_simple_delayed_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_simple_delayed_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_trailing_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl',
+        'end2end_test_trailing_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_bad_hostname_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_bad_hostname',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_binary_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_binary_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_call_creds_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_call_creds',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_cancel_after_accept_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_cancel_after_accept',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_cancel_after_client_done_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_cancel_after_client_done',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_cancel_after_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_cancel_after_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_cancel_before_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_cancel_before_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_cancel_in_a_vacuum_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_cancel_in_a_vacuum',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_census_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_census_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_channel_connectivity_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_channel_connectivity',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_compressed_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_compressed_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_default_host_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_default_host',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_disappearing_server_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_disappearing_server',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_empty_batch_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_empty_batch',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_graceful_server_shutdown_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_graceful_server_shutdown',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_high_initial_seqno_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_high_initial_seqno',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_invoke_large_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_invoke_large_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_large_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_large_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_max_concurrent_streams_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_max_concurrent_streams',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_max_message_length_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_max_message_length',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_no_op_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_no_op',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_ping_pong_streaming_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_ping_pong_streaming',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_registered_call_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_registered_call',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_request_with_flags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_request_with_flags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_request_with_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_request_with_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_server_finishes_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_server_finishes_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_shutdown_finishes_calls_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_shutdown_finishes_calls',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_shutdown_finishes_tags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_shutdown_finishes_tags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_simple_delayed_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_simple_delayed_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl+poll_trailing_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl+poll',
+        'end2end_test_trailing_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_bad_hostname_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_bad_hostname',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_binary_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_binary_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_call_creds_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_call_creds',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_cancel_after_accept_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_cancel_after_accept',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_cancel_after_client_done_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_cancel_after_client_done',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_cancel_after_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_cancel_after_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_cancel_before_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_cancel_before_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_cancel_in_a_vacuum_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_cancel_in_a_vacuum',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_census_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_census_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_default_host_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_default_host',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_disappearing_server_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_disappearing_server',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_empty_batch_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_empty_batch',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_graceful_server_shutdown_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_graceful_server_shutdown',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_high_initial_seqno_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_high_initial_seqno',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_invoke_large_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_invoke_large_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_large_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_large_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_max_message_length_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_max_message_length',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_no_op_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_no_op',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_ping_pong_streaming_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_ping_pong_streaming',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_registered_call_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_registered_call',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_request_with_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_request_with_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_server_finishes_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_server_finishes_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_shutdown_finishes_calls_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_shutdown_finishes_calls',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_shutdown_finishes_tags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_shutdown_finishes_tags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_simple_delayed_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_simple_delayed_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_ssl_proxy_trailing_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_ssl_proxy',
+        'end2end_test_trailing_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_bad_hostname_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_bad_hostname',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_binary_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_binary_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_call_creds_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_call_creds',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_cancel_after_accept_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_cancel_after_accept',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_cancel_after_client_done_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_cancel_after_client_done',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_cancel_after_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_cancel_after_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_cancel_before_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_cancel_before_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_cancel_in_a_vacuum_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_cancel_in_a_vacuum',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_census_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_census_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_channel_connectivity_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_channel_connectivity',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_compressed_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_compressed_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_disappearing_server_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_disappearing_server',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_empty_batch_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_empty_batch',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_graceful_server_shutdown_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_graceful_server_shutdown',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_high_initial_seqno_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_high_initial_seqno',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_invoke_large_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_invoke_large_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_large_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_large_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_max_concurrent_streams_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_max_concurrent_streams',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_max_message_length_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_max_message_length',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_no_op_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_no_op',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_ping_pong_streaming_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_ping_pong_streaming',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_registered_call_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_registered_call',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_request_with_flags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_request_with_flags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_request_with_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_request_with_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_server_finishes_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_server_finishes_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_shutdown_finishes_calls_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_shutdown_finishes_calls',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_shutdown_finishes_tags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_shutdown_finishes_tags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_simple_delayed_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_simple_delayed_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_trailing_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_trailing_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_bad_hostname_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_bad_hostname',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_binary_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_binary_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_call_creds_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_call_creds',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_cancel_after_accept_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_cancel_after_accept',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_cancel_after_client_done_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_cancel_after_client_done',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_cancel_after_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_cancel_after_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_cancel_before_invoke_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_cancel_before_invoke',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_cancel_in_a_vacuum_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_cancel_in_a_vacuum',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_census_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_census_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_channel_connectivity_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_channel_connectivity',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_compressed_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_compressed_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_disappearing_server_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_disappearing_server',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_empty_batch_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_empty_batch',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_graceful_server_shutdown_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_graceful_server_shutdown',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_high_initial_seqno_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_high_initial_seqno',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_invoke_large_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_invoke_large_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_large_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_large_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_max_concurrent_streams_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_max_concurrent_streams',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_max_message_length_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_max_message_length',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_no_op_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_no_op',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_ping_pong_streaming_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_ping_pong_streaming',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_registered_call_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_registered_call',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_request_with_flags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_request_with_flags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_request_with_payload_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_request_with_payload',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_server_finishes_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_server_finishes_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_shutdown_finishes_calls_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_shutdown_finishes_calls',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_shutdown_finishes_tags_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_shutdown_finishes_tags',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_simple_delayed_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_simple_delayed_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_simple_request_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_simple_request',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_trailing_metadata_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_trailing_metadata',
+        'end2end_certs',
+        'grpc_test_util',
+        'grpc',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_bad_hostname_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_bad_hostname',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_binary_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_binary_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_cancel_after_accept_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_cancel_after_accept',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_cancel_after_client_done_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_cancel_after_client_done',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_cancel_after_invoke_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_cancel_after_invoke',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_cancel_before_invoke_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_cancel_before_invoke',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_cancel_in_a_vacuum_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_cancel_in_a_vacuum',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_census_simple_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_census_simple_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_channel_connectivity_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_channel_connectivity',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_compressed_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_compressed_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_default_host_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_default_host',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_disappearing_server_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_disappearing_server',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_empty_batch_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_empty_batch',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_graceful_server_shutdown_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_graceful_server_shutdown',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_high_initial_seqno_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_high_initial_seqno',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_invoke_large_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_invoke_large_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_large_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_large_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_max_concurrent_streams_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_max_concurrent_streams',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_max_message_length_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_max_message_length',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_no_op_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_no_op',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_ping_pong_streaming_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_ping_pong_streaming',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_registered_call_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_registered_call',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_request_with_flags_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_request_with_flags',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_request_with_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_request_with_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_server_finishes_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_server_finishes_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_shutdown_finishes_calls_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_shutdown_finishes_calls',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_shutdown_finishes_tags_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_shutdown_finishes_tags',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_simple_delayed_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_simple_delayed_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_simple_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_simple_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_compress_trailing_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_compress',
+        'end2end_test_trailing_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_bad_hostname_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_bad_hostname',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_binary_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_binary_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_cancel_after_accept_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_cancel_after_accept',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_cancel_after_client_done_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_cancel_after_client_done',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_cancel_after_invoke_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_cancel_after_invoke',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_cancel_before_invoke_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_cancel_before_invoke',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_cancel_in_a_vacuum_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_cancel_in_a_vacuum',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_census_simple_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_census_simple_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_channel_connectivity_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_channel_connectivity',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_compressed_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_compressed_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_default_host_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_default_host',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_disappearing_server_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_disappearing_server',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_empty_batch_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_empty_batch',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_graceful_server_shutdown_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_graceful_server_shutdown',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_high_initial_seqno_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_high_initial_seqno',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_invoke_large_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_invoke_large_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_large_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_large_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_max_concurrent_streams_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_max_concurrent_streams',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_max_message_length_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_max_message_length',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_no_op_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_no_op',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_ping_pong_streaming_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_ping_pong_streaming',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_registered_call_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_registered_call',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_request_with_flags_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_request_with_flags',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_request_with_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_request_with_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_server_finishes_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_server_finishes_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_shutdown_finishes_calls_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_shutdown_finishes_calls',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_shutdown_finishes_tags_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_shutdown_finishes_tags',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_simple_delayed_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_simple_delayed_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_simple_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_simple_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full_trailing_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full',
+        'end2end_test_trailing_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_bad_hostname_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_bad_hostname',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_binary_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_binary_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_cancel_after_accept_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_cancel_after_accept',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_cancel_after_client_done_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_cancel_after_client_done',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_cancel_after_invoke_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_cancel_after_invoke',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_cancel_before_invoke_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_cancel_before_invoke',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_cancel_in_a_vacuum_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_cancel_in_a_vacuum',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_census_simple_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_census_simple_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_channel_connectivity_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_channel_connectivity',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_compressed_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_compressed_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_default_host_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_default_host',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_disappearing_server_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_disappearing_server',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_empty_batch_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_empty_batch',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_graceful_server_shutdown_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_graceful_server_shutdown',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_high_initial_seqno_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_high_initial_seqno',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_invoke_large_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_invoke_large_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_large_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_large_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_max_concurrent_streams_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_max_concurrent_streams',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_max_message_length_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_max_message_length',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_no_op_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_no_op',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_ping_pong_streaming_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_ping_pong_streaming',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_registered_call_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_registered_call',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_request_with_flags_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_request_with_flags',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_request_with_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_request_with_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_server_finishes_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_server_finishes_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_shutdown_finishes_calls_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_shutdown_finishes_calls',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_shutdown_finishes_tags_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_shutdown_finishes_tags',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_simple_delayed_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_simple_delayed_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_simple_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_simple_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_full+poll_trailing_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_full+poll',
+        'end2end_test_trailing_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_bad_hostname_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_bad_hostname',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_binary_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_binary_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_cancel_after_accept_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_cancel_after_accept',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_cancel_after_client_done_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_cancel_after_client_done',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_cancel_after_invoke_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_cancel_after_invoke',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_cancel_before_invoke_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_cancel_before_invoke',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_cancel_in_a_vacuum_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_cancel_in_a_vacuum',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_census_simple_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_census_simple_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_default_host_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_default_host',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_disappearing_server_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_disappearing_server',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_empty_batch_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_empty_batch',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_graceful_server_shutdown_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_graceful_server_shutdown',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_high_initial_seqno_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_high_initial_seqno',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_invoke_large_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_invoke_large_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_large_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_large_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_max_message_length_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_max_message_length',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_no_op_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_no_op',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_ping_pong_streaming_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_ping_pong_streaming',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_registered_call_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_registered_call',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_request_with_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_request_with_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_server_finishes_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_server_finishes_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_shutdown_finishes_calls_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_shutdown_finishes_calls',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_shutdown_finishes_tags_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_shutdown_finishes_tags',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_simple_delayed_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_simple_delayed_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_simple_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_simple_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_proxy_trailing_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_proxy',
+        'end2end_test_trailing_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_bad_hostname_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_bad_hostname',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_binary_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_binary_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_cancel_after_accept_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_cancel_after_accept',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_cancel_after_client_done_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_cancel_after_client_done',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_cancel_after_invoke_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_cancel_after_invoke',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_cancel_before_invoke_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_cancel_before_invoke',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_cancel_in_a_vacuum_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_cancel_in_a_vacuum',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_census_simple_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_census_simple_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_compressed_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_compressed_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_empty_batch_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_empty_batch',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_graceful_server_shutdown_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_graceful_server_shutdown',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_high_initial_seqno_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_high_initial_seqno',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_invoke_large_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_invoke_large_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_large_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_large_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_max_concurrent_streams_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_max_concurrent_streams',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_max_message_length_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_max_message_length',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_no_op_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_no_op',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_ping_pong_streaming_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_ping_pong_streaming',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_registered_call_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_registered_call',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_request_with_flags_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_request_with_flags',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_request_with_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_request_with_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_server_finishes_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_server_finishes_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_shutdown_finishes_calls_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_shutdown_finishes_calls',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_shutdown_finishes_tags_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_shutdown_finishes_tags',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_simple_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_simple_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_trailing_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair',
+        'end2end_test_trailing_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_bad_hostname_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_bad_hostname',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_binary_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_binary_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_cancel_after_accept_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_cancel_after_accept',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_cancel_after_client_done_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_cancel_after_client_done',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_cancel_after_invoke_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_cancel_after_invoke',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_cancel_before_invoke_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_cancel_before_invoke',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_cancel_in_a_vacuum_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_cancel_in_a_vacuum',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_census_simple_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_census_simple_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_compressed_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_compressed_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_empty_batch_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_empty_batch',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_graceful_server_shutdown_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_graceful_server_shutdown',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_high_initial_seqno_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_high_initial_seqno',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_invoke_large_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_invoke_large_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_large_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_large_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_max_concurrent_streams_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_max_concurrent_streams',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_max_message_length_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_max_message_length',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_no_op_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_no_op',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_ping_pong_streaming_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_ping_pong_streaming',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_registered_call_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_registered_call',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_request_with_flags_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_request_with_flags',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_request_with_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_request_with_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_server_finishes_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_server_finishes_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_shutdown_finishes_calls_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_shutdown_finishes_calls',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_shutdown_finishes_tags_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_shutdown_finishes_tags',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_simple_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_simple_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair+trace_trailing_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair+trace',
+        'end2end_test_trailing_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_bad_hostname_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_bad_hostname',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_binary_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_binary_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_cancel_after_accept_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_cancel_after_accept',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_cancel_after_client_done_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_cancel_after_client_done',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_cancel_after_invoke_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_cancel_after_invoke',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_cancel_before_invoke_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_cancel_before_invoke',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_cancel_in_a_vacuum_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_cancel_in_a_vacuum',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_census_simple_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_census_simple_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_compressed_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_compressed_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_empty_batch_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_empty_batch',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_graceful_server_shutdown_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_graceful_server_shutdown',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_high_initial_seqno_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_high_initial_seqno',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_invoke_large_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_invoke_large_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_large_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_large_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_max_concurrent_streams_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_max_concurrent_streams',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_max_message_length_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_max_message_length',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_no_op_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_no_op',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_ping_pong_streaming_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_ping_pong_streaming',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_registered_call_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_registered_call',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_request_with_flags_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_request_with_flags',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_request_with_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_request_with_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_server_finishes_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_server_finishes_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_shutdown_finishes_calls_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_shutdown_finishes_calls',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_shutdown_finishes_tags_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_shutdown_finishes_tags',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_simple_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_simple_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_sockpair_1byte_trailing_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_sockpair_1byte',
+        'end2end_test_trailing_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_bad_hostname_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_bad_hostname',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_binary_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_binary_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_cancel_after_accept_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_cancel_after_accept',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_cancel_after_client_done_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_cancel_after_client_done',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_cancel_after_invoke_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_cancel_after_invoke',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_cancel_before_invoke_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_cancel_before_invoke',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_cancel_in_a_vacuum_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_cancel_in_a_vacuum',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_census_simple_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_census_simple_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_channel_connectivity_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_channel_connectivity',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_compressed_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_compressed_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_disappearing_server_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_disappearing_server',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_empty_batch_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_empty_batch',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_graceful_server_shutdown_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_graceful_server_shutdown',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_high_initial_seqno_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_high_initial_seqno',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_invoke_large_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_invoke_large_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_large_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_large_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_max_concurrent_streams_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_max_concurrent_streams',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_max_message_length_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_max_message_length',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_no_op_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_no_op',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_ping_pong_streaming_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_ping_pong_streaming',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_registered_call_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_registered_call',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_request_with_flags_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_request_with_flags',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_request_with_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_request_with_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_server_finishes_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_server_finishes_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_shutdown_finishes_calls_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_shutdown_finishes_calls',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_shutdown_finishes_tags_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_shutdown_finishes_tags',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_simple_delayed_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_simple_delayed_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_simple_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_simple_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds_trailing_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds',
+        'end2end_test_trailing_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_bad_hostname_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_bad_hostname',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_binary_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_binary_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_cancel_after_accept_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_cancel_after_accept',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_cancel_after_client_done_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_cancel_after_client_done',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_cancel_after_invoke_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_cancel_after_invoke',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_cancel_before_invoke_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_cancel_before_invoke',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_cancel_in_a_vacuum_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_cancel_in_a_vacuum',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_census_simple_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_census_simple_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_channel_connectivity_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_channel_connectivity',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_compressed_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_compressed_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_disappearing_server_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_disappearing_server',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_empty_batch_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_empty_batch',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_graceful_server_shutdown_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_graceful_server_shutdown',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_high_initial_seqno_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_high_initial_seqno',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_invoke_large_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_invoke_large_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_large_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_large_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_max_concurrent_streams_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_max_concurrent_streams',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_max_message_length_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_max_message_length',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_no_op_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_no_op',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_ping_pong_streaming_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_ping_pong_streaming',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_registered_call_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_registered_call',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_request_with_flags_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_request_with_flags',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_request_with_payload_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_request_with_payload',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_server_finishes_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_server_finishes_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_shutdown_finishes_calls_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_shutdown_finishes_calls',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_shutdown_finishes_tags_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_shutdown_finishes_tags',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_simple_delayed_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_simple_delayed_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_simple_request_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_simple_request',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'h2_uds+poll_trailing_metadata_nosec_test',
+      'type': 'executable',
+      'dependencies': [
+        'end2end_fixture_h2_uds+poll',
+        'end2end_test_trailing_metadata',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+      ]
+    },
+    {
+      'target_name': 'connection_prefix_bad_client_test',
+      'type': 'executable',
+      'dependencies': [
+        'bad_client_test',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/bad_client/tests/connection_prefix.c',
+      ]
+    },
+    {
+      'target_name': 'initial_settings_frame_bad_client_test',
+      'type': 'executable',
+      'dependencies': [
+        'bad_client_test',
+        'grpc_test_util_unsecure',
+        'grpc_unsecure',
+        'gpr_test_util',
+        'gpr',
+      ],
+      'sources': [
+        'test/core/bad_client/tests/initial_settings_frame.c',
+      ]
+    },
+  ]
+}

+ 1 - 1
include/grpc++/security/auth_metadata_processor.h

@@ -45,7 +45,7 @@ namespace grpc {
 class AuthMetadataProcessor {
 class AuthMetadataProcessor {
  public:
  public:
   typedef std::multimap<grpc::string_ref, grpc::string_ref> InputMetadata;
   typedef std::multimap<grpc::string_ref, grpc::string_ref> InputMetadata;
-  typedef std::multimap<grpc::string, grpc::string_ref> OutputMetadata;
+  typedef std::multimap<grpc::string, grpc::string> OutputMetadata;
 
 
   virtual ~AuthMetadataProcessor() {}
   virtual ~AuthMetadataProcessor() {}
 
 

+ 21 - 0
include/grpc++/security/credentials.h

@@ -34,10 +34,13 @@
 #ifndef GRPCXX_CREDENTIALS_H
 #ifndef GRPCXX_CREDENTIALS_H
 #define GRPCXX_CREDENTIALS_H
 #define GRPCXX_CREDENTIALS_H
 
 
+#include <map>
 #include <memory>
 #include <memory>
 
 
 #include <grpc++/impl/grpc_library.h>
 #include <grpc++/impl/grpc_library.h>
 #include <grpc++/support/config.h>
 #include <grpc++/support/config.h>
+#include <grpc++/support/status.h>
+#include <grpc++/support/string_ref.h>
 
 
 namespace grpc {
 namespace grpc {
 class ChannelArguments;
 class ChannelArguments;
@@ -165,6 +168,24 @@ std::shared_ptr<Credentials> CompositeCredentials(
 /// Credentials for an unencrypted, unauthenticated channel
 /// Credentials for an unencrypted, unauthenticated channel
 std::shared_ptr<Credentials> InsecureCredentials();
 std::shared_ptr<Credentials> InsecureCredentials();
 
 
+// User defined metadata credentials.
+class MetadataCredentialsPlugin {
+ public:
+  virtual ~MetadataCredentialsPlugin() {}
+
+  // If this method returns true, the Process function will be scheduled in
+  // a different thread from the one processing the call.
+  virtual bool IsBlocking() const { return true; }
+
+  // Gets the auth metatada produced by this plugin.
+  virtual Status GetMetadata(
+      grpc::string_ref service_url,
+      std::multimap<grpc::string, grpc::string>* metadata) = 0;
+};
+
+std::shared_ptr<Credentials> MetadataCredentialsFromPlugin(
+    std::unique_ptr<MetadataCredentialsPlugin> plugin);
+
 }  // namespace grpc
 }  // namespace grpc
 
 
 #endif  // GRPCXX_CREDENTIALS_H
 #endif  // GRPCXX_CREDENTIALS_H

+ 40 - 0
include/grpc/grpc_security.h

@@ -131,6 +131,46 @@ grpc_credentials *grpc_google_iam_credentials_create(
     const char *authorization_token, const char *authority_selector,
     const char *authorization_token, const char *authority_selector,
     void *reserved);
     void *reserved);
 
 
+/* Callback function to be called by the metadata credentials plugin
+   implementation when the metadata is ready.
+   - user_data is the opaque pointer that was passed in the get_metadata method
+     of the grpc_metadata_credentials_plugin (see below).
+   - creds_md is an array of credentials metadata produced by the plugin. It
+     may be set to NULL in case of an error.
+   - num_creds_md is the number of items in the creds_md array.
+   - status must be GRPC_STATUS_OK in case of success or another specific error
+     code otherwise.
+   - error_details contains details about the error if any. In case of success
+     it should be NULL and will be otherwise ignored. */
+typedef void (*grpc_credentials_plugin_metadata_cb)(
+    void *user_data, const grpc_metadata *creds_md, size_t num_creds_md,
+    grpc_status_code status, const char *error_details);
+
+/* grpc_metadata_credentials plugin is an API user provided structure used to
+   create grpc_credentials objects that can be set on a channel (composed) or
+   a call. See grpc_credentials_metadata_create_from_plugin below.
+   The grpc client stack will call the get_metadata method of the plugin for
+   every call in scope for the credentials created from it. */
+typedef struct {
+  /* The implementation of this method has to be non-blocking.
+     - service_url is the fully qualified URL that the client stack is
+       connecting to.
+     - cb is the callback that needs to be called when the metadata is ready.
+     - user_data needs to be passed as the first parameter of the callback. */
+  void (*get_metadata)(void *state, const char *service_url,
+                       grpc_credentials_plugin_metadata_cb cb, void *user_data);
+
+  /* Destroys the plugin state. */
+  void (*destroy)(void *state);
+
+  /* State that will be set as the first parameter of the methods above. */
+  void *state;
+} grpc_metadata_credentials_plugin;
+
+/* Creates a credentials object from a plugin. */
+grpc_credentials *grpc_metadata_credentials_create_from_plugin(
+    grpc_metadata_credentials_plugin plugin, void *reserved);
+
 /* --- Secure channel creation. --- */
 /* --- Secure channel creation. --- */
 
 
 /* Creates a secure channel using the passed-in credentials. */
 /* Creates a secure channel using the passed-in credentials. */

+ 1 - 1
src/core/channel/channel_args.h

@@ -71,7 +71,7 @@ grpc_channel_args *grpc_channel_args_set_compression_algorithm(
  * compression algorithms are enabled. It's an error to disable an algorithm set
  * compression algorithms are enabled. It's an error to disable an algorithm set
  * by grpc_channel_args_set_compression_algorithm.
  * by grpc_channel_args_set_compression_algorithm.
  *
  *
- * Returns an instance will the updated algorithm states. The \a a pointer is
+ * Returns an instance with the updated algorithm states. The \a a pointer is
  * modified to point to the returned instance (which may be different from the
  * modified to point to the returned instance (which may be different from the
  * input value of \a a). */
  * input value of \a a). */
 grpc_channel_args *grpc_channel_args_compression_algorithm_set_state(
 grpc_channel_args *grpc_channel_args_compression_algorithm_set_state(

+ 6 - 2
src/core/channel/http_client_filter.c

@@ -70,7 +70,7 @@ typedef struct channel_data {
 /* used to silence 'variable not used' warnings */
 /* used to silence 'variable not used' warnings */
 static void ignore_unused(void *ignored) {}
 static void ignore_unused(void *ignored) {}
 
 
-static grpc_mdelem *client_filter(void *user_data, grpc_mdelem *md) {
+static grpc_mdelem *client_recv_filter(void *user_data, grpc_mdelem *md) {
   grpc_call_element *elem = user_data;
   grpc_call_element *elem = user_data;
   channel_data *channeld = elem->channel_data;
   channel_data *channeld = elem->channel_data;
   if (md == channeld->status) {
   if (md == channeld->status) {
@@ -78,6 +78,8 @@ static grpc_mdelem *client_filter(void *user_data, grpc_mdelem *md) {
   } else if (md->key == channeld->status->key) {
   } else if (md->key == channeld->status->key) {
     grpc_call_element_send_cancel(elem);
     grpc_call_element_send_cancel(elem);
     return NULL;
     return NULL;
+  } else if (md->key == channeld->content_type->key) {
+    return NULL;
   }
   }
   return md;
   return md;
 }
 }
@@ -92,11 +94,13 @@ static void hc_on_recv(void *user_data, int success) {
     grpc_stream_op *op = &ops[i];
     grpc_stream_op *op = &ops[i];
     if (op->type != GRPC_OP_METADATA) continue;
     if (op->type != GRPC_OP_METADATA) continue;
     calld->got_initial_metadata = 1;
     calld->got_initial_metadata = 1;
-    grpc_metadata_batch_filter(&op->data.metadata, client_filter, elem);
+    grpc_metadata_batch_filter(&op->data.metadata, client_recv_filter, elem);
   }
   }
   calld->on_done_recv->cb(calld->on_done_recv->cb_arg, success);
   calld->on_done_recv->cb(calld->on_done_recv->cb_arg, success);
 }
 }
 
 
+
+
 static grpc_mdelem *client_strip_filter(void *user_data, grpc_mdelem *md) {
 static grpc_mdelem *client_strip_filter(void *user_data, grpc_mdelem *md) {
   grpc_call_element *elem = user_data;
   grpc_call_element *elem = user_data;
   channel_data *channeld = elem->channel_data;
   channel_data *channeld = elem->channel_data;

+ 4 - 2
src/core/channel/http_server_filter.c

@@ -46,6 +46,7 @@ typedef struct call_data {
   gpr_uint8 seen_te_trailers;
   gpr_uint8 seen_te_trailers;
   gpr_uint8 seen_authority;
   gpr_uint8 seen_authority;
   grpc_linked_mdelem status;
   grpc_linked_mdelem status;
+  grpc_linked_mdelem content_type;
 
 
   grpc_stream_op_buffer *recv_ops;
   grpc_stream_op_buffer *recv_ops;
   /** Closure to call when finished with the hs_on_recv hook */
   /** Closure to call when finished with the hs_on_recv hook */
@@ -110,8 +111,7 @@ static grpc_mdelem *server_filter(void *user_data, grpc_mdelem *md) {
     return NULL;
     return NULL;
   } else if (md->key == channeld->te_trailers->key ||
   } else if (md->key == channeld->te_trailers->key ||
              md->key == channeld->method_post->key ||
              md->key == channeld->method_post->key ||
-             md->key == channeld->http_scheme->key ||
-             md->key == channeld->content_type->key) {
+             md->key == channeld->http_scheme->key) {
     gpr_log(GPR_ERROR, "Invalid %s: header: '%s'",
     gpr_log(GPR_ERROR, "Invalid %s: header: '%s'",
             grpc_mdstr_as_c_string(md->key), grpc_mdstr_as_c_string(md->value));
             grpc_mdstr_as_c_string(md->key), grpc_mdstr_as_c_string(md->value));
     /* swallow it and error everything out. */
     /* swallow it and error everything out. */
@@ -202,6 +202,8 @@ static void hs_mutate_op(grpc_call_element *elem,
       calld->sent_status = 1;
       calld->sent_status = 1;
       grpc_metadata_batch_add_head(&stream_op->data.metadata, &calld->status,
       grpc_metadata_batch_add_head(&stream_op->data.metadata, &calld->status,
                                    GRPC_MDELEM_REF(channeld->status_ok));
                                    GRPC_MDELEM_REF(channeld->status_ok));
+      grpc_metadata_batch_add_tail(&op->data.metadata, &calld->content_type,
+                                   GRPC_MDELEM_REF(channeld->content_type));
       break;
       break;
     }
     }
   }
   }

+ 4 - 0
src/core/client_config/connector.c

@@ -47,3 +47,7 @@ void grpc_connector_connect(grpc_connector *connector,
                             grpc_iomgr_closure *notify) {
                             grpc_iomgr_closure *notify) {
   connector->vtable->connect(connector, in_args, out_args, notify);
   connector->vtable->connect(connector, in_args, out_args, notify);
 }
 }
+
+void grpc_connector_shutdown(grpc_connector *connector) {
+  connector->vtable->shutdown(connector);
+}

+ 6 - 0
src/core/client_config/connector.h

@@ -70,6 +70,9 @@ typedef struct {
 struct grpc_connector_vtable {
 struct grpc_connector_vtable {
   void (*ref)(grpc_connector *connector);
   void (*ref)(grpc_connector *connector);
   void (*unref)(grpc_connector *connector);
   void (*unref)(grpc_connector *connector);
+  /** Implementation of grpc_connector_shutdown */
+  void (*shutdown)(grpc_connector *connector);
+  /** Implementation of grpc_connector_connect */
   void (*connect)(grpc_connector *connector,
   void (*connect)(grpc_connector *connector,
                   const grpc_connect_in_args *in_args,
                   const grpc_connect_in_args *in_args,
                   grpc_connect_out_args *out_args, grpc_iomgr_closure *notify);
                   grpc_connect_out_args *out_args, grpc_iomgr_closure *notify);
@@ -77,9 +80,12 @@ struct grpc_connector_vtable {
 
 
 void grpc_connector_ref(grpc_connector *connector);
 void grpc_connector_ref(grpc_connector *connector);
 void grpc_connector_unref(grpc_connector *connector);
 void grpc_connector_unref(grpc_connector *connector);
+/** Connect using the connector: max one outstanding call at a time */
 void grpc_connector_connect(grpc_connector *connector,
 void grpc_connector_connect(grpc_connector *connector,
                             const grpc_connect_in_args *in_args,
                             const grpc_connect_in_args *in_args,
                             grpc_connect_out_args *out_args,
                             grpc_connect_out_args *out_args,
                             grpc_iomgr_closure *notify);
                             grpc_iomgr_closure *notify);
+/** Cancel any pending connection */
+void grpc_connector_shutdown(grpc_connector *connector);
 
 
 #endif
 #endif

+ 23 - 7
src/core/client_config/lb_policies/pick_first.c

@@ -31,6 +31,7 @@
  *
  *
  */
  */
 
 
+#include "src/core/client_config/lb_policy_factory.h"
 #include "src/core/client_config/lb_policies/pick_first.h"
 #include "src/core/client_config/lb_policies/pick_first.h"
 
 
 #include <string.h>
 #include <string.h>
@@ -314,19 +315,34 @@ static const grpc_lb_policy_vtable pick_first_lb_policy_vtable = {
     pf_check_connectivity,
     pf_check_connectivity,
     pf_notify_on_state_change};
     pf_notify_on_state_change};
 
 
-grpc_lb_policy *grpc_create_pick_first_lb_policy(grpc_subchannel **subchannels,
-                                                 size_t num_subchannels) {
+static void pick_first_factory_ref(grpc_lb_policy_factory *factory) {}
+
+static void pick_first_factory_unref(grpc_lb_policy_factory *factory) {}
+
+static grpc_lb_policy *create_pick_first(grpc_lb_policy_factory *factory,
+                                         grpc_lb_policy_args *args) {
   pick_first_lb_policy *p = gpr_malloc(sizeof(*p));
   pick_first_lb_policy *p = gpr_malloc(sizeof(*p));
-  GPR_ASSERT(num_subchannels);
+  GPR_ASSERT(args->num_subchannels > 0);
   memset(p, 0, sizeof(*p));
   memset(p, 0, sizeof(*p));
   grpc_lb_policy_init(&p->base, &pick_first_lb_policy_vtable);
   grpc_lb_policy_init(&p->base, &pick_first_lb_policy_vtable);
-  p->subchannels = gpr_malloc(sizeof(grpc_subchannel *) * num_subchannels);
-  p->num_subchannels = num_subchannels;
+  p->subchannels = gpr_malloc(sizeof(grpc_subchannel *) * args->num_subchannels);
+  p->num_subchannels = args->num_subchannels;
   grpc_connectivity_state_init(&p->state_tracker, GRPC_CHANNEL_IDLE,
   grpc_connectivity_state_init(&p->state_tracker, GRPC_CHANNEL_IDLE,
                                "pick_first");
                                "pick_first");
-  memcpy(p->subchannels, subchannels,
-         sizeof(grpc_subchannel *) * num_subchannels);
+  memcpy(p->subchannels, args->subchannels,
+         sizeof(grpc_subchannel *) * args->num_subchannels);
   grpc_iomgr_closure_init(&p->connectivity_changed, pf_connectivity_changed, p);
   grpc_iomgr_closure_init(&p->connectivity_changed, pf_connectivity_changed, p);
   gpr_mu_init(&p->mu);
   gpr_mu_init(&p->mu);
   return &p->base;
   return &p->base;
 }
 }
+
+static const grpc_lb_policy_factory_vtable pick_first_factory_vtable = {
+    pick_first_factory_ref, pick_first_factory_unref, create_pick_first,
+    "pick_first"};
+
+static grpc_lb_policy_factory pick_first_lb_policy_factory = {
+    &pick_first_factory_vtable};
+
+grpc_lb_policy_factory *grpc_pick_first_lb_factory_create() {
+  return &pick_first_lb_policy_factory;
+}

+ 4 - 5
src/core/client_config/lb_policies/pick_first.h

@@ -34,11 +34,10 @@
 #ifndef GRPC_INTERNAL_CORE_CLIENT_CONFIG_PICK_FIRST_H
 #ifndef GRPC_INTERNAL_CORE_CLIENT_CONFIG_PICK_FIRST_H
 #define GRPC_INTERNAL_CORE_CLIENT_CONFIG_PICK_FIRST_H
 #define GRPC_INTERNAL_CORE_CLIENT_CONFIG_PICK_FIRST_H
 
 
-#include "src/core/client_config/lb_policy.h"
+#include "src/core/client_config/lb_policy_factory.h"
 
 
-/** Returns a load balancing policy instance that picks up the first subchannel
- *  from \a subchannels to succesfully connect */
-grpc_lb_policy *grpc_create_pick_first_lb_policy(grpc_subchannel **subchannels,
-                                                 size_t num_subchannels);
+/** Returns a load balancing factory for the pick first policy, which picks up
+ * the first subchannel from \a subchannels to succesfully connect */
+grpc_lb_policy_factory *grpc_pick_first_lb_factory_create();
 
 
 #endif
 #endif

+ 549 - 0
src/core/client_config/lb_policies/round_robin.c

@@ -0,0 +1,549 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "src/core/client_config/lb_policies/round_robin.h"
+
+#include <string.h>
+
+#include <grpc/support/alloc.h>
+#include "src/core/transport/connectivity_state.h"
+
+int grpc_lb_round_robin_trace = 0;
+
+/** List of entities waiting for a pick.
+ *
+ * Once a pick is available, \a target is updated and \a on_complete called. */
+typedef struct pending_pick {
+  struct pending_pick *next;
+  grpc_pollset *pollset;
+  grpc_subchannel **target;
+  grpc_iomgr_closure *on_complete;
+} pending_pick;
+
+/** List of subchannels in a connectivity READY state */
+typedef struct ready_list {
+  grpc_subchannel *subchannel;
+  struct ready_list *next;
+  struct ready_list *prev;
+} ready_list;
+
+typedef struct {
+  size_t subchannel_idx; /**< Index over p->subchannels */
+  void *p; /**< round_robin_lb_policy instance */
+} connectivity_changed_cb_arg;
+
+typedef struct {
+  /** base policy: must be first */
+  grpc_lb_policy base;
+
+  /** all our subchannels */
+  grpc_subchannel **subchannels;
+  size_t num_subchannels;
+
+  /** Callbacks, one per subchannel being watched, to be called when their
+   * respective connectivity changes */
+  grpc_iomgr_closure *connectivity_changed_cbs;
+  connectivity_changed_cb_arg *cb_args;
+
+  /** mutex protecting remaining members */
+  gpr_mu mu;
+  /** have we started picking? */
+  int started_picking;
+  /** are we shutting down? */
+  int shutdown;
+  /** Connectivity state of the subchannels being watched */
+  grpc_connectivity_state *subchannel_connectivity;
+  /** List of picks that are waiting on connectivity */
+  pending_pick *pending_picks;
+
+  /** our connectivity state tracker */
+  grpc_connectivity_state_tracker state_tracker;
+
+  /** (Dummy) root of the doubly linked list containing READY subchannels */
+  ready_list ready_list;
+  /** Last pick from the ready list. */
+  ready_list *ready_list_last_pick;
+
+  /** Subchannel index to ready_list node.
+   *
+   * Kept in order to remove nodes from the ready list associated with a
+   * subchannel */
+  ready_list **subchannel_index_to_readylist_node;
+} round_robin_lb_policy;
+
+/** Returns the next subchannel from the connected list or NULL if the list is
+ * empty.
+ *
+ * Note that this function does *not* advance p->ready_list_last_pick. Use \a
+ * advance_last_picked_locked() for that. */
+static ready_list *peek_next_connected_locked(const round_robin_lb_policy *p) {
+  ready_list *selected;
+  selected = p->ready_list_last_pick->next;
+
+  while (selected != NULL) {
+    if (selected == &p->ready_list) {
+      GPR_ASSERT(selected->subchannel == NULL);
+      /* skip dummy root */
+      selected = selected->next;
+    } else {
+      GPR_ASSERT(selected->subchannel != NULL);
+      return selected;
+    }
+  }
+  return NULL;
+}
+
+/** Advance the \a ready_list picking head. */
+static void advance_last_picked_locked(round_robin_lb_policy *p) {
+  if (p->ready_list_last_pick->next != NULL) { /* non-empty list */
+    p->ready_list_last_pick = p->ready_list_last_pick->next;
+    if (p->ready_list_last_pick == &p->ready_list) {
+      /* skip dummy root */
+      p->ready_list_last_pick = p->ready_list_last_pick->next;
+    }
+  } else { /* should be an empty list */
+    GPR_ASSERT(p->ready_list_last_pick == &p->ready_list);
+  }
+
+  if (grpc_lb_round_robin_trace) {
+    gpr_log(GPR_DEBUG, "[READYLIST] ADVANCED LAST PICK. NOW AT NODE %p (SC %p)",
+            p->ready_list_last_pick, p->ready_list_last_pick->subchannel);
+  }
+}
+
+/** Prepends (relative to the root at p->ready_list) the connected subchannel \a
+ * csc to the list of ready subchannels. */
+static ready_list *add_connected_sc_locked(round_robin_lb_policy *p,
+                                           grpc_subchannel *csc) {
+  ready_list *new_elem = gpr_malloc(sizeof(ready_list));
+  new_elem->subchannel = csc;
+  if (p->ready_list.prev == NULL) {
+    /* first element */
+    new_elem->next = &p->ready_list;
+    new_elem->prev = &p->ready_list;
+    p->ready_list.next = new_elem;
+    p->ready_list.prev = new_elem;
+  } else {
+    new_elem->next = &p->ready_list;
+    new_elem->prev = p->ready_list.prev;
+    p->ready_list.prev->next = new_elem;
+    p->ready_list.prev = new_elem;
+  }
+  if (grpc_lb_round_robin_trace) {
+    gpr_log(GPR_DEBUG,
+            "[READYLIST] ADDING NODE %p (SC %p)", new_elem, csc);
+  }
+  return new_elem;
+}
+
+/** Removes \a node from the list of connected subchannels */
+static void remove_disconnected_sc_locked(round_robin_lb_policy *p,
+                                          ready_list *node) {
+  if (node == NULL) {
+    return;
+  }
+  if (node == p->ready_list_last_pick) {
+    /* If removing the lastly picked node, reset the last pick pointer to the
+     * dummy root of the list */
+    p->ready_list_last_pick = &p->ready_list;
+  }
+
+  /* removing last item */
+  if (node->next == &p->ready_list && node->prev == &p->ready_list) {
+    GPR_ASSERT(p->ready_list.next == node);
+    GPR_ASSERT(p->ready_list.prev == node);
+    p->ready_list.next = NULL;
+    p->ready_list.prev = NULL;
+  } else {
+    node->prev->next = node->next;
+    node->next->prev = node->prev;
+  }
+
+  if (grpc_lb_round_robin_trace) {
+    gpr_log(GPR_DEBUG, "[READYLIST] REMOVED NODE %p (SC %p)", node,
+            node->subchannel);
+  }
+
+  node->next = NULL;
+  node->prev = NULL;
+  node->subchannel = NULL;
+
+  gpr_free(node);
+}
+
+static void del_interested_parties_locked(round_robin_lb_policy *p,
+                                          const size_t subchannel_idx) {
+  pending_pick *pp;
+  for (pp = p->pending_picks; pp; pp = pp->next) {
+    grpc_subchannel_del_interested_party(p->subchannels[subchannel_idx],
+                                         pp->pollset);
+  }
+}
+
+
+void rr_destroy(grpc_lb_policy *pol) {
+  round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
+  size_t i;
+  ready_list *elem;
+  for (i = 0; i < p->num_subchannels; i++) {
+    del_interested_parties_locked(p, i);
+  }
+  for (i = 0; i < p->num_subchannels; i++) {
+    GRPC_SUBCHANNEL_UNREF(p->subchannels[i], "round_robin");
+  }
+  gpr_free(p->connectivity_changed_cbs);
+  gpr_free(p->subchannel_connectivity);
+
+  grpc_connectivity_state_destroy(&p->state_tracker);
+  gpr_free(p->subchannels);
+  gpr_mu_destroy(&p->mu);
+
+  elem = p->ready_list.next;
+  while (elem != NULL && elem != &p->ready_list) {
+    ready_list *tmp;
+    tmp = elem->next;
+    elem->next = NULL;
+    elem->prev = NULL;
+    elem->subchannel = NULL;
+    gpr_free(elem);
+    elem = tmp;
+  }
+  gpr_free(p->subchannel_index_to_readylist_node);
+  gpr_free(p->cb_args);
+  gpr_free(p);
+}
+
+void rr_shutdown(grpc_lb_policy *pol) {
+  size_t i;
+  round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
+  pending_pick *pp;
+  gpr_mu_lock(&p->mu);
+
+  for (i = 0; i < p->num_subchannels; i++) {
+    del_interested_parties_locked(p, i);
+  }
+
+  p->shutdown = 1;
+  while ((pp = p->pending_picks)) {
+    p->pending_picks = pp->next;
+    *pp->target = NULL;
+    grpc_iomgr_add_delayed_callback(pp->on_complete, 0);
+    gpr_free(pp);
+  }
+  grpc_connectivity_state_set(&p->state_tracker, GRPC_CHANNEL_FATAL_FAILURE,
+                              "shutdown");
+  gpr_mu_unlock(&p->mu);
+}
+
+static void start_picking(round_robin_lb_policy *p) {
+  size_t i;
+  p->started_picking = 1;
+
+  for (i = 0; i < p->num_subchannels; i++) {
+    p->subchannel_connectivity[i] = GRPC_CHANNEL_IDLE;
+    grpc_subchannel_notify_on_state_change(p->subchannels[i],
+                                           &p->subchannel_connectivity[i],
+                                           &p->connectivity_changed_cbs[i]);
+    GRPC_LB_POLICY_REF(&p->base, "round_robin_connectivity");
+  }
+}
+
+void rr_exit_idle(grpc_lb_policy *pol) {
+  round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
+  gpr_mu_lock(&p->mu);
+  if (!p->started_picking) {
+    start_picking(p);
+  }
+  gpr_mu_unlock(&p->mu);
+}
+
+void rr_pick(grpc_lb_policy *pol, grpc_pollset *pollset,
+             grpc_metadata_batch *initial_metadata, grpc_subchannel **target,
+             grpc_iomgr_closure *on_complete) {
+  size_t i;
+  round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
+  pending_pick *pp;
+  ready_list *selected;
+  gpr_mu_lock(&p->mu);
+  if ((selected = peek_next_connected_locked(p))) {
+    gpr_mu_unlock(&p->mu);
+    *target = selected->subchannel;
+    if (grpc_lb_round_robin_trace) {
+      gpr_log(GPR_DEBUG, "[RR PICK] TARGET <-- SUBCHANNEL %p (NODE %p)",
+              selected->subchannel, selected);
+    }
+    /* only advance the last picked pointer if the selection was used */
+    advance_last_picked_locked(p);
+    on_complete->cb(on_complete->cb_arg, 1);
+  } else {
+    if (!p->started_picking) {
+      start_picking(p);
+    }
+    for (i = 0; i < p->num_subchannels; i++) {
+      grpc_subchannel_add_interested_party(p->subchannels[i], pollset);
+    }
+    pp = gpr_malloc(sizeof(*pp));
+    pp->next = p->pending_picks;
+    pp->pollset = pollset;
+    pp->target = target;
+    pp->on_complete = on_complete;
+    p->pending_picks = pp;
+    gpr_mu_unlock(&p->mu);
+  }
+}
+
+static void rr_connectivity_changed(void *arg, int iomgr_success) {
+  connectivity_changed_cb_arg *cb_arg = arg;
+  round_robin_lb_policy *p = cb_arg->p;
+  /* index over p->subchannels of this cb's subchannel */
+  const size_t this_idx = cb_arg->subchannel_idx;
+  pending_pick *pp;
+  ready_list *selected;
+
+  int unref = 0;
+
+  /* connectivity state of this cb's subchannel */
+  grpc_connectivity_state *this_connectivity;
+
+  gpr_mu_lock(&p->mu);
+
+  this_connectivity =
+      &p->subchannel_connectivity[this_idx];
+
+  if (p->shutdown) {
+    unref = 1;
+  } else {
+    switch (*this_connectivity) {
+      case GRPC_CHANNEL_READY:
+        grpc_connectivity_state_set(&p->state_tracker, GRPC_CHANNEL_READY,
+                                    "connecting_ready");
+        /* add the newly connected subchannel to the list of connected ones.
+         * Note that it goes to the "end of the line". */
+        p->subchannel_index_to_readylist_node[this_idx] =
+            add_connected_sc_locked(p, p->subchannels[this_idx]);
+        /* at this point we know there's at least one suitable subchannel. Go
+         * ahead and pick one and notify the pending suitors in
+         * p->pending_picks. This preemtively replicates rr_pick()'s actions. */
+        selected = peek_next_connected_locked(p);
+        if (p->pending_picks != NULL) {
+          /* if the selected subchannel is going to be used for the pending
+           * picks, update the last picked pointer */
+          advance_last_picked_locked(p);
+        }
+        while ((pp = p->pending_picks)) {
+          p->pending_picks = pp->next;
+          *pp->target = selected->subchannel;
+          if (grpc_lb_round_robin_trace) {
+            gpr_log(GPR_DEBUG,
+                    "[RR CONN CHANGED] TARGET <-- SUBCHANNEL %p (NODE %p)",
+                    selected->subchannel, selected);
+          }
+          grpc_subchannel_del_interested_party(selected->subchannel,
+                                               pp->pollset);
+          grpc_iomgr_add_delayed_callback(pp->on_complete, 1);
+          gpr_free(pp);
+        }
+        grpc_subchannel_notify_on_state_change(
+            p->subchannels[this_idx], this_connectivity,
+            &p->connectivity_changed_cbs[this_idx]);
+        break;
+      case GRPC_CHANNEL_CONNECTING:
+      case GRPC_CHANNEL_IDLE:
+        grpc_connectivity_state_set(&p->state_tracker, *this_connectivity,
+                                    "connecting_changed");
+        grpc_subchannel_notify_on_state_change(
+            p->subchannels[this_idx], this_connectivity,
+            &p->connectivity_changed_cbs[this_idx]);
+        break;
+      case GRPC_CHANNEL_TRANSIENT_FAILURE:
+        del_interested_parties_locked(p, this_idx);
+        /* renew state notification */
+        grpc_subchannel_notify_on_state_change(
+            p->subchannels[this_idx], this_connectivity,
+            &p->connectivity_changed_cbs[this_idx]);
+
+        /* remove from ready list if still present */
+        if (p->subchannel_index_to_readylist_node[this_idx] != NULL) {
+          remove_disconnected_sc_locked(p, p->subchannel_index_to_readylist_node[this_idx]);
+          p->subchannel_index_to_readylist_node[this_idx] = NULL;
+        }
+        grpc_connectivity_state_set(&p->state_tracker,
+                                    GRPC_CHANNEL_TRANSIENT_FAILURE,
+                                    "connecting_transient_failure");
+        break;
+      case GRPC_CHANNEL_FATAL_FAILURE:
+        del_interested_parties_locked(p, this_idx);
+        if (p->subchannel_index_to_readylist_node[this_idx] != NULL) {
+          remove_disconnected_sc_locked(p, p->subchannel_index_to_readylist_node[this_idx]);
+          p->subchannel_index_to_readylist_node[this_idx] = NULL;
+        }
+
+        GPR_SWAP(grpc_subchannel *, p->subchannels[this_idx],
+                 p->subchannels[p->num_subchannels - 1]);
+        p->num_subchannels--;
+        GRPC_SUBCHANNEL_UNREF(p->subchannels[p->num_subchannels],
+                              "round_robin");
+
+        if (p->num_subchannels == 0) {
+          grpc_connectivity_state_set(&p->state_tracker,
+                                      GRPC_CHANNEL_FATAL_FAILURE,
+                                      "no_more_channels");
+          while ((pp = p->pending_picks)) {
+            p->pending_picks = pp->next;
+            *pp->target = NULL;
+            grpc_iomgr_add_delayed_callback(pp->on_complete, 1);
+            gpr_free(pp);
+          }
+          unref = 1;
+        } else {
+          grpc_connectivity_state_set(&p->state_tracker,
+                                      GRPC_CHANNEL_TRANSIENT_FAILURE,
+                                      "subchannel_failed");
+        }
+    }  /* switch */
+  }  /* !unref */
+
+  gpr_mu_unlock(&p->mu);
+
+  if (unref) {
+    GRPC_LB_POLICY_UNREF(&p->base, "round_robin_connectivity");
+  }
+}
+
+static void rr_broadcast(grpc_lb_policy *pol, grpc_transport_op *op) {
+  round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
+  size_t i;
+  size_t n;
+  grpc_subchannel **subchannels;
+
+  gpr_mu_lock(&p->mu);
+  n = p->num_subchannels;
+  subchannels = gpr_malloc(n * sizeof(*subchannels));
+  for (i = 0; i < n; i++) {
+    subchannels[i] = p->subchannels[i];
+    GRPC_SUBCHANNEL_REF(subchannels[i], "rr_broadcast");
+  }
+  gpr_mu_unlock(&p->mu);
+
+  for (i = 0; i < n; i++) {
+    grpc_subchannel_process_transport_op(subchannels[i], op);
+    GRPC_SUBCHANNEL_UNREF(subchannels[i], "rr_broadcast");
+  }
+  gpr_free(subchannels);
+}
+
+static grpc_connectivity_state rr_check_connectivity(grpc_lb_policy *pol) {
+  round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
+  grpc_connectivity_state st;
+  gpr_mu_lock(&p->mu);
+  st = grpc_connectivity_state_check(&p->state_tracker);
+  gpr_mu_unlock(&p->mu);
+  return st;
+}
+
+static void rr_notify_on_state_change(grpc_lb_policy *pol,
+                                      grpc_connectivity_state *current,
+                                      grpc_iomgr_closure *notify) {
+  round_robin_lb_policy *p = (round_robin_lb_policy *)pol;
+  gpr_mu_lock(&p->mu);
+  grpc_connectivity_state_notify_on_state_change(&p->state_tracker, current,
+                                                 notify);
+  gpr_mu_unlock(&p->mu);
+}
+
+static const grpc_lb_policy_vtable round_robin_lb_policy_vtable = {
+    rr_destroy,
+    rr_shutdown,
+    rr_pick,
+    rr_exit_idle,
+    rr_broadcast,
+    rr_check_connectivity,
+    rr_notify_on_state_change};
+
+
+static void round_robin_factory_ref(grpc_lb_policy_factory *factory) {}
+
+static void round_robin_factory_unref(grpc_lb_policy_factory *factory) {}
+
+static grpc_lb_policy *create_round_robin(grpc_lb_policy_factory *factory,
+                                          grpc_lb_policy_args *args) {
+  size_t i;
+  round_robin_lb_policy *p = gpr_malloc(sizeof(*p));
+  GPR_ASSERT(args->num_subchannels > 0);
+  memset(p, 0, sizeof(*p));
+  grpc_lb_policy_init(&p->base, &round_robin_lb_policy_vtable);
+  p->subchannels = gpr_malloc(sizeof(grpc_subchannel *) * args->num_subchannels);
+  p->num_subchannels = args->num_subchannels;
+  grpc_connectivity_state_init(&p->state_tracker, GRPC_CHANNEL_IDLE,
+                               "round_robin");
+  memcpy(p->subchannels, args->subchannels,
+         sizeof(grpc_subchannel *) * args->num_subchannels);
+
+  gpr_mu_init(&p->mu);
+  p->connectivity_changed_cbs =
+      gpr_malloc(sizeof(grpc_iomgr_closure) * args->num_subchannels);
+  p->subchannel_connectivity =
+      gpr_malloc(sizeof(grpc_connectivity_state) * args->num_subchannels);
+
+  p->cb_args =
+      gpr_malloc(sizeof(connectivity_changed_cb_arg) * args->num_subchannels);
+  for(i = 0; i < args->num_subchannels; i++) {
+    p->cb_args[i].subchannel_idx = i;
+    p->cb_args[i].p = p;
+    grpc_iomgr_closure_init(&p->connectivity_changed_cbs[i],
+                            rr_connectivity_changed, &p->cb_args[i]);
+  }
+
+  /* The (dummy node) root of the ready list */
+  p->ready_list.subchannel = NULL;
+  p->ready_list.prev = NULL;
+  p->ready_list.next = NULL;
+  p->ready_list_last_pick = &p->ready_list;
+
+  p->subchannel_index_to_readylist_node =
+      gpr_malloc(sizeof(grpc_subchannel *) * args->num_subchannels);
+  memset(p->subchannel_index_to_readylist_node, 0,
+         sizeof(grpc_subchannel *) * args->num_subchannels);
+  return &p->base;
+}
+
+static const grpc_lb_policy_factory_vtable round_robin_factory_vtable = {
+    round_robin_factory_ref, round_robin_factory_unref, create_round_robin,
+    "round_robin"};
+
+static grpc_lb_policy_factory round_robin_lb_policy_factory = {
+    &round_robin_factory_vtable};
+
+grpc_lb_policy_factory *grpc_round_robin_lb_factory_create() {
+  return &round_robin_lb_policy_factory;
+}

+ 47 - 0
src/core/client_config/lb_policies/round_robin.h

@@ -0,0 +1,47 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef GRPC_INTERNAL_CORE_CLIENT_CONFIG_ROUND_ROBIN_H
+#define GRPC_INTERNAL_CORE_CLIENT_CONFIG_ROUND_ROBIN_H
+
+#include "src/core/client_config/lb_policy.h"
+
+extern int grpc_lb_round_robin_trace;
+
+#include "src/core/client_config/lb_policy_factory.h"
+
+/** Returns a load balancing factory for the round robin policy */
+grpc_lb_policy_factory *grpc_round_robin_lb_factory_create();
+
+
+#endif

+ 47 - 0
src/core/client_config/lb_policy_factory.c

@@ -0,0 +1,47 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "src/core/client_config/lb_policy_factory.h"
+
+void grpc_lb_policy_factory_ref(grpc_lb_policy_factory *factory) {
+  factory->vtable->ref(factory);
+}
+void grpc_lb_policy_factory_unref(grpc_lb_policy_factory *factory) {
+  factory->vtable->unref(factory);
+}
+
+grpc_lb_policy *grpc_lb_policy_factory_create_lb_policy(
+    grpc_lb_policy_factory *factory, grpc_lb_policy_args *args) {
+  if (factory == NULL) return NULL;
+  return factory->vtable->create_lb_policy(factory, args);
+}

+ 73 - 0
src/core/client_config/lb_policy_factory.h

@@ -0,0 +1,73 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef GRPC_INTERNAL_CORE_CLIENT_CONFIG_LB_POLICY_FACTORY_H
+#define GRPC_INTERNAL_CORE_CLIENT_CONFIG_LB_POLICY_FACTORY_H
+
+#include "src/core/client_config/lb_policy.h"
+#include "src/core/client_config/subchannel.h"
+
+typedef struct grpc_lb_policy_factory grpc_lb_policy_factory;
+typedef struct grpc_lb_policy_factory_vtable grpc_lb_policy_factory_vtable;
+
+/** grpc_lb_policy provides grpc_client_config objects to grpc_channel
+    objects */
+struct grpc_lb_policy_factory {
+  const grpc_lb_policy_factory_vtable *vtable;
+};
+
+typedef struct grpc_lb_policy_args {
+  grpc_subchannel **subchannels;
+  size_t num_subchannels;
+} grpc_lb_policy_args;
+
+struct grpc_lb_policy_factory_vtable {
+  void (*ref)(grpc_lb_policy_factory *factory);
+  void (*unref)(grpc_lb_policy_factory *factory);
+
+  /** Implementation of grpc_lb_policy_factory_create_lb_policy */
+  grpc_lb_policy *(*create_lb_policy)(grpc_lb_policy_factory *factory,
+                                      grpc_lb_policy_args *args);
+
+  /** Name for the LB policy this factory implements */
+  const char *name;
+};
+
+void grpc_lb_policy_factory_ref(grpc_lb_policy_factory *factory);
+void grpc_lb_policy_factory_unref(grpc_lb_policy_factory *factory);
+
+/** Create a lb_policy instance. */
+grpc_lb_policy *grpc_lb_policy_factory_create_lb_policy(
+    grpc_lb_policy_factory *factory, grpc_lb_policy_args *args);
+
+#endif /* GRPC_INTERNAL_CORE_CONFIG_LB_POLICY_FACTORY_H */

+ 88 - 0
src/core/client_config/lb_policy_registry.c

@@ -0,0 +1,88 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "src/core/client_config/lb_policy_registry.h"
+
+#include <string.h>
+
+#define MAX_POLICIES 10
+
+static grpc_lb_policy_factory *g_all_of_the_lb_policies[MAX_POLICIES];
+static int g_number_of_lb_policies = 0;
+
+static grpc_lb_policy_factory *g_default_lb_policy_factory;
+
+void grpc_lb_policy_registry_init(grpc_lb_policy_factory *default_factory) {
+  g_number_of_lb_policies = 0;
+  g_default_lb_policy_factory = default_factory;
+}
+
+void grpc_lb_policy_registry_shutdown(void) {
+  int i;
+  for (i = 0; i < g_number_of_lb_policies; i++) {
+    grpc_lb_policy_factory_unref(g_all_of_the_lb_policies[i]);
+  }
+}
+
+void grpc_register_lb_policy(grpc_lb_policy_factory *factory) {
+  int i;
+  for (i = 0; i < g_number_of_lb_policies; i++) {
+    GPR_ASSERT(0 != strcmp(factory->vtable->name,
+                           g_all_of_the_lb_policies[i]->vtable->name));
+  }
+  GPR_ASSERT(g_number_of_lb_policies != MAX_POLICIES);
+  grpc_lb_policy_factory_ref(factory);
+  g_all_of_the_lb_policies[g_number_of_lb_policies++] = factory;
+}
+
+static grpc_lb_policy_factory *lookup_factory(const char* name) {
+  int i;
+
+  if (name == NULL) return NULL;
+
+  for (i = 0; i < g_number_of_lb_policies; i++) {
+    if (0 == strcmp(name, g_all_of_the_lb_policies[i]->vtable->name)) {
+      return g_all_of_the_lb_policies[i];
+    }
+  }
+
+  return NULL;
+}
+
+grpc_lb_policy *grpc_lb_policy_create(const char *name,
+                                      grpc_lb_policy_args *args) {
+  grpc_lb_policy_factory *factory = lookup_factory(name);
+  grpc_lb_policy *lb_policy = grpc_lb_policy_factory_create_lb_policy(
+      factory, args);
+  return lb_policy;
+}

+ 54 - 0
src/core/client_config/lb_policy_registry.h

@@ -0,0 +1,54 @@
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#ifndef GRPC_INTERNAL_CORE_CLIENT_CONFIG_LB_POLICY_REGISTRY_H
+#define GRPC_INTERNAL_CORE_CLIENT_CONFIG_LB_POLICY_REGISTRY_H
+
+#include "src/core/client_config/lb_policy_factory.h"
+
+/** Initialize the registry and set \a default_factory as the factory to be
+ * returned when no name is provided in a lookup */
+void grpc_lb_policy_registry_init(grpc_lb_policy_factory *default_factory);
+void grpc_lb_policy_registry_shutdown(void);
+
+/** Register a LB policy factory. */
+void grpc_register_lb_policy(grpc_lb_policy_factory *factory);
+
+/** Create a \a grpc_lb_policy instance.
+ *
+ * If \a name is NULL, the default factory from \a grpc_lb_policy_registry_init
+ * will be returned. */
+grpc_lb_policy *grpc_lb_policy_create(const char *name,
+                                      grpc_lb_policy_args *args);
+
+#endif /* GRPC_INTERNAL_CORE_CLIENT_CONFIG_LB_POLICY_REGISTRY_H */

+ 11 - 10
src/core/client_config/resolvers/dns_resolver.c

@@ -39,7 +39,7 @@
 #include <grpc/support/host_port.h>
 #include <grpc/support/host_port.h>
 #include <grpc/support/string_util.h>
 #include <grpc/support/string_util.h>
 
 
-#include "src/core/client_config/lb_policies/pick_first.h"
+#include "src/core/client_config/lb_policy_registry.h"
 #include "src/core/client_config/subchannel_factory_decorators/add_channel_arg.h"
 #include "src/core/client_config/subchannel_factory_decorators/add_channel_arg.h"
 #include "src/core/iomgr/resolve_address.h"
 #include "src/core/iomgr/resolve_address.h"
 #include "src/core/support/string.h"
 #include "src/core/support/string.h"
@@ -55,9 +55,8 @@ typedef struct {
   char *default_port;
   char *default_port;
   /** subchannel factory */
   /** subchannel factory */
   grpc_subchannel_factory *subchannel_factory;
   grpc_subchannel_factory *subchannel_factory;
-  /** load balancing policy factory */
-  grpc_lb_policy *(*lb_policy_factory)(grpc_subchannel **subchannels,
-                                       size_t num_subchannels);
+  /** load balancing policy name */
+  char *lb_policy_name;
 
 
   /** mutex guarding the rest of the state */
   /** mutex guarding the rest of the state */
   gpr_mu mu;
   gpr_mu mu;
@@ -135,6 +134,7 @@ static void dns_on_resolved(void *arg, grpc_resolved_addresses *addresses) {
   grpc_lb_policy *lb_policy;
   grpc_lb_policy *lb_policy;
   size_t i;
   size_t i;
   if (addresses) {
   if (addresses) {
+    grpc_lb_policy_args lb_policy_args;
     config = grpc_client_config_create();
     config = grpc_client_config_create();
     subchannels = gpr_malloc(sizeof(grpc_subchannel *) * addresses->naddrs);
     subchannels = gpr_malloc(sizeof(grpc_subchannel *) * addresses->naddrs);
     for (i = 0; i < addresses->naddrs; i++) {
     for (i = 0; i < addresses->naddrs; i++) {
@@ -144,7 +144,9 @@ static void dns_on_resolved(void *arg, grpc_resolved_addresses *addresses) {
       subchannels[i] = grpc_subchannel_factory_create_subchannel(
       subchannels[i] = grpc_subchannel_factory_create_subchannel(
           r->subchannel_factory, &args);
           r->subchannel_factory, &args);
     }
     }
-    lb_policy = r->lb_policy_factory(subchannels, addresses->naddrs);
+    lb_policy_args.subchannels = subchannels;
+    lb_policy_args.num_subchannels = addresses->naddrs;
+    lb_policy = grpc_lb_policy_create(r->lb_policy_name, &lb_policy_args);
     grpc_client_config_set_lb_policy(config, lb_policy);
     grpc_client_config_set_lb_policy(config, lb_policy);
     GRPC_LB_POLICY_UNREF(lb_policy, "construction");
     GRPC_LB_POLICY_UNREF(lb_policy, "construction");
     grpc_resolved_addresses_destroy(addresses);
     grpc_resolved_addresses_destroy(addresses);
@@ -193,13 +195,13 @@ static void dns_destroy(grpc_resolver *gr) {
   grpc_subchannel_factory_unref(r->subchannel_factory);
   grpc_subchannel_factory_unref(r->subchannel_factory);
   gpr_free(r->name);
   gpr_free(r->name);
   gpr_free(r->default_port);
   gpr_free(r->default_port);
+  gpr_free(r->lb_policy_name);
   gpr_free(r);
   gpr_free(r);
 }
 }
 
 
 static grpc_resolver *dns_create(
 static grpc_resolver *dns_create(
     grpc_uri *uri, const char *default_port,
     grpc_uri *uri, const char *default_port,
-    grpc_lb_policy *(*lb_policy_factory)(grpc_subchannel **subchannels,
-                                         size_t num_subchannels),
+    const char* lb_policy_name,
     grpc_subchannel_factory *subchannel_factory) {
     grpc_subchannel_factory *subchannel_factory) {
   dns_resolver *r;
   dns_resolver *r;
   const char *path = uri->path;
   const char *path = uri->path;
@@ -220,7 +222,7 @@ static grpc_resolver *dns_create(
   r->default_port = gpr_strdup(default_port);
   r->default_port = gpr_strdup(default_port);
   r->subchannel_factory = subchannel_factory;
   r->subchannel_factory = subchannel_factory;
   grpc_subchannel_factory_ref(subchannel_factory);
   grpc_subchannel_factory_ref(subchannel_factory);
-  r->lb_policy_factory = lb_policy_factory;
+  r->lb_policy_name = gpr_strdup(lb_policy_name);
   return &r->base;
   return &r->base;
 }
 }
 
 
@@ -235,8 +237,7 @@ static void dns_factory_unref(grpc_resolver_factory *factory) {}
 static grpc_resolver *dns_factory_create_resolver(
 static grpc_resolver *dns_factory_create_resolver(
     grpc_resolver_factory *factory, grpc_uri *uri,
     grpc_resolver_factory *factory, grpc_uri *uri,
     grpc_subchannel_factory *subchannel_factory) {
     grpc_subchannel_factory *subchannel_factory) {
-  return dns_create(uri, "https", grpc_create_pick_first_lb_policy,
-                    subchannel_factory);
+  return dns_create(uri, "https", "pick_first", subchannel_factory);
 }
 }
 
 
 char *dns_factory_get_default_host_name(grpc_resolver_factory *factory,
 char *dns_factory_get_default_host_name(grpc_resolver_factory *factory,

+ 30 - 10
src/core/client_config/resolvers/sockaddr_resolver.c

@@ -45,7 +45,7 @@
 #include <grpc/support/host_port.h>
 #include <grpc/support/host_port.h>
 #include <grpc/support/string_util.h>
 #include <grpc/support/string_util.h>
 
 
-#include "src/core/client_config/lb_policies/pick_first.h"
+#include "src/core/client_config/lb_policy_registry.h"
 #include "src/core/iomgr/resolve_address.h"
 #include "src/core/iomgr/resolve_address.h"
 #include "src/core/support/string.h"
 #include "src/core/support/string.h"
 
 
@@ -56,9 +56,8 @@ typedef struct {
   gpr_refcount refs;
   gpr_refcount refs;
   /** subchannel factory */
   /** subchannel factory */
   grpc_subchannel_factory *subchannel_factory;
   grpc_subchannel_factory *subchannel_factory;
-  /** load balancing policy factory */
-  grpc_lb_policy *(*lb_policy_factory)(grpc_subchannel **subchannels,
-                                       size_t num_subchannels);
+  /** load balancing policy name */
+  char *lb_policy_name;
 
 
   /** the addresses that we've 'resolved' */
   /** the addresses that we've 'resolved' */
   struct sockaddr_storage *addrs;
   struct sockaddr_storage *addrs;
@@ -122,6 +121,7 @@ static void sockaddr_next(grpc_resolver *resolver,
 static void sockaddr_maybe_finish_next_locked(sockaddr_resolver *r) {
 static void sockaddr_maybe_finish_next_locked(sockaddr_resolver *r) {
   grpc_client_config *cfg;
   grpc_client_config *cfg;
   grpc_lb_policy *lb_policy;
   grpc_lb_policy *lb_policy;
+  grpc_lb_policy_args lb_policy_args;
   grpc_subchannel **subchannels;
   grpc_subchannel **subchannels;
   grpc_subchannel_args args;
   grpc_subchannel_args args;
 
 
@@ -136,7 +136,10 @@ static void sockaddr_maybe_finish_next_locked(sockaddr_resolver *r) {
       subchannels[i] = grpc_subchannel_factory_create_subchannel(
       subchannels[i] = grpc_subchannel_factory_create_subchannel(
           r->subchannel_factory, &args);
           r->subchannel_factory, &args);
     }
     }
-    lb_policy = r->lb_policy_factory(subchannels, r->num_addrs);
+    lb_policy_args.subchannels = subchannels;
+    lb_policy_args.num_subchannels = r->num_addrs;
+    lb_policy =
+        grpc_lb_policy_create(r->lb_policy_name, &lb_policy_args);
     gpr_free(subchannels);
     gpr_free(subchannels);
     grpc_client_config_set_lb_policy(cfg, lb_policy);
     grpc_client_config_set_lb_policy(cfg, lb_policy);
     GRPC_LB_POLICY_UNREF(lb_policy, "unix");
     GRPC_LB_POLICY_UNREF(lb_policy, "unix");
@@ -153,6 +156,7 @@ static void sockaddr_destroy(grpc_resolver *gr) {
   grpc_subchannel_factory_unref(r->subchannel_factory);
   grpc_subchannel_factory_unref(r->subchannel_factory);
   gpr_free(r->addrs);
   gpr_free(r->addrs);
   gpr_free(r->addrs_len);
   gpr_free(r->addrs_len);
+  gpr_free(r->lb_policy_name);
   gpr_free(r);
   gpr_free(r);
 }
 }
 
 
@@ -274,9 +278,7 @@ done:
 
 
 static void do_nothing(void *ignored) {}
 static void do_nothing(void *ignored) {}
 static grpc_resolver *sockaddr_create(
 static grpc_resolver *sockaddr_create(
-    grpc_uri *uri,
-    grpc_lb_policy *(*lb_policy_factory)(grpc_subchannel **subchannels,
-                                         size_t num_subchannels),
+    grpc_uri *uri, const char *default_lb_policy_name,
     grpc_subchannel_factory *subchannel_factory,
     grpc_subchannel_factory *subchannel_factory,
     int parse(grpc_uri *uri, struct sockaddr_storage *dst, size_t *len)) {
     int parse(grpc_uri *uri, struct sockaddr_storage *dst, size_t *len)) {
   size_t i;
   size_t i;
@@ -293,6 +295,25 @@ static grpc_resolver *sockaddr_create(
   r = gpr_malloc(sizeof(sockaddr_resolver));
   r = gpr_malloc(sizeof(sockaddr_resolver));
   memset(r, 0, sizeof(*r));
   memset(r, 0, sizeof(*r));
 
 
+  r->lb_policy_name = NULL;
+  if (0 != strcmp(uri->query, "")) {
+    gpr_slice query_slice;
+    gpr_slice_buffer query_parts;
+
+    query_slice = gpr_slice_new(uri->query, strlen(uri->query), do_nothing);
+    gpr_slice_buffer_init(&query_parts);
+    gpr_slice_split(query_slice, "=", &query_parts);
+    GPR_ASSERT(query_parts.count == 2);
+    if (0 == gpr_slice_str_cmp(query_parts.slices[0], "lb_policy")) {
+      r->lb_policy_name = gpr_dump_slice(query_parts.slices[1], GPR_DUMP_ASCII);
+    }
+    gpr_slice_buffer_destroy(&query_parts);
+    gpr_slice_unref(query_slice);
+  }
+  if (r->lb_policy_name == NULL) {
+    r->lb_policy_name = gpr_strdup(default_lb_policy_name);
+  }
+
   path_slice = gpr_slice_new(uri->path, strlen(uri->path), do_nothing);
   path_slice = gpr_slice_new(uri->path, strlen(uri->path), do_nothing);
   gpr_slice_buffer_init(&path_parts);
   gpr_slice_buffer_init(&path_parts);
 
 
@@ -323,7 +344,6 @@ static grpc_resolver *sockaddr_create(
   gpr_mu_init(&r->mu);
   gpr_mu_init(&r->mu);
   grpc_resolver_init(&r->base, &sockaddr_resolver_vtable);
   grpc_resolver_init(&r->base, &sockaddr_resolver_vtable);
   r->subchannel_factory = subchannel_factory;
   r->subchannel_factory = subchannel_factory;
-  r->lb_policy_factory = lb_policy_factory;
 
 
   grpc_subchannel_factory_ref(subchannel_factory);
   grpc_subchannel_factory_ref(subchannel_factory);
   return &r->base;
   return &r->base;
@@ -341,7 +361,7 @@ static void sockaddr_factory_unref(grpc_resolver_factory *factory) {}
   static grpc_resolver *name##_factory_create_resolver(                     \
   static grpc_resolver *name##_factory_create_resolver(                     \
       grpc_resolver_factory *factory, grpc_uri *uri,                        \
       grpc_resolver_factory *factory, grpc_uri *uri,                        \
       grpc_subchannel_factory *subchannel_factory) {                        \
       grpc_subchannel_factory *subchannel_factory) {                        \
-    return sockaddr_create(uri, grpc_create_pick_first_lb_policy,           \
+    return sockaddr_create(uri, "pick_first",                               \
                            subchannel_factory, parse_##name);               \
                            subchannel_factory, parse_##name);               \
   }                                                                         \
   }                                                                         \
   static const grpc_resolver_factory_vtable name##_factory_vtable = {       \
   static const grpc_resolver_factory_vtable name##_factory_vtable = {       \

+ 12 - 11
src/core/client_config/resolvers/zookeeper_resolver.c

@@ -41,7 +41,7 @@
 #include <grpc/grpc_zookeeper.h>
 #include <grpc/grpc_zookeeper.h>
 #include <zookeeper/zookeeper.h>
 #include <zookeeper/zookeeper.h>
 
 
-#include "src/core/client_config/lb_policies/pick_first.h"
+#include "src/core/client_config/lb_policy_registry.h"
 #include "src/core/client_config/resolver_registry.h"
 #include "src/core/client_config/resolver_registry.h"
 #include "src/core/iomgr/resolve_address.h"
 #include "src/core/iomgr/resolve_address.h"
 #include "src/core/support/string.h"
 #include "src/core/support/string.h"
@@ -59,9 +59,8 @@ typedef struct {
   char *name;
   char *name;
   /** subchannel factory */
   /** subchannel factory */
   grpc_subchannel_factory *subchannel_factory;
   grpc_subchannel_factory *subchannel_factory;
-  /** load balancing policy factory */
-  grpc_lb_policy *(*lb_policy_factory)(grpc_subchannel **subchannels,
-                                       size_t num_subchannels);
+  /** load balancing policy name */
+  char *lb_policy_name;
 
 
   /** mutex guarding the rest of the state */
   /** mutex guarding the rest of the state */
   gpr_mu mu;
   gpr_mu mu;
@@ -183,6 +182,7 @@ static void zookeeper_on_resolved(void *arg,
   grpc_lb_policy *lb_policy;
   grpc_lb_policy *lb_policy;
   size_t i;
   size_t i;
   if (addresses != NULL) {
   if (addresses != NULL) {
+    grpc_lb_policy_args lb_policy_args;
     config = grpc_client_config_create();
     config = grpc_client_config_create();
     subchannels = gpr_malloc(sizeof(grpc_subchannel *) * addresses->naddrs);
     subchannels = gpr_malloc(sizeof(grpc_subchannel *) * addresses->naddrs);
     for (i = 0; i < addresses->naddrs; i++) {
     for (i = 0; i < addresses->naddrs; i++) {
@@ -192,7 +192,10 @@ static void zookeeper_on_resolved(void *arg,
       subchannels[i] = grpc_subchannel_factory_create_subchannel(
       subchannels[i] = grpc_subchannel_factory_create_subchannel(
           r->subchannel_factory, &args);
           r->subchannel_factory, &args);
     }
     }
-    lb_policy = r->lb_policy_factory(subchannels, addresses->naddrs);
+    lb_policy_args.subchannels = subchannels;
+    lb_policy_args.num_subchannels = addresses->naddrs;
+    lb_policy =
+        grpc_lb_policy_create(r->lb_policy_name, &lb_policy_args);
     grpc_client_config_set_lb_policy(config, lb_policy);
     grpc_client_config_set_lb_policy(config, lb_policy);
     GRPC_LB_POLICY_UNREF(lb_policy, "construction");
     GRPC_LB_POLICY_UNREF(lb_policy, "construction");
     grpc_resolved_addresses_destroy(addresses);
     grpc_resolved_addresses_destroy(addresses);
@@ -420,13 +423,12 @@ static void zookeeper_destroy(grpc_resolver *gr) {
   }
   }
   grpc_subchannel_factory_unref(r->subchannel_factory);
   grpc_subchannel_factory_unref(r->subchannel_factory);
   gpr_free(r->name);
   gpr_free(r->name);
+  gpr_free(r->lb_policy_name);
   gpr_free(r);
   gpr_free(r);
 }
 }
 
 
 static grpc_resolver *zookeeper_create(
 static grpc_resolver *zookeeper_create(
-    grpc_uri *uri,
-    grpc_lb_policy *(*lb_policy_factory)(grpc_subchannel **subchannels,
-                                         size_t num_subchannels),
+    grpc_uri *uri, const char *lb_policy_name,
     grpc_subchannel_factory *subchannel_factory) {
     grpc_subchannel_factory *subchannel_factory) {
   zookeeper_resolver *r;
   zookeeper_resolver *r;
   size_t length;
   size_t length;
@@ -451,7 +453,7 @@ static grpc_resolver *zookeeper_create(
   r->name = gpr_strdup(path);
   r->name = gpr_strdup(path);
 
 
   r->subchannel_factory = subchannel_factory;
   r->subchannel_factory = subchannel_factory;
-  r->lb_policy_factory = lb_policy_factory;
+  r->lb_policy_name = gpr_strdup(lb_policy_name);
   grpc_subchannel_factory_ref(subchannel_factory);
   grpc_subchannel_factory_ref(subchannel_factory);
 
 
   /** Initializes zookeeper client */
   /** Initializes zookeeper client */
@@ -490,8 +492,7 @@ static char *zookeeper_factory_get_default_hostname(
 static grpc_resolver *zookeeper_factory_create_resolver(
 static grpc_resolver *zookeeper_factory_create_resolver(
     grpc_resolver_factory *factory, grpc_uri *uri,
     grpc_resolver_factory *factory, grpc_uri *uri,
     grpc_subchannel_factory *subchannel_factory) {
     grpc_subchannel_factory *subchannel_factory) {
-  return zookeeper_create(uri, grpc_create_pick_first_lb_policy,
-                          subchannel_factory);
+  return zookeeper_create(uri, "pick_first", subchannel_factory);
 }
 }
 
 
 static const grpc_resolver_factory_vtable zookeeper_factory_vtable = {
 static const grpc_resolver_factory_vtable zookeeper_factory_vtable = {

+ 4 - 0
src/core/client_config/subchannel.c

@@ -439,6 +439,10 @@ void grpc_subchannel_process_transport_op(grpc_subchannel *c,
   if (cancel_alarm) {
   if (cancel_alarm) {
     grpc_alarm_cancel(&c->alarm);
     grpc_alarm_cancel(&c->alarm);
   }
   }
+
+  if (op->disconnect) {
+    grpc_connector_shutdown(c->connector);
+  }
 }
 }
 
 
 static void on_state_changed(void *p, int iomgr_success) {
 static void on_state_changed(void *p, int iomgr_success) {

+ 17 - 10
src/core/httpcli/httpcli_security_connector.c

@@ -35,7 +35,7 @@
 
 
 #include <string.h>
 #include <string.h>
 
 
-#include "src/core/security/secure_transport_setup.h"
+#include "src/core/security/handshake.h"
 #include "src/core/support/string.h"
 #include "src/core/support/string.h"
 #include <grpc/support/alloc.h>
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
 #include <grpc/support/log.h>
@@ -58,20 +58,27 @@ static void httpcli_ssl_destroy(grpc_security_connector *sc) {
   gpr_free(sc);
   gpr_free(sc);
 }
 }
 
 
-static grpc_security_status httpcli_ssl_create_handshaker(
-    grpc_security_connector *sc, tsi_handshaker **handshaker) {
+static void httpcli_ssl_do_handshake(
+    grpc_security_connector *sc, grpc_endpoint *nonsecure_endpoint,
+    grpc_security_handshake_done_cb cb, void *user_data) {
   grpc_httpcli_ssl_channel_security_connector *c =
   grpc_httpcli_ssl_channel_security_connector *c =
       (grpc_httpcli_ssl_channel_security_connector *)sc;
       (grpc_httpcli_ssl_channel_security_connector *)sc;
   tsi_result result = TSI_OK;
   tsi_result result = TSI_OK;
-  if (c->handshaker_factory == NULL) return GRPC_SECURITY_ERROR;
+  tsi_handshaker *handshaker;
+  if (c->handshaker_factory == NULL) {
+    cb(user_data, GRPC_SECURITY_ERROR, nonsecure_endpoint, NULL);
+    return;
+  }
   result = tsi_ssl_handshaker_factory_create_handshaker(
   result = tsi_ssl_handshaker_factory_create_handshaker(
-      c->handshaker_factory, c->secure_peer_name, handshaker);
+      c->handshaker_factory, c->secure_peer_name, &handshaker);
   if (result != TSI_OK) {
   if (result != TSI_OK) {
     gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
     gpr_log(GPR_ERROR, "Handshaker creation failed with error %s.",
             tsi_result_to_string(result));
             tsi_result_to_string(result));
-    return GRPC_SECURITY_ERROR;
+    cb(user_data, GRPC_SECURITY_ERROR, nonsecure_endpoint, NULL);
+  } else {
+    grpc_do_security_handshake(handshaker, sc, nonsecure_endpoint, cb,
+                               user_data);
   }
   }
-  return GRPC_SECURITY_OK;
 }
 }
 
 
 static grpc_security_status httpcli_ssl_check_peer(grpc_security_connector *sc,
 static grpc_security_status httpcli_ssl_check_peer(grpc_security_connector *sc,
@@ -94,7 +101,7 @@ static grpc_security_status httpcli_ssl_check_peer(grpc_security_connector *sc,
 }
 }
 
 
 static grpc_security_connector_vtable httpcli_ssl_vtable = {
 static grpc_security_connector_vtable httpcli_ssl_vtable = {
-    httpcli_ssl_destroy, httpcli_ssl_create_handshaker, httpcli_ssl_check_peer};
+    httpcli_ssl_destroy, httpcli_ssl_do_handshake, httpcli_ssl_check_peer};
 
 
 static grpc_security_status httpcli_ssl_channel_security_connector_create(
 static grpc_security_status httpcli_ssl_channel_security_connector_create(
     const unsigned char *pem_root_certs, size_t pem_root_certs_size,
     const unsigned char *pem_root_certs, size_t pem_root_certs_size,
@@ -169,8 +176,8 @@ static void ssl_handshake(void *arg, grpc_endpoint *tcp, const char *host,
   GPR_ASSERT(httpcli_ssl_channel_security_connector_create(
   GPR_ASSERT(httpcli_ssl_channel_security_connector_create(
                  pem_root_certs, pem_root_certs_size, host, &sc) ==
                  pem_root_certs, pem_root_certs_size, host, &sc) ==
              GRPC_SECURITY_OK);
              GRPC_SECURITY_OK);
-  grpc_setup_secure_transport(&sc->base, tcp, on_secure_transport_setup_done,
-                              c);
+  grpc_security_connector_do_handshake(&sc->base, tcp,
+                                       on_secure_transport_setup_done, c);
   GRPC_SECURITY_CONNECTOR_UNREF(&sc->base, "httpcli");
   GRPC_SECURITY_CONNECTOR_UNREF(&sc->base, "httpcli");
 }
 }
 
 

+ 1 - 2
src/core/iomgr/fd_posix.c

@@ -213,10 +213,9 @@ void grpc_fd_orphan(grpc_fd *fd, grpc_iomgr_closure *on_done,
                     const char *reason) {
                     const char *reason) {
   fd->on_done_closure = on_done;
   fd->on_done_closure = on_done;
   shutdown(fd->fd, SHUT_RDWR);
   shutdown(fd->fd, SHUT_RDWR);
-  REF_BY(fd, 1, reason); /* remove active status, but keep referenced */
   gpr_mu_lock(&fd->watcher_mu);
   gpr_mu_lock(&fd->watcher_mu);
+  REF_BY(fd, 1, reason); /* remove active status, but keep referenced */
   if (!has_watchers(fd)) {
   if (!has_watchers(fd)) {
-    GPR_ASSERT(!fd->closed);
     fd->closed = 1;
     fd->closed = 1;
     close(fd->fd);
     close(fd->fd);
     if (fd->on_done_closure) {
     if (fd->on_done_closure) {

+ 7 - 3
src/core/iomgr/iomgr.c

@@ -34,16 +34,18 @@
 #include "src/core/iomgr/iomgr.h"
 #include "src/core/iomgr/iomgr.h"
 
 
 #include <stdlib.h>
 #include <stdlib.h>
+#include <string.h>
 
 
-#include "src/core/iomgr/iomgr_internal.h"
-#include "src/core/iomgr/alarm_internal.h"
-#include "src/core/support/string.h"
 #include <grpc/support/alloc.h>
 #include <grpc/support/alloc.h>
 #include <grpc/support/log.h>
 #include <grpc/support/log.h>
 #include <grpc/support/string_util.h>
 #include <grpc/support/string_util.h>
 #include <grpc/support/sync.h>
 #include <grpc/support/sync.h>
 #include <grpc/support/thd.h>
 #include <grpc/support/thd.h>
 
 
+#include "src/core/iomgr/iomgr_internal.h"
+#include "src/core/iomgr/alarm_internal.h"
+#include "src/core/support/string.h"
+
 static gpr_mu g_mu;
 static gpr_mu g_mu;
 static gpr_cv g_rcv;
 static gpr_cv g_rcv;
 static grpc_iomgr_closure *g_cbs_head = NULL;
 static grpc_iomgr_closure *g_cbs_head = NULL;
@@ -179,6 +181,8 @@ void grpc_iomgr_shutdown(void) {
   }
   }
   gpr_mu_unlock(&g_mu);
   gpr_mu_unlock(&g_mu);
 
 
+  memset(&g_root_object, 0, sizeof(g_root_object));
+
   grpc_kick_poller();
   grpc_kick_poller();
   gpr_event_wait(&g_background_callback_executor_done,
   gpr_event_wait(&g_background_callback_executor_done,
                  gpr_inf_future(GPR_CLOCK_REALTIME));
                  gpr_inf_future(GPR_CLOCK_REALTIME));

+ 1 - 1
src/core/iomgr/pollset_multipoller_with_epoll.c

@@ -72,7 +72,7 @@ static void finally_add_fd(grpc_pollset *pollset, grpc_fd *fd) {
      to this pollset whilst adding, but that should be benign. */
      to this pollset whilst adding, but that should be benign. */
   GPR_ASSERT(grpc_fd_begin_poll(fd, pollset, 0, 0, &watcher) == 0);
   GPR_ASSERT(grpc_fd_begin_poll(fd, pollset, 0, 0, &watcher) == 0);
   if (watcher.fd != NULL) {
   if (watcher.fd != NULL) {
-    ev.events = EPOLLIN | EPOLLOUT | EPOLLET;
+    ev.events = (uint32_t)(EPOLLIN | EPOLLOUT | EPOLLET);
     ev.data.ptr = fd;
     ev.data.ptr = fd;
     err = epoll_ctl(h->epoll_fd, EPOLL_CTL_ADD, fd->fd, &ev);
     err = epoll_ctl(h->epoll_fd, EPOLL_CTL_ADD, fd->fd, &ev);
     if (err < 0) {
     if (err < 0) {

+ 6 - 6
src/core/iomgr/pollset_posix.c

@@ -187,6 +187,12 @@ void grpc_pollset_work(grpc_pollset *pollset, grpc_pollset_worker *worker,
   if (pollset->shutting_down) {
   if (pollset->shutting_down) {
     goto done;
     goto done;
   }
   }
+  if (pollset->in_flight_cbs) {
+    /* Give do_promote priority so we don't starve it out */
+    gpr_mu_unlock(&pollset->mu);
+    gpr_mu_lock(&pollset->mu);
+    goto done;
+  }
   if (!pollset->kicked_without_pollers) {
   if (!pollset->kicked_without_pollers) {
     push_front_worker(pollset, worker);
     push_front_worker(pollset, worker);
     added_worker = 1;
     added_worker = 1;
@@ -422,12 +428,6 @@ static void basic_pollset_maybe_work(grpc_pollset *pollset,
   int r;
   int r;
   nfds_t nfds;
   nfds_t nfds;
 
 
-  if (pollset->in_flight_cbs) {
-    /* Give do_promote priority so we don't starve it out */
-    gpr_mu_unlock(&pollset->mu);
-    gpr_mu_lock(&pollset->mu);
-    return;
-  }
   fd = pollset->data.ptr;
   fd = pollset->data.ptr;
   if (fd && grpc_fd_is_orphaned(fd)) {
   if (fd && grpc_fd_is_orphaned(fd)) {
     GRPC_FD_UNREF(fd, "basicpoll");
     GRPC_FD_UNREF(fd, "basicpoll");

+ 16 - 0
src/core/iomgr/tcp_client_posix.c

@@ -54,6 +54,8 @@
 #include <grpc/support/string_util.h>
 #include <grpc/support/string_util.h>
 #include <grpc/support/time.h>
 #include <grpc/support/time.h>
 
 
+extern int grpc_tcp_trace;
+
 typedef struct {
 typedef struct {
   void (*cb)(void *arg, grpc_endpoint *tcp);
   void (*cb)(void *arg, grpc_endpoint *tcp);
   void *cb_arg;
   void *cb_arg;
@@ -92,6 +94,10 @@ error:
 static void tc_on_alarm(void *acp, int success) {
 static void tc_on_alarm(void *acp, int success) {
   int done;
   int done;
   async_connect *ac = acp;
   async_connect *ac = acp;
+  if (grpc_tcp_trace) {
+    gpr_log(GPR_DEBUG, "CLIENT_CONNECT: %s: on_alarm: success=%d", ac->addr_str,
+            success);
+  }
   gpr_mu_lock(&ac->mu);
   gpr_mu_lock(&ac->mu);
   if (ac->fd != NULL) {
   if (ac->fd != NULL) {
     grpc_fd_shutdown(ac->fd);
     grpc_fd_shutdown(ac->fd);
@@ -116,6 +122,11 @@ static void on_writable(void *acp, int success) {
   void *cb_arg = ac->cb_arg;
   void *cb_arg = ac->cb_arg;
   grpc_fd *fd;
   grpc_fd *fd;
 
 
+  if (grpc_tcp_trace) {
+    gpr_log(GPR_DEBUG, "CLIENT_CONNECT: %s: on_writable: success=%d",
+            ac->addr_str, success);
+  }
+
   gpr_mu_lock(&ac->mu);
   gpr_mu_lock(&ac->mu);
   GPR_ASSERT(ac->fd);
   GPR_ASSERT(ac->fd);
   fd = ac->fd;
   fd = ac->fd;
@@ -264,6 +275,11 @@ void grpc_tcp_client_connect(void (*cb)(void *arg, grpc_endpoint *ep),
   ac->write_closure.cb = on_writable;
   ac->write_closure.cb = on_writable;
   ac->write_closure.cb_arg = ac;
   ac->write_closure.cb_arg = ac;
 
 
+  if (grpc_tcp_trace) {
+    gpr_log(GPR_DEBUG, "CLIENT_CONNECT: %s: asynchronously connecting",
+            ac->addr_str);
+  }
+
   gpr_mu_lock(&ac->mu);
   gpr_mu_lock(&ac->mu);
   grpc_alarm_init(&ac->alarm,
   grpc_alarm_init(&ac->alarm,
                   gpr_convert_clock_type(deadline, GPR_CLOCK_MONOTONIC),
                   gpr_convert_clock_type(deadline, GPR_CLOCK_MONOTONIC),

+ 2 - 5
src/core/iomgr/tcp_client_windows.c

@@ -77,7 +77,6 @@ static void on_alarm(void *acp, int occured) {
   async_connect *ac = acp;
   async_connect *ac = acp;
   gpr_mu_lock(&ac->mu);
   gpr_mu_lock(&ac->mu);
   /* If the alarm didn't occur, it got cancelled. */
   /* If the alarm didn't occur, it got cancelled. */
-  gpr_log(GPR_DEBUG, "on_alarm: %p", ac->socket);
   if (ac->socket != NULL && occured) {
   if (ac->socket != NULL && occured) {
     grpc_winsocket_shutdown(ac->socket);
     grpc_winsocket_shutdown(ac->socket);
   }
   }
@@ -96,8 +95,6 @@ static void on_connect(void *acp, int from_iocp) {
 
 
   gpr_mu_lock(&ac->mu);
   gpr_mu_lock(&ac->mu);
 
 
-  gpr_log(GPR_DEBUG, "on_connect: %p", ac->socket);
-
   if (from_iocp) {
   if (from_iocp) {
     DWORD transfered_bytes = 0;
     DWORD transfered_bytes = 0;
     DWORD flags;
     DWORD flags;
@@ -124,7 +121,7 @@ static void on_connect(void *acp, int from_iocp) {
    notification request for the connection, and one timeout alert. */
    notification request for the connection, and one timeout alert. */
 void grpc_tcp_client_connect(void (*cb)(void *arg, grpc_endpoint *tcp),
 void grpc_tcp_client_connect(void (*cb)(void *arg, grpc_endpoint *tcp),
                              void *arg, grpc_pollset_set *interested_parties,
                              void *arg, grpc_pollset_set *interested_parties,
-                             const struct sockaddr *addr, int addr_len,
+                             const struct sockaddr *addr, size_t addr_len,
                              gpr_timespec deadline) {
                              gpr_timespec deadline) {
   SOCKET sock = INVALID_SOCKET;
   SOCKET sock = INVALID_SOCKET;
   BOOL success;
   BOOL success;
@@ -179,7 +176,7 @@ void grpc_tcp_client_connect(void (*cb)(void *arg, grpc_endpoint *tcp),
 
 
   socket = grpc_winsocket_create(sock, "client");
   socket = grpc_winsocket_create(sock, "client");
   info = &socket->write_info;
   info = &socket->write_info;
-  success = ConnectEx(sock, addr, addr_len, NULL, 0, NULL, &info->overlapped);
+  success = ConnectEx(sock, addr, (int)addr_len, NULL, 0, NULL, &info->overlapped);
 
 
   /* It wouldn't be unusual to get a success immediately. But we'll still get
   /* It wouldn't be unusual to get a success immediately. But we'll still get
      an IOCP notification, so let's ignore it. */
      an IOCP notification, so let's ignore it. */

+ 3 - 3
src/core/iomgr/tcp_server.h

@@ -39,7 +39,7 @@
 /* Forward decl of grpc_tcp_server */
 /* Forward decl of grpc_tcp_server */
 typedef struct grpc_tcp_server grpc_tcp_server;
 typedef struct grpc_tcp_server grpc_tcp_server;
 
 
-/* New server callback: tcp is the newly connected tcp connection */
+/* Called for newly connected TCP connections. */
 typedef void (*grpc_tcp_server_cb)(void *arg, grpc_endpoint *ep);
 typedef void (*grpc_tcp_server_cb)(void *arg, grpc_endpoint *ep);
 
 
 /* Create a server, initially not bound to any ports */
 /* Create a server, initially not bound to any ports */
@@ -47,8 +47,8 @@ grpc_tcp_server *grpc_tcp_server_create(void);
 
 
 /* Start listening to bound ports */
 /* Start listening to bound ports */
 void grpc_tcp_server_start(grpc_tcp_server *server, grpc_pollset **pollsets,
 void grpc_tcp_server_start(grpc_tcp_server *server, grpc_pollset **pollsets,
-                           size_t pollset_count, grpc_tcp_server_cb cb,
-                           void *cb_arg);
+                           size_t pollset_count,
+                           grpc_tcp_server_cb on_accept_cb, void *cb_arg);
 
 
 /* Add a port to the server, returning port number on success, or negative
 /* Add a port to the server, returning port number on success, or negative
    on failure.
    on failure.

+ 19 - 14
src/core/iomgr/tcp_server_posix.c

@@ -98,8 +98,9 @@ static void unlink_if_unix_domain_socket(const struct sockaddr_un *un) {
 
 
 /* the overall server */
 /* the overall server */
 struct grpc_tcp_server {
 struct grpc_tcp_server {
-  grpc_tcp_server_cb cb;
-  void *cb_arg;
+  /* Called whenever accept() succeeds on a server port. */
+  grpc_tcp_server_cb on_accept_cb;
+  void *on_accept_cb_arg;
 
 
   gpr_mu mu;
   gpr_mu mu;
 
 
@@ -132,8 +133,8 @@ grpc_tcp_server *grpc_tcp_server_create(void) {
   s->active_ports = 0;
   s->active_ports = 0;
   s->destroyed_ports = 0;
   s->destroyed_ports = 0;
   s->shutdown = 0;
   s->shutdown = 0;
-  s->cb = NULL;
-  s->cb_arg = NULL;
+  s->on_accept_cb = NULL;
+  s->on_accept_cb_arg = NULL;
   s->ports = gpr_malloc(sizeof(server_port) * INIT_PORT_CAP);
   s->ports = gpr_malloc(sizeof(server_port) * INIT_PORT_CAP);
   s->nports = 0;
   s->nports = 0;
   s->port_capacity = INIT_PORT_CAP;
   s->port_capacity = INIT_PORT_CAP;
@@ -339,6 +340,10 @@ static void on_read(void *arg, int success) {
     addr_str = grpc_sockaddr_to_uri((struct sockaddr *)&addr);
     addr_str = grpc_sockaddr_to_uri((struct sockaddr *)&addr);
     gpr_asprintf(&name, "tcp-server-connection:%s", addr_str);
     gpr_asprintf(&name, "tcp-server-connection:%s", addr_str);
 
 
+    if (grpc_tcp_trace) {
+      gpr_log(GPR_DEBUG, "SERVER_CONNECT: incoming connection: %s", addr_str);
+    }
+
     fdobj = grpc_fd_create(fd, name);
     fdobj = grpc_fd_create(fd, name);
     /* TODO(ctiller): revise this when we have server-side sharding
     /* TODO(ctiller): revise this when we have server-side sharding
        of channels -- we certainly should not be automatically adding every
        of channels -- we certainly should not be automatically adding every
@@ -346,8 +351,8 @@ static void on_read(void *arg, int success) {
     for (i = 0; i < sp->server->pollset_count; i++) {
     for (i = 0; i < sp->server->pollset_count; i++) {
       grpc_pollset_add_fd(sp->server->pollsets[i], fdobj);
       grpc_pollset_add_fd(sp->server->pollsets[i], fdobj);
     }
     }
-    sp->server->cb(
-        sp->server->cb_arg,
+    sp->server->on_accept_cb(
+        sp->server->on_accept_cb_arg,
         grpc_tcp_create(fdobj, GRPC_TCP_DEFAULT_READ_SLICE_SIZE, addr_str));
         grpc_tcp_create(fdobj, GRPC_TCP_DEFAULT_READ_SLICE_SIZE, addr_str));
 
 
     gpr_free(name);
     gpr_free(name);
@@ -378,7 +383,7 @@ static int add_socket_to_server(grpc_tcp_server *s, int fd,
     grpc_sockaddr_to_string(&addr_str, (struct sockaddr *)&addr, 1);
     grpc_sockaddr_to_string(&addr_str, (struct sockaddr *)&addr, 1);
     gpr_asprintf(&name, "tcp-server-listener:%s", addr_str);
     gpr_asprintf(&name, "tcp-server-listener:%s", addr_str);
     gpr_mu_lock(&s->mu);
     gpr_mu_lock(&s->mu);
-    GPR_ASSERT(!s->cb && "must add ports before starting server");
+    GPR_ASSERT(!s->on_accept_cb && "must add ports before starting server");
     /* append it to the list under a lock */
     /* append it to the list under a lock */
     if (s->nports == s->port_capacity) {
     if (s->nports == s->port_capacity) {
       s->port_capacity *= 2;
       s->port_capacity *= 2;
@@ -484,16 +489,16 @@ int grpc_tcp_server_get_fd(grpc_tcp_server *s, unsigned index) {
   return (index < s->nports) ? s->ports[index].fd : -1;
   return (index < s->nports) ? s->ports[index].fd : -1;
 }
 }
 
 
-void grpc_tcp_server_start(grpc_tcp_server *s, grpc_pollset **pollsets,
-                           size_t pollset_count, grpc_tcp_server_cb cb,
-                           void *cb_arg) {
+void grpc_tcp_server_start(grpc_tcp_server *s, grpc_pollset **pollsets, size_t
+                           pollset_count, grpc_tcp_server_cb on_accept_cb, void
+                           *on_accept_cb_arg) {
   size_t i, j;
   size_t i, j;
-  GPR_ASSERT(cb);
+  GPR_ASSERT(on_accept_cb);
   gpr_mu_lock(&s->mu);
   gpr_mu_lock(&s->mu);
-  GPR_ASSERT(!s->cb);
+  GPR_ASSERT(!s->on_accept_cb);
   GPR_ASSERT(s->active_ports == 0);
   GPR_ASSERT(s->active_ports == 0);
-  s->cb = cb;
-  s->cb_arg = cb_arg;
+  s->on_accept_cb = on_accept_cb;
+  s->on_accept_cb_arg = on_accept_cb_arg;
   s->pollsets = pollsets;
   s->pollsets = pollsets;
   s->pollset_count = pollset_count;
   s->pollset_count = pollset_count;
   for (i = 0; i < s->nports; i++) {
   for (i = 0; i < s->nports; i++) {

+ 18 - 16
src/core/iomgr/tcp_server_windows.c

@@ -71,8 +71,9 @@ typedef struct server_port {
 
 
 /* the overall server */
 /* the overall server */
 struct grpc_tcp_server {
 struct grpc_tcp_server {
-  grpc_tcp_server_cb cb;
-  void *cb_arg;
+  /* Called whenever accept() succeeds on a server port. */
+  grpc_tcp_server_cb on_accept_cb;
+  void *on_accept_cb_arg;
 
 
   gpr_mu mu;
   gpr_mu mu;
 
 
@@ -95,8 +96,8 @@ grpc_tcp_server *grpc_tcp_server_create(void) {
   grpc_tcp_server *s = gpr_malloc(sizeof(grpc_tcp_server));
   grpc_tcp_server *s = gpr_malloc(sizeof(grpc_tcp_server));
   gpr_mu_init(&s->mu);
   gpr_mu_init(&s->mu);
   s->active_ports = 0;
   s->active_ports = 0;
-  s->cb = NULL;
-  s->cb_arg = NULL;
+  s->on_accept_cb = NULL;
+  s->on_accept_cb_arg = NULL;
   s->ports = gpr_malloc(sizeof(server_port) * INIT_PORT_CAP);
   s->ports = gpr_malloc(sizeof(server_port) * INIT_PORT_CAP);
   s->nports = 0;
   s->nports = 0;
   s->port_capacity = INIT_PORT_CAP;
   s->port_capacity = INIT_PORT_CAP;
@@ -154,7 +155,7 @@ void grpc_tcp_server_destroy(grpc_tcp_server *s,
 
 
 /* Prepare (bind) a recently-created socket for listening. */
 /* Prepare (bind) a recently-created socket for listening. */
 static int prepare_socket(SOCKET sock, const struct sockaddr *addr,
 static int prepare_socket(SOCKET sock, const struct sockaddr *addr,
-                          int addr_len) {
+                          size_t addr_len) {
   struct sockaddr_storage sockname_temp;
   struct sockaddr_storage sockname_temp;
   socklen_t sockname_len;
   socklen_t sockname_len;
 
 
@@ -167,7 +168,7 @@ static int prepare_socket(SOCKET sock, const struct sockaddr *addr,
     goto error;
     goto error;
   }
   }
 
 
-  if (bind(sock, addr, addr_len) == SOCKET_ERROR) {
+  if (bind(sock, addr, (int)addr_len) == SOCKET_ERROR) {
     char *addr_str;
     char *addr_str;
     char *utf8_message = gpr_format_message(WSAGetLastError());
     char *utf8_message = gpr_format_message(WSAGetLastError());
     grpc_sockaddr_to_string(&addr_str, addr, 0);
     grpc_sockaddr_to_string(&addr_str, addr, 0);
@@ -344,7 +345,7 @@ static void on_accept(void *arg, int from_iocp) {
 
 
   /* The only time we should call our callback, is where we successfully
   /* The only time we should call our callback, is where we successfully
      managed to accept a connection, and created an endpoint. */
      managed to accept a connection, and created an endpoint. */
-  if (ep) sp->server->cb(sp->server->cb_arg, ep);
+  if (ep) sp->server->on_accept_cb(sp->server->on_accept_cb_arg, ep);
   /* As we were notified from the IOCP of one and exactly one accept,
   /* As we were notified from the IOCP of one and exactly one accept,
      the former socked we created has now either been destroy or assigned
      the former socked we created has now either been destroy or assigned
      to the new connection. We need to create a new one for the next
      to the new connection. We need to create a new one for the next
@@ -353,7 +354,7 @@ static void on_accept(void *arg, int from_iocp) {
 }
 }
 
 
 static int add_socket_to_server(grpc_tcp_server *s, SOCKET sock,
 static int add_socket_to_server(grpc_tcp_server *s, SOCKET sock,
-                                const struct sockaddr *addr, int addr_len) {
+                                const struct sockaddr *addr, size_t addr_len) {
   server_port *sp;
   server_port *sp;
   int port;
   int port;
   int status;
   int status;
@@ -380,7 +381,7 @@ static int add_socket_to_server(grpc_tcp_server *s, SOCKET sock,
   port = prepare_socket(sock, addr, addr_len);
   port = prepare_socket(sock, addr, addr_len);
   if (port >= 0) {
   if (port >= 0) {
     gpr_mu_lock(&s->mu);
     gpr_mu_lock(&s->mu);
-    GPR_ASSERT(!s->cb && "must add ports before starting server");
+    GPR_ASSERT(!s->on_accept_cb && "must add ports before starting server");
     /* append it to the list under a lock */
     /* append it to the list under a lock */
     if (s->nports == s->port_capacity) {
     if (s->nports == s->port_capacity) {
       s->port_capacity *= 2;
       s->port_capacity *= 2;
@@ -400,7 +401,7 @@ static int add_socket_to_server(grpc_tcp_server *s, SOCKET sock,
 }
 }
 
 
 int grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr,
 int grpc_tcp_server_add_port(grpc_tcp_server *s, const void *addr,
-                             int addr_len) {
+                             size_t addr_len) {
   int allocated_port = -1;
   int allocated_port = -1;
   unsigned i;
   unsigned i;
   SOCKET sock;
   SOCKET sock;
@@ -462,15 +463,16 @@ SOCKET grpc_tcp_server_get_socket(grpc_tcp_server *s, unsigned index) {
 }
 }
 
 
 void grpc_tcp_server_start(grpc_tcp_server *s, grpc_pollset **pollset,
 void grpc_tcp_server_start(grpc_tcp_server *s, grpc_pollset **pollset,
-                           size_t pollset_count, grpc_tcp_server_cb cb,
-                           void *cb_arg) {
+                           size_t pollset_count,
+                           grpc_tcp_server_cb on_accept_cb,
+                           void *on_accept_cb_arg) {
   size_t i;
   size_t i;
-  GPR_ASSERT(cb);
+  GPR_ASSERT(on_accept_cb);
   gpr_mu_lock(&s->mu);
   gpr_mu_lock(&s->mu);
-  GPR_ASSERT(!s->cb);
+  GPR_ASSERT(!s->on_accept_cb);
   GPR_ASSERT(s->active_ports == 0);
   GPR_ASSERT(s->active_ports == 0);
-  s->cb = cb;
-  s->cb_arg = cb_arg;
+  s->on_accept_cb = on_accept_cb;
+  s->on_accept_cb_arg = on_accept_cb_arg;
   for (i = 0; i < s->nports; i++) {
   for (i = 0; i < s->nports; i++) {
     start_accept(s->ports + i);
     start_accept(s->ports + i);
     s->active_ports++;
     s->active_ports++;

+ 2 - 2
src/core/iomgr/tcp_windows.c

@@ -144,7 +144,7 @@ static int on_read(grpc_tcp *tcp, int success) {
   int do_abort = 0;
   int do_abort = 0;
 
 
   if (success) {
   if (success) {
-    if (socket->read_info.wsa_error != 0) {
+    if (socket->read_info.wsa_error != 0 && !tcp->shutting_down) {
       if (socket->read_info.wsa_error != WSAECONNRESET) {
       if (socket->read_info.wsa_error != WSAECONNRESET) {
         char *utf8_message = gpr_format_message(info->wsa_error);
         char *utf8_message = gpr_format_message(info->wsa_error);
         gpr_log(GPR_ERROR, "ReadFile overlapped error: %s", utf8_message);
         gpr_log(GPR_ERROR, "ReadFile overlapped error: %s", utf8_message);
@@ -153,7 +153,7 @@ static int on_read(grpc_tcp *tcp, int success) {
       success = 0;
       success = 0;
       gpr_slice_unref(tcp->read_slice);
       gpr_slice_unref(tcp->read_slice);
     } else {
     } else {
-      if (info->bytes_transfered != 0) {
+      if (info->bytes_transfered != 0 && !tcp->shutting_down) {
         sub = gpr_slice_sub_no_ref(tcp->read_slice, 0, info->bytes_transfered);
         sub = gpr_slice_sub_no_ref(tcp->read_slice, 0, info->bytes_transfered);
         gpr_slice_buffer_add(tcp->read_slices, sub);
         gpr_slice_buffer_add(tcp->read_slices, sub);
         success = 1;
         success = 1;

+ 7 - 13
src/core/iomgr/udp_server.c

@@ -94,9 +94,6 @@ static void unlink_if_unix_domain_socket(const struct sockaddr_un *un) {
 
 
 /* the overall server */
 /* the overall server */
 struct grpc_udp_server {
 struct grpc_udp_server {
-  grpc_udp_server_cb cb;
-  void *cb_arg;
-
   gpr_mu mu;
   gpr_mu mu;
   gpr_cv cv;
   gpr_cv cv;
 
 
@@ -130,8 +127,6 @@ grpc_udp_server *grpc_udp_server_create(void) {
   s->active_ports = 0;
   s->active_ports = 0;
   s->destroyed_ports = 0;
   s->destroyed_ports = 0;
   s->shutdown = 0;
   s->shutdown = 0;
-  s->cb = NULL;
-  s->cb_arg = NULL;
   s->ports = gpr_malloc(sizeof(server_port) * INIT_PORT_CAP);
   s->ports = gpr_malloc(sizeof(server_port) * INIT_PORT_CAP);
   s->nports = 0;
   s->nports = 0;
   s->port_capacity = INIT_PORT_CAP;
   s->port_capacity = INIT_PORT_CAP;
@@ -232,6 +227,11 @@ static int prepare_socket(int fd, const struct sockaddr *addr,
     goto error;
     goto error;
   }
   }
 
 
+  if (!grpc_set_socket_nonblocking(fd, 1) || !grpc_set_socket_cloexec(fd, 1)) {
+    gpr_log(GPR_ERROR, "Unable to configure socket %d: %s", fd,
+            strerror(errno));
+  }
+
   get_local_ip = 1;
   get_local_ip = 1;
   rc = setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &get_local_ip,
   rc = setsockopt(fd, IPPROTO_IP, IP_PKTINFO, &get_local_ip,
                   sizeof(get_local_ip));
                   sizeof(get_local_ip));
@@ -282,7 +282,7 @@ static void on_read(void *arg, int success) {
 
 
   /* Tell the registered callback that data is available to read. */
   /* Tell the registered callback that data is available to read. */
   GPR_ASSERT(sp->read_cb);
   GPR_ASSERT(sp->read_cb);
-  sp->read_cb(sp->fd, sp->server->cb, sp->server->cb_arg);
+  sp->read_cb(sp->fd);
 
 
   /* Re-arm the notification event so we get another chance to read. */
   /* Re-arm the notification event so we get another chance to read. */
   grpc_fd_notify_on_read(sp->emfd, &sp->read_closure);
   grpc_fd_notify_on_read(sp->emfd, &sp->read_closure);
@@ -301,7 +301,6 @@ static int add_socket_to_server(grpc_udp_server *s, int fd,
     grpc_sockaddr_to_string(&addr_str, (struct sockaddr *)&addr, 1);
     grpc_sockaddr_to_string(&addr_str, (struct sockaddr *)&addr, 1);
     gpr_asprintf(&name, "udp-server-listener:%s", addr_str);
     gpr_asprintf(&name, "udp-server-listener:%s", addr_str);
     gpr_mu_lock(&s->mu);
     gpr_mu_lock(&s->mu);
-    GPR_ASSERT(!s->cb && "must add ports before starting server");
     /* append it to the list under a lock */
     /* append it to the list under a lock */
     if (s->nports == s->port_capacity) {
     if (s->nports == s->port_capacity) {
       s->port_capacity *= 2;
       s->port_capacity *= 2;
@@ -407,15 +406,10 @@ int grpc_udp_server_get_fd(grpc_udp_server *s, unsigned index) {
 }
 }
 
 
 void grpc_udp_server_start(grpc_udp_server *s, grpc_pollset **pollsets,
 void grpc_udp_server_start(grpc_udp_server *s, grpc_pollset **pollsets,
-                           size_t pollset_count,
-                           grpc_udp_server_cb new_transport_cb, void *cb_arg) {
+                           size_t pollset_count) {
   size_t i, j;
   size_t i, j;
-  GPR_ASSERT(new_transport_cb);
   gpr_mu_lock(&s->mu);
   gpr_mu_lock(&s->mu);
-  GPR_ASSERT(!s->cb);
   GPR_ASSERT(s->active_ports == 0);
   GPR_ASSERT(s->active_ports == 0);
-  s->cb = new_transport_cb;
-  s->cb_arg = cb_arg;
   s->pollsets = pollsets;
   s->pollsets = pollsets;
   for (i = 0; i < s->nports; i++) {
   for (i = 0; i < s->nports; i++) {
     for (j = 0; j < pollset_count; j++) {
     for (j = 0; j < pollset_count; j++) {

+ 3 - 9
src/core/iomgr/udp_server.h

@@ -39,21 +39,15 @@
 /* Forward decl of grpc_udp_server */
 /* Forward decl of grpc_udp_server */
 typedef struct grpc_udp_server grpc_udp_server;
 typedef struct grpc_udp_server grpc_udp_server;
 
 
-/* New server callback: ep is the newly connected connection */
-typedef void (*grpc_udp_server_cb)(void *arg, grpc_endpoint *ep);
-
 /* Called when data is available to read from the socket. */
 /* Called when data is available to read from the socket. */
-typedef void (*grpc_udp_server_read_cb)(int fd,
-                                        grpc_udp_server_cb new_transport_cb,
-                                        void *cb_arg);
+typedef void (*grpc_udp_server_read_cb)(int fd);
 
 
 /* Create a server, initially not bound to any ports */
 /* Create a server, initially not bound to any ports */
 grpc_udp_server *grpc_udp_server_create(void);
 grpc_udp_server *grpc_udp_server_create(void);
 
 
 /* Start listening to bound ports */
 /* Start listening to bound ports */
-void grpc_udp_server_start(grpc_udp_server *server, grpc_pollset **pollsets,
-                           size_t pollset_count, grpc_udp_server_cb cb,
-                           void *cb_arg);
+void grpc_udp_server_start(grpc_udp_server *udp_server, grpc_pollset **pollsets,
+                           size_t pollset_count);
 
 
 int grpc_udp_server_get_fd(grpc_udp_server *s, unsigned index);
 int grpc_udp_server_get_fd(grpc_udp_server *s, unsigned index);
 
 

+ 22 - 20
src/core/security/client_auth_filter.c

@@ -63,6 +63,7 @@ typedef struct {
   int sent_initial_metadata;
   int sent_initial_metadata;
   gpr_uint8 security_context_set;
   gpr_uint8 security_context_set;
   grpc_linked_mdelem md_links[MAX_CREDENTIALS_METADATA_COUNT];
   grpc_linked_mdelem md_links[MAX_CREDENTIALS_METADATA_COUNT];
+  char *service_url;
 } call_data;
 } call_data;
 
 
 /* We can have a per-channel credentials. */
 /* We can have a per-channel credentials. */
@@ -75,6 +76,13 @@ typedef struct {
   grpc_mdstr *status_key;
   grpc_mdstr *status_key;
 } channel_data;
 } channel_data;
 
 
+static void reset_service_url(call_data *calld) {
+  if (calld->service_url != NULL) {
+    gpr_free(calld->service_url);
+    calld->service_url = NULL;
+  }
+}
+
 static void bubble_up_error(grpc_call_element *elem, grpc_status_code status,
 static void bubble_up_error(grpc_call_element *elem, grpc_status_code status,
                             const char *error_msg) {
                             const char *error_msg) {
   call_data *calld = elem->call_data;
   call_data *calld = elem->call_data;
@@ -93,6 +101,7 @@ static void on_credentials_metadata(void *user_data,
   grpc_transport_stream_op *op = &calld->op;
   grpc_transport_stream_op *op = &calld->op;
   grpc_metadata_batch *mdb;
   grpc_metadata_batch *mdb;
   size_t i;
   size_t i;
+  reset_service_url(calld);
   if (status != GRPC_CREDENTIALS_OK) {
   if (status != GRPC_CREDENTIALS_OK) {
     bubble_up_error(elem, GRPC_STATUS_UNAUTHENTICATED,
     bubble_up_error(elem, GRPC_STATUS_UNAUTHENTICATED,
                     "Credentials failed to get metadata.");
                     "Credentials failed to get metadata.");
@@ -111,8 +120,7 @@ static void on_credentials_metadata(void *user_data,
   grpc_call_next_op(elem, op);
   grpc_call_next_op(elem, op);
 }
 }
 
 
-static char *build_service_url(const char *url_scheme, call_data *calld) {
-  char *service_url;
+void build_service_url(const char *url_scheme, call_data *calld) {
   char *service = gpr_strdup(grpc_mdstr_as_c_string(calld->method));
   char *service = gpr_strdup(grpc_mdstr_as_c_string(calld->method));
   char *last_slash = strrchr(service, '/');
   char *last_slash = strrchr(service, '/');
   if (last_slash == NULL) {
   if (last_slash == NULL) {
@@ -125,10 +133,10 @@ static char *build_service_url(const char *url_scheme, call_data *calld) {
     *last_slash = '\0';
     *last_slash = '\0';
   }
   }
   if (url_scheme == NULL) url_scheme = "";
   if (url_scheme == NULL) url_scheme = "";
-  gpr_asprintf(&service_url, "%s://%s%s", url_scheme,
+  reset_service_url(calld);
+  gpr_asprintf(&calld->service_url, "%s://%s%s", url_scheme,
                grpc_mdstr_as_c_string(calld->host), service);
                grpc_mdstr_as_c_string(calld->host), service);
   gpr_free(service);
   gpr_free(service);
-  return service_url;
 }
 }
 
 
 static void send_security_metadata(grpc_call_element *elem,
 static void send_security_metadata(grpc_call_element *elem,
@@ -137,7 +145,6 @@ static void send_security_metadata(grpc_call_element *elem,
   channel_data *chand = elem->channel_data;
   channel_data *chand = elem->channel_data;
   grpc_client_security_context *ctx =
   grpc_client_security_context *ctx =
       (grpc_client_security_context *)op->context[GRPC_CONTEXT_SECURITY].value;
       (grpc_client_security_context *)op->context[GRPC_CONTEXT_SECURITY].value;
-  char *service_url = NULL;
   grpc_credentials *channel_creds =
   grpc_credentials *channel_creds =
       chand->security_connector->request_metadata_creds;
       chand->security_connector->request_metadata_creds;
   int channel_creds_has_md =
   int channel_creds_has_md =
@@ -165,13 +172,12 @@ static void send_security_metadata(grpc_call_element *elem,
         grpc_credentials_ref(call_creds_has_md ? ctx->creds : channel_creds);
         grpc_credentials_ref(call_creds_has_md ? ctx->creds : channel_creds);
   }
   }
 
 
-  service_url =
-      build_service_url(chand->security_connector->base.url_scheme, calld);
+  build_service_url(chand->security_connector->base.url_scheme, calld);
   calld->op = *op; /* Copy op (originates from the caller's stack). */
   calld->op = *op; /* Copy op (originates from the caller's stack). */
   GPR_ASSERT(calld->pollset);
   GPR_ASSERT(calld->pollset);
-  grpc_credentials_get_request_metadata(
-      calld->creds, calld->pollset, service_url, on_credentials_metadata, elem);
-  gpr_free(service_url);
+  grpc_credentials_get_request_metadata(calld->creds, calld->pollset,
+                                        calld->service_url,
+                                        on_credentials_metadata, elem);
 }
 }
 
 
 static void on_host_checked(void *user_data, grpc_security_status status) {
 static void on_host_checked(void *user_data, grpc_security_status status) {
@@ -203,7 +209,8 @@ static void auth_start_transport_op(grpc_call_element *elem,
   size_t i;
   size_t i;
   grpc_client_security_context *sec_ctx = NULL;
   grpc_client_security_context *sec_ctx = NULL;
 
 
-  if (calld->security_context_set == 0) {
+  if (calld->security_context_set == 0 &&
+      op->cancel_with_status == GRPC_STATUS_OK) {
     calld->security_context_set = 1;
     calld->security_context_set = 1;
     GPR_ASSERT(op->context);
     GPR_ASSERT(op->context);
     if (op->context[GRPC_CONTEXT_SECURITY].value == NULL) {
     if (op->context[GRPC_CONTEXT_SECURITY].value == NULL) {
@@ -218,11 +225,11 @@ static void auth_start_transport_op(grpc_call_element *elem,
         chand->security_connector->base.auth_context, "client_auth_filter");
         chand->security_connector->base.auth_context, "client_auth_filter");
   }
   }
 
 
-  if (op->bind_pollset) {
+  if (op->bind_pollset != NULL) {
     calld->pollset = op->bind_pollset;
     calld->pollset = op->bind_pollset;
   }
   }
 
 
-  if (op->send_ops && !calld->sent_initial_metadata) {
+  if (op->send_ops != NULL && !calld->sent_initial_metadata) {
     size_t nops = op->send_ops->nops;
     size_t nops = op->send_ops->nops;
     grpc_stream_op *ops = op->send_ops->ops;
     grpc_stream_op *ops = op->send_ops->ops;
     for (i = 0; i < nops; i++) {
     for (i = 0; i < nops; i++) {
@@ -274,13 +281,7 @@ static void init_call_elem(grpc_call_element *elem,
                            const void *server_transport_data,
                            const void *server_transport_data,
                            grpc_transport_stream_op *initial_op) {
                            grpc_transport_stream_op *initial_op) {
   call_data *calld = elem->call_data;
   call_data *calld = elem->call_data;
-  calld->creds = NULL;
-  calld->host = NULL;
-  calld->method = NULL;
-  calld->pollset = NULL;
-  calld->sent_initial_metadata = 0;
-  calld->security_context_set = 0;
-
+  memset(calld, 0, sizeof(*calld));
   GPR_ASSERT(!initial_op || !initial_op->send_ops);
   GPR_ASSERT(!initial_op || !initial_op->send_ops);
 }
 }
 
 
@@ -294,6 +295,7 @@ static void destroy_call_elem(grpc_call_element *elem) {
   if (calld->method != NULL) {
   if (calld->method != NULL) {
     GRPC_MDSTR_UNREF(calld->method);
     GRPC_MDSTR_UNREF(calld->method);
   }
   }
+  reset_service_url(calld);
 }
 }
 
 
 /* Constructor for channel_data */
 /* Constructor for channel_data */

+ 92 - 0
src/core/security/credentials.c

@@ -1185,3 +1185,95 @@ grpc_credentials *grpc_google_iam_credentials_create(
       c->iam_md, GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY, authority_selector);
       c->iam_md, GRPC_IAM_AUTHORITY_SELECTOR_METADATA_KEY, authority_selector);
   return &c->base;
   return &c->base;
 }
 }
+
+/* -- Plugin credentials. -- */
+
+typedef struct {
+  void *user_data;
+  grpc_credentials_metadata_cb cb;
+} grpc_metadata_plugin_request;
+
+static void plugin_destruct(grpc_credentials *creds) {
+  grpc_plugin_credentials *c = (grpc_plugin_credentials *)creds;
+  if (c->plugin.state != NULL && c->plugin.destroy != NULL) {
+    c->plugin.destroy(c->plugin.state);
+  }
+}
+
+static int plugin_has_request_metadata(const grpc_credentials *creds) {
+  return 1;
+}
+
+static int plugin_has_request_metadata_only(const grpc_credentials *creds) {
+  return 1;
+}
+
+static void plugin_md_request_metadata_ready(void *request,
+                                             const grpc_metadata *md,
+                                             size_t num_md,
+                                             grpc_status_code status,
+                                             const char *error_details) {
+  grpc_metadata_plugin_request *r = (grpc_metadata_plugin_request *)request;
+  if (status != GRPC_STATUS_OK) {
+    if (error_details != NULL) {
+      gpr_log(GPR_ERROR, "Getting metadata from plugin failed with error: %s",
+              error_details);
+    }
+    r->cb(r->user_data, NULL, 0, GRPC_CREDENTIALS_ERROR);
+  } else {
+    size_t i;
+    grpc_credentials_md *md_array = NULL;
+    if (num_md > 0) {
+      md_array = gpr_malloc(num_md * sizeof(grpc_credentials_md));
+      for (i = 0; i < num_md; i++) {
+        md_array[i].key = gpr_slice_from_copied_string(md[i].key);
+        md_array[i].value =
+            gpr_slice_from_copied_buffer(md[i].value, md[i].value_length);
+      }
+    }
+    r->cb(r->user_data, md_array, num_md, GRPC_CREDENTIALS_OK);
+    if (md_array != NULL) {
+      for (i = 0; i < num_md; i++) {
+        gpr_slice_unref(md_array[i].key);
+        gpr_slice_unref(md_array[i].value);
+      }
+      gpr_free(md_array);
+    }
+  }
+  gpr_free(r);
+}
+
+static void plugin_get_request_metadata(grpc_credentials *creds,
+                                        grpc_pollset *pollset,
+                                        const char *service_url,
+                                        grpc_credentials_metadata_cb cb,
+                                        void *user_data) {
+  grpc_plugin_credentials *c = (grpc_plugin_credentials *)creds;
+  if (c->plugin.get_metadata != NULL) {
+    grpc_metadata_plugin_request *request = gpr_malloc(sizeof(*request));
+    memset(request, 0, sizeof(*request));
+    request->user_data = user_data;
+    request->cb = cb;
+    c->plugin.get_metadata(c->plugin.state, service_url,
+                           plugin_md_request_metadata_ready, request);
+  } else {
+    cb(user_data, NULL, 0, GRPC_CREDENTIALS_OK);
+  }
+}
+
+static grpc_credentials_vtable plugin_vtable = {
+    plugin_destruct, plugin_has_request_metadata,
+    plugin_has_request_metadata_only, plugin_get_request_metadata, NULL};
+
+grpc_credentials *grpc_metadata_credentials_create_from_plugin(
+    grpc_metadata_credentials_plugin plugin, void *reserved) {
+  grpc_plugin_credentials *c = gpr_malloc(sizeof(*c));
+  GPR_ASSERT(reserved == NULL);
+  memset(c, 0, sizeof(*c));
+  c->base.type = GRPC_CREDENTIALS_TYPE_METADATA_PLUGIN;
+  c->base.vtable = &plugin_vtable;
+  gpr_ref_init(&c->base.refcount, 1);
+  c->plugin = plugin;
+  return &c->base;
+}
+

+ 9 - 0
src/core/security/credentials.h

@@ -56,6 +56,7 @@ typedef enum {
 
 
 #define GRPC_CREDENTIALS_TYPE_SSL "Ssl"
 #define GRPC_CREDENTIALS_TYPE_SSL "Ssl"
 #define GRPC_CREDENTIALS_TYPE_OAUTH2 "Oauth2"
 #define GRPC_CREDENTIALS_TYPE_OAUTH2 "Oauth2"
+#define GRPC_CREDENTIALS_TYPE_METADATA_PLUGIN "Plugin"
 #define GRPC_CREDENTIALS_TYPE_JWT "Jwt"
 #define GRPC_CREDENTIALS_TYPE_JWT "Jwt"
 #define GRPC_CREDENTIALS_TYPE_IAM "Iam"
 #define GRPC_CREDENTIALS_TYPE_IAM "Iam"
 #define GRPC_CREDENTIALS_TYPE_COMPOSITE "Composite"
 #define GRPC_CREDENTIALS_TYPE_COMPOSITE "Composite"
@@ -322,4 +323,12 @@ typedef struct {
   grpc_credentials *connector_creds;
   grpc_credentials *connector_creds;
 } grpc_composite_credentials;
 } grpc_composite_credentials;
 
 
+/* -- Plugin credentials. -- */
+
+typedef struct {
+  grpc_credentials base;
+  grpc_metadata_credentials_plugin plugin;
+  grpc_credentials_md_store *plugin_md;
+} grpc_plugin_credentials;
+
 #endif /* GRPC_INTERNAL_CORE_SECURITY_CREDENTIALS_H */
 #endif /* GRPC_INTERNAL_CORE_SECURITY_CREDENTIALS_H */

+ 106 - 110
src/core/security/secure_transport_setup.c → src/core/security/handshake.c

@@ -31,7 +31,7 @@
  *
  *
  */
  */
 
 
-#include "src/core/security/secure_transport_setup.h"
+#include "src/core/security/handshake.h"
 
 
 #include <string.h>
 #include <string.h>
 
 
@@ -52,133 +52,134 @@ typedef struct {
   gpr_slice_buffer left_overs;
   gpr_slice_buffer left_overs;
   gpr_slice_buffer incoming;
   gpr_slice_buffer incoming;
   gpr_slice_buffer outgoing;
   gpr_slice_buffer outgoing;
-  grpc_secure_transport_setup_done_cb cb;
+  grpc_security_handshake_done_cb cb;
   void *user_data;
   void *user_data;
   grpc_iomgr_closure on_handshake_data_sent_to_peer;
   grpc_iomgr_closure on_handshake_data_sent_to_peer;
   grpc_iomgr_closure on_handshake_data_received_from_peer;
   grpc_iomgr_closure on_handshake_data_received_from_peer;
-} grpc_secure_transport_setup;
+} grpc_security_handshake;
+
 
 
 static void on_handshake_data_received_from_peer(void *setup, int success);
 static void on_handshake_data_received_from_peer(void *setup, int success);
 
 
 static void on_handshake_data_sent_to_peer(void *setup, int success);
 static void on_handshake_data_sent_to_peer(void *setup, int success);
 
 
-static void secure_transport_setup_done(grpc_secure_transport_setup *s,
-                                        int is_success) {
+static void security_handshake_done(grpc_security_handshake *h,
+                                    int is_success) {
   if (is_success) {
   if (is_success) {
-    s->cb(s->user_data, GRPC_SECURITY_OK, s->wrapped_endpoint,
-          s->secure_endpoint);
+    h->cb(h->user_data, GRPC_SECURITY_OK, h->wrapped_endpoint,
+          h->secure_endpoint);
   } else {
   } else {
-    if (s->secure_endpoint != NULL) {
-      grpc_endpoint_shutdown(s->secure_endpoint);
-      grpc_endpoint_destroy(s->secure_endpoint);
+    if (h->secure_endpoint != NULL) {
+      grpc_endpoint_shutdown(h->secure_endpoint);
+      grpc_endpoint_destroy(h->secure_endpoint);
     } else {
     } else {
-      grpc_endpoint_destroy(s->wrapped_endpoint);
+      grpc_endpoint_destroy(h->wrapped_endpoint);
     }
     }
-    s->cb(s->user_data, GRPC_SECURITY_ERROR, s->wrapped_endpoint, NULL);
+    h->cb(h->user_data, GRPC_SECURITY_ERROR, h->wrapped_endpoint, NULL);
   }
   }
-  if (s->handshaker != NULL) tsi_handshaker_destroy(s->handshaker);
-  if (s->handshake_buffer != NULL) gpr_free(s->handshake_buffer);
-  gpr_slice_buffer_destroy(&s->left_overs);
-  gpr_slice_buffer_destroy(&s->outgoing);
-  gpr_slice_buffer_destroy(&s->incoming);
-  GRPC_SECURITY_CONNECTOR_UNREF(s->connector, "secure_transport_setup");
-  gpr_free(s);
+  if (h->handshaker != NULL) tsi_handshaker_destroy(h->handshaker);
+  if (h->handshake_buffer != NULL) gpr_free(h->handshake_buffer);
+  gpr_slice_buffer_destroy(&h->left_overs);
+  gpr_slice_buffer_destroy(&h->outgoing);
+  gpr_slice_buffer_destroy(&h->incoming);
+  GRPC_SECURITY_CONNECTOR_UNREF(h->connector, "handshake");
+  gpr_free(h);
 }
 }
 
 
 static void on_peer_checked(void *user_data, grpc_security_status status) {
 static void on_peer_checked(void *user_data, grpc_security_status status) {
-  grpc_secure_transport_setup *s = user_data;
+  grpc_security_handshake *h = user_data;
   tsi_frame_protector *protector;
   tsi_frame_protector *protector;
   tsi_result result;
   tsi_result result;
   if (status != GRPC_SECURITY_OK) {
   if (status != GRPC_SECURITY_OK) {
     gpr_log(GPR_ERROR, "Error checking peer.");
     gpr_log(GPR_ERROR, "Error checking peer.");
-    secure_transport_setup_done(s, 0);
+    security_handshake_done(h, 0);
     return;
     return;
   }
   }
   result =
   result =
-      tsi_handshaker_create_frame_protector(s->handshaker, NULL, &protector);
+      tsi_handshaker_create_frame_protector(h->handshaker, NULL, &protector);
   if (result != TSI_OK) {
   if (result != TSI_OK) {
     gpr_log(GPR_ERROR, "Frame protector creation failed with error %s.",
     gpr_log(GPR_ERROR, "Frame protector creation failed with error %s.",
             tsi_result_to_string(result));
             tsi_result_to_string(result));
-    secure_transport_setup_done(s, 0);
+    security_handshake_done(h, 0);
     return;
     return;
   }
   }
-  s->secure_endpoint =
-      grpc_secure_endpoint_create(protector, s->wrapped_endpoint,
-                                  s->left_overs.slices, s->left_overs.count);
-  s->left_overs.count = 0;
-  s->left_overs.length = 0;
-  secure_transport_setup_done(s, 1);
+  h->secure_endpoint =
+      grpc_secure_endpoint_create(protector, h->wrapped_endpoint,
+                                  h->left_overs.slices, h->left_overs.count);
+  h->left_overs.count = 0;
+  h->left_overs.length = 0;
+  security_handshake_done(h, 1);
   return;
   return;
 }
 }
 
 
-static void check_peer(grpc_secure_transport_setup *s) {
+static void check_peer(grpc_security_handshake *h) {
   grpc_security_status peer_status;
   grpc_security_status peer_status;
   tsi_peer peer;
   tsi_peer peer;
-  tsi_result result = tsi_handshaker_extract_peer(s->handshaker, &peer);
+  tsi_result result = tsi_handshaker_extract_peer(h->handshaker, &peer);
 
 
   if (result != TSI_OK) {
   if (result != TSI_OK) {
     gpr_log(GPR_ERROR, "Peer extraction failed with error %s",
     gpr_log(GPR_ERROR, "Peer extraction failed with error %s",
             tsi_result_to_string(result));
             tsi_result_to_string(result));
-    secure_transport_setup_done(s, 0);
+    security_handshake_done(h, 0);
     return;
     return;
   }
   }
-  peer_status = grpc_security_connector_check_peer(s->connector, peer,
-                                                   on_peer_checked, s);
+  peer_status = grpc_security_connector_check_peer(h->connector, peer,
+                                                   on_peer_checked, h);
   if (peer_status == GRPC_SECURITY_ERROR) {
   if (peer_status == GRPC_SECURITY_ERROR) {
     gpr_log(GPR_ERROR, "Peer check failed.");
     gpr_log(GPR_ERROR, "Peer check failed.");
-    secure_transport_setup_done(s, 0);
+    security_handshake_done(h, 0);
     return;
     return;
   } else if (peer_status == GRPC_SECURITY_OK) {
   } else if (peer_status == GRPC_SECURITY_OK) {
-    on_peer_checked(s, peer_status);
+    on_peer_checked(h, peer_status);
   }
   }
 }
 }
 
 
-static void send_handshake_bytes_to_peer(grpc_secure_transport_setup *s) {
+static void send_handshake_bytes_to_peer(grpc_security_handshake *h) {
   size_t offset = 0;
   size_t offset = 0;
   tsi_result result = TSI_OK;
   tsi_result result = TSI_OK;
   gpr_slice to_send;
   gpr_slice to_send;
 
 
   do {
   do {
-    size_t to_send_size = s->handshake_buffer_size - offset;
+    size_t to_send_size = h->handshake_buffer_size - offset;
     result = tsi_handshaker_get_bytes_to_send_to_peer(
     result = tsi_handshaker_get_bytes_to_send_to_peer(
-        s->handshaker, s->handshake_buffer + offset, &to_send_size);
+        h->handshaker, h->handshake_buffer + offset, &to_send_size);
     offset += to_send_size;
     offset += to_send_size;
     if (result == TSI_INCOMPLETE_DATA) {
     if (result == TSI_INCOMPLETE_DATA) {
-      s->handshake_buffer_size *= 2;
-      s->handshake_buffer =
-          gpr_realloc(s->handshake_buffer, s->handshake_buffer_size);
+      h->handshake_buffer_size *= 2;
+      h->handshake_buffer =
+          gpr_realloc(h->handshake_buffer, h->handshake_buffer_size);
     }
     }
   } while (result == TSI_INCOMPLETE_DATA);
   } while (result == TSI_INCOMPLETE_DATA);
 
 
   if (result != TSI_OK) {
   if (result != TSI_OK) {
     gpr_log(GPR_ERROR, "Handshake failed with error %s",
     gpr_log(GPR_ERROR, "Handshake failed with error %s",
             tsi_result_to_string(result));
             tsi_result_to_string(result));
-    secure_transport_setup_done(s, 0);
+    security_handshake_done(h, 0);
     return;
     return;
   }
   }
 
 
   to_send =
   to_send =
-      gpr_slice_from_copied_buffer((const char *)s->handshake_buffer, offset);
-  gpr_slice_buffer_reset_and_unref(&s->outgoing);
-  gpr_slice_buffer_add(&s->outgoing, to_send);
+      gpr_slice_from_copied_buffer((const char *)h->handshake_buffer, offset);
+  gpr_slice_buffer_reset_and_unref(&h->outgoing);
+  gpr_slice_buffer_add(&h->outgoing, to_send);
   /* TODO(klempner,jboeuf): This should probably use the client setup
   /* TODO(klempner,jboeuf): This should probably use the client setup
          deadline */
          deadline */
-  switch (grpc_endpoint_write(s->wrapped_endpoint, &s->outgoing,
-                              &s->on_handshake_data_sent_to_peer)) {
+  switch (grpc_endpoint_write(h->wrapped_endpoint, &h->outgoing,
+                              &h->on_handshake_data_sent_to_peer)) {
     case GRPC_ENDPOINT_ERROR:
     case GRPC_ENDPOINT_ERROR:
       gpr_log(GPR_ERROR, "Could not send handshake data to peer.");
       gpr_log(GPR_ERROR, "Could not send handshake data to peer.");
-      secure_transport_setup_done(s, 0);
+      security_handshake_done(h, 0);
       break;
       break;
     case GRPC_ENDPOINT_DONE:
     case GRPC_ENDPOINT_DONE:
-      on_handshake_data_sent_to_peer(s, 1);
+      on_handshake_data_sent_to_peer(h, 1);
       break;
       break;
     case GRPC_ENDPOINT_PENDING:
     case GRPC_ENDPOINT_PENDING:
       break;
       break;
   }
   }
 }
 }
 
 
-static void on_handshake_data_received_from_peer(void *setup, int success) {
-  grpc_secure_transport_setup *s = setup;
+static void on_handshake_data_received_from_peer(void *handshake, int success) {
+  grpc_security_handshake *h = handshake;
   size_t consumed_slice_size = 0;
   size_t consumed_slice_size = 0;
   tsi_result result = TSI_OK;
   tsi_result result = TSI_OK;
   size_t i;
   size_t i;
@@ -187,35 +188,35 @@ static void on_handshake_data_received_from_peer(void *setup, int success) {
 
 
   if (!success) {
   if (!success) {
     gpr_log(GPR_ERROR, "Read failed.");
     gpr_log(GPR_ERROR, "Read failed.");
-    secure_transport_setup_done(s, 0);
+    security_handshake_done(h, 0);
     return;
     return;
   }
   }
 
 
-  for (i = 0; i < s->incoming.count; i++) {
-    consumed_slice_size = GPR_SLICE_LENGTH(s->incoming.slices[i]);
+  for (i = 0; i < h->incoming.count; i++) {
+    consumed_slice_size = GPR_SLICE_LENGTH(h->incoming.slices[i]);
     result = tsi_handshaker_process_bytes_from_peer(
     result = tsi_handshaker_process_bytes_from_peer(
-        s->handshaker, GPR_SLICE_START_PTR(s->incoming.slices[i]),
+        h->handshaker, GPR_SLICE_START_PTR(h->incoming.slices[i]),
         &consumed_slice_size);
         &consumed_slice_size);
-    if (!tsi_handshaker_is_in_progress(s->handshaker)) break;
+    if (!tsi_handshaker_is_in_progress(h->handshaker)) break;
   }
   }
 
 
-  if (tsi_handshaker_is_in_progress(s->handshaker)) {
+  if (tsi_handshaker_is_in_progress(h->handshaker)) {
     /* We may need more data. */
     /* We may need more data. */
     if (result == TSI_INCOMPLETE_DATA) {
     if (result == TSI_INCOMPLETE_DATA) {
-      switch (grpc_endpoint_read(s->wrapped_endpoint, &s->incoming,
-                                 &s->on_handshake_data_received_from_peer)) {
+      switch (grpc_endpoint_read(h->wrapped_endpoint, &h->incoming,
+                                 &h->on_handshake_data_received_from_peer)) {
         case GRPC_ENDPOINT_DONE:
         case GRPC_ENDPOINT_DONE:
-          on_handshake_data_received_from_peer(s, 1);
+          on_handshake_data_received_from_peer(h, 1);
           break;
           break;
         case GRPC_ENDPOINT_ERROR:
         case GRPC_ENDPOINT_ERROR:
-          on_handshake_data_received_from_peer(s, 0);
+          on_handshake_data_received_from_peer(h, 0);
           break;
           break;
         case GRPC_ENDPOINT_PENDING:
         case GRPC_ENDPOINT_PENDING:
           break;
           break;
       }
       }
       return;
       return;
     } else {
     } else {
-      send_handshake_bytes_to_peer(s);
+      send_handshake_bytes_to_peer(h);
       return;
       return;
     }
     }
   }
   }
@@ -223,90 +224,85 @@ static void on_handshake_data_received_from_peer(void *setup, int success) {
   if (result != TSI_OK) {
   if (result != TSI_OK) {
     gpr_log(GPR_ERROR, "Handshake failed with error %s",
     gpr_log(GPR_ERROR, "Handshake failed with error %s",
             tsi_result_to_string(result));
             tsi_result_to_string(result));
-    secure_transport_setup_done(s, 0);
+    security_handshake_done(h, 0);
     return;
     return;
   }
   }
 
 
   /* Handshake is done and successful this point. */
   /* Handshake is done and successful this point. */
   has_left_overs_in_current_slice =
   has_left_overs_in_current_slice =
-      (consumed_slice_size < GPR_SLICE_LENGTH(s->incoming.slices[i]));
+      (consumed_slice_size < GPR_SLICE_LENGTH(h->incoming.slices[i]));
   num_left_overs =
   num_left_overs =
-      (has_left_overs_in_current_slice ? 1 : 0) + s->incoming.count - i - 1;
+      (has_left_overs_in_current_slice ? 1 : 0) + h->incoming.count - i - 1;
   if (num_left_overs == 0) {
   if (num_left_overs == 0) {
-    check_peer(s);
+    check_peer(h);
     return;
     return;
   }
   }
+
   /* Put the leftovers in our buffer (ownership transfered). */
   /* Put the leftovers in our buffer (ownership transfered). */
   if (has_left_overs_in_current_slice) {
   if (has_left_overs_in_current_slice) {
     gpr_slice_buffer_add(
     gpr_slice_buffer_add(
-        &s->left_overs,
-        gpr_slice_split_tail(&s->incoming.slices[i], consumed_slice_size));
+        &h->left_overs,
+        gpr_slice_split_tail(&h->incoming.slices[i], consumed_slice_size));
     gpr_slice_unref(
     gpr_slice_unref(
-        s->incoming.slices[i]); /* split_tail above increments refcount. */
+        h->incoming.slices[i]); /* split_tail above increments refcount. */
   }
   }
   gpr_slice_buffer_addn(
   gpr_slice_buffer_addn(
-      &s->left_overs, &s->incoming.slices[i + 1],
+      &h->left_overs, &h->incoming.slices[i + 1],
       num_left_overs - (size_t)has_left_overs_in_current_slice);
       num_left_overs - (size_t)has_left_overs_in_current_slice);
-  check_peer(s);
+  check_peer(h);
 }
 }
 
 
-/* If setup is NULL, the setup is done. */
-static void on_handshake_data_sent_to_peer(void *setup, int success) {
-  grpc_secure_transport_setup *s = setup;
+/* If handshake is NULL, the handshake is done. */
+static void on_handshake_data_sent_to_peer(void *handshake, int success) {
+  grpc_security_handshake *h = handshake;
 
 
   /* Make sure that write is OK. */
   /* Make sure that write is OK. */
   if (!success) {
   if (!success) {
     gpr_log(GPR_ERROR, "Write failed.");
     gpr_log(GPR_ERROR, "Write failed.");
-    if (setup != NULL) secure_transport_setup_done(s, 0);
+    if (handshake != NULL) security_handshake_done(h, 0);
     return;
     return;
   }
   }
 
 
   /* We may be done. */
   /* We may be done. */
-  if (tsi_handshaker_is_in_progress(s->handshaker)) {
+  if (tsi_handshaker_is_in_progress(h->handshaker)) {
     /* TODO(klempner,jboeuf): This should probably use the client setup
     /* TODO(klempner,jboeuf): This should probably use the client setup
        deadline */
        deadline */
-    switch (grpc_endpoint_read(s->wrapped_endpoint, &s->incoming,
-                               &s->on_handshake_data_received_from_peer)) {
+    switch (grpc_endpoint_read(h->wrapped_endpoint, &h->incoming,
+                               &h->on_handshake_data_received_from_peer)) {
       case GRPC_ENDPOINT_ERROR:
       case GRPC_ENDPOINT_ERROR:
-        on_handshake_data_received_from_peer(s, 0);
+        on_handshake_data_received_from_peer(h, 0);
         break;
         break;
       case GRPC_ENDPOINT_PENDING:
       case GRPC_ENDPOINT_PENDING:
         break;
         break;
       case GRPC_ENDPOINT_DONE:
       case GRPC_ENDPOINT_DONE:
-        on_handshake_data_received_from_peer(s, 1);
+        on_handshake_data_received_from_peer(h, 1);
         break;
         break;
     }
     }
   } else {
   } else {
-    check_peer(s);
+    check_peer(h);
   }
   }
 }
 }
 
 
-void grpc_setup_secure_transport(grpc_security_connector *connector,
-                                 grpc_endpoint *nonsecure_endpoint,
-                                 grpc_secure_transport_setup_done_cb cb,
-                                 void *user_data) {
-  grpc_security_status result = GRPC_SECURITY_OK;
-  grpc_secure_transport_setup *s =
-      gpr_malloc(sizeof(grpc_secure_transport_setup));
-  memset(s, 0, sizeof(grpc_secure_transport_setup));
-  result = grpc_security_connector_create_handshaker(connector, &s->handshaker);
-  if (result != GRPC_SECURITY_OK) {
-    secure_transport_setup_done(s, 0);
-    return;
-  }
-  s->connector =
-      GRPC_SECURITY_CONNECTOR_REF(connector, "secure_transport_setup");
-  s->handshake_buffer_size = GRPC_INITIAL_HANDSHAKE_BUFFER_SIZE;
-  s->handshake_buffer = gpr_malloc(s->handshake_buffer_size);
-  s->wrapped_endpoint = nonsecure_endpoint;
-  s->user_data = user_data;
-  s->cb = cb;
-  grpc_iomgr_closure_init(&s->on_handshake_data_sent_to_peer,
-                          on_handshake_data_sent_to_peer, s);
-  grpc_iomgr_closure_init(&s->on_handshake_data_received_from_peer,
-                          on_handshake_data_received_from_peer, s);
-  gpr_slice_buffer_init(&s->left_overs);
-  gpr_slice_buffer_init(&s->outgoing);
-  gpr_slice_buffer_init(&s->incoming);
-  send_handshake_bytes_to_peer(s);
+void grpc_do_security_handshake(tsi_handshaker *handshaker,
+                                grpc_security_connector *connector,
+                                grpc_endpoint *nonsecure_endpoint,
+                                grpc_security_handshake_done_cb cb,
+                                void *user_data) {
+  grpc_security_handshake *h = gpr_malloc(sizeof(grpc_security_handshake));
+  memset(h, 0, sizeof(grpc_security_handshake));
+  h->handshaker = handshaker;
+  h->connector = GRPC_SECURITY_CONNECTOR_REF(connector, "handshake");
+  h->handshake_buffer_size = GRPC_INITIAL_HANDSHAKE_BUFFER_SIZE;
+  h->handshake_buffer = gpr_malloc(h->handshake_buffer_size);
+  h->wrapped_endpoint = nonsecure_endpoint;
+  h->user_data = user_data;
+  h->cb = cb;
+  grpc_iomgr_closure_init(&h->on_handshake_data_sent_to_peer,
+                          on_handshake_data_sent_to_peer, h);
+  grpc_iomgr_closure_init(&h->on_handshake_data_received_from_peer,
+                          on_handshake_data_received_from_peer, h);
+  gpr_slice_buffer_init(&h->left_overs);
+  gpr_slice_buffer_init(&h->outgoing);
+  gpr_slice_buffer_init(&h->incoming);
+  send_handshake_bytes_to_peer(h);
 }
 }

+ 9 - 14
src/core/security/secure_transport_setup.h → src/core/security/handshake.h

@@ -31,23 +31,18 @@
  *
  *
  */
  */
 
 
-#ifndef GRPC_INTERNAL_CORE_SECURITY_SECURE_TRANSPORT_SETUP_H
-#define GRPC_INTERNAL_CORE_SECURITY_SECURE_TRANSPORT_SETUP_H
+#ifndef GRPC_INTERNAL_CORE_SECURITY_HANDSHAKE_H
+#define GRPC_INTERNAL_CORE_SECURITY_HANDSHAKE_H
 
 
 #include "src/core/iomgr/endpoint.h"
 #include "src/core/iomgr/endpoint.h"
 #include "src/core/security/security_connector.h"
 #include "src/core/security/security_connector.h"
 
 
-/* --- Secure transport setup --- */
 
 
-/* Ownership of the secure_endpoint is transfered. */
-typedef void (*grpc_secure_transport_setup_done_cb)(
-    void *user_data, grpc_security_status status,
-    grpc_endpoint *wrapped_endpoint, grpc_endpoint *secure_endpoint);
+/* Calls the callback upon completion. Takes owership of handshaker. */
+void grpc_do_security_handshake(tsi_handshaker *handshaker,
+                                grpc_security_connector *connector,
+                                grpc_endpoint *nonsecure_endpoint,
+                                grpc_security_handshake_done_cb cb,
+                                void *user_data);
 
 
-/* Calls the callback upon completion. */
-void grpc_setup_secure_transport(grpc_security_connector *connector,
-                                 grpc_endpoint *nonsecure_endpoint,
-                                 grpc_secure_transport_setup_done_cb cb,
-                                 void *user_data);
-
-#endif /* GRPC_INTERNAL_CORE_SECURITY_SECURE_TRANSPORT_SETUP_H */
+#endif /* GRPC_INTERNAL_CORE_SECURITY_HANDSHAKE_H */

+ 59 - 30
src/core/security/security_connector.c

@@ -36,6 +36,7 @@
 #include <string.h>
 #include <string.h>
 
 
 #include "src/core/security/credentials.h"
 #include "src/core/security/credentials.h"
+#include "src/core/security/handshake.h"
 #include "src/core/security/secure_endpoint.h"
 #include "src/core/security/secure_endpoint.h"
 #include "src/core/security/security_context.h"
 #include "src/core/security/security_context.h"
 #include "src/core/support/env.h"
 #include "src/core/support/env.h"
@@ -101,10 +102,15 @@ const tsi_peer_property *tsi_peer_get_property_by_name(const tsi_peer *peer,
   return NULL;
   return NULL;
 }
 }
 
 
-grpc_security_status grpc_security_connector_create_handshaker(
-    grpc_security_connector *sc, tsi_handshaker **handshaker) {
-  if (sc == NULL || handshaker == NULL) return GRPC_SECURITY_ERROR;
-  return sc->vtable->create_handshaker(sc, handshaker);
+void grpc_security_connector_do_handshake(grpc_security_connector *sc,
+                                          grpc_endpoint *nonsecure_endpoint,
+                                          grpc_security_handshake_done_cb cb,
+                                          void *user_data) {
+  if (sc == NULL || nonsecure_endpoint == NULL) {
+    cb(user_data, GRPC_SECURITY_ERROR, nonsecure_endpoint, NULL);
+  } else {
+    sc->vtable->do_handshake(sc, nonsecure_endpoint, cb, user_data);
+  }
 }
 }
 
 
 grpc_security_status grpc_security_connector_check_peer(
 grpc_security_status grpc_security_connector_check_peer(
@@ -225,18 +231,6 @@ static void fake_server_destroy(grpc_security_connector *sc) {
   gpr_free(sc);
   gpr_free(sc);
 }
 }
 
 
-static grpc_security_status fake_channel_create_handshaker(
-    grpc_security_connector *sc, tsi_handshaker **handshaker) {
-  *handshaker = tsi_create_fake_handshaker(1);
-  return GRPC_SECURITY_OK;
-}
-
-static grpc_security_status fake_server_create_handshaker(
-    grpc_security_connector *sc, tsi_handshaker **handshaker) {
-  *handshaker = tsi_create_fake_handshaker(0);
-  return GRPC_SECURITY_OK;
-}
-
 static grpc_security_status fake_check_peer(grpc_security_connector *sc,
 static grpc_security_status fake_check_peer(grpc_security_connector *sc,
                                             tsi_peer peer,
                                             tsi_peer peer,
                                             grpc_security_check_cb cb,
                                             grpc_security_check_cb cb,
@@ -286,11 +280,27 @@ static grpc_security_status fake_channel_check_call_host(
   }
   }
 }
 }
 
 
+static void fake_channel_do_handshake(grpc_security_connector *sc,
+                                      grpc_endpoint *nonsecure_endpoint,
+                                      grpc_security_handshake_done_cb cb,
+                                      void *user_data) {
+  grpc_do_security_handshake(tsi_create_fake_handshaker(1), sc,
+                             nonsecure_endpoint, cb, user_data);
+}
+
+static void fake_server_do_handshake(grpc_security_connector *sc,
+                                     grpc_endpoint *nonsecure_endpoint,
+                                     grpc_security_handshake_done_cb cb,
+                                     void *user_data) {
+  grpc_do_security_handshake(tsi_create_fake_handshaker(0), sc,
+                             nonsecure_endpoint, cb, user_data);
+}
+
 static grpc_security_connector_vtable fake_channel_vtable = {
 static grpc_security_connector_vtable fake_channel_vtable = {
-    fake_channel_destroy, fake_channel_create_handshaker, fake_check_peer};
+    fake_channel_destroy, fake_channel_do_handshake, fake_check_peer};
 
 
 static grpc_security_connector_vtable fake_server_vtable = {
 static grpc_security_connector_vtable fake_server_vtable = {
-    fake_server_destroy, fake_server_create_handshaker, fake_check_peer};
+    fake_server_destroy, fake_server_do_handshake, fake_check_peer};
 
 
 grpc_channel_security_connector *grpc_fake_channel_security_connector_create(
 grpc_channel_security_connector *grpc_fake_channel_security_connector_create(
     grpc_credentials *request_metadata_creds, int call_host_check_is_async) {
     grpc_credentials *request_metadata_creds, int call_host_check_is_async) {
@@ -372,22 +382,41 @@ static grpc_security_status ssl_create_handshaker(
   return GRPC_SECURITY_OK;
   return GRPC_SECURITY_OK;
 }
 }
 
 
-static grpc_security_status ssl_channel_create_handshaker(
-    grpc_security_connector *sc, tsi_handshaker **handshaker) {
+static void ssl_channel_do_handshake(grpc_security_connector *sc,
+                                     grpc_endpoint *nonsecure_endpoint,
+                                     grpc_security_handshake_done_cb cb,
+                                     void *user_data) {
   grpc_ssl_channel_security_connector *c =
   grpc_ssl_channel_security_connector *c =
       (grpc_ssl_channel_security_connector *)sc;
       (grpc_ssl_channel_security_connector *)sc;
-  return ssl_create_handshaker(c->handshaker_factory, 1,
-                               c->overridden_target_name != NULL
-                                   ? c->overridden_target_name
-                                   : c->target_name,
-                               handshaker);
+  tsi_handshaker *handshaker;
+  grpc_security_status status = ssl_create_handshaker(
+      c->handshaker_factory, 1,
+      c->overridden_target_name != NULL ? c->overridden_target_name
+                                        : c->target_name,
+      &handshaker);
+  if (status != GRPC_SECURITY_OK) {
+    cb(user_data, status, nonsecure_endpoint, NULL);
+  } else {
+    grpc_do_security_handshake(handshaker, sc, nonsecure_endpoint, cb,
+                               user_data);
+  }
 }
 }
 
 
-static grpc_security_status ssl_server_create_handshaker(
-    grpc_security_connector *sc, tsi_handshaker **handshaker) {
+static void ssl_server_do_handshake(grpc_security_connector *sc,
+                                    grpc_endpoint *nonsecure_endpoint,
+                                    grpc_security_handshake_done_cb cb,
+                                    void *user_data) {
   grpc_ssl_server_security_connector *c =
   grpc_ssl_server_security_connector *c =
       (grpc_ssl_server_security_connector *)sc;
       (grpc_ssl_server_security_connector *)sc;
-  return ssl_create_handshaker(c->handshaker_factory, 0, NULL, handshaker);
+  tsi_handshaker *handshaker;
+  grpc_security_status status =
+      ssl_create_handshaker(c->handshaker_factory, 0, NULL, &handshaker);
+  if (status != GRPC_SECURITY_OK) {
+    cb(user_data, status, nonsecure_endpoint, NULL);
+  } else {
+    grpc_do_security_handshake(handshaker, sc, nonsecure_endpoint, cb,
+                               user_data);
+  }
 }
 }
 
 
 static int ssl_host_matches_name(const tsi_peer *peer, const char *peer_name) {
 static int ssl_host_matches_name(const tsi_peer *peer, const char *peer_name) {
@@ -512,10 +541,10 @@ static grpc_security_status ssl_channel_check_call_host(
 }
 }
 
 
 static grpc_security_connector_vtable ssl_channel_vtable = {
 static grpc_security_connector_vtable ssl_channel_vtable = {
-    ssl_channel_destroy, ssl_channel_create_handshaker, ssl_channel_check_peer};
+    ssl_channel_destroy, ssl_channel_do_handshake, ssl_channel_check_peer};
 
 
 static grpc_security_connector_vtable ssl_server_vtable = {
 static grpc_security_connector_vtable ssl_server_vtable = {
-    ssl_server_destroy, ssl_server_create_handshaker, ssl_server_check_peer};
+    ssl_server_destroy, ssl_server_do_handshake, ssl_server_check_peer};
 
 
 static gpr_slice default_pem_root_certs;
 static gpr_slice default_pem_root_certs;
 
 

+ 14 - 5
src/core/security/security_connector.h

@@ -63,10 +63,17 @@ typedef struct grpc_security_connector grpc_security_connector;
 typedef void (*grpc_security_check_cb)(void *user_data,
 typedef void (*grpc_security_check_cb)(void *user_data,
                                        grpc_security_status status);
                                        grpc_security_status status);
 
 
+
+/* Ownership of the secure_endpoint is transfered. */
+typedef void (*grpc_security_handshake_done_cb)(
+    void *user_data, grpc_security_status status,
+    grpc_endpoint *wrapped_endpoint, grpc_endpoint *secure_endpoint);
+
 typedef struct {
 typedef struct {
   void (*destroy)(grpc_security_connector *sc);
   void (*destroy)(grpc_security_connector *sc);
-  grpc_security_status (*create_handshaker)(grpc_security_connector *sc,
-                                            tsi_handshaker **handshaker);
+  void (*do_handshake)(grpc_security_connector *sc,
+                       grpc_endpoint *nonsecure_endpoint,
+                       grpc_security_handshake_done_cb cb, void *user_data);
   grpc_security_status (*check_peer)(grpc_security_connector *sc, tsi_peer peer,
   grpc_security_status (*check_peer)(grpc_security_connector *sc, tsi_peer peer,
                                      grpc_security_check_cb cb,
                                      grpc_security_check_cb cb,
                                      void *user_data);
                                      void *user_data);
@@ -100,9 +107,11 @@ grpc_security_connector *grpc_security_connector_ref(
 void grpc_security_connector_unref(grpc_security_connector *policy);
 void grpc_security_connector_unref(grpc_security_connector *policy);
 #endif
 #endif
 
 
-/* Handshake creation. */
-grpc_security_status grpc_security_connector_create_handshaker(
-    grpc_security_connector *sc, tsi_handshaker **handshaker);
+/* Handshake. */
+void grpc_security_connector_do_handshake(grpc_security_connector *connector,
+                                          grpc_endpoint *nonsecure_endpoint,
+                                          grpc_security_handshake_done_cb cb,
+                                          void *user_data);
 
 
 /* Check the peer.
 /* Check the peer.
    Implementations can choose to check the peer either synchronously or
    Implementations can choose to check the peer either synchronously or

+ 5 - 7
src/core/security/server_secure_chttp2.c

@@ -44,7 +44,6 @@
 #include "src/core/security/credentials.h"
 #include "src/core/security/credentials.h"
 #include "src/core/security/security_connector.h"
 #include "src/core/security/security_connector.h"
 #include "src/core/security/security_context.h"
 #include "src/core/security/security_context.h"
-#include "src/core/security/secure_transport_setup.h"
 #include "src/core/surface/server.h"
 #include "src/core/surface/server.h"
 #include "src/core/transport/chttp2_transport.h"
 #include "src/core/transport/chttp2_transport.h"
 #include <grpc/support/alloc.h>
 #include <grpc/support/alloc.h>
@@ -123,10 +122,9 @@ static int remove_tcp_from_list_locked(grpc_server_secure_state *state,
   return -1;
   return -1;
 }
 }
 
 
-static void on_secure_transport_setup_done(void *statep,
-                                           grpc_security_status status,
-                                           grpc_endpoint *wrapped_endpoint,
-                                           grpc_endpoint *secure_endpoint) {
+static void on_secure_handshake_done(void *statep, grpc_security_status status,
+                                     grpc_endpoint *wrapped_endpoint,
+                                     grpc_endpoint *secure_endpoint) {
   grpc_server_secure_state *state = statep;
   grpc_server_secure_state *state = statep;
   grpc_transport *transport;
   grpc_transport *transport;
   grpc_mdctx *mdctx;
   grpc_mdctx *mdctx;
@@ -165,8 +163,8 @@ static void on_accept(void *statep, grpc_endpoint *tcp) {
   node->next = state->handshaking_tcp_endpoints;
   node->next = state->handshaking_tcp_endpoints;
   state->handshaking_tcp_endpoints = node;
   state->handshaking_tcp_endpoints = node;
   gpr_mu_unlock(&state->mu);
   gpr_mu_unlock(&state->mu);
-  grpc_setup_secure_transport(state->sc, tcp, on_secure_transport_setup_done,
-                              state);
+  grpc_security_connector_do_handshake(state->sc, tcp, on_secure_handshake_done,
+                                       state);
 }
 }
 
 
 /* Server callback: start listening on our ports */
 /* Server callback: start listening on our ports */

+ 1 - 1
src/core/support/log_posix.c

@@ -64,7 +64,7 @@ void gpr_log(const char *file, int line, gpr_log_severity severity,
   } else {
   } else {
     message = allocated = gpr_malloc((size_t)ret + 1);
     message = allocated = gpr_malloc((size_t)ret + 1);
     va_start(args, format);
     va_start(args, format);
-    vsnprintf(message, ret + 1, format, args);
+    vsnprintf(message, (size_t)(ret + 1), format, args);
     va_end(args);
     va_end(args);
   }
   }
   gpr_log_message(file, line, severity, message);
   gpr_log_message(file, line, severity, message);

+ 1 - 1
src/core/support/string.c

@@ -101,7 +101,7 @@ static void asciidump(dump_out *out, const char *buf, size_t len) {
     dump_out_append(out, '\'');
     dump_out_append(out, '\'');
   }
   }
   for (cur = beg; cur != end; ++cur) {
   for (cur = beg; cur != end; ++cur) {
-    dump_out_append(out, isprint(*cur) ? *(char *)cur : '.');
+    dump_out_append(out, (char)(isprint(*cur) ? *(char *)cur : '.'));
   }
   }
   if (!out_was_empty) {
   if (!out_was_empty) {
     dump_out_append(out, '\'');
     dump_out_append(out, '\'');

+ 12 - 4
src/core/surface/channel_connectivity.c

@@ -67,6 +67,7 @@ typedef struct {
   gpr_mu mu;
   gpr_mu mu;
   callback_phase phase;
   callback_phase phase;
   int success;
   int success;
+  int removed;
   grpc_iomgr_closure on_complete;
   grpc_iomgr_closure on_complete;
   grpc_alarm alarm;
   grpc_alarm alarm;
   grpc_connectivity_state state;
   grpc_connectivity_state state;
@@ -77,10 +78,6 @@ typedef struct {
 } state_watcher;
 } state_watcher;
 
 
 static void delete_state_watcher(state_watcher *w) {
 static void delete_state_watcher(state_watcher *w) {
-  grpc_channel_element *client_channel_elem = grpc_channel_stack_last_element(
-      grpc_channel_get_channel_stack(w->channel));
-  grpc_client_channel_del_interested_party(client_channel_elem,
-                                           grpc_cq_pollset(w->cq));
   GRPC_CHANNEL_INTERNAL_UNREF(w->channel, "watch_connectivity");
   GRPC_CHANNEL_INTERNAL_UNREF(w->channel, "watch_connectivity");
   gpr_mu_destroy(&w->mu);
   gpr_mu_destroy(&w->mu);
   gpr_free(w);
   gpr_free(w);
@@ -112,7 +109,17 @@ static void finished_completion(void *pw, grpc_cq_completion *ignored) {
 
 
 static void partly_done(state_watcher *w, int due_to_completion) {
 static void partly_done(state_watcher *w, int due_to_completion) {
   int delete = 0;
   int delete = 0;
+  grpc_channel_element *client_channel_elem = NULL;
 
 
+  gpr_mu_lock(&w->mu);
+  if (w->removed == 0) {
+    w->removed = 1;
+    client_channel_elem = grpc_channel_stack_last_element(
+        grpc_channel_get_channel_stack(w->channel));
+    grpc_client_channel_del_interested_party(client_channel_elem,
+                                             grpc_cq_pollset(w->cq));
+  }
+  gpr_mu_unlock(&w->mu);
   if (due_to_completion) {
   if (due_to_completion) {
     gpr_mu_lock(&w->mu);
     gpr_mu_lock(&w->mu);
     w->success = 1;
     w->success = 1;
@@ -163,6 +170,7 @@ void grpc_channel_watch_connectivity_state(
   w->phase = WAITING;
   w->phase = WAITING;
   w->state = last_observed_state;
   w->state = last_observed_state;
   w->success = 0;
   w->success = 0;
+  w->removed = 0;
   w->cq = cq;
   w->cq = cq;
   w->tag = tag;
   w->tag = tag;
   w->channel = channel;
   w->channel = channel;

+ 3 - 1
src/core/surface/channel_create.c

@@ -88,6 +88,8 @@ static void connected(void *arg, grpc_endpoint *tcp) {
   grpc_iomgr_add_callback(notify);
   grpc_iomgr_add_callback(notify);
 }
 }
 
 
+static void connector_shutdown(grpc_connector *con) {}
+
 static void connector_connect(grpc_connector *con,
 static void connector_connect(grpc_connector *con,
                               const grpc_connect_in_args *args,
                               const grpc_connect_in_args *args,
                               grpc_connect_out_args *result,
                               grpc_connect_out_args *result,
@@ -103,7 +105,7 @@ static void connector_connect(grpc_connector *con,
 }
 }
 
 
 static const grpc_connector_vtable connector_vtable = {
 static const grpc_connector_vtable connector_vtable = {
-    connector_ref, connector_unref, connector_connect};
+    connector_ref, connector_unref, connector_shutdown, connector_connect};
 
 
 typedef struct {
 typedef struct {
   grpc_subchannel_factory base;
   grpc_subchannel_factory base;

+ 6 - 0
src/core/surface/init.c

@@ -40,6 +40,9 @@
 #include <grpc/support/alloc.h>
 #include <grpc/support/alloc.h>
 #include <grpc/support/time.h>
 #include <grpc/support/time.h>
 #include "src/core/channel/channel_stack.h"
 #include "src/core/channel/channel_stack.h"
+#include "src/core/client_config/lb_policy_registry.h"
+#include "src/core/client_config/lb_policies/pick_first.h"
+#include "src/core/client_config/lb_policies/round_robin.h"
 #include "src/core/client_config/resolver_registry.h"
 #include "src/core/client_config/resolver_registry.h"
 #include "src/core/client_config/resolvers/dns_resolver.h"
 #include "src/core/client_config/resolvers/dns_resolver.h"
 #include "src/core/client_config/resolvers/sockaddr_resolver.h"
 #include "src/core/client_config/resolvers/sockaddr_resolver.h"
@@ -85,6 +88,9 @@ void grpc_init(void) {
   gpr_mu_lock(&g_init_mu);
   gpr_mu_lock(&g_init_mu);
   if (++g_initializations == 1) {
   if (++g_initializations == 1) {
     gpr_time_init();
     gpr_time_init();
+    grpc_lb_policy_registry_init(grpc_pick_first_lb_factory_create());
+    grpc_register_lb_policy(grpc_pick_first_lb_factory_create());
+    grpc_register_lb_policy(grpc_round_robin_lb_factory_create());
     grpc_resolver_registry_init("dns:///");
     grpc_resolver_registry_init("dns:///");
     grpc_register_resolver_type(grpc_dns_resolver_factory_create());
     grpc_register_resolver_type(grpc_dns_resolver_factory_create());
     grpc_register_resolver_type(grpc_ipv4_resolver_factory_create());
     grpc_register_resolver_type(grpc_ipv4_resolver_factory_create());

+ 41 - 10
src/core/surface/secure_channel_create.c

@@ -47,7 +47,6 @@
 #include "src/core/iomgr/tcp_client.h"
 #include "src/core/iomgr/tcp_client.h"
 #include "src/core/security/auth_filters.h"
 #include "src/core/security/auth_filters.h"
 #include "src/core/security/credentials.h"
 #include "src/core/security/credentials.h"
-#include "src/core/security/secure_transport_setup.h"
 #include "src/core/surface/channel.h"
 #include "src/core/surface/channel.h"
 #include "src/core/transport/chttp2_transport.h"
 #include "src/core/transport/chttp2_transport.h"
 #include "src/core/tsi/transport_security_interface.h"
 #include "src/core/tsi/transport_security_interface.h"
@@ -61,6 +60,9 @@ typedef struct {
   grpc_iomgr_closure *notify;
   grpc_iomgr_closure *notify;
   grpc_connect_in_args args;
   grpc_connect_in_args args;
   grpc_connect_out_args *result;
   grpc_connect_out_args *result;
+
+  gpr_mu mu;
+  grpc_endpoint *connecting_endpoint;
 } connector;
 } connector;
 
 
 static void connector_ref(grpc_connector *con) {
 static void connector_ref(grpc_connector *con) {
@@ -75,16 +77,25 @@ static void connector_unref(grpc_connector *con) {
   }
   }
 }
 }
 
 
-static void on_secure_transport_setup_done(void *arg,
-                                           grpc_security_status status,
-                                           grpc_endpoint *wrapped_endpoint,
-                                           grpc_endpoint *secure_endpoint) {
+static void on_secure_handshake_done(void *arg, grpc_security_status status,
+                                     grpc_endpoint *wrapped_endpoint,
+                                     grpc_endpoint *secure_endpoint) {
   connector *c = arg;
   connector *c = arg;
   grpc_iomgr_closure *notify;
   grpc_iomgr_closure *notify;
-  if (status != GRPC_SECURITY_OK) {
-    gpr_log(GPR_ERROR, "Secure transport setup failed with error %d.", status);
+  gpr_mu_lock(&c->mu);
+  if (c->connecting_endpoint == NULL) {
+    memset(c->result, 0, sizeof(*c->result));
+    gpr_mu_unlock(&c->mu);
+  } else if (status != GRPC_SECURITY_OK) {
+    GPR_ASSERT(c->connecting_endpoint == wrapped_endpoint);
+    gpr_log(GPR_ERROR, "Secure handshake failed with error %d.", status);
     memset(c->result, 0, sizeof(*c->result));
     memset(c->result, 0, sizeof(*c->result));
+    c->connecting_endpoint = NULL;
+    gpr_mu_unlock(&c->mu);
   } else {
   } else {
+    GPR_ASSERT(c->connecting_endpoint == wrapped_endpoint);
+    c->connecting_endpoint = NULL;
+    gpr_mu_unlock(&c->mu);
     c->result->transport = grpc_create_chttp2_transport(
     c->result->transport = grpc_create_chttp2_transport(
         c->args.channel_args, secure_endpoint, c->args.metadata_context, 1);
         c->args.channel_args, secure_endpoint, c->args.metadata_context, 1);
     grpc_chttp2_transport_start_reading(c->result->transport, NULL, 0);
     grpc_chttp2_transport_start_reading(c->result->transport, NULL, 0);
@@ -102,8 +113,12 @@ static void connected(void *arg, grpc_endpoint *tcp) {
   connector *c = arg;
   connector *c = arg;
   grpc_iomgr_closure *notify;
   grpc_iomgr_closure *notify;
   if (tcp != NULL) {
   if (tcp != NULL) {
-    grpc_setup_secure_transport(&c->security_connector->base, tcp,
-                                on_secure_transport_setup_done, c);
+    gpr_mu_lock(&c->mu);
+    GPR_ASSERT(c->connecting_endpoint == NULL);
+    c->connecting_endpoint = tcp;
+    gpr_mu_unlock(&c->mu);
+    grpc_security_connector_do_handshake(&c->security_connector->base, tcp,
+                                         on_secure_handshake_done, c);
   } else {
   } else {
     memset(c->result, 0, sizeof(*c->result));
     memset(c->result, 0, sizeof(*c->result));
     notify = c->notify;
     notify = c->notify;
@@ -112,6 +127,18 @@ static void connected(void *arg, grpc_endpoint *tcp) {
   }
   }
 }
 }
 
 
+static void connector_shutdown(grpc_connector *con) {
+  connector *c = (connector *)con;
+  grpc_endpoint *ep;
+  gpr_mu_lock(&c->mu);
+  ep = c->connecting_endpoint;
+  c->connecting_endpoint = NULL;
+  gpr_mu_unlock(&c->mu);
+  if (ep) {
+    grpc_endpoint_shutdown(ep);
+  }
+}
+
 static void connector_connect(grpc_connector *con,
 static void connector_connect(grpc_connector *con,
                               const grpc_connect_in_args *args,
                               const grpc_connect_in_args *args,
                               grpc_connect_out_args *result,
                               grpc_connect_out_args *result,
@@ -122,12 +149,15 @@ static void connector_connect(grpc_connector *con,
   c->notify = notify;
   c->notify = notify;
   c->args = *args;
   c->args = *args;
   c->result = result;
   c->result = result;
+  gpr_mu_lock(&c->mu);
+  GPR_ASSERT(c->connecting_endpoint == NULL);
+  gpr_mu_unlock(&c->mu);
   grpc_tcp_client_connect(connected, c, args->interested_parties, args->addr,
   grpc_tcp_client_connect(connected, c, args->interested_parties, args->addr,
                           args->addr_len, args->deadline);
                           args->addr_len, args->deadline);
 }
 }
 
 
 static const grpc_connector_vtable connector_vtable = {
 static const grpc_connector_vtable connector_vtable = {
-    connector_ref, connector_unref, connector_connect};
+    connector_ref, connector_unref, connector_shutdown, connector_connect};
 
 
 typedef struct {
 typedef struct {
   grpc_subchannel_factory base;
   grpc_subchannel_factory base;
@@ -165,6 +195,7 @@ static grpc_subchannel *subchannel_factory_create_subchannel(
   memset(c, 0, sizeof(*c));
   memset(c, 0, sizeof(*c));
   c->base.vtable = &connector_vtable;
   c->base.vtable = &connector_vtable;
   c->security_connector = f->security_connector;
   c->security_connector = f->security_connector;
+  gpr_mu_init(&c->mu);
   gpr_ref_init(&c->refs, 1);
   gpr_ref_init(&c->refs, 1);
   args->mdctx = f->mdctx;
   args->mdctx = f->mdctx;
   args->args = final_args;
   args->args = final_args;

+ 2 - 2
src/core/transport/chttp2/parsing.c

@@ -486,7 +486,7 @@ static int init_skip_frame_parser(
     transport_parsing->hpack_parser.on_header_user_data = NULL;
     transport_parsing->hpack_parser.on_header_user_data = NULL;
     transport_parsing->hpack_parser.is_boundary = is_eoh;
     transport_parsing->hpack_parser.is_boundary = is_eoh;
     transport_parsing->hpack_parser.is_eof =
     transport_parsing->hpack_parser.is_eof =
-        is_eoh ? transport_parsing->header_eof : 0;
+        (gpr_uint8)(is_eoh ? transport_parsing->header_eof : 0);
   } else {
   } else {
     transport_parsing->parser = skip_parser;
     transport_parsing->parser = skip_parser;
   }
   }
@@ -696,7 +696,7 @@ static int init_header_frame_parser(
   transport_parsing->hpack_parser.on_header_user_data = transport_parsing;
   transport_parsing->hpack_parser.on_header_user_data = transport_parsing;
   transport_parsing->hpack_parser.is_boundary = is_eoh;
   transport_parsing->hpack_parser.is_boundary = is_eoh;
   transport_parsing->hpack_parser.is_eof =
   transport_parsing->hpack_parser.is_eof =
-      is_eoh ? transport_parsing->header_eof : 0;
+      (gpr_uint8)(is_eoh ? transport_parsing->header_eof : 0);
   if (!is_continuation && (transport_parsing->incoming_frame_flags &
   if (!is_continuation && (transport_parsing->incoming_frame_flags &
                            GRPC_CHTTP2_FLAG_HAS_PRIORITY)) {
                            GRPC_CHTTP2_FLAG_HAS_PRIORITY)) {
     grpc_chttp2_hpack_parser_set_has_priority(&transport_parsing->hpack_parser);
     grpc_chttp2_hpack_parser_set_has_priority(&transport_parsing->hpack_parser);

+ 60 - 0
src/cpp/client/secure_credentials.cc

@@ -144,4 +144,64 @@ std::shared_ptr<Credentials> CompositeCredentials(
   return nullptr;
   return nullptr;
 }
 }
 
 
+void MetadataCredentialsPluginWrapper::Destroy(void* wrapper) {
+  if (wrapper == nullptr) return;
+  MetadataCredentialsPluginWrapper* w =
+      reinterpret_cast<MetadataCredentialsPluginWrapper*>(wrapper);
+  delete w;
+}
+
+void MetadataCredentialsPluginWrapper::GetMetadata(
+    void* wrapper, const char* service_url,
+    grpc_credentials_plugin_metadata_cb cb, void* user_data) {
+  GPR_ASSERT(wrapper != nullptr);
+  MetadataCredentialsPluginWrapper* w =
+      reinterpret_cast<MetadataCredentialsPluginWrapper*>(wrapper);
+  if (w->plugin_ == nullptr) {
+    cb(user_data, NULL, 0, GRPC_STATUS_OK, NULL);
+    return;
+  }
+  if (w->plugin_->IsBlocking()) {
+    w->thread_pool_->Add(
+        std::bind(&MetadataCredentialsPluginWrapper::InvokePlugin, w,
+                  service_url, cb, user_data));
+  } else {
+    w->InvokePlugin(service_url, cb, user_data);
+  }
+}
+
+void MetadataCredentialsPluginWrapper::InvokePlugin(
+    const char* service_url, grpc_credentials_plugin_metadata_cb cb,
+    void* user_data) {
+  std::multimap<grpc::string, grpc::string> metadata;
+  Status status = plugin_->GetMetadata(service_url, &metadata);
+  std::vector<grpc_metadata> md;
+  for (auto it = metadata.begin(); it != metadata.end(); ++it) {
+    md.push_back({it->first.c_str(),
+                  it->second.data(),
+                  it->second.size(),
+                  0,
+                  {{nullptr, nullptr, nullptr, nullptr}}});
+  }
+  cb(user_data, md.empty() ? nullptr : &md[0], md.size(),
+     static_cast<grpc_status_code>(status.error_code()),
+     status.error_message().c_str());
+}
+
+MetadataCredentialsPluginWrapper::MetadataCredentialsPluginWrapper(
+    std::unique_ptr<MetadataCredentialsPlugin> plugin)
+    : thread_pool_(CreateDefaultThreadPool()), plugin_(std::move(plugin)) {}
+
+std::shared_ptr<Credentials> MetadataCredentialsFromPlugin(
+    std::unique_ptr<MetadataCredentialsPlugin> plugin) {
+  GrpcLibrary init;  // To call grpc_init().
+  MetadataCredentialsPluginWrapper* wrapper =
+      new MetadataCredentialsPluginWrapper(std::move(plugin));
+  grpc_metadata_credentials_plugin c_plugin = {
+      MetadataCredentialsPluginWrapper::GetMetadata,
+      MetadataCredentialsPluginWrapper::Destroy, wrapper};
+  return WrapCredentials(
+      grpc_metadata_credentials_create_from_plugin(c_plugin, nullptr));
+}
+
 }  // namespace grpc
 }  // namespace grpc

+ 19 - 0
src/cpp/client/secure_credentials.h

@@ -39,6 +39,8 @@
 #include <grpc++/support/config.h>
 #include <grpc++/support/config.h>
 #include <grpc++/security/credentials.h>
 #include <grpc++/security/credentials.h>
 
 
+#include "src/cpp/server/thread_pool_interface.h"
+
 namespace grpc {
 namespace grpc {
 
 
 class SecureCredentials GRPC_FINAL : public Credentials {
 class SecureCredentials GRPC_FINAL : public Credentials {
@@ -56,6 +58,23 @@ class SecureCredentials GRPC_FINAL : public Credentials {
   grpc_credentials* const c_creds_;
   grpc_credentials* const c_creds_;
 };
 };
 
 
+class MetadataCredentialsPluginWrapper GRPC_FINAL {
+ public:
+  static void Destroy(void* wrapper);
+  static void GetMetadata(void* wrapper, const char* service_url,
+                          grpc_credentials_plugin_metadata_cb cb,
+                          void* user_data);
+
+  explicit MetadataCredentialsPluginWrapper(
+      std::unique_ptr<MetadataCredentialsPlugin> plugin);
+
+ private:
+  void InvokePlugin(const char* service_url,
+                    grpc_credentials_plugin_metadata_cb cb, void* user_data);
+  std::unique_ptr<ThreadPoolInterface> thread_pool_;
+  std::unique_ptr<MetadataCredentialsPlugin> plugin_;
+};
+
 }  // namespace grpc
 }  // namespace grpc
 
 
 #endif  // GRPC_INTERNAL_CPP_CLIENT_SECURE_CREDENTIALS_H
 #endif  // GRPC_INTERNAL_CPP_CLIENT_SECURE_CREDENTIALS_H

+ 38 - 14
src/csharp/Grpc.Core/Logging/ConsoleLogger.cs

@@ -79,48 +79,72 @@ namespace Grpc.Core.Logging
         }
         }
 
 
         /// <summary>Logs a message with severity Debug.</summary>
         /// <summary>Logs a message with severity Debug.</summary>
-        public void Debug(string message, params object[] formatArgs)
+        public void Debug(string message)
         {
         {
-            Log("D", message, formatArgs);
+            Log("D", message);
+        }
+
+        /// <summary>Logs a formatted message with severity Debug.</summary>
+        public void Debug(string format, params object[] formatArgs)
+        {
+            Debug(string.Format(format, formatArgs));
         }
         }
 
 
         /// <summary>Logs a message with severity Info.</summary>
         /// <summary>Logs a message with severity Info.</summary>
-        public void Info(string message, params object[] formatArgs)
+        public void Info(string message)
+        {
+            Log("I", message);
+        }
+
+        /// <summary>Logs a formatted message with severity Info.</summary>
+        public void Info(string format, params object[] formatArgs)
         {
         {
-            Log("I", message, formatArgs);
+            Info(string.Format(format, formatArgs));
         }
         }
 
 
         /// <summary>Logs a message with severity Warning.</summary>
         /// <summary>Logs a message with severity Warning.</summary>
-        public void Warning(string message, params object[] formatArgs)
+        public void Warning(string message)
         {
         {
-            Log("W", message, formatArgs);
+            Log("W", message);
+        }
+
+        /// <summary>Logs a formatted message with severity Warning.</summary>
+        public void Warning(string format, params object[] formatArgs)
+        {
+            Warning(string.Format(format, formatArgs));
         }
         }
 
 
         /// <summary>Logs a message and an associated exception with severity Warning.</summary>
         /// <summary>Logs a message and an associated exception with severity Warning.</summary>
-        public void Warning(Exception exception, string message, params object[] formatArgs)
+        public void Warning(Exception exception, string message)
         {
         {
-            Log("W", message + " " + exception, formatArgs);
+            Warning(message + " " + exception);
         }
         }
 
 
         /// <summary>Logs a message with severity Error.</summary>
         /// <summary>Logs a message with severity Error.</summary>
-        public void Error(string message, params object[] formatArgs)
+        public void Error(string message)
+        {
+            Log("E", message);
+        }
+
+        /// <summary>Logs a formatted message with severity Error.</summary>
+        public void Error(string format, params object[] formatArgs)
         {
         {
-            Log("E", message, formatArgs);
+            Error(string.Format(format, formatArgs));
         }
         }
 
 
         /// <summary>Logs a message and an associated exception with severity Error.</summary>
         /// <summary>Logs a message and an associated exception with severity Error.</summary>
-        public void Error(Exception exception, string message, params object[] formatArgs)
+        public void Error(Exception exception, string message)
         {
         {
-            Log("E", message + " " + exception, formatArgs);
+            Error(message + " " + exception);
         }
         }
 
 
-        private void Log(string severityString, string message, object[] formatArgs)
+        private void Log(string severityString, string message)
         {
         {
             Console.Error.WriteLine("{0}{1} {2}{3}",
             Console.Error.WriteLine("{0}{1} {2}{3}",
                 severityString,
                 severityString,
                 DateTime.Now,
                 DateTime.Now,
                 forTypeString,
                 forTypeString,
-                string.Format(message, formatArgs));
+                message);
         }
         }
     }
     }
 }
 }

+ 18 - 6
src/csharp/Grpc.Core/Logging/ILogger.cs

@@ -43,21 +43,33 @@ namespace Grpc.Core.Logging
         ILogger ForType<T>();
         ILogger ForType<T>();
 
 
         /// <summary>Logs a message with severity Debug.</summary>
         /// <summary>Logs a message with severity Debug.</summary>
-        void Debug(string message, params object[] formatArgs);
+        void Debug(string message);
+
+        /// <summary>Logs a formatted message with severity Debug.</summary>
+        void Debug(string format, params object[] formatArgs);
 
 
         /// <summary>Logs a message with severity Info.</summary>
         /// <summary>Logs a message with severity Info.</summary>
-        void Info(string message, params object[] formatArgs);
+        void Info(string message);
+
+        /// <summary>Logs a formatted message with severity Info.</summary>
+        void Info(string format, params object[] formatArgs);
 
 
         /// <summary>Logs a message with severity Warning.</summary>
         /// <summary>Logs a message with severity Warning.</summary>
-        void Warning(string message, params object[] formatArgs);
+        void Warning(string message);
+
+        /// <summary>Logs a formatted message with severity Warning.</summary>
+        void Warning(string format, params object[] formatArgs);
 
 
         /// <summary>Logs a message and an associated exception with severity Warning.</summary>
         /// <summary>Logs a message and an associated exception with severity Warning.</summary>
-        void Warning(Exception exception, string message, params object[] formatArgs);
+        void Warning(Exception exception, string message);
 
 
         /// <summary>Logs a message with severity Error.</summary>
         /// <summary>Logs a message with severity Error.</summary>
-        void Error(string message, params object[] formatArgs);
+        void Error(string message);
+
+        /// <summary>Logs a formatted message with severity Error.</summary>
+        void Error(string format, params object[] formatArgs);
 
 
         /// <summary>Logs a message and an associated exception with severity Error.</summary>
         /// <summary>Logs a message and an associated exception with severity Error.</summary>
-        void Error(Exception exception, string message, params object[] formatArgs);
+        void Error(Exception exception, string message);
     }
     }
 }
 }

+ 1 - 1
src/csharp/Grpc.Core/VersionInfo.cs

@@ -41,6 +41,6 @@ namespace Grpc.Core
         /// <summary>
         /// <summary>
         /// Current version of gRPC C#
         /// Current version of gRPC C#
         /// </summary>
         /// </summary>
-        public const string CurrentVersion = "0.7.0";
+        public const string CurrentVersion = "0.7.1";
     }
     }
 }
 }

+ 1 - 1
src/csharp/Grpc.IntegrationTesting/InteropClient.cs

@@ -131,7 +131,7 @@ namespace Grpc.IntegrationTesting
             var channel = new Channel(options.ServerHost, options.ServerPort, credentials, channelOptions);
             var channel = new Channel(options.ServerHost, options.ServerPort, credentials, channelOptions);
             TestService.TestServiceClient client = new TestService.TestServiceClient(channel);
             TestService.TestServiceClient client = new TestService.TestServiceClient(channel);
             await RunTestCaseAsync(client, options);
             await RunTestCaseAsync(client, options);
-            channel.ShutdownAsync().Wait();
+            await channel.ShutdownAsync();
         }
         }
 
 
         private async Task RunTestCaseAsync(TestService.TestServiceClient client, ClientOptions options)
         private async Task RunTestCaseAsync(TestService.TestServiceClient client, ClientOptions options)

+ 0 - 1
src/csharp/Grpc.IntegrationTesting/proto/test.proto

@@ -44,7 +44,6 @@ service TestService {
   rpc EmptyCall(grpc.testing.Empty) returns (grpc.testing.Empty);
   rpc EmptyCall(grpc.testing.Empty) returns (grpc.testing.Empty);
 
 
   // One request followed by one response.
   // One request followed by one response.
-  // TODO(Issue 527): Describe required server behavior.
   rpc UnaryCall(SimpleRequest) returns (SimpleResponse);
   rpc UnaryCall(SimpleRequest) returns (SimpleResponse);
 
 
   // One request followed by a sequence of responses (streamed download).
   // One request followed by a sequence of responses (streamed download).

+ 3 - 3
src/csharp/build_packages.bat

@@ -1,12 +1,12 @@
 @rem Builds gRPC NuGet packages
 @rem Builds gRPC NuGet packages
 
 
 @rem Current package versions
 @rem Current package versions
-set VERSION=0.7.0
-set CORE_VERSION=0.11.0
+set VERSION=0.7.1
+set CORE_VERSION=0.11.1
 set PROTOBUF_VERSION=3.0.0-alpha4
 set PROTOBUF_VERSION=3.0.0-alpha4
 
 
 @rem Packages that depend on prerelease packages (like Google.Protobuf) need to have prerelease suffix as well.
 @rem Packages that depend on prerelease packages (like Google.Protobuf) need to have prerelease suffix as well.
-set VERSION_WITH_BETA=0.7.0-beta
+set VERSION_WITH_BETA=%VERSION%-beta
 
 
 @rem Adjust the location of nuget.exe
 @rem Adjust the location of nuget.exe
 set NUGET=C:\nuget\nuget.exe
 set NUGET=C:\nuget\nuget.exe

+ 1 - 1
src/csharp/ext/grpc_csharp_ext.c

@@ -252,7 +252,7 @@ GPR_EXPORT gpr_intptr GPR_CALLTYPE grpcsharp_batch_context_recv_message_length(
   if (!ctx->recv_message) {
   if (!ctx->recv_message) {
     return -1;
     return -1;
   }
   }
-  return grpc_byte_buffer_length(ctx->recv_message);
+  return (gpr_intptr)grpc_byte_buffer_length(ctx->recv_message);
 }
 }
 
 
 /*
 /*

+ 0 - 1
src/node/binding.gyp

@@ -8,7 +8,6 @@
         '-std=c++0x',
         '-std=c++0x',
         '-Wall',
         '-Wall',
         '-pthread',
         '-pthread',
-        '-pedantic',
         '-g',
         '-g',
         '-zdefs',
         '-zdefs',
         '-Werror',
         '-Werror',

+ 19 - 17
src/node/ext/byte_buffer.cc

@@ -44,15 +44,16 @@
 namespace grpc {
 namespace grpc {
 namespace node {
 namespace node {
 
 
+
 using v8::Context;
 using v8::Context;
 using v8::Function;
 using v8::Function;
-using v8::Handle;
+using v8::Local;
 using v8::Object;
 using v8::Object;
 using v8::Number;
 using v8::Number;
 using v8::Value;
 using v8::Value;
 
 
-grpc_byte_buffer *BufferToByteBuffer(Handle<Value> buffer) {
-  NanScope();
+grpc_byte_buffer *BufferToByteBuffer(Local<Value> buffer) {
+  Nan::HandleScope scope;
   int length = ::node::Buffer::Length(buffer);
   int length = ::node::Buffer::Length(buffer);
   char *data = ::node::Buffer::Data(buffer);
   char *data = ::node::Buffer::Data(buffer);
   gpr_slice slice = gpr_slice_malloc(length);
   gpr_slice slice = gpr_slice_malloc(length);
@@ -62,10 +63,10 @@ grpc_byte_buffer *BufferToByteBuffer(Handle<Value> buffer) {
   return byte_buffer;
   return byte_buffer;
 }
 }
 
 
-Handle<Value> ByteBufferToBuffer(grpc_byte_buffer *buffer) {
-  NanEscapableScope();
+Local<Value> ByteBufferToBuffer(grpc_byte_buffer *buffer) {
+  Nan::EscapableHandleScope scope;
   if (buffer == NULL) {
   if (buffer == NULL) {
-    return NanEscapeScope(NanNull());
+    return scope.Escape(Nan::Null());
   }
   }
   size_t length = grpc_byte_buffer_length(buffer);
   size_t length = grpc_byte_buffer_length(buffer);
   char *result = reinterpret_cast<char *>(calloc(length, sizeof(char)));
   char *result = reinterpret_cast<char *>(calloc(length, sizeof(char)));
@@ -77,21 +78,22 @@ Handle<Value> ByteBufferToBuffer(grpc_byte_buffer *buffer) {
     memcpy(result + offset, GPR_SLICE_START_PTR(next), GPR_SLICE_LENGTH(next));
     memcpy(result + offset, GPR_SLICE_START_PTR(next), GPR_SLICE_LENGTH(next));
     offset += GPR_SLICE_LENGTH(next);
     offset += GPR_SLICE_LENGTH(next);
   }
   }
-  return NanEscapeScope(MakeFastBuffer(NanNewBufferHandle(result, length)));
+  return scope.Escape(MakeFastBuffer(
+      Nan::NewBuffer(result, length).ToLocalChecked()));
 }
 }
 
 
-Handle<Value> MakeFastBuffer(Handle<Value> slowBuffer) {
-  NanEscapableScope();
-  Handle<Object> globalObj = NanGetCurrentContext()->Global();
-  Handle<Function> bufferConstructor = Handle<Function>::Cast(
-      globalObj->Get(NanNew("Buffer")));
-  Handle<Value> consArgs[3] = {
+Local<Value> MakeFastBuffer(Local<Value> slowBuffer) {
+  Nan::EscapableHandleScope scope;
+  Local<Object> globalObj = Nan::GetCurrentContext()->Global();
+  Local<Function> bufferConstructor = Local<Function>::Cast(
+      globalObj->Get(Nan::New("Buffer").ToLocalChecked()));
+  Local<Value> consArgs[3] = {
     slowBuffer,
     slowBuffer,
-    NanNew<Number>(::node::Buffer::Length(slowBuffer)),
-    NanNew<Number>(0)
+    Nan::New<Number>(::node::Buffer::Length(slowBuffer)),
+    Nan::New<Number>(0)
   };
   };
-  Handle<Object> fastBuffer = bufferConstructor->NewInstance(3, consArgs);
-  return NanEscapeScope(fastBuffer);
+  Local<Object> fastBuffer = bufferConstructor->NewInstance(3, consArgs);
+  return scope.Escape(fastBuffer);
 }
 }
 }  // namespace node
 }  // namespace node
 }  // namespace grpc
 }  // namespace grpc

+ 3 - 3
src/node/ext/byte_buffer.h

@@ -45,14 +45,14 @@ namespace node {
 
 
 /* Convert a Node.js Buffer to grpc_byte_buffer. Requires that
 /* Convert a Node.js Buffer to grpc_byte_buffer. Requires that
    ::node::Buffer::HasInstance(buffer) */
    ::node::Buffer::HasInstance(buffer) */
-grpc_byte_buffer *BufferToByteBuffer(v8::Handle<v8::Value> buffer);
+grpc_byte_buffer *BufferToByteBuffer(v8::Local<v8::Value> buffer);
 
 
 /* Convert a grpc_byte_buffer to a Node.js Buffer */
 /* Convert a grpc_byte_buffer to a Node.js Buffer */
-v8::Handle<v8::Value> ByteBufferToBuffer(grpc_byte_buffer *buffer);
+v8::Local<v8::Value> ByteBufferToBuffer(grpc_byte_buffer *buffer);
 
 
 /* Convert a ::node::Buffer to a fast Buffer, as defined in the Node
 /* Convert a ::node::Buffer to a fast Buffer, as defined in the Node
    Buffer documentation */
    Buffer documentation */
-v8::Handle<v8::Value> MakeFastBuffer(v8::Handle<v8::Value> slowBuffer);
+v8::Local<v8::Value> MakeFastBuffer(v8::Local<v8::Value> slowBuffer);
 
 
 }  // namespace node
 }  // namespace node
 }  // namespace grpc
 }  // namespace grpc

+ 248 - 202
src/node/ext/call.cc

@@ -54,52 +54,61 @@ using std::vector;
 namespace grpc {
 namespace grpc {
 namespace node {
 namespace node {
 
 
+using Nan::Callback;
+using Nan::EscapableHandleScope;
+using Nan::HandleScope;
+using Nan::Maybe;
+using Nan::MaybeLocal;
+using Nan::ObjectWrap;
+using Nan::Persistent;
+using Nan::Utf8String;
+
 using v8::Array;
 using v8::Array;
 using v8::Boolean;
 using v8::Boolean;
 using v8::Exception;
 using v8::Exception;
 using v8::External;
 using v8::External;
 using v8::Function;
 using v8::Function;
 using v8::FunctionTemplate;
 using v8::FunctionTemplate;
-using v8::Handle;
-using v8::HandleScope;
 using v8::Integer;
 using v8::Integer;
 using v8::Local;
 using v8::Local;
 using v8::Number;
 using v8::Number;
 using v8::Object;
 using v8::Object;
 using v8::ObjectTemplate;
 using v8::ObjectTemplate;
-using v8::Persistent;
 using v8::Uint32;
 using v8::Uint32;
 using v8::String;
 using v8::String;
 using v8::Value;
 using v8::Value;
 
 
-NanCallback *Call::constructor;
+Callback *Call::constructor;
 Persistent<FunctionTemplate> Call::fun_tpl;
 Persistent<FunctionTemplate> Call::fun_tpl;
 
 
 bool EndsWith(const char *str, const char *substr) {
 bool EndsWith(const char *str, const char *substr) {
   return strcmp(str+strlen(str)-strlen(substr), substr) == 0;
   return strcmp(str+strlen(str)-strlen(substr), substr) == 0;
 }
 }
 
 
-bool CreateMetadataArray(Handle<Object> metadata, grpc_metadata_array *array,
+bool CreateMetadataArray(Local<Object> metadata, grpc_metadata_array *array,
                          shared_ptr<Resources> resources) {
                          shared_ptr<Resources> resources) {
-  NanScope();
+  HandleScope scope;
   grpc_metadata_array_init(array);
   grpc_metadata_array_init(array);
-  Handle<Array> keys(metadata->GetOwnPropertyNames());
+  Local<Array> keys = Nan::GetOwnPropertyNames(metadata).ToLocalChecked();
   for (unsigned int i = 0; i < keys->Length(); i++) {
   for (unsigned int i = 0; i < keys->Length(); i++) {
-    Handle<String> current_key(keys->Get(i)->ToString());
-    if (!metadata->Get(current_key)->IsArray()) {
+    Local<String> current_key = Nan::To<String>(
+        Nan::Get(keys, i).ToLocalChecked()).ToLocalChecked();
+    Local<Value> value_array = Nan::Get(metadata, current_key).ToLocalChecked();
+    if (!value_array->IsArray()) {
       return false;
       return false;
     }
     }
-    array->capacity += Local<Array>::Cast(metadata->Get(current_key))->Length();
+    array->capacity += Local<Array>::Cast(value_array)->Length();
   }
   }
   array->metadata = reinterpret_cast<grpc_metadata*>(
   array->metadata = reinterpret_cast<grpc_metadata*>(
       gpr_malloc(array->capacity * sizeof(grpc_metadata)));
       gpr_malloc(array->capacity * sizeof(grpc_metadata)));
   for (unsigned int i = 0; i < keys->Length(); i++) {
   for (unsigned int i = 0; i < keys->Length(); i++) {
-    Handle<String> current_key(keys->Get(i)->ToString());
-    NanUtf8String *utf8_key = new NanUtf8String(current_key);
-    resources->strings.push_back(unique_ptr<NanUtf8String>(utf8_key));
-    Handle<Array> values = Local<Array>::Cast(metadata->Get(current_key));
+    Local<String> current_key(keys->Get(i)->ToString());
+    Utf8String *utf8_key = new Utf8String(current_key);
+    resources->strings.push_back(unique_ptr<Utf8String>(utf8_key));
+    Local<Array> values = Local<Array>::Cast(
+        Nan::Get(metadata, current_key).ToLocalChecked());
     for (unsigned int j = 0; j < values->Length(); j++) {
     for (unsigned int j = 0; j < values->Length(); j++) {
-      Handle<Value> value = values->Get(j);
+      Local<Value> value = Nan::Get(values, j).ToLocalChecked();
       grpc_metadata *current = &array->metadata[array->count];
       grpc_metadata *current = &array->metadata[array->count];
       current->key = **utf8_key;
       current->key = **utf8_key;
       // Only allow binary headers for "-bin" keys
       // Only allow binary headers for "-bin" keys
@@ -107,18 +116,16 @@ bool CreateMetadataArray(Handle<Object> metadata, grpc_metadata_array *array,
         if (::node::Buffer::HasInstance(value)) {
         if (::node::Buffer::HasInstance(value)) {
           current->value = ::node::Buffer::Data(value);
           current->value = ::node::Buffer::Data(value);
           current->value_length = ::node::Buffer::Length(value);
           current->value_length = ::node::Buffer::Length(value);
-          Persistent<Value> *handle = new Persistent<Value>();
-          NanAssignPersistent(*handle, value);
-          resources->handles.push_back(unique_ptr<PersistentHolder>(
-              new PersistentHolder(handle)));
+          PersistentValue *handle = new PersistentValue(value);
+          resources->handles.push_back(unique_ptr<PersistentValue>(handle));
         } else {
         } else {
           return false;
           return false;
         }
         }
       } else {
       } else {
         if (value->IsString()) {
         if (value->IsString()) {
-          Handle<String> string_value = value->ToString();
-          NanUtf8String *utf8_value = new NanUtf8String(string_value);
-          resources->strings.push_back(unique_ptr<NanUtf8String>(utf8_value));
+          Local<String> string_value = Nan::To<String>(value).ToLocalChecked();
+          Utf8String *utf8_value = new Utf8String(string_value);
+          resources->strings.push_back(unique_ptr<Utf8String>(utf8_value));
           current->value = **utf8_value;
           current->value = **utf8_value;
           current->value_length = string_value->Length();
           current->value_length = string_value->Length();
         } else {
         } else {
@@ -131,8 +138,8 @@ bool CreateMetadataArray(Handle<Object> metadata, grpc_metadata_array *array,
   return true;
   return true;
 }
 }
 
 
-Handle<Value> ParseMetadata(const grpc_metadata_array *metadata_array) {
-  NanEscapableScope();
+Local<Value> ParseMetadata(const grpc_metadata_array *metadata_array) {
+  EscapableHandleScope scope;
   grpc_metadata *metadata_elements = metadata_array->metadata;
   grpc_metadata *metadata_elements = metadata_array->metadata;
   size_t length = metadata_array->count;
   size_t length = metadata_array->count;
   std::map<const char*, size_t> size_map;
   std::map<const char*, size_t> size_map;
@@ -142,49 +149,62 @@ Handle<Value> ParseMetadata(const grpc_metadata_array *metadata_array) {
     const char *key = metadata_elements[i].key;
     const char *key = metadata_elements[i].key;
     if (size_map.count(key)) {
     if (size_map.count(key)) {
       size_map[key] += 1;
       size_map[key] += 1;
+    } else {
+      size_map[key] = 1;
     }
     }
     index_map[key] = 0;
     index_map[key] = 0;
   }
   }
-  Handle<Object> metadata_object = NanNew<Object>();
+  Local<Object> metadata_object = Nan::New<Object>();
   for (unsigned int i = 0; i < length; i++) {
   for (unsigned int i = 0; i < length; i++) {
     grpc_metadata* elem = &metadata_elements[i];
     grpc_metadata* elem = &metadata_elements[i];
-    Handle<String> key_string = NanNew(elem->key);
-    Handle<Array> array;
-    if (metadata_object->Has(key_string)) {
-      array = Handle<Array>::Cast(metadata_object->Get(key_string));
+    Local<String> key_string = Nan::New(elem->key).ToLocalChecked();
+    Local<Array> array;
+    MaybeLocal<Value> maybe_array = Nan::Get(metadata_object, key_string);
+    if (maybe_array.IsEmpty() || !maybe_array.ToLocalChecked()->IsArray()) {
+      array = Nan::New<Array>(size_map[elem->key]);
+      Nan::Set(metadata_object, key_string, array);
     } else {
     } else {
-      array = NanNew<Array>(size_map[elem->key]);
-      metadata_object->Set(key_string, array);
+      array = Local<Array>::Cast(maybe_array.ToLocalChecked());
     }
     }
     if (EndsWith(elem->key, "-bin")) {
     if (EndsWith(elem->key, "-bin")) {
-      array->Set(index_map[elem->key],
-                 NanNewBufferHandle(elem->value, elem->value_length));
+      Nan::Set(array, index_map[elem->key],
+               Nan::CopyBuffer(elem->value,
+                               elem->value_length).ToLocalChecked());
     } else {
     } else {
-      array->Set(index_map[elem->key], NanNew(elem->value));
+      Nan::Set(array, index_map[elem->key],
+               Nan::New(elem->value).ToLocalChecked());
     }
     }
     index_map[elem->key] += 1;
     index_map[elem->key] += 1;
   }
   }
-  return NanEscapeScope(metadata_object);
+  return scope.Escape(metadata_object);
 }
 }
 
 
-Handle<Value> Op::GetOpType() const {
-  NanEscapableScope();
-  return NanEscapeScope(NanNew<String>(GetTypeString()));
+Local<Value> Op::GetOpType() const {
+  EscapableHandleScope scope;
+  return scope.Escape(Nan::New(GetTypeString()).ToLocalChecked());
+}
+
+Op::~Op() {
 }
 }
 
 
 class SendMetadataOp : public Op {
 class SendMetadataOp : public Op {
  public:
  public:
-  Handle<Value> GetNodeValue() const {
-    NanEscapableScope();
-    return NanEscapeScope(NanTrue());
+  Local<Value> GetNodeValue() const {
+    EscapableHandleScope scope;
+    return scope.Escape(Nan::True());
   }
   }
-  bool ParseOp(Handle<Value> value, grpc_op *out,
+  bool ParseOp(Local<Value> value, grpc_op *out,
                shared_ptr<Resources> resources) {
                shared_ptr<Resources> resources) {
     if (!value->IsObject()) {
     if (!value->IsObject()) {
       return false;
       return false;
     }
     }
     grpc_metadata_array array;
     grpc_metadata_array array;
-    if (!CreateMetadataArray(value->ToObject(), &array, resources)) {
+    MaybeLocal<Object> maybe_metadata = Nan::To<Object>(value);
+    if (maybe_metadata.IsEmpty()) {
+      return false;
+    }
+    if (!CreateMetadataArray(maybe_metadata.ToLocalChecked(),
+                             &array, resources)) {
       return false;
       return false;
     }
     }
     out->data.send_initial_metadata.count = array.count;
     out->data.send_initial_metadata.count = array.count;
@@ -199,27 +219,28 @@ class SendMetadataOp : public Op {
 
 
 class SendMessageOp : public Op {
 class SendMessageOp : public Op {
  public:
  public:
-  Handle<Value> GetNodeValue() const {
-    NanEscapableScope();
-    return NanEscapeScope(NanTrue());
+  Local<Value> GetNodeValue() const {
+    EscapableHandleScope scope;
+    return scope.Escape(Nan::True());
   }
   }
-  bool ParseOp(Handle<Value> value, grpc_op *out,
+  bool ParseOp(Local<Value> value, grpc_op *out,
                shared_ptr<Resources> resources) {
                shared_ptr<Resources> resources) {
     if (!::node::Buffer::HasInstance(value)) {
     if (!::node::Buffer::HasInstance(value)) {
       return false;
       return false;
     }
     }
-    Handle<Object> object_value = value->ToObject();
-    if (object_value->HasOwnProperty(NanNew("grpcWriteFlags"))) {
-      Handle<Value> flag_value = object_value->Get(NanNew("grpcWriteFlags"));
+    Local<Object> object_value = Nan::To<Object>(value).ToLocalChecked();
+    MaybeLocal<Value> maybe_flag_value = Nan::Get(
+        object_value, Nan::New("grpcWriteFlags").ToLocalChecked());
+    if (!maybe_flag_value.IsEmpty()) {
+      Local<Value> flag_value = maybe_flag_value.ToLocalChecked();
       if (flag_value->IsUint32()) {
       if (flag_value->IsUint32()) {
-        out->flags = flag_value->Uint32Value() & GRPC_WRITE_USED_MASK;
+        Maybe<uint32_t> maybe_flag = Nan::To<uint32_t>(flag_value);
+        out->flags = maybe_flag.FromMaybe(0) & GRPC_WRITE_USED_MASK;
       }
       }
     }
     }
     out->data.send_message = BufferToByteBuffer(value);
     out->data.send_message = BufferToByteBuffer(value);
-    Persistent<Value> *handle = new Persistent<Value>();
-    NanAssignPersistent(*handle, value);
-    resources->handles.push_back(unique_ptr<PersistentHolder>(
-        new PersistentHolder(handle)));
+    PersistentValue *handle = new PersistentValue(value);
+    resources->handles.push_back(unique_ptr<PersistentValue>(handle));
     return true;
     return true;
   }
   }
  protected:
  protected:
@@ -230,11 +251,11 @@ class SendMessageOp : public Op {
 
 
 class SendClientCloseOp : public Op {
 class SendClientCloseOp : public Op {
  public:
  public:
-  Handle<Value> GetNodeValue() const {
-    NanEscapableScope();
-    return NanEscapeScope(NanTrue());
+  Local<Value> GetNodeValue() const {
+    EscapableHandleScope scope;
+    return scope.Escape(Nan::True());
   }
   }
-  bool ParseOp(Handle<Value> value, grpc_op *out,
+  bool ParseOp(Local<Value> value, grpc_op *out,
                shared_ptr<Resources> resources) {
                shared_ptr<Resources> resources) {
     return true;
     return true;
   }
   }
@@ -246,39 +267,55 @@ class SendClientCloseOp : public Op {
 
 
 class SendServerStatusOp : public Op {
 class SendServerStatusOp : public Op {
  public:
  public:
-  Handle<Value> GetNodeValue() const {
-    NanEscapableScope();
-    return NanEscapeScope(NanTrue());
+  Local<Value> GetNodeValue() const {
+    EscapableHandleScope scope;
+    return scope.Escape(Nan::True());
   }
   }
-  bool ParseOp(Handle<Value> value, grpc_op *out,
+  bool ParseOp(Local<Value> value, grpc_op *out,
                shared_ptr<Resources> resources) {
                shared_ptr<Resources> resources) {
     if (!value->IsObject()) {
     if (!value->IsObject()) {
       return false;
       return false;
     }
     }
-    Handle<Object> server_status = value->ToObject();
-    if (!server_status->Get(NanNew("metadata"))->IsObject()) {
+    Local<Object> server_status = Nan::To<Object>(value).ToLocalChecked();
+    MaybeLocal<Value> maybe_metadata = Nan::Get(
+        server_status, Nan::New("metadata").ToLocalChecked());
+    if (maybe_metadata.IsEmpty()) {
       return false;
       return false;
     }
     }
-    if (!server_status->Get(NanNew("code"))->IsUint32()) {
+    if (!maybe_metadata.ToLocalChecked()->IsObject()) {
       return false;
       return false;
     }
     }
-    if (!server_status->Get(NanNew("details"))->IsString()) {
+    Local<Object> metadata = Nan::To<Object>(
+        maybe_metadata.ToLocalChecked()).ToLocalChecked();
+    MaybeLocal<Value> maybe_code = Nan::Get(server_status,
+                                            Nan::New("code").ToLocalChecked());
+    if (maybe_code.IsEmpty()) {
       return false;
       return false;
     }
     }
+    if (!maybe_code.ToLocalChecked()->IsUint32()) {
+      return false;
+    }
+    uint32_t code = Nan::To<uint32_t>(maybe_code.ToLocalChecked()).FromJust();
+    MaybeLocal<Value> maybe_details = Nan::Get(
+        server_status, Nan::New("details").ToLocalChecked());
+    if (maybe_details.IsEmpty()) {
+      return false;
+    }
+    if (!maybe_details.ToLocalChecked()->IsString()) {
+      return false;
+    }
+    Local<String> details = Nan::To<String>(
+        maybe_details.ToLocalChecked()).ToLocalChecked();
     grpc_metadata_array array;
     grpc_metadata_array array;
-    if (!CreateMetadataArray(server_status->Get(NanNew("metadata"))->
-                             ToObject(),
-                             &array, resources)) {
+    if (!CreateMetadataArray(metadata, &array, resources)) {
       return false;
       return false;
     }
     }
     out->data.send_status_from_server.trailing_metadata_count = array.count;
     out->data.send_status_from_server.trailing_metadata_count = array.count;
     out->data.send_status_from_server.trailing_metadata = array.metadata;
     out->data.send_status_from_server.trailing_metadata = array.metadata;
     out->data.send_status_from_server.status =
     out->data.send_status_from_server.status =
-        static_cast<grpc_status_code>(
-            server_status->Get(NanNew("code"))->Uint32Value());
-    NanUtf8String *str = new NanUtf8String(
-        server_status->Get(NanNew("details")));
-    resources->strings.push_back(unique_ptr<NanUtf8String>(str));
+        static_cast<grpc_status_code>(code);
+    Utf8String *str = new Utf8String(details);
+    resources->strings.push_back(unique_ptr<Utf8String>(str));
     out->data.send_status_from_server.status_details = **str;
     out->data.send_status_from_server.status_details = **str;
     return true;
     return true;
   }
   }
@@ -298,12 +335,12 @@ class GetMetadataOp : public Op {
     grpc_metadata_array_destroy(&recv_metadata);
     grpc_metadata_array_destroy(&recv_metadata);
   }
   }
 
 
-  Handle<Value> GetNodeValue() const {
-    NanEscapableScope();
-    return NanEscapeScope(ParseMetadata(&recv_metadata));
+  Local<Value> GetNodeValue() const {
+    EscapableHandleScope scope;
+    return scope.Escape(ParseMetadata(&recv_metadata));
   }
   }
 
 
-  bool ParseOp(Handle<Value> value, grpc_op *out,
+  bool ParseOp(Local<Value> value, grpc_op *out,
                shared_ptr<Resources> resources) {
                shared_ptr<Resources> resources) {
     out->data.recv_initial_metadata = &recv_metadata;
     out->data.recv_initial_metadata = &recv_metadata;
     return true;
     return true;
@@ -325,15 +362,15 @@ class ReadMessageOp : public Op {
   }
   }
   ~ReadMessageOp() {
   ~ReadMessageOp() {
     if (recv_message != NULL) {
     if (recv_message != NULL) {
-      gpr_free(recv_message);
+      grpc_byte_buffer_destroy(recv_message);
     }
     }
   }
   }
-  Handle<Value> GetNodeValue() const {
-    NanEscapableScope();
-    return NanEscapeScope(ByteBufferToBuffer(recv_message));
+  Local<Value> GetNodeValue() const {
+    EscapableHandleScope scope;
+    return scope.Escape(ByteBufferToBuffer(recv_message));
   }
   }
 
 
-  bool ParseOp(Handle<Value> value, grpc_op *out,
+  bool ParseOp(Local<Value> value, grpc_op *out,
                shared_ptr<Resources> resources) {
                shared_ptr<Resources> resources) {
     out->data.recv_message = &recv_message;
     out->data.recv_message = &recv_message;
     return true;
     return true;
@@ -361,7 +398,7 @@ class ClientStatusOp : public Op {
     gpr_free(status_details);
     gpr_free(status_details);
   }
   }
 
 
-  bool ParseOp(Handle<Value> value, grpc_op *out,
+  bool ParseOp(Local<Value> value, grpc_op *out,
                shared_ptr<Resources> resources) {
                shared_ptr<Resources> resources) {
     out->data.recv_status_on_client.trailing_metadata = &metadata_array;
     out->data.recv_status_on_client.trailing_metadata = &metadata_array;
     out->data.recv_status_on_client.status = &status;
     out->data.recv_status_on_client.status = &status;
@@ -370,15 +407,18 @@ class ClientStatusOp : public Op {
     return true;
     return true;
   }
   }
 
 
-  Handle<Value> GetNodeValue() const {
-    NanEscapableScope();
-    Handle<Object> status_obj = NanNew<Object>();
-    status_obj->Set(NanNew("code"), NanNew<Number>(status));
+  Local<Value> GetNodeValue() const {
+    EscapableHandleScope scope;
+    Local<Object> status_obj = Nan::New<Object>();
+    Nan::Set(status_obj, Nan::New("code").ToLocalChecked(),
+                    Nan::New<Number>(status));
     if (status_details != NULL) {
     if (status_details != NULL) {
-      status_obj->Set(NanNew("details"), NanNew(status_details));
+      Nan::Set(status_obj, Nan::New("details").ToLocalChecked(),
+               Nan::New(status_details).ToLocalChecked());
     }
     }
-    status_obj->Set(NanNew("metadata"), ParseMetadata(&metadata_array));
-    return NanEscapeScope(status_obj);
+    Nan::Set(status_obj, Nan::New("metadata").ToLocalChecked(),
+             ParseMetadata(&metadata_array));
+    return scope.Escape(status_obj);
   }
   }
  protected:
  protected:
   std::string GetTypeString() const {
   std::string GetTypeString() const {
@@ -393,12 +433,12 @@ class ClientStatusOp : public Op {
 
 
 class ServerCloseResponseOp : public Op {
 class ServerCloseResponseOp : public Op {
  public:
  public:
-  Handle<Value> GetNodeValue() const {
-    NanEscapableScope();
-    return NanEscapeScope(NanNew<Boolean>(cancelled));
+  Local<Value> GetNodeValue() const {
+    EscapableHandleScope scope;
+    return scope.Escape(Nan::New<Boolean>(cancelled));
   }
   }
 
 
-  bool ParseOp(Handle<Value> value, grpc_op *out,
+  bool ParseOp(Local<Value> value, grpc_op *out,
                shared_ptr<Resources> resources) {
                shared_ptr<Resources> resources) {
     out->data.recv_close_on_server.cancelled = &cancelled;
     out->data.recv_close_on_server.cancelled = &cancelled;
     return true;
     return true;
@@ -413,7 +453,7 @@ class ServerCloseResponseOp : public Op {
   int cancelled;
   int cancelled;
 };
 };
 
 
-tag::tag(NanCallback *callback, OpVec *ops,
+tag::tag(Callback *callback, OpVec *ops,
          shared_ptr<Resources> resources) :
          shared_ptr<Resources> resources) :
     callback(callback), ops(ops), resources(resources){
     callback(callback), ops(ops), resources(resources){
 }
 }
@@ -423,19 +463,19 @@ tag::~tag() {
   delete ops;
   delete ops;
 }
 }
 
 
-Handle<Value> GetTagNodeValue(void *tag) {
-  NanEscapableScope();
+Local<Value> GetTagNodeValue(void *tag) {
+  EscapableHandleScope scope;
   struct tag *tag_struct = reinterpret_cast<struct tag *>(tag);
   struct tag *tag_struct = reinterpret_cast<struct tag *>(tag);
-  Handle<Object> tag_obj = NanNew<Object>();
+  Local<Object> tag_obj = Nan::New<Object>();
   for (vector<unique_ptr<Op> >::iterator it = tag_struct->ops->begin();
   for (vector<unique_ptr<Op> >::iterator it = tag_struct->ops->begin();
        it != tag_struct->ops->end(); ++it) {
        it != tag_struct->ops->end(); ++it) {
     Op *op_ptr = it->get();
     Op *op_ptr = it->get();
-    tag_obj->Set(op_ptr->GetOpType(), op_ptr->GetNodeValue());
+    Nan::Set(tag_obj, op_ptr->GetOpType(), op_ptr->GetNodeValue());
   }
   }
-  return NanEscapeScope(tag_obj);
+  return scope.Escape(tag_obj);
 }
 }
 
 
-NanCallback *GetTagCallback(void *tag) {
+Callback *GetTagCallback(void *tag) {
   struct tag *tag_struct = reinterpret_cast<struct tag *>(tag);
   struct tag *tag_struct = reinterpret_cast<struct tag *>(tag);
   return tag_struct->callback;
   return tag_struct->callback;
 }
 }
@@ -452,140 +492,149 @@ Call::~Call() {
   grpc_call_destroy(wrapped_call);
   grpc_call_destroy(wrapped_call);
 }
 }
 
 
-void Call::Init(Handle<Object> exports) {
-  NanScope();
-  Local<FunctionTemplate> tpl = NanNew<FunctionTemplate>(New);
-  tpl->SetClassName(NanNew("Call"));
+void Call::Init(Local<Object> exports) {
+  HandleScope scope;
+  Local<FunctionTemplate> tpl = Nan::New<FunctionTemplate>(New);
+  tpl->SetClassName(Nan::New("Call").ToLocalChecked());
   tpl->InstanceTemplate()->SetInternalFieldCount(1);
   tpl->InstanceTemplate()->SetInternalFieldCount(1);
-  NanSetPrototypeTemplate(tpl, "startBatch",
-                          NanNew<FunctionTemplate>(StartBatch)->GetFunction());
-  NanSetPrototypeTemplate(tpl, "cancel",
-                          NanNew<FunctionTemplate>(Cancel)->GetFunction());
-  NanSetPrototypeTemplate(
-      tpl, "cancelWithStatus",
-      NanNew<FunctionTemplate>(CancelWithStatus)->GetFunction());
-  NanSetPrototypeTemplate(tpl, "getPeer",
-                          NanNew<FunctionTemplate>(GetPeer)->GetFunction());
-  NanAssignPersistent(fun_tpl, tpl);
-  Handle<Function> ctr = tpl->GetFunction();
-  exports->Set(NanNew("Call"), ctr);
-  constructor = new NanCallback(ctr);
+  Nan::SetPrototypeMethod(tpl, "startBatch", StartBatch);
+  Nan::SetPrototypeMethod(tpl, "cancel", Cancel);
+  Nan::SetPrototypeMethod(tpl, "cancelWithStatus", CancelWithStatus);
+  Nan::SetPrototypeMethod(tpl, "getPeer", GetPeer);
+  fun_tpl.Reset(tpl);
+  Local<Function> ctr = Nan::GetFunction(tpl).ToLocalChecked();
+  Nan::Set(exports, Nan::New("Call").ToLocalChecked(), ctr);
+  constructor = new Callback(ctr);
 }
 }
 
 
-bool Call::HasInstance(Handle<Value> val) {
-  NanScope();
-  return NanHasInstance(fun_tpl, val);
+bool Call::HasInstance(Local<Value> val) {
+  HandleScope scope;
+  return Nan::New(fun_tpl)->HasInstance(val);
 }
 }
 
 
-Handle<Value> Call::WrapStruct(grpc_call *call) {
-  NanEscapableScope();
+Local<Value> Call::WrapStruct(grpc_call *call) {
+  EscapableHandleScope scope;
   if (call == NULL) {
   if (call == NULL) {
-    return NanEscapeScope(NanNull());
+    return scope.Escape(Nan::Null());
   }
   }
   const int argc = 1;
   const int argc = 1;
-  Handle<Value> argv[argc] = {NanNew<External>(reinterpret_cast<void *>(call))};
-  return NanEscapeScope(constructor->GetFunction()->NewInstance(argc, argv));
+  Local<Value> argv[argc] = {Nan::New<External>(
+      reinterpret_cast<void *>(call))};
+  MaybeLocal<Object> maybe_instance = Nan::NewInstance(
+      constructor->GetFunction(), argc, argv);
+  if (maybe_instance.IsEmpty()) {
+    return scope.Escape(Nan::Null());
+  } else {
+    return scope.Escape(maybe_instance.ToLocalChecked());
+  }
 }
 }
 
 
 NAN_METHOD(Call::New) {
 NAN_METHOD(Call::New) {
-  NanScope();
-
-  if (args.IsConstructCall()) {
+  if (info.IsConstructCall()) {
     Call *call;
     Call *call;
-    if (args[0]->IsExternal()) {
-      Handle<External> ext = args[0].As<External>();
+    if (info[0]->IsExternal()) {
+      Local<External> ext = info[0].As<External>();
       // This option is used for wrapping an existing call
       // This option is used for wrapping an existing call
       grpc_call *call_value =
       grpc_call *call_value =
           reinterpret_cast<grpc_call *>(ext->Value());
           reinterpret_cast<grpc_call *>(ext->Value());
       call = new Call(call_value);
       call = new Call(call_value);
     } else {
     } else {
-      if (!Channel::HasInstance(args[0])) {
-        return NanThrowTypeError("Call's first argument must be a Channel");
+      if (!Channel::HasInstance(info[0])) {
+        return Nan::ThrowTypeError("Call's first argument must be a Channel");
       }
       }
-      if (!args[1]->IsString()) {
-        return NanThrowTypeError("Call's second argument must be a string");
+      if (!info[1]->IsString()) {
+        return Nan::ThrowTypeError("Call's second argument must be a string");
       }
       }
-      if (!(args[2]->IsNumber() || args[2]->IsDate())) {
-        return NanThrowTypeError(
+      if (!(info[2]->IsNumber() || info[2]->IsDate())) {
+        return Nan::ThrowTypeError(
             "Call's third argument must be a date or a number");
             "Call's third argument must be a date or a number");
       }
       }
       // These arguments are at the end because they are optional
       // These arguments are at the end because they are optional
       grpc_call *parent_call = NULL;
       grpc_call *parent_call = NULL;
-      if (Call::HasInstance(args[4])) {
-        Call *parent_obj = ObjectWrap::Unwrap<Call>(args[4]->ToObject());
+      if (Call::HasInstance(info[4])) {
+        Call *parent_obj = ObjectWrap::Unwrap<Call>(
+            Nan::To<Object>(info[4]).ToLocalChecked());
         parent_call = parent_obj->wrapped_call;
         parent_call = parent_obj->wrapped_call;
-      } else if (!(args[4]->IsUndefined() || args[4]->IsNull())) {
-        return NanThrowTypeError(
+      } else if (!(info[4]->IsUndefined() || info[4]->IsNull())) {
+        return Nan::ThrowTypeError(
             "Call's fifth argument must be another call, if provided");
             "Call's fifth argument must be another call, if provided");
       }
       }
       gpr_uint32 propagate_flags = GRPC_PROPAGATE_DEFAULTS;
       gpr_uint32 propagate_flags = GRPC_PROPAGATE_DEFAULTS;
-      if (args[5]->IsUint32()) {
-        propagate_flags = args[5]->Uint32Value();
-      } else if (!(args[5]->IsUndefined() || args[5]->IsNull())) {
-        return NanThrowTypeError(
+      if (info[5]->IsUint32()) {
+        propagate_flags = Nan::To<uint32_t>(info[5]).FromJust();
+      } else if (!(info[5]->IsUndefined() || info[5]->IsNull())) {
+        return Nan::ThrowTypeError(
             "Call's sixth argument must be propagate flags, if provided");
             "Call's sixth argument must be propagate flags, if provided");
       }
       }
-      Handle<Object> channel_object = args[0]->ToObject();
+      Local<Object> channel_object = Nan::To<Object>(info[0]).ToLocalChecked();
       Channel *channel = ObjectWrap::Unwrap<Channel>(channel_object);
       Channel *channel = ObjectWrap::Unwrap<Channel>(channel_object);
       if (channel->GetWrappedChannel() == NULL) {
       if (channel->GetWrappedChannel() == NULL) {
-        return NanThrowError("Call cannot be created from a closed channel");
+        return Nan::ThrowError("Call cannot be created from a closed channel");
       }
       }
-      NanUtf8String method(args[1]);
-      double deadline = args[2]->NumberValue();
+      Utf8String method(info[1]);
+      double deadline = Nan::To<double>(info[2]).FromJust();
       grpc_channel *wrapped_channel = channel->GetWrappedChannel();
       grpc_channel *wrapped_channel = channel->GetWrappedChannel();
       grpc_call *wrapped_call;
       grpc_call *wrapped_call;
-      if (args[3]->IsString()) {
-        NanUtf8String host_override(args[3]);
+      if (info[3]->IsString()) {
+        Utf8String host_override(info[3]);
         wrapped_call = grpc_channel_create_call(
         wrapped_call = grpc_channel_create_call(
             wrapped_channel, parent_call, propagate_flags,
             wrapped_channel, parent_call, propagate_flags,
             CompletionQueueAsyncWorker::GetQueue(), *method,
             CompletionQueueAsyncWorker::GetQueue(), *method,
             *host_override, MillisecondsToTimespec(deadline), NULL);
             *host_override, MillisecondsToTimespec(deadline), NULL);
-      } else if (args[3]->IsUndefined() || args[3]->IsNull()) {
+      } else if (info[3]->IsUndefined() || info[3]->IsNull()) {
         wrapped_call = grpc_channel_create_call(
         wrapped_call = grpc_channel_create_call(
             wrapped_channel, parent_call, propagate_flags,
             wrapped_channel, parent_call, propagate_flags,
             CompletionQueueAsyncWorker::GetQueue(), *method,
             CompletionQueueAsyncWorker::GetQueue(), *method,
             NULL, MillisecondsToTimespec(deadline), NULL);
             NULL, MillisecondsToTimespec(deadline), NULL);
       } else {
       } else {
-        return NanThrowTypeError("Call's fourth argument must be a string");
+        return Nan::ThrowTypeError("Call's fourth argument must be a string");
       }
       }
       call = new Call(wrapped_call);
       call = new Call(wrapped_call);
-      args.This()->SetHiddenValue(NanNew("channel_"), channel_object);
+      info.This()->SetHiddenValue(Nan::New("channel_").ToLocalChecked(),
+                                  channel_object);
     }
     }
-    call->Wrap(args.This());
-    NanReturnValue(args.This());
+    call->Wrap(info.This());
+    info.GetReturnValue().Set(info.This());
   } else {
   } else {
     const int argc = 4;
     const int argc = 4;
-    Local<Value> argv[argc] = {args[0], args[1], args[2], args[3]};
-    NanReturnValue(constructor->GetFunction()->NewInstance(argc, argv));
+    Local<Value> argv[argc] = {info[0], info[1], info[2], info[3]};
+    MaybeLocal<Object> maybe_instance = constructor->GetFunction()->NewInstance(
+        argc, argv);
+    if (maybe_instance.IsEmpty()) {
+      // There's probably a pending exception
+      return;
+    } else {
+      info.GetReturnValue().Set(maybe_instance.ToLocalChecked());
+    }
   }
   }
 }
 }
 
 
 NAN_METHOD(Call::StartBatch) {
 NAN_METHOD(Call::StartBatch) {
-  NanScope();
-  if (!HasInstance(args.This())) {
-    return NanThrowTypeError("startBatch can only be called on Call objects");
+  if (!Call::HasInstance(info.This())) {
+    return Nan::ThrowTypeError("startBatch can only be called on Call objects");
   }
   }
-  if (!args[0]->IsObject()) {
-    return NanThrowError("startBatch's first argument must be an object");
+  if (!info[0]->IsObject()) {
+    return Nan::ThrowError("startBatch's first argument must be an object");
   }
   }
-  if (!args[1]->IsFunction()) {
-    return NanThrowError("startBatch's second argument must be a callback");
+  if (!info[1]->IsFunction()) {
+    return Nan::ThrowError("startBatch's second argument must be a callback");
   }
   }
-  Handle<Function> callback_func = args[1].As<Function>();
-  Call *call = ObjectWrap::Unwrap<Call>(args.This());
+  Local<Function> callback_func = info[1].As<Function>();
+  Call *call = ObjectWrap::Unwrap<Call>(info.This());
   shared_ptr<Resources> resources(new Resources);
   shared_ptr<Resources> resources(new Resources);
-  Handle<Object> obj = args[0]->ToObject();
-  Handle<Array> keys = obj->GetOwnPropertyNames();
+  Local<Object> obj = Nan::To<Object>(info[0]).ToLocalChecked();
+  Local<Array> keys = Nan::GetOwnPropertyNames(obj).ToLocalChecked();
   size_t nops = keys->Length();
   size_t nops = keys->Length();
   vector<grpc_op> ops(nops);
   vector<grpc_op> ops(nops);
   unique_ptr<OpVec> op_vector(new OpVec());
   unique_ptr<OpVec> op_vector(new OpVec());
   for (unsigned int i = 0; i < nops; i++) {
   for (unsigned int i = 0; i < nops; i++) {
     unique_ptr<Op> op;
     unique_ptr<Op> op;
-    if (!keys->Get(i)->IsUint32()) {
-      return NanThrowError(
+    MaybeLocal<Value> maybe_key = Nan::Get(keys, i);
+    if (maybe_key.IsEmpty() || (!maybe_key.ToLocalChecked()->IsUint32())) {
+      return Nan::ThrowError(
           "startBatch's first argument's keys must be integers");
           "startBatch's first argument's keys must be integers");
     }
     }
-    uint32_t type = keys->Get(i)->Uint32Value();
+    uint32_t type = Nan::To<uint32_t>(maybe_key.ToLocalChecked()).FromJust();
     ops[i].op = static_cast<grpc_op_type>(type);
     ops[i].op = static_cast<grpc_op_type>(type);
     ops[i].flags = 0;
     ops[i].flags = 0;
     ops[i].reserved = NULL;
     ops[i].reserved = NULL;
@@ -615,67 +664,64 @@ NAN_METHOD(Call::StartBatch) {
         op.reset(new ServerCloseResponseOp());
         op.reset(new ServerCloseResponseOp());
         break;
         break;
       default:
       default:
-        return NanThrowError("Argument object had an unrecognized key");
+        return Nan::ThrowError("Argument object had an unrecognized key");
     }
     }
     if (!op->ParseOp(obj->Get(type), &ops[i], resources)) {
     if (!op->ParseOp(obj->Get(type), &ops[i], resources)) {
-      return NanThrowTypeError("Incorrectly typed arguments to startBatch");
+      return Nan::ThrowTypeError("Incorrectly typed arguments to startBatch");
     }
     }
     op_vector->push_back(std::move(op));
     op_vector->push_back(std::move(op));
   }
   }
-  NanCallback *callback = new NanCallback(callback_func);
+  Callback *callback = new Callback(callback_func);
   grpc_call_error error = grpc_call_start_batch(
   grpc_call_error error = grpc_call_start_batch(
       call->wrapped_call, &ops[0], nops, new struct tag(
       call->wrapped_call, &ops[0], nops, new struct tag(
           callback, op_vector.release(), resources), NULL);
           callback, op_vector.release(), resources), NULL);
   if (error != GRPC_CALL_OK) {
   if (error != GRPC_CALL_OK) {
-    return NanThrowError(nanErrorWithCode("startBatch failed", error));
+    return Nan::ThrowError(nanErrorWithCode("startBatch failed", error));
   }
   }
   CompletionQueueAsyncWorker::Next();
   CompletionQueueAsyncWorker::Next();
-  NanReturnUndefined();
 }
 }
 
 
 NAN_METHOD(Call::Cancel) {
 NAN_METHOD(Call::Cancel) {
-  NanScope();
-  if (!HasInstance(args.This())) {
-    return NanThrowTypeError("cancel can only be called on Call objects");
+  if (!Call::HasInstance(info.This())) {
+    return Nan::ThrowTypeError("cancel can only be called on Call objects");
   }
   }
-  Call *call = ObjectWrap::Unwrap<Call>(args.This());
+  Call *call = ObjectWrap::Unwrap<Call>(info.This());
   grpc_call_error error = grpc_call_cancel(call->wrapped_call, NULL);
   grpc_call_error error = grpc_call_cancel(call->wrapped_call, NULL);
   if (error != GRPC_CALL_OK) {
   if (error != GRPC_CALL_OK) {
-    return NanThrowError(nanErrorWithCode("cancel failed", error));
+    return Nan::ThrowError(nanErrorWithCode("cancel failed", error));
   }
   }
-  NanReturnUndefined();
 }
 }
 
 
 NAN_METHOD(Call::CancelWithStatus) {
 NAN_METHOD(Call::CancelWithStatus) {
-  NanScope();
-  if (!HasInstance(args.This())) {
-    return NanThrowTypeError("cancel can only be called on Call objects");
+  Nan::HandleScope scope;
+  if (!HasInstance(info.This())) {
+    return Nan::ThrowTypeError("cancel can only be called on Call objects");
   }
   }
-  if (!args[0]->IsUint32()) {
-    return NanThrowTypeError(
+  if (!info[0]->IsUint32()) {
+    return Nan::ThrowTypeError(
         "cancelWithStatus's first argument must be a status code");
         "cancelWithStatus's first argument must be a status code");
   }
   }
-  if (!args[1]->IsString()) {
-    return NanThrowTypeError(
+  if (!info[1]->IsString()) {
+    return Nan::ThrowTypeError(
         "cancelWithStatus's second argument must be a string");
         "cancelWithStatus's second argument must be a string");
   }
   }
-  Call *call = ObjectWrap::Unwrap<Call>(args.This());
-  grpc_status_code code = static_cast<grpc_status_code>(args[0]->Uint32Value());
-  NanUtf8String details(args[0]);
+  Call *call = ObjectWrap::Unwrap<Call>(info.This());
+  grpc_status_code code = static_cast<grpc_status_code>(
+      Nan::To<uint32_t>(info[0]).FromJust());
+  Utf8String details(info[0]);
   grpc_call_cancel_with_status(call->wrapped_call, code, *details, NULL);
   grpc_call_cancel_with_status(call->wrapped_call, code, *details, NULL);
-  NanReturnUndefined();
 }
 }
 
 
 NAN_METHOD(Call::GetPeer) {
 NAN_METHOD(Call::GetPeer) {
-  NanScope();
-  if (!HasInstance(args.This())) {
-    return NanThrowTypeError("getPeer can only be called on Call objects");
+  Nan::HandleScope scope;
+  if (!HasInstance(info.This())) {
+    return Nan::ThrowTypeError("getPeer can only be called on Call objects");
   }
   }
-  Call *call = ObjectWrap::Unwrap<Call>(args.This());
+  Call *call = ObjectWrap::Unwrap<Call>(info.This());
   char *peer = grpc_call_get_peer(call->wrapped_call);
   char *peer = grpc_call_get_peer(call->wrapped_call);
-  Handle<Value> peer_value = NanNew(peer);
+  Local<Value> peer_value = Nan::New(peer).ToLocalChecked();
   gpr_free(peer);
   gpr_free(peer);
-  NanReturnValue(peer_value);
+  info.GetReturnValue().Set(peer_value);
 }
 }
 
 
 }  // namespace node
 }  // namespace node

+ 23 - 36
src/node/ext/call.h

@@ -51,6 +51,8 @@ namespace node {
 using std::unique_ptr;
 using std::unique_ptr;
 using std::shared_ptr;
 using std::shared_ptr;
 
 
+typedef Nan::Persistent<v8::Value, Nan::CopyablePersistentTraits<v8::Value>> PersistentValue;
+
 /**
 /**
  * Helper function for throwing errors with a grpc_call_error value.
  * Helper function for throwing errors with a grpc_call_error value.
  * Modified from the answer by Gus Goose to
  * Modified from the answer by Gus Goose to
@@ -58,69 +60,54 @@ using std::shared_ptr;
  */
  */
 inline v8::Local<v8::Value> nanErrorWithCode(const char *msg,
 inline v8::Local<v8::Value> nanErrorWithCode(const char *msg,
                                              grpc_call_error code) {
                                              grpc_call_error code) {
-    NanEscapableScope();
-    v8::Local<v8::Object> err = NanError(msg).As<v8::Object>();
-    err->Set(NanNew("code"), NanNew<v8::Uint32>(code));
-    return NanEscapeScope(err);
+  Nan::EscapableHandleScope scope;
+    v8::Local<v8::Object> err = Nan::Error(msg).As<v8::Object>();
+    Nan::Set(err, Nan::New("code").ToLocalChecked(), Nan::New<v8::Uint32>(code));
+    return scope.Escape(err);
 }
 }
 
 
-v8::Handle<v8::Value> ParseMetadata(const grpc_metadata_array *metadata_array);
-
-class PersistentHolder {
- public:
-  explicit PersistentHolder(v8::Persistent<v8::Value> *persist) :
-      persist(persist) {
-  }
-
-  ~PersistentHolder() {
-    NanDisposePersistent(*persist);
-    delete persist;
-  }
-
- private:
-  v8::Persistent<v8::Value> *persist;
-};
+v8::Local<v8::Value> ParseMetadata(const grpc_metadata_array *metadata_array);
 
 
 struct Resources {
 struct Resources {
-  std::vector<unique_ptr<NanUtf8String> > strings;
-  std::vector<unique_ptr<PersistentHolder> > handles;
+  std::vector<unique_ptr<Nan::Utf8String> > strings;
+  std::vector<unique_ptr<PersistentValue> > handles;
 };
 };
 
 
 class Op {
 class Op {
  public:
  public:
-  virtual v8::Handle<v8::Value> GetNodeValue() const = 0;
-  virtual bool ParseOp(v8::Handle<v8::Value> value, grpc_op *out,
+  virtual v8::Local<v8::Value> GetNodeValue() const = 0;
+  virtual bool ParseOp(v8::Local<v8::Value> value, grpc_op *out,
                        shared_ptr<Resources> resources) = 0;
                        shared_ptr<Resources> resources) = 0;
-  v8::Handle<v8::Value> GetOpType() const;
+  virtual ~Op();
+  v8::Local<v8::Value> GetOpType() const;
 
 
  protected:
  protected:
   virtual std::string GetTypeString() const = 0;
   virtual std::string GetTypeString() const = 0;
 };
 };
 
 
 typedef std::vector<unique_ptr<Op>> OpVec;
 typedef std::vector<unique_ptr<Op>> OpVec;
-
 struct tag {
 struct tag {
-  tag(NanCallback *callback, OpVec *ops,
+  tag(Nan::Callback *callback, OpVec *ops,
       shared_ptr<Resources> resources);
       shared_ptr<Resources> resources);
   ~tag();
   ~tag();
-  NanCallback *callback;
+  Nan::Callback *callback;
   OpVec *ops;
   OpVec *ops;
   shared_ptr<Resources> resources;
   shared_ptr<Resources> resources;
 };
 };
 
 
-v8::Handle<v8::Value> GetTagNodeValue(void *tag);
+v8::Local<v8::Value> GetTagNodeValue(void *tag);
 
 
-NanCallback *GetTagCallback(void *tag);
+Nan::Callback *GetTagCallback(void *tag);
 
 
 void DestroyTag(void *tag);
 void DestroyTag(void *tag);
 
 
 /* Wrapper class for grpc_call structs. */
 /* Wrapper class for grpc_call structs. */
-class Call : public ::node::ObjectWrap {
+class Call : public Nan::ObjectWrap {
  public:
  public:
-  static void Init(v8::Handle<v8::Object> exports);
-  static bool HasInstance(v8::Handle<v8::Value> val);
+  static void Init(v8::Local<v8::Object> exports);
+  static bool HasInstance(v8::Local<v8::Value> val);
   /* Wrap a grpc_call struct in a javascript object */
   /* Wrap a grpc_call struct in a javascript object */
-  static v8::Handle<v8::Value> WrapStruct(grpc_call *call);
+  static v8::Local<v8::Value> WrapStruct(grpc_call *call);
 
 
  private:
  private:
   explicit Call(grpc_call *call);
   explicit Call(grpc_call *call);
@@ -135,9 +122,9 @@ class Call : public ::node::ObjectWrap {
   static NAN_METHOD(Cancel);
   static NAN_METHOD(Cancel);
   static NAN_METHOD(CancelWithStatus);
   static NAN_METHOD(CancelWithStatus);
   static NAN_METHOD(GetPeer);
   static NAN_METHOD(GetPeer);
-  static NanCallback *constructor;
+  static Nan::Callback *constructor;
   // Used for typechecking instances of this javascript class
   // Used for typechecking instances of this javascript class
-  static v8::Persistent<v8::FunctionTemplate> fun_tpl;
+  static Nan::Persistent<v8::FunctionTemplate> fun_tpl;
 
 
   grpc_call *wrapped_call;
   grpc_call *wrapped_call;
 };
 };

+ 95 - 83
src/node/ext/channel.cc

@@ -48,21 +48,27 @@
 namespace grpc {
 namespace grpc {
 namespace node {
 namespace node {
 
 
+using Nan::Callback;
+using Nan::EscapableHandleScope;
+using Nan::HandleScope;
+using Nan::Maybe;
+using Nan::MaybeLocal;
+using Nan::ObjectWrap;
+using Nan::Persistent;
+using Nan::Utf8String;
+
 using v8::Array;
 using v8::Array;
 using v8::Exception;
 using v8::Exception;
 using v8::Function;
 using v8::Function;
 using v8::FunctionTemplate;
 using v8::FunctionTemplate;
-using v8::Handle;
-using v8::HandleScope;
 using v8::Integer;
 using v8::Integer;
 using v8::Local;
 using v8::Local;
 using v8::Number;
 using v8::Number;
 using v8::Object;
 using v8::Object;
-using v8::Persistent;
 using v8::String;
 using v8::String;
 using v8::Value;
 using v8::Value;
 
 
-NanCallback *Channel::constructor;
+Callback *Channel::constructor;
 Persistent<FunctionTemplate> Channel::fun_tpl;
 Persistent<FunctionTemplate> Channel::fun_tpl;
 
 
 Channel::Channel(grpc_channel *channel) : wrapped_channel(channel) {}
 Channel::Channel(grpc_channel *channel) : wrapped_channel(channel) {}
@@ -73,88 +79,89 @@ Channel::~Channel() {
   }
   }
 }
 }
 
 
-void Channel::Init(Handle<Object> exports) {
-  NanScope();
-  Local<FunctionTemplate> tpl = NanNew<FunctionTemplate>(New);
-  tpl->SetClassName(NanNew("Channel"));
+void Channel::Init(Local<Object> exports) {
+  Nan::HandleScope scope;
+  Local<FunctionTemplate> tpl = Nan::New<FunctionTemplate>(New);
+  tpl->SetClassName(Nan::New("Channel").ToLocalChecked());
   tpl->InstanceTemplate()->SetInternalFieldCount(1);
   tpl->InstanceTemplate()->SetInternalFieldCount(1);
-  NanSetPrototypeTemplate(tpl, "close",
-                          NanNew<FunctionTemplate>(Close)->GetFunction());
-  NanSetPrototypeTemplate(tpl, "getTarget",
-                          NanNew<FunctionTemplate>(GetTarget)->GetFunction());
-  NanSetPrototypeTemplate(
-      tpl, "getConnectivityState",
-      NanNew<FunctionTemplate>(GetConnectivityState)->GetFunction());
-  NanSetPrototypeTemplate(
-      tpl, "watchConnectivityState",
-      NanNew<FunctionTemplate>(WatchConnectivityState)->GetFunction());
-  NanAssignPersistent(fun_tpl, tpl);
-  Handle<Function> ctr = tpl->GetFunction();
-  constructor = new NanCallback(ctr);
-  exports->Set(NanNew("Channel"), ctr);
+  Nan::SetPrototypeMethod(tpl, "close", Close);
+  Nan::SetPrototypeMethod(tpl, "getTarget", GetTarget);
+  Nan::SetPrototypeMethod(tpl, "getConnectivityState", GetConnectivityState);
+  Nan::SetPrototypeMethod(tpl, "watchConnectivityState",
+                          WatchConnectivityState);
+  fun_tpl.Reset(tpl);
+  Local<Function> ctr = Nan::GetFunction(tpl).ToLocalChecked();
+  Nan::Set(exports, Nan::New("Channel").ToLocalChecked(), ctr);
+  constructor = new Callback(ctr);
 }
 }
 
 
-bool Channel::HasInstance(Handle<Value> val) {
-  NanScope();
-  return NanHasInstance(fun_tpl, val);
+bool Channel::HasInstance(Local<Value> val) {
+  HandleScope scope;
+  return Nan::New(fun_tpl)->HasInstance(val);
 }
 }
 
 
 grpc_channel *Channel::GetWrappedChannel() { return this->wrapped_channel; }
 grpc_channel *Channel::GetWrappedChannel() { return this->wrapped_channel; }
 
 
 NAN_METHOD(Channel::New) {
 NAN_METHOD(Channel::New) {
-  NanScope();
-
-  if (args.IsConstructCall()) {
-    if (!args[0]->IsString()) {
-      return NanThrowTypeError(
+  if (info.IsConstructCall()) {
+    if (!info[0]->IsString()) {
+      return Nan::ThrowTypeError(
           "Channel expects a string, a credential and an object");
           "Channel expects a string, a credential and an object");
     }
     }
     grpc_channel *wrapped_channel;
     grpc_channel *wrapped_channel;
     // Owned by the Channel object
     // Owned by the Channel object
-    NanUtf8String host(args[0]);
+    Utf8String host(info[0]);
     grpc_credentials *creds;
     grpc_credentials *creds;
-    if (!Credentials::HasInstance(args[1])) {
-      return NanThrowTypeError(
+    if (!Credentials::HasInstance(info[1])) {
+      return Nan::ThrowTypeError(
           "Channel's second argument must be a credential");
           "Channel's second argument must be a credential");
     }
     }
     Credentials *creds_object = ObjectWrap::Unwrap<Credentials>(
     Credentials *creds_object = ObjectWrap::Unwrap<Credentials>(
-        args[1]->ToObject());
+        Nan::To<Object>(info[1]).ToLocalChecked());
     creds = creds_object->GetWrappedCredentials();
     creds = creds_object->GetWrappedCredentials();
     grpc_channel_args *channel_args_ptr;
     grpc_channel_args *channel_args_ptr;
-    if (args[2]->IsUndefined()) {
+    if (info[2]->IsUndefined()) {
       channel_args_ptr = NULL;
       channel_args_ptr = NULL;
       wrapped_channel = grpc_insecure_channel_create(*host, NULL, NULL);
       wrapped_channel = grpc_insecure_channel_create(*host, NULL, NULL);
-    } else if (args[2]->IsObject()) {
-      Handle<Object> args_hash(args[2]->ToObject()->Clone());
-      Handle<Array> keys(args_hash->GetOwnPropertyNames());
+    } else if (info[2]->IsObject()) {
+      Local<Object> args_hash = Nan::To<Object>(info[2]).ToLocalChecked();
+      Local<Array> keys(Nan::GetOwnPropertyNames(args_hash).ToLocalChecked());
       grpc_channel_args channel_args;
       grpc_channel_args channel_args;
       channel_args.num_args = keys->Length();
       channel_args.num_args = keys->Length();
       channel_args.args = reinterpret_cast<grpc_arg *>(
       channel_args.args = reinterpret_cast<grpc_arg *>(
           calloc(channel_args.num_args, sizeof(grpc_arg)));
           calloc(channel_args.num_args, sizeof(grpc_arg)));
       /* These are used to keep all strings until then end of the block, then
       /* These are used to keep all strings until then end of the block, then
          destroy them */
          destroy them */
-      std::vector<NanUtf8String *> key_strings(keys->Length());
-      std::vector<NanUtf8String *> value_strings(keys->Length());
+      std::vector<Nan::Utf8String *> key_strings(keys->Length());
+      std::vector<Nan::Utf8String *> value_strings(keys->Length());
       for (unsigned int i = 0; i < channel_args.num_args; i++) {
       for (unsigned int i = 0; i < channel_args.num_args; i++) {
-        Handle<String> current_key(keys->Get(i)->ToString());
-        Handle<Value> current_value(args_hash->Get(current_key));
-        key_strings[i] = new NanUtf8String(current_key);
+        MaybeLocal<String> maybe_key = Nan::To<String>(
+            Nan::Get(keys, i).ToLocalChecked());
+        if (maybe_key.IsEmpty()) {
+          free(channel_args.args);
+          return Nan::ThrowTypeError("Arg keys must be strings");
+        }
+        Local<String> current_key = maybe_key.ToLocalChecked();
+        Local<Value> current_value = Nan::Get(args_hash,
+                                               current_key).ToLocalChecked();
+        key_strings[i] = new Nan::Utf8String(current_key);
         channel_args.args[i].key = **key_strings[i];
         channel_args.args[i].key = **key_strings[i];
         if (current_value->IsInt32()) {
         if (current_value->IsInt32()) {
           channel_args.args[i].type = GRPC_ARG_INTEGER;
           channel_args.args[i].type = GRPC_ARG_INTEGER;
-          channel_args.args[i].value.integer = current_value->Int32Value();
+          channel_args.args[i].value.integer = Nan::To<int32_t>(
+              current_value).FromJust();
         } else if (current_value->IsString()) {
         } else if (current_value->IsString()) {
           channel_args.args[i].type = GRPC_ARG_STRING;
           channel_args.args[i].type = GRPC_ARG_STRING;
-          value_strings[i] = new NanUtf8String(current_value);
+          value_strings[i] = new Nan::Utf8String(current_value);
           channel_args.args[i].value.string = **value_strings[i];
           channel_args.args[i].value.string = **value_strings[i];
         } else {
         } else {
           free(channel_args.args);
           free(channel_args.args);
-          return NanThrowTypeError("Arg values must be strings");
+          return Nan::ThrowTypeError("Arg values must be strings");
         }
         }
       }
       }
       channel_args_ptr = &channel_args;
       channel_args_ptr = &channel_args;
     } else {
     } else {
-      return NanThrowTypeError("Channel expects a string and an object");
+      return Nan::ThrowTypeError("Channel expects a string and an object");
     }
     }
     if (creds == NULL) {
     if (creds == NULL) {
       wrapped_channel = grpc_insecure_channel_create(*host, channel_args_ptr,
       wrapped_channel = grpc_insecure_channel_create(*host, channel_args_ptr,
@@ -167,73 +174,79 @@ NAN_METHOD(Channel::New) {
       free(channel_args_ptr->args);
       free(channel_args_ptr->args);
     }
     }
     Channel *channel = new Channel(wrapped_channel);
     Channel *channel = new Channel(wrapped_channel);
-    channel->Wrap(args.This());
-    NanReturnValue(args.This());
+    channel->Wrap(info.This());
+    info.GetReturnValue().Set(info.This());
+    return;
   } else {
   } else {
     const int argc = 3;
     const int argc = 3;
-    Local<Value> argv[argc] = {args[0], args[1], args[2]};
-    NanReturnValue(constructor->GetFunction()->NewInstance(argc, argv));
+    Local<Value> argv[argc] = {info[0], info[1], info[2]};
+    MaybeLocal<Object> maybe_instance = constructor->GetFunction()->NewInstance(
+        argc, argv);
+    if (maybe_instance.IsEmpty()) {
+      // There's probably a pending exception
+      return;
+    } else {
+      info.GetReturnValue().Set(maybe_instance.ToLocalChecked());
+    }
   }
   }
 }
 }
 
 
 NAN_METHOD(Channel::Close) {
 NAN_METHOD(Channel::Close) {
-  NanScope();
-  if (!HasInstance(args.This())) {
-    return NanThrowTypeError("close can only be called on Channel objects");
+  if (!HasInstance(info.This())) {
+    return Nan::ThrowTypeError("close can only be called on Channel objects");
   }
   }
-  Channel *channel = ObjectWrap::Unwrap<Channel>(args.This());
+  Channel *channel = ObjectWrap::Unwrap<Channel>(info.This());
   if (channel->wrapped_channel != NULL) {
   if (channel->wrapped_channel != NULL) {
     grpc_channel_destroy(channel->wrapped_channel);
     grpc_channel_destroy(channel->wrapped_channel);
     channel->wrapped_channel = NULL;
     channel->wrapped_channel = NULL;
   }
   }
-  NanReturnUndefined();
 }
 }
 
 
 NAN_METHOD(Channel::GetTarget) {
 NAN_METHOD(Channel::GetTarget) {
-  NanScope();
-  if (!HasInstance(args.This())) {
-    return NanThrowTypeError("getTarget can only be called on Channel objects");
+  if (!HasInstance(info.This())) {
+    return Nan::ThrowTypeError("getTarget can only be called on Channel objects");
   }
   }
-  Channel *channel = ObjectWrap::Unwrap<Channel>(args.This());
-  NanReturnValue(NanNew(grpc_channel_get_target(channel->wrapped_channel)));
+  Channel *channel = ObjectWrap::Unwrap<Channel>(info.This());
+  info.GetReturnValue().Set(Nan::New(
+      grpc_channel_get_target(channel->wrapped_channel)).ToLocalChecked());
 }
 }
 
 
 NAN_METHOD(Channel::GetConnectivityState) {
 NAN_METHOD(Channel::GetConnectivityState) {
-  NanScope();
-  if (!HasInstance(args.This())) {
-    return NanThrowTypeError(
+  if (!HasInstance(info.This())) {
+    return Nan::ThrowTypeError(
         "getConnectivityState can only be called on Channel objects");
         "getConnectivityState can only be called on Channel objects");
   }
   }
-  Channel *channel = ObjectWrap::Unwrap<Channel>(args.This());
-  int try_to_connect = (int)args[0]->Equals(NanTrue());
-  NanReturnValue(grpc_channel_check_connectivity_state(channel->wrapped_channel,
-                                                       try_to_connect));
+  Channel *channel = ObjectWrap::Unwrap<Channel>(info.This());
+  int try_to_connect = (int)info[0]->Equals(Nan::True());
+  info.GetReturnValue().Set(
+      grpc_channel_check_connectivity_state(channel->wrapped_channel,
+                                            try_to_connect));
 }
 }
 
 
 NAN_METHOD(Channel::WatchConnectivityState) {
 NAN_METHOD(Channel::WatchConnectivityState) {
-  NanScope();
-  if (!HasInstance(args.This())) {
-    return NanThrowTypeError(
+  if (!HasInstance(info.This())) {
+    return Nan::ThrowTypeError(
         "watchConnectivityState can only be called on Channel objects");
         "watchConnectivityState can only be called on Channel objects");
   }
   }
-  if (!args[0]->IsUint32()) {
-    return NanThrowTypeError(
+  if (!info[0]->IsUint32()) {
+    return Nan::ThrowTypeError(
         "watchConnectivityState's first argument must be a channel state");
         "watchConnectivityState's first argument must be a channel state");
   }
   }
-  if (!(args[1]->IsNumber() || args[1]->IsDate())) {
-    return NanThrowTypeError(
+  if (!(info[1]->IsNumber() || info[1]->IsDate())) {
+    return Nan::ThrowTypeError(
         "watchConnectivityState's second argument must be a date or a number");
         "watchConnectivityState's second argument must be a date or a number");
   }
   }
-  if (!args[2]->IsFunction()) {
-    return NanThrowTypeError(
+  if (!info[2]->IsFunction()) {
+    return Nan::ThrowTypeError(
         "watchConnectivityState's third argument must be a callback");
         "watchConnectivityState's third argument must be a callback");
   }
   }
   grpc_connectivity_state last_state =
   grpc_connectivity_state last_state =
-      static_cast<grpc_connectivity_state>(args[0]->Uint32Value());
-  double deadline = args[1]->NumberValue();
-  Handle<Function> callback_func = args[2].As<Function>();
-  NanCallback *callback = new NanCallback(callback_func);
-  Channel *channel = ObjectWrap::Unwrap<Channel>(args.This());
+      static_cast<grpc_connectivity_state>(
+          Nan::To<uint32_t>(info[0]).FromJust());
+  double deadline = Nan::To<double>(info[1]).FromJust();
+  Local<Function> callback_func = info[2].As<Function>();
+  Nan::Callback *callback = new Callback(callback_func);
+  Channel *channel = ObjectWrap::Unwrap<Channel>(info.This());
   unique_ptr<OpVec> ops(new OpVec());
   unique_ptr<OpVec> ops(new OpVec());
   grpc_channel_watch_connectivity_state(
   grpc_channel_watch_connectivity_state(
       channel->wrapped_channel, last_state, MillisecondsToTimespec(deadline),
       channel->wrapped_channel, last_state, MillisecondsToTimespec(deadline),
@@ -242,7 +255,6 @@ NAN_METHOD(Channel::WatchConnectivityState) {
                      ops.release(),
                      ops.release(),
                      shared_ptr<Resources>(nullptr)));
                      shared_ptr<Resources>(nullptr)));
   CompletionQueueAsyncWorker::Next();
   CompletionQueueAsyncWorker::Next();
-  NanReturnUndefined();
 }
 }
 
 
 }  // namespace node
 }  // namespace node

+ 5 - 5
src/node/ext/channel.h

@@ -42,10 +42,10 @@ namespace grpc {
 namespace node {
 namespace node {
 
 
 /* Wrapper class for grpc_channel structs */
 /* Wrapper class for grpc_channel structs */
-class Channel : public ::node::ObjectWrap {
+class Channel : public Nan::ObjectWrap {
  public:
  public:
-  static void Init(v8::Handle<v8::Object> exports);
-  static bool HasInstance(v8::Handle<v8::Value> val);
+  static void Init(v8::Local<v8::Object> exports);
+  static bool HasInstance(v8::Local<v8::Value> val);
   /* This is used to typecheck javascript objects before converting them to
   /* This is used to typecheck javascript objects before converting them to
      this type */
      this type */
   static v8::Persistent<v8::Value> prototype;
   static v8::Persistent<v8::Value> prototype;
@@ -66,8 +66,8 @@ class Channel : public ::node::ObjectWrap {
   static NAN_METHOD(GetTarget);
   static NAN_METHOD(GetTarget);
   static NAN_METHOD(GetConnectivityState);
   static NAN_METHOD(GetConnectivityState);
   static NAN_METHOD(WatchConnectivityState);
   static NAN_METHOD(WatchConnectivityState);
-  static NanCallback *constructor;
-  static v8::Persistent<v8::FunctionTemplate> fun_tpl;
+  static Nan::Callback *constructor;
+  static Nan::Persistent<v8::FunctionTemplate> fun_tpl;
 
 
   grpc_channel *wrapped_channel;
   grpc_channel *wrapped_channel;
 };
 };

+ 13 - 14
src/node/ext/completion_queue_async_worker.cc

@@ -46,9 +46,8 @@ namespace node {
 const int max_queue_threads = 2;
 const int max_queue_threads = 2;
 
 
 using v8::Function;
 using v8::Function;
-using v8::Handle;
+using v8::Local;
 using v8::Object;
 using v8::Object;
-using v8::Persistent;
 using v8::Value;
 using v8::Value;
 
 
 grpc_completion_queue *CompletionQueueAsyncWorker::queue;
 grpc_completion_queue *CompletionQueueAsyncWorker::queue;
@@ -57,7 +56,7 @@ int CompletionQueueAsyncWorker::current_threads;
 int CompletionQueueAsyncWorker::waiting_next_calls;
 int CompletionQueueAsyncWorker::waiting_next_calls;
 
 
 CompletionQueueAsyncWorker::CompletionQueueAsyncWorker()
 CompletionQueueAsyncWorker::CompletionQueueAsyncWorker()
-    : NanAsyncWorker(NULL) {}
+    : Nan::AsyncWorker(NULL) {}
 
 
 CompletionQueueAsyncWorker::~CompletionQueueAsyncWorker() {}
 CompletionQueueAsyncWorker::~CompletionQueueAsyncWorker() {}
 
 
@@ -72,42 +71,42 @@ void CompletionQueueAsyncWorker::Execute() {
 grpc_completion_queue *CompletionQueueAsyncWorker::GetQueue() { return queue; }
 grpc_completion_queue *CompletionQueueAsyncWorker::GetQueue() { return queue; }
 
 
 void CompletionQueueAsyncWorker::Next() {
 void CompletionQueueAsyncWorker::Next() {
-  NanScope();
+  Nan::HandleScope scope;
   if (current_threads < max_queue_threads) {
   if (current_threads < max_queue_threads) {
     CompletionQueueAsyncWorker *worker = new CompletionQueueAsyncWorker();
     CompletionQueueAsyncWorker *worker = new CompletionQueueAsyncWorker();
-    NanAsyncQueueWorker(worker);
+    Nan::AsyncQueueWorker(worker);
   } else {
   } else {
     waiting_next_calls += 1;
     waiting_next_calls += 1;
   }
   }
 }
 }
 
 
-void CompletionQueueAsyncWorker::Init(Handle<Object> exports) {
-  NanScope();
+void CompletionQueueAsyncWorker::Init(Local<Object> exports) {
+  Nan::HandleScope scope;
   current_threads = 0;
   current_threads = 0;
   waiting_next_calls = 0;
   waiting_next_calls = 0;
   queue = grpc_completion_queue_create(NULL);
   queue = grpc_completion_queue_create(NULL);
 }
 }
 
 
 void CompletionQueueAsyncWorker::HandleOKCallback() {
 void CompletionQueueAsyncWorker::HandleOKCallback() {
-  NanScope();
+  Nan::HandleScope scope;
   if (waiting_next_calls > 0) {
   if (waiting_next_calls > 0) {
     waiting_next_calls -= 1;
     waiting_next_calls -= 1;
     CompletionQueueAsyncWorker *worker = new CompletionQueueAsyncWorker();
     CompletionQueueAsyncWorker *worker = new CompletionQueueAsyncWorker();
-    NanAsyncQueueWorker(worker);
+    Nan::AsyncQueueWorker(worker);
   } else {
   } else {
     current_threads -= 1;
     current_threads -= 1;
   }
   }
-  NanCallback *callback = GetTagCallback(result.tag);
-  Handle<Value> argv[] = {NanNull(), GetTagNodeValue(result.tag)};
+  Nan::Callback *callback = GetTagCallback(result.tag);
+  Local<Value> argv[] = {Nan::Null(), GetTagNodeValue(result.tag)};
   callback->Call(2, argv);
   callback->Call(2, argv);
 
 
   DestroyTag(result.tag);
   DestroyTag(result.tag);
 }
 }
 
 
 void CompletionQueueAsyncWorker::HandleErrorCallback() {
 void CompletionQueueAsyncWorker::HandleErrorCallback() {
-  NanScope();
-  NanCallback *callback = GetTagCallback(result.tag);
-  Handle<Value> argv[] = {NanError(ErrorMessage())};
+  Nan::HandleScope scope;
+  Nan::Callback *callback = GetTagCallback(result.tag);
+  Local<Value> argv[] = {Nan::Error(ErrorMessage())};
 
 
   callback->Call(1, argv);
   callback->Call(1, argv);
 
 

+ 2 - 2
src/node/ext/completion_queue_async_worker.h

@@ -42,7 +42,7 @@ namespace node {
 
 
 /* A worker that asynchronously calls completion_queue_next, and queues onto the
 /* A worker that asynchronously calls completion_queue_next, and queues onto the
    node event loop a call to the function stored in the event's tag. */
    node event loop a call to the function stored in the event's tag. */
-class CompletionQueueAsyncWorker : public NanAsyncWorker {
+class CompletionQueueAsyncWorker : public Nan::AsyncWorker {
  public:
  public:
   CompletionQueueAsyncWorker();
   CompletionQueueAsyncWorker();
 
 
@@ -59,7 +59,7 @@ class CompletionQueueAsyncWorker : public NanAsyncWorker {
   static void Next();
   static void Next();
 
 
   /* Initialize the CompletionQueueAsyncWorker class */
   /* Initialize the CompletionQueueAsyncWorker class */
-  static void Init(v8::Handle<v8::Object> exports);
+  static void Init(v8::Local<v8::Object> exports);
 
 
  protected:
  protected:
   /* Called when Execute has succeeded (completed without setting an error
   /* Called when Execute has succeeded (completed without setting an error

+ 109 - 83
src/node/ext/credentials.cc

@@ -41,20 +41,26 @@
 namespace grpc {
 namespace grpc {
 namespace node {
 namespace node {
 
 
+using Nan::Callback;
+using Nan::EscapableHandleScope;
+using Nan::HandleScope;
+using Nan::Maybe;
+using Nan::MaybeLocal;
+using Nan::ObjectWrap;
+using Nan::Persistent;
+using Nan::Utf8String;
+
 using v8::Exception;
 using v8::Exception;
 using v8::External;
 using v8::External;
 using v8::Function;
 using v8::Function;
 using v8::FunctionTemplate;
 using v8::FunctionTemplate;
-using v8::Handle;
-using v8::HandleScope;
 using v8::Integer;
 using v8::Integer;
 using v8::Local;
 using v8::Local;
 using v8::Object;
 using v8::Object;
 using v8::ObjectTemplate;
 using v8::ObjectTemplate;
-using v8::Persistent;
 using v8::Value;
 using v8::Value;
 
 
-NanCallback *Credentials::constructor;
+Nan::Callback *Credentials::constructor;
 Persistent<FunctionTemplate> Credentials::fun_tpl;
 Persistent<FunctionTemplate> Credentials::fun_tpl;
 
 
 Credentials::Credentials(grpc_credentials *credentials)
 Credentials::Credentials(grpc_credentials *credentials)
@@ -64,40 +70,52 @@ Credentials::~Credentials() {
   grpc_credentials_release(wrapped_credentials);
   grpc_credentials_release(wrapped_credentials);
 }
 }
 
 
-void Credentials::Init(Handle<Object> exports) {
-  NanScope();
-  Local<FunctionTemplate> tpl = NanNew<FunctionTemplate>(New);
-  tpl->SetClassName(NanNew("Credentials"));
+void Credentials::Init(Local<Object> exports) {
+  HandleScope scope;
+  Local<FunctionTemplate> tpl = Nan::New<FunctionTemplate>(New);
+  tpl->SetClassName(Nan::New("Credentials").ToLocalChecked());
   tpl->InstanceTemplate()->SetInternalFieldCount(1);
   tpl->InstanceTemplate()->SetInternalFieldCount(1);
-  NanAssignPersistent(fun_tpl, tpl);
-  Handle<Function> ctr = tpl->GetFunction();
-  ctr->Set(NanNew("createDefault"),
-           NanNew<FunctionTemplate>(CreateDefault)->GetFunction());
-  ctr->Set(NanNew("createSsl"),
-           NanNew<FunctionTemplate>(CreateSsl)->GetFunction());
-  ctr->Set(NanNew("createComposite"),
-           NanNew<FunctionTemplate>(CreateComposite)->GetFunction());
-  ctr->Set(NanNew("createGce"),
-           NanNew<FunctionTemplate>(CreateGce)->GetFunction());
-  ctr->Set(NanNew("createIam"),
-           NanNew<FunctionTemplate>(CreateIam)->GetFunction());
-  ctr->Set(NanNew("createInsecure"),
-           NanNew<FunctionTemplate>(CreateInsecure)->GetFunction());
-  constructor = new NanCallback(ctr);
-  exports->Set(NanNew("Credentials"), ctr);
+  fun_tpl.Reset(tpl);
+  Local<Function> ctr = Nan::GetFunction(tpl).ToLocalChecked();
+  Nan::Set(ctr, Nan::New("createDefault").ToLocalChecked(),
+           Nan::GetFunction(
+               Nan::New<FunctionTemplate>(CreateDefault)).ToLocalChecked());
+  Nan::Set(ctr, Nan::New("createSsl").ToLocalChecked(),
+           Nan::GetFunction(
+               Nan::New<FunctionTemplate>(CreateSsl)).ToLocalChecked());
+  Nan::Set(ctr, Nan::New("createComposite").ToLocalChecked(),
+           Nan::GetFunction(
+               Nan::New<FunctionTemplate>(CreateComposite)).ToLocalChecked());
+  Nan::Set(ctr, Nan::New("createGce").ToLocalChecked(),
+           Nan::GetFunction(
+               Nan::New<FunctionTemplate>(CreateGce)).ToLocalChecked());
+  Nan::Set(ctr, Nan::New("createIam").ToLocalChecked(),
+           Nan::GetFunction(
+               Nan::New<FunctionTemplate>(CreateIam)).ToLocalChecked());
+  Nan::Set(ctr, Nan::New("createInsecure").ToLocalChecked(),
+           Nan::GetFunction(
+               Nan::New<FunctionTemplate>(CreateInsecure)).ToLocalChecked());
+  Nan::Set(exports, Nan::New("Credentials").ToLocalChecked(), ctr);
+  constructor = new Nan::Callback(ctr);
 }
 }
 
 
-bool Credentials::HasInstance(Handle<Value> val) {
-  NanScope();
-  return NanHasInstance(fun_tpl, val);
+bool Credentials::HasInstance(Local<Value> val) {
+  HandleScope scope;
+  return Nan::New(fun_tpl)->HasInstance(val);
 }
 }
 
 
-Handle<Value> Credentials::WrapStruct(grpc_credentials *credentials) {
-  NanEscapableScope();
+Local<Value> Credentials::WrapStruct(grpc_credentials *credentials) {
+  EscapableHandleScope scope;
   const int argc = 1;
   const int argc = 1;
-  Handle<Value> argv[argc] = {
-    NanNew<External>(reinterpret_cast<void *>(credentials))};
-  return NanEscapeScope(constructor->GetFunction()->NewInstance(argc, argv));
+  Local<Value> argv[argc] = {
+    Nan::New<External>(reinterpret_cast<void *>(credentials))};
+  MaybeLocal<Object> maybe_instance = Nan::NewInstance(
+      constructor->GetFunction(), argc, argv);
+  if (maybe_instance.IsEmpty()) {
+    return scope.Escape(Nan::Null());
+  } else {
+    return scope.Escape(maybe_instance.ToLocalChecked());
+  }
 }
 }
 
 
 grpc_credentials *Credentials::GetWrappedCredentials() {
 grpc_credentials *Credentials::GetWrappedCredentials() {
@@ -105,115 +123,123 @@ grpc_credentials *Credentials::GetWrappedCredentials() {
 }
 }
 
 
 NAN_METHOD(Credentials::New) {
 NAN_METHOD(Credentials::New) {
-  NanScope();
-
-  if (args.IsConstructCall()) {
-    if (!args[0]->IsExternal()) {
-      return NanThrowTypeError(
+  if (info.IsConstructCall()) {
+    if (!info[0]->IsExternal()) {
+      return Nan::ThrowTypeError(
           "Credentials can only be created with the provided functions");
           "Credentials can only be created with the provided functions");
     }
     }
-    Handle<External> ext = args[0].As<External>();
+    Local<External> ext = info[0].As<External>();
     grpc_credentials *creds_value =
     grpc_credentials *creds_value =
         reinterpret_cast<grpc_credentials *>(ext->Value());
         reinterpret_cast<grpc_credentials *>(ext->Value());
     Credentials *credentials = new Credentials(creds_value);
     Credentials *credentials = new Credentials(creds_value);
-    credentials->Wrap(args.This());
-    NanReturnValue(args.This());
+    credentials->Wrap(info.This());
+    info.GetReturnValue().Set(info.This());
+    return;
   } else {
   } else {
     const int argc = 1;
     const int argc = 1;
-    Local<Value> argv[argc] = {args[0]};
-    NanReturnValue(constructor->GetFunction()->NewInstance(argc, argv));
+    Local<Value> argv[argc] = {info[0]};
+    MaybeLocal<Object> maybe_instance = constructor->GetFunction()->NewInstance(
+        argc, argv);
+    if (maybe_instance.IsEmpty()) {
+      // There's probably a pending exception
+      return;
+    } else {
+      info.GetReturnValue().Set(maybe_instance.ToLocalChecked());
+    }
   }
   }
 }
 }
 
 
 NAN_METHOD(Credentials::CreateDefault) {
 NAN_METHOD(Credentials::CreateDefault) {
-  NanScope();
   grpc_credentials *creds = grpc_google_default_credentials_create();
   grpc_credentials *creds = grpc_google_default_credentials_create();
   if (creds == NULL) {
   if (creds == NULL) {
-    NanReturnNull();
+    info.GetReturnValue().SetNull();
+  } else {
+    info.GetReturnValue().Set(WrapStruct(creds));
   }
   }
-  NanReturnValue(WrapStruct(creds));
 }
 }
 
 
 NAN_METHOD(Credentials::CreateSsl) {
 NAN_METHOD(Credentials::CreateSsl) {
-  NanScope();
   char *root_certs = NULL;
   char *root_certs = NULL;
   grpc_ssl_pem_key_cert_pair key_cert_pair = {NULL, NULL};
   grpc_ssl_pem_key_cert_pair key_cert_pair = {NULL, NULL};
-  if (::node::Buffer::HasInstance(args[0])) {
-    root_certs = ::node::Buffer::Data(args[0]);
-  } else if (!(args[0]->IsNull() || args[0]->IsUndefined())) {
-    return NanThrowTypeError("createSsl's first argument must be a Buffer");
+  if (::node::Buffer::HasInstance(info[0])) {
+    root_certs = ::node::Buffer::Data(info[0]);
+  } else if (!(info[0]->IsNull() || info[0]->IsUndefined())) {
+    return Nan::ThrowTypeError("createSsl's first argument must be a Buffer");
   }
   }
-  if (::node::Buffer::HasInstance(args[1])) {
-    key_cert_pair.private_key = ::node::Buffer::Data(args[1]);
-  } else if (!(args[1]->IsNull() || args[1]->IsUndefined())) {
-    return NanThrowTypeError(
+  if (::node::Buffer::HasInstance(info[1])) {
+    key_cert_pair.private_key = ::node::Buffer::Data(info[1]);
+  } else if (!(info[1]->IsNull() || info[1]->IsUndefined())) {
+    return Nan::ThrowTypeError(
         "createSSl's second argument must be a Buffer if provided");
         "createSSl's second argument must be a Buffer if provided");
   }
   }
-  if (::node::Buffer::HasInstance(args[2])) {
-    key_cert_pair.cert_chain = ::node::Buffer::Data(args[2]);
-  } else if (!(args[2]->IsNull() || args[2]->IsUndefined())) {
-    return NanThrowTypeError(
+  if (::node::Buffer::HasInstance(info[2])) {
+    key_cert_pair.cert_chain = ::node::Buffer::Data(info[2]);
+  } else if (!(info[2]->IsNull() || info[2]->IsUndefined())) {
+    return Nan::ThrowTypeError(
         "createSSl's third argument must be a Buffer if provided");
         "createSSl's third argument must be a Buffer if provided");
   }
   }
   grpc_credentials *creds = grpc_ssl_credentials_create(
   grpc_credentials *creds = grpc_ssl_credentials_create(
       root_certs, key_cert_pair.private_key == NULL ? NULL : &key_cert_pair,
       root_certs, key_cert_pair.private_key == NULL ? NULL : &key_cert_pair,
       NULL);
       NULL);
   if (creds == NULL) {
   if (creds == NULL) {
-    NanReturnNull();
+    info.GetReturnValue().SetNull();
+  } else {
+    info.GetReturnValue().Set(WrapStruct(creds));
   }
   }
-  NanReturnValue(WrapStruct(creds));
 }
 }
 
 
 NAN_METHOD(Credentials::CreateComposite) {
 NAN_METHOD(Credentials::CreateComposite) {
-  NanScope();
-  if (!HasInstance(args[0])) {
-    return NanThrowTypeError(
+  if (!HasInstance(info[0])) {
+    return Nan::ThrowTypeError(
         "createComposite's first argument must be a Credentials object");
         "createComposite's first argument must be a Credentials object");
   }
   }
-  if (!HasInstance(args[1])) {
-    return NanThrowTypeError(
+  if (!HasInstance(info[1])) {
+    return Nan::ThrowTypeError(
         "createComposite's second argument must be a Credentials object");
         "createComposite's second argument must be a Credentials object");
   }
   }
-  Credentials *creds1 = ObjectWrap::Unwrap<Credentials>(args[0]->ToObject());
-  Credentials *creds2 = ObjectWrap::Unwrap<Credentials>(args[1]->ToObject());
+  Credentials *creds1 = ObjectWrap::Unwrap<Credentials>(
+      Nan::To<Object>(info[0]).ToLocalChecked());
+  Credentials *creds2 = ObjectWrap::Unwrap<Credentials>(
+      Nan::To<Object>(info[1]).ToLocalChecked());
   grpc_credentials *creds = grpc_composite_credentials_create(
   grpc_credentials *creds = grpc_composite_credentials_create(
       creds1->wrapped_credentials, creds2->wrapped_credentials, NULL);
       creds1->wrapped_credentials, creds2->wrapped_credentials, NULL);
   if (creds == NULL) {
   if (creds == NULL) {
-    NanReturnNull();
+    info.GetReturnValue().SetNull();
+  } else {
+    info.GetReturnValue().Set(WrapStruct(creds));
   }
   }
-  NanReturnValue(WrapStruct(creds));
 }
 }
 
 
 NAN_METHOD(Credentials::CreateGce) {
 NAN_METHOD(Credentials::CreateGce) {
-  NanScope();
+  Nan::HandleScope scope;
   grpc_credentials *creds = grpc_google_compute_engine_credentials_create(NULL);
   grpc_credentials *creds = grpc_google_compute_engine_credentials_create(NULL);
   if (creds == NULL) {
   if (creds == NULL) {
-    NanReturnNull();
+    info.GetReturnValue().SetNull();
+  } else {
+    info.GetReturnValue().Set(WrapStruct(creds));
   }
   }
-  NanReturnValue(WrapStruct(creds));
 }
 }
 
 
 NAN_METHOD(Credentials::CreateIam) {
 NAN_METHOD(Credentials::CreateIam) {
-  NanScope();
-  if (!args[0]->IsString()) {
-    return NanThrowTypeError("createIam's first argument must be a string");
+  if (!info[0]->IsString()) {
+    return Nan::ThrowTypeError("createIam's first argument must be a string");
   }
   }
-  if (!args[1]->IsString()) {
-    return NanThrowTypeError("createIam's second argument must be a string");
+  if (!info[1]->IsString()) {
+    return Nan::ThrowTypeError("createIam's second argument must be a string");
   }
   }
-  NanUtf8String auth_token(args[0]);
-  NanUtf8String auth_selector(args[1]);
+  Utf8String auth_token(info[0]);
+  Utf8String auth_selector(info[1]);
   grpc_credentials *creds =
   grpc_credentials *creds =
       grpc_google_iam_credentials_create(*auth_token, *auth_selector, NULL);
       grpc_google_iam_credentials_create(*auth_token, *auth_selector, NULL);
   if (creds == NULL) {
   if (creds == NULL) {
-    NanReturnNull();
+    info.GetReturnValue().SetNull();
+  } else {
+    info.GetReturnValue().Set(WrapStruct(creds));
   }
   }
-  NanReturnValue(WrapStruct(creds));
 }
 }
 
 
 NAN_METHOD(Credentials::CreateInsecure) {
 NAN_METHOD(Credentials::CreateInsecure) {
-  NanScope();
-  NanReturnValue(WrapStruct(NULL));
+  info.GetReturnValue().Set(WrapStruct(NULL));
 }
 }
 
 
 }  // namespace node
 }  // namespace node

+ 6 - 6
src/node/ext/credentials.h

@@ -43,12 +43,12 @@ namespace grpc {
 namespace node {
 namespace node {
 
 
 /* Wrapper class for grpc_credentials structs */
 /* Wrapper class for grpc_credentials structs */
-class Credentials : public ::node::ObjectWrap {
+class Credentials : public Nan::ObjectWrap {
  public:
  public:
-  static void Init(v8::Handle<v8::Object> exports);
-  static bool HasInstance(v8::Handle<v8::Value> val);
+  static void Init(v8::Local<v8::Object> exports);
+  static bool HasInstance(v8::Local<v8::Value> val);
   /* Wrap a grpc_credentials struct in a javascript object */
   /* Wrap a grpc_credentials struct in a javascript object */
-  static v8::Handle<v8::Value> WrapStruct(grpc_credentials *credentials);
+  static v8::Local<v8::Value> WrapStruct(grpc_credentials *credentials);
 
 
   /* Returns the grpc_credentials struct that this object wraps */
   /* Returns the grpc_credentials struct that this object wraps */
   grpc_credentials *GetWrappedCredentials();
   grpc_credentials *GetWrappedCredentials();
@@ -69,9 +69,9 @@ class Credentials : public ::node::ObjectWrap {
   static NAN_METHOD(CreateFake);
   static NAN_METHOD(CreateFake);
   static NAN_METHOD(CreateIam);
   static NAN_METHOD(CreateIam);
   static NAN_METHOD(CreateInsecure);
   static NAN_METHOD(CreateInsecure);
-  static NanCallback *constructor;
+  static Nan::Callback *constructor;
   // Used for typechecking instances of this javascript class
   // Used for typechecking instances of this javascript class
-  static v8::Persistent<v8::FunctionTemplate> fun_tpl;
+  static Nan::Persistent<v8::FunctionTemplate> fun_tpl;
 
 
   grpc_credentials *wrapped_credentials;
   grpc_credentials *wrapped_credentials;
 };
 };

+ 171 - 148
src/node/ext/node_grpc.cc

@@ -43,171 +43,194 @@
 #include "credentials.h"
 #include "credentials.h"
 #include "server_credentials.h"
 #include "server_credentials.h"
 
 
-using v8::Handle;
+using v8::Local;
 using v8::Value;
 using v8::Value;
 using v8::Object;
 using v8::Object;
 using v8::Uint32;
 using v8::Uint32;
 using v8::String;
 using v8::String;
 
 
-void InitStatusConstants(Handle<Object> exports) {
-  NanScope();
-  Handle<Object> status = NanNew<Object>();
-  exports->Set(NanNew("status"), status);
-  Handle<Value> OK(NanNew<Uint32, uint32_t>(GRPC_STATUS_OK));
-  status->Set(NanNew("OK"), OK);
-  Handle<Value> CANCELLED(NanNew<Uint32, uint32_t>(GRPC_STATUS_CANCELLED));
-  status->Set(NanNew("CANCELLED"), CANCELLED);
-  Handle<Value> UNKNOWN(NanNew<Uint32, uint32_t>(GRPC_STATUS_UNKNOWN));
-  status->Set(NanNew("UNKNOWN"), UNKNOWN);
-  Handle<Value> INVALID_ARGUMENT(
-      NanNew<Uint32, uint32_t>(GRPC_STATUS_INVALID_ARGUMENT));
-  status->Set(NanNew("INVALID_ARGUMENT"), INVALID_ARGUMENT);
-  Handle<Value> DEADLINE_EXCEEDED(
-      NanNew<Uint32, uint32_t>(GRPC_STATUS_DEADLINE_EXCEEDED));
-  status->Set(NanNew("DEADLINE_EXCEEDED"), DEADLINE_EXCEEDED);
-  Handle<Value> NOT_FOUND(NanNew<Uint32, uint32_t>(GRPC_STATUS_NOT_FOUND));
-  status->Set(NanNew("NOT_FOUND"), NOT_FOUND);
-  Handle<Value> ALREADY_EXISTS(
-      NanNew<Uint32, uint32_t>(GRPC_STATUS_ALREADY_EXISTS));
-  status->Set(NanNew("ALREADY_EXISTS"), ALREADY_EXISTS);
-  Handle<Value> PERMISSION_DENIED(
-      NanNew<Uint32, uint32_t>(GRPC_STATUS_PERMISSION_DENIED));
-  status->Set(NanNew("PERMISSION_DENIED"), PERMISSION_DENIED);
-  Handle<Value> UNAUTHENTICATED(
-      NanNew<Uint32, uint32_t>(GRPC_STATUS_UNAUTHENTICATED));
-  status->Set(NanNew("UNAUTHENTICATED"), UNAUTHENTICATED);
-  Handle<Value> RESOURCE_EXHAUSTED(
-      NanNew<Uint32, uint32_t>(GRPC_STATUS_RESOURCE_EXHAUSTED));
-  status->Set(NanNew("RESOURCE_EXHAUSTED"), RESOURCE_EXHAUSTED);
-  Handle<Value> FAILED_PRECONDITION(
-      NanNew<Uint32, uint32_t>(GRPC_STATUS_FAILED_PRECONDITION));
-  status->Set(NanNew("FAILED_PRECONDITION"), FAILED_PRECONDITION);
-  Handle<Value> ABORTED(NanNew<Uint32, uint32_t>(GRPC_STATUS_ABORTED));
-  status->Set(NanNew("ABORTED"), ABORTED);
-  Handle<Value> OUT_OF_RANGE(
-      NanNew<Uint32, uint32_t>(GRPC_STATUS_OUT_OF_RANGE));
-  status->Set(NanNew("OUT_OF_RANGE"), OUT_OF_RANGE);
-  Handle<Value> UNIMPLEMENTED(
-      NanNew<Uint32, uint32_t>(GRPC_STATUS_UNIMPLEMENTED));
-  status->Set(NanNew("UNIMPLEMENTED"), UNIMPLEMENTED);
-  Handle<Value> INTERNAL(NanNew<Uint32, uint32_t>(GRPC_STATUS_INTERNAL));
-  status->Set(NanNew("INTERNAL"), INTERNAL);
-  Handle<Value> UNAVAILABLE(NanNew<Uint32, uint32_t>(GRPC_STATUS_UNAVAILABLE));
-  status->Set(NanNew("UNAVAILABLE"), UNAVAILABLE);
-  Handle<Value> DATA_LOSS(NanNew<Uint32, uint32_t>(GRPC_STATUS_DATA_LOSS));
-  status->Set(NanNew("DATA_LOSS"), DATA_LOSS);
+void InitStatusConstants(Local<Object> exports) {
+  Nan::HandleScope scope;
+  Local<Object> status = Nan::New<Object>();
+  Nan::Set(exports, Nan::New("status").ToLocalChecked(), status);
+  Local<Value> OK(Nan::New<Uint32, uint32_t>(GRPC_STATUS_OK));
+  Nan::Set(status, Nan::New("OK").ToLocalChecked(), OK);
+  Local<Value> CANCELLED(Nan::New<Uint32, uint32_t>(GRPC_STATUS_CANCELLED));
+  Nan::Set(status, Nan::New("CANCELLED").ToLocalChecked(), CANCELLED);
+  Local<Value> UNKNOWN(Nan::New<Uint32, uint32_t>(GRPC_STATUS_UNKNOWN));
+  Nan::Set(status, Nan::New("UNKNOWN").ToLocalChecked(), UNKNOWN);
+  Local<Value> INVALID_ARGUMENT(
+      Nan::New<Uint32, uint32_t>(GRPC_STATUS_INVALID_ARGUMENT));
+  Nan::Set(status, Nan::New("INVALID_ARGUMENT").ToLocalChecked(),
+           INVALID_ARGUMENT);
+  Local<Value> DEADLINE_EXCEEDED(
+      Nan::New<Uint32, uint32_t>(GRPC_STATUS_DEADLINE_EXCEEDED));
+  Nan::Set(status, Nan::New("DEADLINE_EXCEEDED").ToLocalChecked(),
+           DEADLINE_EXCEEDED);
+  Local<Value> NOT_FOUND(Nan::New<Uint32, uint32_t>(GRPC_STATUS_NOT_FOUND));
+  Nan::Set(status, Nan::New("NOT_FOUND").ToLocalChecked(), NOT_FOUND);
+  Local<Value> ALREADY_EXISTS(
+      Nan::New<Uint32, uint32_t>(GRPC_STATUS_ALREADY_EXISTS));
+  Nan::Set(status, Nan::New("ALREADY_EXISTS").ToLocalChecked(), ALREADY_EXISTS);
+  Local<Value> PERMISSION_DENIED(
+      Nan::New<Uint32, uint32_t>(GRPC_STATUS_PERMISSION_DENIED));
+  Nan::Set(status, Nan::New("PERMISSION_DENIED").ToLocalChecked(),
+           PERMISSION_DENIED);
+  Local<Value> UNAUTHENTICATED(
+      Nan::New<Uint32, uint32_t>(GRPC_STATUS_UNAUTHENTICATED));
+  Nan::Set(status, Nan::New("UNAUTHENTICATED").ToLocalChecked(),
+           UNAUTHENTICATED);
+  Local<Value> RESOURCE_EXHAUSTED(
+      Nan::New<Uint32, uint32_t>(GRPC_STATUS_RESOURCE_EXHAUSTED));
+  Nan::Set(status, Nan::New("RESOURCE_EXHAUSTED").ToLocalChecked(),
+           RESOURCE_EXHAUSTED);
+  Local<Value> FAILED_PRECONDITION(
+      Nan::New<Uint32, uint32_t>(GRPC_STATUS_FAILED_PRECONDITION));
+  Nan::Set(status, Nan::New("FAILED_PRECONDITION").ToLocalChecked(),
+           FAILED_PRECONDITION);
+  Local<Value> ABORTED(Nan::New<Uint32, uint32_t>(GRPC_STATUS_ABORTED));
+  Nan::Set(status, Nan::New("ABORTED").ToLocalChecked(), ABORTED);
+  Local<Value> OUT_OF_RANGE(
+      Nan::New<Uint32, uint32_t>(GRPC_STATUS_OUT_OF_RANGE));
+  Nan::Set(status, Nan::New("OUT_OF_RANGE").ToLocalChecked(), OUT_OF_RANGE);
+  Local<Value> UNIMPLEMENTED(
+      Nan::New<Uint32, uint32_t>(GRPC_STATUS_UNIMPLEMENTED));
+  Nan::Set(status, Nan::New("UNIMPLEMENTED").ToLocalChecked(), UNIMPLEMENTED);
+  Local<Value> INTERNAL(Nan::New<Uint32, uint32_t>(GRPC_STATUS_INTERNAL));
+  Nan::Set(status, Nan::New("INTERNAL").ToLocalChecked(), INTERNAL);
+  Local<Value> UNAVAILABLE(Nan::New<Uint32, uint32_t>(GRPC_STATUS_UNAVAILABLE));
+  Nan::Set(status, Nan::New("UNAVAILABLE").ToLocalChecked(), UNAVAILABLE);
+  Local<Value> DATA_LOSS(Nan::New<Uint32, uint32_t>(GRPC_STATUS_DATA_LOSS));
+  Nan::Set(status, Nan::New("DATA_LOSS").ToLocalChecked(), DATA_LOSS);
 }
 }
 
 
-void InitCallErrorConstants(Handle<Object> exports) {
-  NanScope();
-  Handle<Object> call_error = NanNew<Object>();
-  exports->Set(NanNew("callError"), call_error);
-  Handle<Value> OK(NanNew<Uint32, uint32_t>(GRPC_CALL_OK));
-  call_error->Set(NanNew("OK"), OK);
-  Handle<Value> ERROR(NanNew<Uint32, uint32_t>(GRPC_CALL_ERROR));
-  call_error->Set(NanNew("ERROR"), ERROR);
-  Handle<Value> NOT_ON_SERVER(
-      NanNew<Uint32, uint32_t>(GRPC_CALL_ERROR_NOT_ON_SERVER));
-  call_error->Set(NanNew("NOT_ON_SERVER"), NOT_ON_SERVER);
-  Handle<Value> NOT_ON_CLIENT(
-      NanNew<Uint32, uint32_t>(GRPC_CALL_ERROR_NOT_ON_CLIENT));
-  call_error->Set(NanNew("NOT_ON_CLIENT"), NOT_ON_CLIENT);
-  Handle<Value> ALREADY_INVOKED(
-      NanNew<Uint32, uint32_t>(GRPC_CALL_ERROR_ALREADY_INVOKED));
-  call_error->Set(NanNew("ALREADY_INVOKED"), ALREADY_INVOKED);
-  Handle<Value> NOT_INVOKED(
-      NanNew<Uint32, uint32_t>(GRPC_CALL_ERROR_NOT_INVOKED));
-  call_error->Set(NanNew("NOT_INVOKED"), NOT_INVOKED);
-  Handle<Value> ALREADY_FINISHED(
-      NanNew<Uint32, uint32_t>(GRPC_CALL_ERROR_ALREADY_FINISHED));
-  call_error->Set(NanNew("ALREADY_FINISHED"), ALREADY_FINISHED);
-  Handle<Value> TOO_MANY_OPERATIONS(
-      NanNew<Uint32, uint32_t>(GRPC_CALL_ERROR_TOO_MANY_OPERATIONS));
-  call_error->Set(NanNew("TOO_MANY_OPERATIONS"), TOO_MANY_OPERATIONS);
-  Handle<Value> INVALID_FLAGS(
-      NanNew<Uint32, uint32_t>(GRPC_CALL_ERROR_INVALID_FLAGS));
-  call_error->Set(NanNew("INVALID_FLAGS"), INVALID_FLAGS);
+void InitCallErrorConstants(Local<Object> exports) {
+  Nan::HandleScope scope;
+  Local<Object> call_error = Nan::New<Object>();
+  Nan::Set(exports, Nan::New("callError").ToLocalChecked(), call_error);
+  Local<Value> OK(Nan::New<Uint32, uint32_t>(GRPC_CALL_OK));
+  Nan::Set(call_error, Nan::New("OK").ToLocalChecked(), OK);
+  Local<Value> ERROR(Nan::New<Uint32, uint32_t>(GRPC_CALL_ERROR));
+  Nan::Set(call_error, Nan::New("ERROR").ToLocalChecked(), ERROR);
+  Local<Value> NOT_ON_SERVER(
+      Nan::New<Uint32, uint32_t>(GRPC_CALL_ERROR_NOT_ON_SERVER));
+  Nan::Set(call_error, Nan::New("NOT_ON_SERVER").ToLocalChecked(),
+           NOT_ON_SERVER);
+  Local<Value> NOT_ON_CLIENT(
+      Nan::New<Uint32, uint32_t>(GRPC_CALL_ERROR_NOT_ON_CLIENT));
+  Nan::Set(call_error, Nan::New("NOT_ON_CLIENT").ToLocalChecked(),
+           NOT_ON_CLIENT);
+  Local<Value> ALREADY_INVOKED(
+      Nan::New<Uint32, uint32_t>(GRPC_CALL_ERROR_ALREADY_INVOKED));
+  Nan::Set(call_error, Nan::New("ALREADY_INVOKED").ToLocalChecked(),
+           ALREADY_INVOKED);
+  Local<Value> NOT_INVOKED(
+      Nan::New<Uint32, uint32_t>(GRPC_CALL_ERROR_NOT_INVOKED));
+  Nan::Set(call_error, Nan::New("NOT_INVOKED").ToLocalChecked(), NOT_INVOKED);
+  Local<Value> ALREADY_FINISHED(
+      Nan::New<Uint32, uint32_t>(GRPC_CALL_ERROR_ALREADY_FINISHED));
+  Nan::Set(call_error, Nan::New("ALREADY_FINISHED").ToLocalChecked(),
+           ALREADY_FINISHED);
+  Local<Value> TOO_MANY_OPERATIONS(
+      Nan::New<Uint32, uint32_t>(GRPC_CALL_ERROR_TOO_MANY_OPERATIONS));
+  Nan::Set(call_error, Nan::New("TOO_MANY_OPERATIONS").ToLocalChecked(),
+           TOO_MANY_OPERATIONS);
+  Local<Value> INVALID_FLAGS(
+      Nan::New<Uint32, uint32_t>(GRPC_CALL_ERROR_INVALID_FLAGS));
+  Nan::Set(call_error, Nan::New("INVALID_FLAGS").ToLocalChecked(),
+           INVALID_FLAGS);
 }
 }
 
 
-void InitOpTypeConstants(Handle<Object> exports) {
-  NanScope();
-  Handle<Object> op_type = NanNew<Object>();
-  exports->Set(NanNew("opType"), op_type);
-  Handle<Value> SEND_INITIAL_METADATA(
-      NanNew<Uint32, uint32_t>(GRPC_OP_SEND_INITIAL_METADATA));
-  op_type->Set(NanNew("SEND_INITIAL_METADATA"), SEND_INITIAL_METADATA);
-  Handle<Value> SEND_MESSAGE(
-      NanNew<Uint32, uint32_t>(GRPC_OP_SEND_MESSAGE));
-  op_type->Set(NanNew("SEND_MESSAGE"), SEND_MESSAGE);
-  Handle<Value> SEND_CLOSE_FROM_CLIENT(
-      NanNew<Uint32, uint32_t>(GRPC_OP_SEND_CLOSE_FROM_CLIENT));
-  op_type->Set(NanNew("SEND_CLOSE_FROM_CLIENT"), SEND_CLOSE_FROM_CLIENT);
-  Handle<Value> SEND_STATUS_FROM_SERVER(
-      NanNew<Uint32, uint32_t>(GRPC_OP_SEND_STATUS_FROM_SERVER));
-  op_type->Set(NanNew("SEND_STATUS_FROM_SERVER"), SEND_STATUS_FROM_SERVER);
-  Handle<Value> RECV_INITIAL_METADATA(
-      NanNew<Uint32, uint32_t>(GRPC_OP_RECV_INITIAL_METADATA));
-  op_type->Set(NanNew("RECV_INITIAL_METADATA"), RECV_INITIAL_METADATA);
-  Handle<Value> RECV_MESSAGE(
-      NanNew<Uint32, uint32_t>(GRPC_OP_RECV_MESSAGE));
-  op_type->Set(NanNew("RECV_MESSAGE"), RECV_MESSAGE);
-  Handle<Value> RECV_STATUS_ON_CLIENT(
-      NanNew<Uint32, uint32_t>(GRPC_OP_RECV_STATUS_ON_CLIENT));
-  op_type->Set(NanNew("RECV_STATUS_ON_CLIENT"), RECV_STATUS_ON_CLIENT);
-  Handle<Value> RECV_CLOSE_ON_SERVER(
-      NanNew<Uint32, uint32_t>(GRPC_OP_RECV_CLOSE_ON_SERVER));
-  op_type->Set(NanNew("RECV_CLOSE_ON_SERVER"), RECV_CLOSE_ON_SERVER);
+void InitOpTypeConstants(Local<Object> exports) {
+  Nan::HandleScope scope;
+  Local<Object> op_type = Nan::New<Object>();
+  Nan::Set(exports, Nan::New("opType").ToLocalChecked(), op_type);
+  Local<Value> SEND_INITIAL_METADATA(
+      Nan::New<Uint32, uint32_t>(GRPC_OP_SEND_INITIAL_METADATA));
+  Nan::Set(op_type, Nan::New("SEND_INITIAL_METADATA").ToLocalChecked(),
+           SEND_INITIAL_METADATA);
+  Local<Value> SEND_MESSAGE(
+      Nan::New<Uint32, uint32_t>(GRPC_OP_SEND_MESSAGE));
+  Nan::Set(op_type, Nan::New("SEND_MESSAGE").ToLocalChecked(), SEND_MESSAGE);
+  Local<Value> SEND_CLOSE_FROM_CLIENT(
+      Nan::New<Uint32, uint32_t>(GRPC_OP_SEND_CLOSE_FROM_CLIENT));
+  Nan::Set(op_type, Nan::New("SEND_CLOSE_FROM_CLIENT").ToLocalChecked(),
+           SEND_CLOSE_FROM_CLIENT);
+  Local<Value> SEND_STATUS_FROM_SERVER(
+      Nan::New<Uint32, uint32_t>(GRPC_OP_SEND_STATUS_FROM_SERVER));
+  Nan::Set(op_type, Nan::New("SEND_STATUS_FROM_SERVER").ToLocalChecked(),
+           SEND_STATUS_FROM_SERVER);
+  Local<Value> RECV_INITIAL_METADATA(
+      Nan::New<Uint32, uint32_t>(GRPC_OP_RECV_INITIAL_METADATA));
+  Nan::Set(op_type, Nan::New("RECV_INITIAL_METADATA").ToLocalChecked(),
+           RECV_INITIAL_METADATA);
+  Local<Value> RECV_MESSAGE(
+      Nan::New<Uint32, uint32_t>(GRPC_OP_RECV_MESSAGE));
+  Nan::Set(op_type, Nan::New("RECV_MESSAGE").ToLocalChecked(), RECV_MESSAGE);
+  Local<Value> RECV_STATUS_ON_CLIENT(
+      Nan::New<Uint32, uint32_t>(GRPC_OP_RECV_STATUS_ON_CLIENT));
+  Nan::Set(op_type, Nan::New("RECV_STATUS_ON_CLIENT").ToLocalChecked(),
+           RECV_STATUS_ON_CLIENT);
+  Local<Value> RECV_CLOSE_ON_SERVER(
+      Nan::New<Uint32, uint32_t>(GRPC_OP_RECV_CLOSE_ON_SERVER));
+  Nan::Set(op_type, Nan::New("RECV_CLOSE_ON_SERVER").ToLocalChecked(),
+           RECV_CLOSE_ON_SERVER);
 }
 }
 
 
-void InitPropagateConstants(Handle<Object> exports) {
-  NanScope();
-  Handle<Object> propagate = NanNew<Object>();
-  exports->Set(NanNew("propagate"), propagate);
-  Handle<Value> DEADLINE(NanNew<Uint32, uint32_t>(GRPC_PROPAGATE_DEADLINE));
-  propagate->Set(NanNew("DEADLINE"), DEADLINE);
-  Handle<Value> CENSUS_STATS_CONTEXT(
-      NanNew<Uint32, uint32_t>(GRPC_PROPAGATE_CENSUS_STATS_CONTEXT));
-  propagate->Set(NanNew("CENSUS_STATS_CONTEXT"), CENSUS_STATS_CONTEXT);
-  Handle<Value> CENSUS_TRACING_CONTEXT(
-      NanNew<Uint32, uint32_t>(GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT));
-  propagate->Set(NanNew("CENSUS_TRACING_CONTEXT"), CENSUS_TRACING_CONTEXT);
-  Handle<Value> CANCELLATION(
-      NanNew<Uint32, uint32_t>(GRPC_PROPAGATE_CANCELLATION));
-  propagate->Set(NanNew("CANCELLATION"), CANCELLATION);
-  Handle<Value> DEFAULTS(NanNew<Uint32, uint32_t>(GRPC_PROPAGATE_DEFAULTS));
-  propagate->Set(NanNew("DEFAULTS"), DEFAULTS);
+void InitPropagateConstants(Local<Object> exports) {
+  Nan::HandleScope scope;
+  Local<Object> propagate = Nan::New<Object>();
+  Nan::Set(exports, Nan::New("propagate").ToLocalChecked(), propagate);
+  Local<Value> DEADLINE(Nan::New<Uint32, uint32_t>(GRPC_PROPAGATE_DEADLINE));
+  Nan::Set(propagate, Nan::New("DEADLINE").ToLocalChecked(), DEADLINE);
+  Local<Value> CENSUS_STATS_CONTEXT(
+      Nan::New<Uint32, uint32_t>(GRPC_PROPAGATE_CENSUS_STATS_CONTEXT));
+  Nan::Set(propagate, Nan::New("CENSUS_STATS_CONTEXT").ToLocalChecked(),
+           CENSUS_STATS_CONTEXT);
+  Local<Value> CENSUS_TRACING_CONTEXT(
+      Nan::New<Uint32, uint32_t>(GRPC_PROPAGATE_CENSUS_TRACING_CONTEXT));
+  Nan::Set(propagate, Nan::New("CENSUS_TRACING_CONTEXT").ToLocalChecked(),
+           CENSUS_TRACING_CONTEXT);
+  Local<Value> CANCELLATION(
+      Nan::New<Uint32, uint32_t>(GRPC_PROPAGATE_CANCELLATION));
+  Nan::Set(propagate, Nan::New("CANCELLATION").ToLocalChecked(), CANCELLATION);
+  Local<Value> DEFAULTS(Nan::New<Uint32, uint32_t>(GRPC_PROPAGATE_DEFAULTS));
+  Nan::Set(propagate, Nan::New("DEFAULTS").ToLocalChecked(), DEFAULTS);
 }
 }
 
 
-void InitConnectivityStateConstants(Handle<Object> exports) {
-  NanScope();
-  Handle<Object> channel_state = NanNew<Object>();
-  exports->Set(NanNew("connectivityState"), channel_state);
-  Handle<Value> IDLE(NanNew<Uint32, uint32_t>(GRPC_CHANNEL_IDLE));
-  channel_state->Set(NanNew("IDLE"), IDLE);
-  Handle<Value> CONNECTING(NanNew<Uint32, uint32_t>(GRPC_CHANNEL_CONNECTING));
-  channel_state->Set(NanNew("CONNECTING"), CONNECTING);
-  Handle<Value> READY(NanNew<Uint32, uint32_t>(GRPC_CHANNEL_READY));
-  channel_state->Set(NanNew("READY"), READY);
-  Handle<Value> TRANSIENT_FAILURE(
-      NanNew<Uint32, uint32_t>(GRPC_CHANNEL_TRANSIENT_FAILURE));
-  channel_state->Set(NanNew("TRANSIENT_FAILURE"), TRANSIENT_FAILURE);
-  Handle<Value> FATAL_FAILURE(
-      NanNew<Uint32, uint32_t>(GRPC_CHANNEL_FATAL_FAILURE));
-  channel_state->Set(NanNew("FATAL_FAILURE"), FATAL_FAILURE);
+void InitConnectivityStateConstants(Local<Object> exports) {
+  Nan::HandleScope scope;
+  Local<Object> channel_state = Nan::New<Object>();
+  Nan::Set(exports, Nan::New("connectivityState").ToLocalChecked(),
+           channel_state);
+  Local<Value> IDLE(Nan::New<Uint32, uint32_t>(GRPC_CHANNEL_IDLE));
+  Nan::Set(channel_state, Nan::New("IDLE").ToLocalChecked(), IDLE);
+  Local<Value> CONNECTING(Nan::New<Uint32, uint32_t>(GRPC_CHANNEL_CONNECTING));
+  Nan::Set(channel_state, Nan::New("CONNECTING").ToLocalChecked(), CONNECTING);
+  Local<Value> READY(Nan::New<Uint32, uint32_t>(GRPC_CHANNEL_READY));
+  Nan::Set(channel_state, Nan::New("READY").ToLocalChecked(), READY);
+  Local<Value> TRANSIENT_FAILURE(
+      Nan::New<Uint32, uint32_t>(GRPC_CHANNEL_TRANSIENT_FAILURE));
+  Nan::Set(channel_state, Nan::New("TRANSIENT_FAILURE").ToLocalChecked(),
+           TRANSIENT_FAILURE);
+  Local<Value> FATAL_FAILURE(
+      Nan::New<Uint32, uint32_t>(GRPC_CHANNEL_FATAL_FAILURE));
+  Nan::Set(channel_state, Nan::New("FATAL_FAILURE").ToLocalChecked(),
+           FATAL_FAILURE);
 }
 }
 
 
-void InitWriteFlags(Handle<Object> exports) {
-  NanScope();
-  Handle<Object> write_flags = NanNew<Object>();
-  exports->Set(NanNew("writeFlags"), write_flags);
-  Handle<Value> BUFFER_HINT(NanNew<Uint32, uint32_t>(GRPC_WRITE_BUFFER_HINT));
-  write_flags->Set(NanNew("BUFFER_HINT"), BUFFER_HINT);
-  Handle<Value> NO_COMPRESS(NanNew<Uint32, uint32_t>(GRPC_WRITE_NO_COMPRESS));
-  write_flags->Set(NanNew("NO_COMPRESS"), NO_COMPRESS);
+void InitWriteFlags(Local<Object> exports) {
+  Nan::HandleScope scope;
+  Local<Object> write_flags = Nan::New<Object>();
+  Nan::Set(exports, Nan::New("writeFlags").ToLocalChecked(), write_flags);
+  Local<Value> BUFFER_HINT(Nan::New<Uint32, uint32_t>(GRPC_WRITE_BUFFER_HINT));
+  Nan::Set(write_flags, Nan::New("BUFFER_HINT").ToLocalChecked(), BUFFER_HINT);
+  Local<Value> NO_COMPRESS(Nan::New<Uint32, uint32_t>(GRPC_WRITE_NO_COMPRESS));
+  Nan::Set(write_flags, Nan::New("NO_COMPRESS").ToLocalChecked(), NO_COMPRESS);
 }
 }
 
 
-void init(Handle<Object> exports) {
-  NanScope();
+void init(Local<Object> exports) {
+  Nan::HandleScope scope;
   grpc_init();
   grpc_init();
   InitStatusConstants(exports);
   InitStatusConstants(exports);
   InitCallErrorConstants(exports);
   InitCallErrorConstants(exports);

+ 105 - 97
src/node/ext/server.cc

@@ -50,6 +50,15 @@
 namespace grpc {
 namespace grpc {
 namespace node {
 namespace node {
 
 
+using Nan::Callback;
+using Nan::EscapableHandleScope;
+using Nan::HandleScope;
+using Nan::Maybe;
+using Nan::MaybeLocal;
+using Nan::ObjectWrap;
+using Nan::Persistent;
+using Nan::Utf8String;
+
 using std::unique_ptr;
 using std::unique_ptr;
 using v8::Array;
 using v8::Array;
 using v8::Boolean;
 using v8::Boolean;
@@ -57,16 +66,13 @@ using v8::Date;
 using v8::Exception;
 using v8::Exception;
 using v8::Function;
 using v8::Function;
 using v8::FunctionTemplate;
 using v8::FunctionTemplate;
-using v8::Handle;
-using v8::HandleScope;
 using v8::Local;
 using v8::Local;
 using v8::Number;
 using v8::Number;
 using v8::Object;
 using v8::Object;
-using v8::Persistent;
 using v8::String;
 using v8::String;
 using v8::Value;
 using v8::Value;
 
 
-NanCallback *Server::constructor;
+Nan::Callback *Server::constructor;
 Persistent<FunctionTemplate> Server::fun_tpl;
 Persistent<FunctionTemplate> Server::fun_tpl;
 
 
 class NewCallOp : public Op {
 class NewCallOp : public Op {
@@ -82,22 +88,26 @@ class NewCallOp : public Op {
     grpc_metadata_array_destroy(&request_metadata);
     grpc_metadata_array_destroy(&request_metadata);
   }
   }
 
 
-  Handle<Value> GetNodeValue() const {
-    NanEscapableScope();
+  Local<Value> GetNodeValue() const {
+    Nan::EscapableHandleScope scope;
     if (call == NULL) {
     if (call == NULL) {
-      return NanEscapeScope(NanNull());
+      return scope.Escape(Nan::Null());
     }
     }
-    Handle<Object> obj = NanNew<Object>();
-    obj->Set(NanNew("call"), Call::WrapStruct(call));
-    obj->Set(NanNew("method"), NanNew(details.method));
-    obj->Set(NanNew("host"), NanNew(details.host));
-    obj->Set(NanNew("deadline"),
-             NanNew<Date>(TimespecToMilliseconds(details.deadline)));
-    obj->Set(NanNew("metadata"), ParseMetadata(&request_metadata));
-    return NanEscapeScope(obj);
+    Local<Object> obj = Nan::New<Object>();
+    Nan::Set(obj, Nan::New("call").ToLocalChecked(), Call::WrapStruct(call));
+    Nan::Set(obj, Nan::New("method").ToLocalChecked(),
+             Nan::New(details.method).ToLocalChecked());
+    Nan::Set(obj, Nan::New("host").ToLocalChecked(),
+             Nan::New(details.host).ToLocalChecked());
+    Nan::Set(obj, Nan::New("deadline").ToLocalChecked(),
+             Nan::New<Date>(
+                 TimespecToMilliseconds(details.deadline)).ToLocalChecked());
+    Nan::Set(obj, Nan::New("metadata").ToLocalChecked(),
+             ParseMetadata(&request_metadata));
+    return scope.Escape(obj);
   }
   }
 
 
-  bool ParseOp(Handle<Value> value, grpc_op *out,
+  bool ParseOp(Local<Value> value, grpc_op *out,
                shared_ptr<Resources> resources) {
                shared_ptr<Resources> resources) {
     return true;
     return true;
   }
   }
@@ -124,35 +134,25 @@ Server::~Server() {
   grpc_completion_queue_destroy(this->shutdown_queue);
   grpc_completion_queue_destroy(this->shutdown_queue);
 }
 }
 
 
-void Server::Init(Handle<Object> exports) {
-  NanScope();
-  Local<FunctionTemplate> tpl = NanNew<FunctionTemplate>(New);
-  tpl->SetClassName(NanNew("Server"));
+void Server::Init(Local<Object> exports) {
+  HandleScope scope;
+  Local<FunctionTemplate> tpl = Nan::New<FunctionTemplate>(New);
+  tpl->SetClassName(Nan::New("Server").ToLocalChecked());
   tpl->InstanceTemplate()->SetInternalFieldCount(1);
   tpl->InstanceTemplate()->SetInternalFieldCount(1);
-  NanSetPrototypeTemplate(tpl, "requestCall",
-                          NanNew<FunctionTemplate>(RequestCall)->GetFunction());
-
-  NanSetPrototypeTemplate(
-      tpl, "addHttp2Port",
-      NanNew<FunctionTemplate>(AddHttp2Port)->GetFunction());
-
-  NanSetPrototypeTemplate(tpl, "start",
-                          NanNew<FunctionTemplate>(Start)->GetFunction());
-
-  NanSetPrototypeTemplate(tpl, "tryShutdown",
-                          NanNew<FunctionTemplate>(TryShutdown)->GetFunction());
-  NanSetPrototypeTemplate(
-      tpl, "forceShutdown",
-      NanNew<FunctionTemplate>(ForceShutdown)->GetFunction());
-
-  NanAssignPersistent(fun_tpl, tpl);
-  Handle<Function> ctr = tpl->GetFunction();
-  constructor = new NanCallback(ctr);
-  exports->Set(NanNew("Server"), ctr);
+  Nan::SetPrototypeMethod(tpl, "requestCall", RequestCall);
+  Nan::SetPrototypeMethod(tpl, "addHttp2Port", AddHttp2Port);
+  Nan::SetPrototypeMethod(tpl, "start", Start);
+  Nan::SetPrototypeMethod(tpl, "tryShutdown", TryShutdown);
+  Nan::SetPrototypeMethod(tpl, "forceShutdown", ForceShutdown);
+  fun_tpl.Reset(tpl);
+  Local<Function> ctr = Nan::GetFunction(tpl).ToLocalChecked();
+  Nan::Set(exports, Nan::New("Server").ToLocalChecked(), ctr);
+  constructor = new Callback(ctr);
 }
 }
 
 
-bool Server::HasInstance(Handle<Value> val) {
-  return NanHasInstance(fun_tpl, val);
+bool Server::HasInstance(Local<Value> val) {
+  HandleScope scope;
+  return Nan::New(fun_tpl)->HasInstance(val);
 }
 }
 
 
 void Server::ShutdownServer() {
 void Server::ShutdownServer() {
@@ -165,64 +165,77 @@ void Server::ShutdownServer() {
 }
 }
 
 
 NAN_METHOD(Server::New) {
 NAN_METHOD(Server::New) {
-  NanScope();
-
   /* If this is not a constructor call, make a constructor call and return
   /* If this is not a constructor call, make a constructor call and return
      the result */
      the result */
-  if (!args.IsConstructCall()) {
+  if (!info.IsConstructCall()) {
     const int argc = 1;
     const int argc = 1;
-    Local<Value> argv[argc] = {args[0]};
-    NanReturnValue(constructor->GetFunction()->NewInstance(argc, argv));
+    Local<Value> argv[argc] = {info[0]};
+    MaybeLocal<Object> maybe_instance = constructor->GetFunction()->NewInstance(
+        argc, argv);
+    if (maybe_instance.IsEmpty()) {
+      // There's probably a pending exception
+      return;
+    } else {
+      info.GetReturnValue().Set(maybe_instance.ToLocalChecked());
+      return;
+    }
   }
   }
   grpc_server *wrapped_server;
   grpc_server *wrapped_server;
   grpc_completion_queue *queue = CompletionQueueAsyncWorker::GetQueue();
   grpc_completion_queue *queue = CompletionQueueAsyncWorker::GetQueue();
-  if (args[0]->IsUndefined()) {
+  if (info[0]->IsUndefined()) {
     wrapped_server = grpc_server_create(NULL, NULL);
     wrapped_server = grpc_server_create(NULL, NULL);
-  } else if (args[0]->IsObject()) {
-    Handle<Object> args_hash(args[0]->ToObject());
-    Handle<Array> keys(args_hash->GetOwnPropertyNames());
+  } else if (info[0]->IsObject()) {
+    Local<Object> args_hash = Nan::To<Object>(info[0]).ToLocalChecked();
+    Local<Array> keys = Nan::GetOwnPropertyNames(args_hash).ToLocalChecked();
     grpc_channel_args channel_args;
     grpc_channel_args channel_args;
     channel_args.num_args = keys->Length();
     channel_args.num_args = keys->Length();
     channel_args.args = reinterpret_cast<grpc_arg *>(
     channel_args.args = reinterpret_cast<grpc_arg *>(
         calloc(channel_args.num_args, sizeof(grpc_arg)));
         calloc(channel_args.num_args, sizeof(grpc_arg)));
     /* These are used to keep all strings until then end of the block, then
     /* These are used to keep all strings until then end of the block, then
        destroy them */
        destroy them */
-    std::vector<NanUtf8String *> key_strings(keys->Length());
-    std::vector<NanUtf8String *> value_strings(keys->Length());
+    std::vector<Utf8String *> key_strings(keys->Length());
+    std::vector<Utf8String *> value_strings(keys->Length());
     for (unsigned int i = 0; i < channel_args.num_args; i++) {
     for (unsigned int i = 0; i < channel_args.num_args; i++) {
-      Handle<String> current_key(keys->Get(i)->ToString());
-      Handle<Value> current_value(args_hash->Get(current_key));
-      key_strings[i] = new NanUtf8String(current_key);
+      MaybeLocal<String> maybe_key = Nan::To<String>(
+          Nan::Get(keys, i).ToLocalChecked());
+      if (maybe_key.IsEmpty()) {
+        free(channel_args.args);
+        return Nan::ThrowTypeError("Arg keys must be strings");
+      }
+      Local<String> current_key = maybe_key.ToLocalChecked();
+      Local<Value> current_value = Nan::Get(args_hash,
+                                             current_key).ToLocalChecked();
+      key_strings[i] = new Utf8String(current_key);
       channel_args.args[i].key = **key_strings[i];
       channel_args.args[i].key = **key_strings[i];
       if (current_value->IsInt32()) {
       if (current_value->IsInt32()) {
         channel_args.args[i].type = GRPC_ARG_INTEGER;
         channel_args.args[i].type = GRPC_ARG_INTEGER;
-        channel_args.args[i].value.integer = current_value->Int32Value();
+        channel_args.args[i].value.integer = Nan::To<int32_t>(
+            current_value).FromJust();
       } else if (current_value->IsString()) {
       } else if (current_value->IsString()) {
         channel_args.args[i].type = GRPC_ARG_STRING;
         channel_args.args[i].type = GRPC_ARG_STRING;
-        value_strings[i] = new NanUtf8String(current_value);
+        value_strings[i] = new Utf8String(current_value);
         channel_args.args[i].value.string = **value_strings[i];
         channel_args.args[i].value.string = **value_strings[i];
       } else {
       } else {
         free(channel_args.args);
         free(channel_args.args);
-        return NanThrowTypeError("Arg values must be strings");
+        return Nan::ThrowTypeError("Arg values must be strings");
       }
       }
     }
     }
     wrapped_server = grpc_server_create(&channel_args, NULL);
     wrapped_server = grpc_server_create(&channel_args, NULL);
     free(channel_args.args);
     free(channel_args.args);
   } else {
   } else {
-    return NanThrowTypeError("Server expects an object");
+    return Nan::ThrowTypeError("Server expects an object");
   }
   }
   grpc_server_register_completion_queue(wrapped_server, queue, NULL);
   grpc_server_register_completion_queue(wrapped_server, queue, NULL);
   Server *server = new Server(wrapped_server);
   Server *server = new Server(wrapped_server);
-  server->Wrap(args.This());
-  NanReturnValue(args.This());
+  server->Wrap(info.This());
+  info.GetReturnValue().Set(info.This());
 }
 }
 
 
 NAN_METHOD(Server::RequestCall) {
 NAN_METHOD(Server::RequestCall) {
-  NanScope();
-  if (!HasInstance(args.This())) {
-    return NanThrowTypeError("requestCall can only be called on a Server");
+  if (!HasInstance(info.This())) {
+    return Nan::ThrowTypeError("requestCall can only be called on a Server");
   }
   }
-  Server *server = ObjectWrap::Unwrap<Server>(args.This());
+  Server *server = ObjectWrap::Unwrap<Server>(info.This());
   NewCallOp *op = new NewCallOp();
   NewCallOp *op = new NewCallOp();
   unique_ptr<OpVec> ops(new OpVec());
   unique_ptr<OpVec> ops(new OpVec());
   ops->push_back(unique_ptr<Op>(op));
   ops->push_back(unique_ptr<Op>(op));
@@ -230,79 +243,74 @@ NAN_METHOD(Server::RequestCall) {
       server->wrapped_server, &op->call, &op->details, &op->request_metadata,
       server->wrapped_server, &op->call, &op->details, &op->request_metadata,
       CompletionQueueAsyncWorker::GetQueue(),
       CompletionQueueAsyncWorker::GetQueue(),
       CompletionQueueAsyncWorker::GetQueue(),
       CompletionQueueAsyncWorker::GetQueue(),
-      new struct tag(new NanCallback(args[0].As<Function>()), ops.release(),
+      new struct tag(new Callback(info[0].As<Function>()), ops.release(),
                      shared_ptr<Resources>(nullptr)));
                      shared_ptr<Resources>(nullptr)));
   if (error != GRPC_CALL_OK) {
   if (error != GRPC_CALL_OK) {
-    return NanThrowError(nanErrorWithCode("requestCall failed", error));
+    return Nan::ThrowError(nanErrorWithCode("requestCall failed", error));
   }
   }
   CompletionQueueAsyncWorker::Next();
   CompletionQueueAsyncWorker::Next();
-  NanReturnUndefined();
 }
 }
 
 
 NAN_METHOD(Server::AddHttp2Port) {
 NAN_METHOD(Server::AddHttp2Port) {
-  NanScope();
-  if (!HasInstance(args.This())) {
-    return NanThrowTypeError(
+  if (!HasInstance(info.This())) {
+    return Nan::ThrowTypeError(
         "addHttp2Port can only be called on a Server");
         "addHttp2Port can only be called on a Server");
   }
   }
-  if (!args[0]->IsString()) {
-    return NanThrowTypeError(
+  if (!info[0]->IsString()) {
+    return Nan::ThrowTypeError(
         "addHttp2Port's first argument must be a String");
         "addHttp2Port's first argument must be a String");
   }
   }
-  if (!ServerCredentials::HasInstance(args[1])) {
-    return NanThrowTypeError(
+  if (!ServerCredentials::HasInstance(info[1])) {
+    return Nan::ThrowTypeError(
         "addHttp2Port's second argument must be ServerCredentials");
         "addHttp2Port's second argument must be ServerCredentials");
   }
   }
-  Server *server = ObjectWrap::Unwrap<Server>(args.This());
+  Server *server = ObjectWrap::Unwrap<Server>(info.This());
   ServerCredentials *creds_object = ObjectWrap::Unwrap<ServerCredentials>(
   ServerCredentials *creds_object = ObjectWrap::Unwrap<ServerCredentials>(
-      args[1]->ToObject());
+      Nan::To<Object>(info[1]).ToLocalChecked());
   grpc_server_credentials *creds = creds_object->GetWrappedServerCredentials();
   grpc_server_credentials *creds = creds_object->GetWrappedServerCredentials();
   int port;
   int port;
   if (creds == NULL) {
   if (creds == NULL) {
     port = grpc_server_add_insecure_http2_port(server->wrapped_server,
     port = grpc_server_add_insecure_http2_port(server->wrapped_server,
-                                               *NanUtf8String(args[0]));
+                                               *Utf8String(info[0]));
   } else {
   } else {
     port = grpc_server_add_secure_http2_port(server->wrapped_server,
     port = grpc_server_add_secure_http2_port(server->wrapped_server,
-                                             *NanUtf8String(args[0]),
+                                             *Utf8String(info[0]),
                                              creds);
                                              creds);
   }
   }
-  NanReturnValue(NanNew<Number>(port));
+  info.GetReturnValue().Set(Nan::New<Number>(port));
 }
 }
 
 
 NAN_METHOD(Server::Start) {
 NAN_METHOD(Server::Start) {
-  NanScope();
-  if (!HasInstance(args.This())) {
-    return NanThrowTypeError("start can only be called on a Server");
+  Nan::HandleScope scope;
+  if (!HasInstance(info.This())) {
+    return Nan::ThrowTypeError("start can only be called on a Server");
   }
   }
-  Server *server = ObjectWrap::Unwrap<Server>(args.This());
+  Server *server = ObjectWrap::Unwrap<Server>(info.This());
   grpc_server_start(server->wrapped_server);
   grpc_server_start(server->wrapped_server);
-  NanReturnUndefined();
 }
 }
 
 
 NAN_METHOD(Server::TryShutdown) {
 NAN_METHOD(Server::TryShutdown) {
-  NanScope();
-  if (!HasInstance(args.This())) {
-    return NanThrowTypeError("tryShutdown can only be called on a Server");
+  Nan::HandleScope scope;
+  if (!HasInstance(info.This())) {
+    return Nan::ThrowTypeError("tryShutdown can only be called on a Server");
   }
   }
-  Server *server = ObjectWrap::Unwrap<Server>(args.This());
+  Server *server = ObjectWrap::Unwrap<Server>(info.This());
   unique_ptr<OpVec> ops(new OpVec());
   unique_ptr<OpVec> ops(new OpVec());
   grpc_server_shutdown_and_notify(
   grpc_server_shutdown_and_notify(
       server->wrapped_server,
       server->wrapped_server,
       CompletionQueueAsyncWorker::GetQueue(),
       CompletionQueueAsyncWorker::GetQueue(),
-      new struct tag(new NanCallback(args[0].As<Function>()), ops.release(),
+      new struct tag(new Nan::Callback(info[0].As<Function>()), ops.release(),
                      shared_ptr<Resources>(nullptr)));
                      shared_ptr<Resources>(nullptr)));
   CompletionQueueAsyncWorker::Next();
   CompletionQueueAsyncWorker::Next();
-  NanReturnUndefined();
 }
 }
 
 
 NAN_METHOD(Server::ForceShutdown) {
 NAN_METHOD(Server::ForceShutdown) {
-  NanScope();
-  if (!HasInstance(args.This())) {
-    return NanThrowTypeError("forceShutdown can only be called on a Server");
+  Nan::HandleScope scope;
+  if (!HasInstance(info.This())) {
+    return Nan::ThrowTypeError("forceShutdown can only be called on a Server");
   }
   }
-  Server *server = ObjectWrap::Unwrap<Server>(args.This());
+  Server *server = ObjectWrap::Unwrap<Server>(info.This());
   server->ShutdownServer();
   server->ShutdownServer();
-  NanReturnUndefined();
 }
 }
 
 
 }  // namespace node
 }  // namespace node

+ 5 - 5
src/node/ext/server.h

@@ -44,14 +44,14 @@ namespace node {
 /* Wraps grpc_server as a JavaScript object. Provides a constructor
 /* Wraps grpc_server as a JavaScript object. Provides a constructor
    and wrapper methods for grpc_server_create, grpc_server_request_call,
    and wrapper methods for grpc_server_create, grpc_server_request_call,
    grpc_server_add_http2_port, and grpc_server_start. */
    grpc_server_add_http2_port, and grpc_server_start. */
-class Server : public ::node::ObjectWrap {
+class Server : public Nan::ObjectWrap {
  public:
  public:
   /* Initializes the Server class and exposes the constructor and
   /* Initializes the Server class and exposes the constructor and
      wrapper methods to JavaScript */
      wrapper methods to JavaScript */
-  static void Init(v8::Handle<v8::Object> exports);
+  static void Init(v8::Local<v8::Object> exports);
   /* Tests whether the given value was constructed by this class's
   /* Tests whether the given value was constructed by this class's
      JavaScript constructor */
      JavaScript constructor */
-  static bool HasInstance(v8::Handle<v8::Value> val);
+  static bool HasInstance(v8::Local<v8::Value> val);
 
 
  private:
  private:
   explicit Server(grpc_server *server);
   explicit Server(grpc_server *server);
@@ -69,8 +69,8 @@ class Server : public ::node::ObjectWrap {
   static NAN_METHOD(Start);
   static NAN_METHOD(Start);
   static NAN_METHOD(TryShutdown);
   static NAN_METHOD(TryShutdown);
   static NAN_METHOD(ForceShutdown);
   static NAN_METHOD(ForceShutdown);
-  static NanCallback *constructor;
-  static v8::Persistent<v8::FunctionTemplate> fun_tpl;
+  static Nan::Callback *constructor;
+  static Nan::Persistent<v8::FunctionTemplate> fun_tpl;
 
 
   grpc_server *wrapped_server;
   grpc_server *wrapped_server;
   grpc_completion_queue *shutdown_queue;
   grpc_completion_queue *shutdown_queue;

+ 87 - 66
src/node/ext/server_credentials.cc

@@ -41,22 +41,28 @@
 namespace grpc {
 namespace grpc {
 namespace node {
 namespace node {
 
 
+using Nan::Callback;
+using Nan::EscapableHandleScope;
+using Nan::HandleScope;
+using Nan::Maybe;
+using Nan::MaybeLocal;
+using Nan::ObjectWrap;
+using Nan::Persistent;
+using Nan::Utf8String;
+
 using v8::Array;
 using v8::Array;
 using v8::Exception;
 using v8::Exception;
 using v8::External;
 using v8::External;
 using v8::Function;
 using v8::Function;
 using v8::FunctionTemplate;
 using v8::FunctionTemplate;
-using v8::Handle;
-using v8::HandleScope;
 using v8::Integer;
 using v8::Integer;
 using v8::Local;
 using v8::Local;
 using v8::Object;
 using v8::Object;
 using v8::ObjectTemplate;
 using v8::ObjectTemplate;
-using v8::Persistent;
 using v8::String;
 using v8::String;
 using v8::Value;
 using v8::Value;
 
 
-NanCallback *ServerCredentials::constructor;
+Nan::Callback *ServerCredentials::constructor;
 Persistent<FunctionTemplate> ServerCredentials::fun_tpl;
 Persistent<FunctionTemplate> ServerCredentials::fun_tpl;
 
 
 ServerCredentials::ServerCredentials(grpc_server_credentials *credentials)
 ServerCredentials::ServerCredentials(grpc_server_credentials *credentials)
@@ -66,33 +72,41 @@ ServerCredentials::~ServerCredentials() {
   grpc_server_credentials_release(wrapped_credentials);
   grpc_server_credentials_release(wrapped_credentials);
 }
 }
 
 
-void ServerCredentials::Init(Handle<Object> exports) {
-  NanScope();
-  Local<FunctionTemplate> tpl = NanNew<FunctionTemplate>(New);
-  tpl->SetClassName(NanNew("ServerCredentials"));
+void ServerCredentials::Init(Local<Object> exports) {
+  Nan::HandleScope scope;
+  Local<FunctionTemplate> tpl = Nan::New<FunctionTemplate>(New);
+  tpl->SetClassName(Nan::New("ServerCredentials").ToLocalChecked());
   tpl->InstanceTemplate()->SetInternalFieldCount(1);
   tpl->InstanceTemplate()->SetInternalFieldCount(1);
-  NanAssignPersistent(fun_tpl, tpl);
-  Handle<Function> ctr = tpl->GetFunction();
-  ctr->Set(NanNew("createSsl"),
-           NanNew<FunctionTemplate>(CreateSsl)->GetFunction());
-  ctr->Set(NanNew("createInsecure"),
-           NanNew<FunctionTemplate>(CreateInsecure)->GetFunction());
-  constructor = new NanCallback(ctr);
-  exports->Set(NanNew("ServerCredentials"), ctr);
+  Local<Function> ctr = tpl->GetFunction();
+  Nan::Set(ctr, Nan::New("createSsl").ToLocalChecked(),
+           Nan::GetFunction(
+               Nan::New<FunctionTemplate>(CreateSsl)).ToLocalChecked());
+  Nan::Set(ctr, Nan::New("createInsecure").ToLocalChecked(),
+           Nan::GetFunction(
+               Nan::New<FunctionTemplate>(CreateInsecure)).ToLocalChecked());
+  fun_tpl.Reset(tpl);
+  constructor = new Nan::Callback(ctr);
+  Nan::Set(exports, Nan::New("ServerCredentials").ToLocalChecked(), ctr);
 }
 }
 
 
-bool ServerCredentials::HasInstance(Handle<Value> val) {
-  NanScope();
-  return NanHasInstance(fun_tpl, val);
+bool ServerCredentials::HasInstance(Local<Value> val) {
+  Nan::HandleScope scope;
+  return Nan::New(fun_tpl)->HasInstance(val);
 }
 }
 
 
-Handle<Value> ServerCredentials::WrapStruct(
+Local<Value> ServerCredentials::WrapStruct(
     grpc_server_credentials *credentials) {
     grpc_server_credentials *credentials) {
-  NanEscapableScope();
+  Nan::EscapableHandleScope scope;
   const int argc = 1;
   const int argc = 1;
-  Handle<Value> argv[argc] = {
-    NanNew<External>(reinterpret_cast<void *>(credentials))};
-  return NanEscapeScope(constructor->GetFunction()->NewInstance(argc, argv));
+  Local<Value> argv[argc] = {
+    Nan::New<External>(reinterpret_cast<void *>(credentials))};
+  MaybeLocal<Object> maybe_instance = Nan::NewInstance(
+      constructor->GetFunction(), argc, argv);
+  if (maybe_instance.IsEmpty()) {
+    return scope.Escape(Nan::Null());
+  } else {
+    return scope.Escape(maybe_instance.ToLocalChecked());
+  }
 }
 }
 
 
 grpc_server_credentials *ServerCredentials::GetWrappedServerCredentials() {
 grpc_server_credentials *ServerCredentials::GetWrappedServerCredentials() {
@@ -100,96 +114,103 @@ grpc_server_credentials *ServerCredentials::GetWrappedServerCredentials() {
 }
 }
 
 
 NAN_METHOD(ServerCredentials::New) {
 NAN_METHOD(ServerCredentials::New) {
-  NanScope();
-
-  if (args.IsConstructCall()) {
-    if (!args[0]->IsExternal()) {
-      return NanThrowTypeError(
+  if (info.IsConstructCall()) {
+    if (!info[0]->IsExternal()) {
+      return Nan::ThrowTypeError(
           "ServerCredentials can only be created with the provide functions");
           "ServerCredentials can only be created with the provide functions");
     }
     }
-    Handle<External> ext = args[0].As<External>();
+    Local<External> ext = info[0].As<External>();
     grpc_server_credentials *creds_value =
     grpc_server_credentials *creds_value =
         reinterpret_cast<grpc_server_credentials *>(ext->Value());
         reinterpret_cast<grpc_server_credentials *>(ext->Value());
     ServerCredentials *credentials = new ServerCredentials(creds_value);
     ServerCredentials *credentials = new ServerCredentials(creds_value);
-    credentials->Wrap(args.This());
-    NanReturnValue(args.This());
+    credentials->Wrap(info.This());
+    info.GetReturnValue().Set(info.This());
   } else {
   } else {
     const int argc = 1;
     const int argc = 1;
-    Local<Value> argv[argc] = {args[0]};
-    NanReturnValue(constructor->GetFunction()->NewInstance(argc, argv));
+    Local<Value> argv[argc] = {info[0]};
+    MaybeLocal<Object> maybe_instance = constructor->GetFunction()->NewInstance(
+        argc, argv);
+    if (maybe_instance.IsEmpty()) {
+      // There's probably a pending exception
+      return;
+    } else {
+      info.GetReturnValue().Set(maybe_instance.ToLocalChecked());
+    }
   }
   }
 }
 }
 
 
 NAN_METHOD(ServerCredentials::CreateSsl) {
 NAN_METHOD(ServerCredentials::CreateSsl) {
-  // TODO: have the node API support multiple key/cert pairs.
-  NanScope();
+  Nan::HandleScope scope;
   char *root_certs = NULL;
   char *root_certs = NULL;
-  if (::node::Buffer::HasInstance(args[0])) {
-    root_certs = ::node::Buffer::Data(args[0]);
-  } else if (!(args[0]->IsNull() || args[0]->IsUndefined())) {
-    return NanThrowTypeError(
+  if (::node::Buffer::HasInstance(info[0])) {
+    root_certs = ::node::Buffer::Data(info[0]);
+  } else if (!(info[0]->IsNull() || info[0]->IsUndefined())) {
+    return Nan::ThrowTypeError(
         "createSSl's first argument must be a Buffer if provided");
         "createSSl's first argument must be a Buffer if provided");
   }
   }
-  if (!args[1]->IsArray()) {
-    return NanThrowTypeError(
+  if (!info[1]->IsArray()) {
+    return Nan::ThrowTypeError(
         "createSsl's second argument must be a list of objects");
         "createSsl's second argument must be a list of objects");
   }
   }
   int force_client_auth = 0;
   int force_client_auth = 0;
-  if (args[2]->IsBoolean()) {
-    force_client_auth = (int)args[2]->BooleanValue();
-  } else if (!(args[2]->IsUndefined() || args[2]->IsNull())) {
-    return NanThrowTypeError(
+  if (info[2]->IsBoolean()) {
+    force_client_auth = (int)Nan::To<bool>(info[2]).FromJust();
+  } else if (!(info[2]->IsUndefined() || info[2]->IsNull())) {
+    return Nan::ThrowTypeError(
         "createSsl's third argument must be a boolean if provided");
         "createSsl's third argument must be a boolean if provided");
   }
   }
-  Handle<Array> pair_list = Local<Array>::Cast(args[1]);
+  Local<Array> pair_list = Local<Array>::Cast(info[1]);
   uint32_t key_cert_pair_count = pair_list->Length();
   uint32_t key_cert_pair_count = pair_list->Length();
   grpc_ssl_pem_key_cert_pair *key_cert_pairs = new grpc_ssl_pem_key_cert_pair[
   grpc_ssl_pem_key_cert_pair *key_cert_pairs = new grpc_ssl_pem_key_cert_pair[
       key_cert_pair_count];
       key_cert_pair_count];
 
 
-  Handle<String> key_key = NanNew("private_key");
-  Handle<String> cert_key = NanNew("cert_chain");
+  Local<String> key_key = Nan::New("private_key").ToLocalChecked();
+  Local<String> cert_key = Nan::New("cert_chain").ToLocalChecked();
 
 
   for(uint32_t i = 0; i < key_cert_pair_count; i++) {
   for(uint32_t i = 0; i < key_cert_pair_count; i++) {
-    if (!pair_list->Get(i)->IsObject()) {
+    Local<Value> pair_val = Nan::Get(pair_list, i).ToLocalChecked();
+    if (!pair_val->IsObject()) {
       delete key_cert_pairs;
       delete key_cert_pairs;
-      return NanThrowTypeError("Key/cert pairs must be objects");
+      return Nan::ThrowTypeError("Key/cert pairs must be objects");
     }
     }
-    Handle<Object> pair_obj = pair_list->Get(i)->ToObject();
-    if (!pair_obj->HasOwnProperty(key_key)) {
+    Local<Object> pair_obj = Nan::To<Object>(pair_val).ToLocalChecked();
+    MaybeLocal<Value> maybe_key = Nan::Get(pair_obj, key_key);
+    if (maybe_key.IsEmpty()) {
       delete key_cert_pairs;
       delete key_cert_pairs;
-      return NanThrowTypeError(
+      return Nan::ThrowTypeError(
           "Key/cert pairs must have a private_key and a cert_chain");
           "Key/cert pairs must have a private_key and a cert_chain");
     }
     }
-    if (!pair_obj->HasOwnProperty(cert_key)) {
+    MaybeLocal<Value> maybe_cert = Nan::Get(pair_obj, cert_key);
+    if (maybe_cert.IsEmpty()) {
       delete key_cert_pairs;
       delete key_cert_pairs;
-      return NanThrowTypeError(
+      return Nan::ThrowTypeError(
           "Key/cert pairs must have a private_key and a cert_chain");
           "Key/cert pairs must have a private_key and a cert_chain");
     }
     }
-    if (!::node::Buffer::HasInstance(pair_obj->Get(key_key))) {
+    if (!::node::Buffer::HasInstance(maybe_key.ToLocalChecked())) {
       delete key_cert_pairs;
       delete key_cert_pairs;
-      return NanThrowTypeError("private_key must be a Buffer");
+      return Nan::ThrowTypeError("private_key must be a Buffer");
     }
     }
-    if (!::node::Buffer::HasInstance(pair_obj->Get(cert_key))) {
+    if (!::node::Buffer::HasInstance(maybe_cert.ToLocalChecked())) {
       delete key_cert_pairs;
       delete key_cert_pairs;
-      return NanThrowTypeError("cert_chain must be a Buffer");
+      return Nan::ThrowTypeError("cert_chain must be a Buffer");
     }
     }
     key_cert_pairs[i].private_key = ::node::Buffer::Data(
     key_cert_pairs[i].private_key = ::node::Buffer::Data(
-        pair_obj->Get(key_key));
+        maybe_key.ToLocalChecked());
     key_cert_pairs[i].cert_chain = ::node::Buffer::Data(
     key_cert_pairs[i].cert_chain = ::node::Buffer::Data(
-        pair_obj->Get(cert_key));
+        maybe_cert.ToLocalChecked());
   }
   }
   grpc_server_credentials *creds = grpc_ssl_server_credentials_create(
   grpc_server_credentials *creds = grpc_ssl_server_credentials_create(
       root_certs, key_cert_pairs, key_cert_pair_count, force_client_auth, NULL);
       root_certs, key_cert_pairs, key_cert_pair_count, force_client_auth, NULL);
   delete key_cert_pairs;
   delete key_cert_pairs;
   if (creds == NULL) {
   if (creds == NULL) {
-    NanReturnNull();
+    info.GetReturnValue().SetNull();
+  } else {
+    info.GetReturnValue().Set(WrapStruct(creds));
   }
   }
-  NanReturnValue(WrapStruct(creds));
 }
 }
 
 
 NAN_METHOD(ServerCredentials::CreateInsecure) {
 NAN_METHOD(ServerCredentials::CreateInsecure) {
-  NanScope();
-  NanReturnValue(WrapStruct(NULL));
+  info.GetReturnValue().Set(WrapStruct(NULL));
 }
 }
 
 
 }  // namespace node
 }  // namespace node

+ 6 - 6
src/node/ext/server_credentials.h

@@ -43,12 +43,12 @@ namespace grpc {
 namespace node {
 namespace node {
 
 
 /* Wrapper class for grpc_server_credentials structs */
 /* Wrapper class for grpc_server_credentials structs */
-class ServerCredentials : public ::node::ObjectWrap {
+class ServerCredentials : public Nan::ObjectWrap {
  public:
  public:
-  static void Init(v8::Handle<v8::Object> exports);
-  static bool HasInstance(v8::Handle<v8::Value> val);
+  static void Init(v8::Local<v8::Object> exports);
+  static bool HasInstance(v8::Local<v8::Value> val);
   /* Wrap a grpc_server_credentials struct in a javascript object */
   /* Wrap a grpc_server_credentials struct in a javascript object */
-  static v8::Handle<v8::Value> WrapStruct(grpc_server_credentials *credentials);
+  static v8::Local<v8::Value> WrapStruct(grpc_server_credentials *credentials);
 
 
   /* Returns the grpc_server_credentials struct that this object wraps */
   /* Returns the grpc_server_credentials struct that this object wraps */
   grpc_server_credentials *GetWrappedServerCredentials();
   grpc_server_credentials *GetWrappedServerCredentials();
@@ -64,9 +64,9 @@ class ServerCredentials : public ::node::ObjectWrap {
   static NAN_METHOD(New);
   static NAN_METHOD(New);
   static NAN_METHOD(CreateSsl);
   static NAN_METHOD(CreateSsl);
   static NAN_METHOD(CreateInsecure);
   static NAN_METHOD(CreateInsecure);
-  static NanCallback *constructor;
+  static Nan::Callback *constructor;
   // Used for typechecking instances of this javascript class
   // Used for typechecking instances of this javascript class
-  static v8::Persistent<v8::FunctionTemplate> fun_tpl;
+  static Nan::Persistent<v8::FunctionTemplate> fun_tpl;
 
 
   grpc_server_credentials *wrapped_credentials;
   grpc_server_credentials *wrapped_credentials;
 };
 };

+ 0 - 1
src/node/interop/test.proto

@@ -45,7 +45,6 @@ service TestService {
   rpc EmptyCall(grpc.testing.Empty) returns (grpc.testing.Empty);
   rpc EmptyCall(grpc.testing.Empty) returns (grpc.testing.Empty);
 
 
   // One request followed by one response.
   // One request followed by one response.
-  // TODO(Issue 527): Describe required server behavior.
   rpc UnaryCall(SimpleRequest) returns (SimpleResponse);
   rpc UnaryCall(SimpleRequest) returns (SimpleResponse);
 
 
   // One request followed by a sequence of responses (streamed download).
   // One request followed by a sequence of responses (streamed download).

+ 2 - 2
src/node/package.json

@@ -1,6 +1,6 @@
 {
 {
   "name": "grpc",
   "name": "grpc",
-  "version": "0.11.0",
+  "version": "0.11.1",
   "author": "Google Inc.",
   "author": "Google Inc.",
   "description": "gRPC Library for Node",
   "description": "gRPC Library for Node",
   "homepage": "http://www.grpc.io/",
   "homepage": "http://www.grpc.io/",
@@ -27,7 +27,7 @@
   "dependencies": {
   "dependencies": {
     "bindings": "^1.2.0",
     "bindings": "^1.2.0",
     "lodash": "^3.9.3",
     "lodash": "^3.9.3",
-    "nan": "^1.5.0",
+    "nan": "^2.0.0",
     "protobufjs": "^4.0.0"
     "protobufjs": "^4.0.0"
   },
   },
   "devDependencies": {
   "devDependencies": {

+ 4 - 2
src/node/src/server.js

@@ -276,6 +276,7 @@ function ServerWritableStream(call, serialize) {
 function _write(chunk, encoding, callback) {
 function _write(chunk, encoding, callback) {
   /* jshint validthis: true */
   /* jshint validthis: true */
   var batch = {};
   var batch = {};
+  var self = this;
   if (!this.call.metadataSent) {
   if (!this.call.metadataSent) {
     batch[grpc.opType.SEND_INITIAL_METADATA] =
     batch[grpc.opType.SEND_INITIAL_METADATA] =
         (new Metadata())._getCoreRepresentation();
         (new Metadata())._getCoreRepresentation();
@@ -290,7 +291,7 @@ function _write(chunk, encoding, callback) {
   batch[grpc.opType.SEND_MESSAGE] = message;
   batch[grpc.opType.SEND_MESSAGE] = message;
   this.call.startBatch(batch, function(err, value) {
   this.call.startBatch(batch, function(err, value) {
     if (err) {
     if (err) {
-      this.emit('error', err);
+      self.emit('error', err);
       return;
       return;
     }
     }
     callback();
     callback();
@@ -305,6 +306,7 @@ ServerWritableStream.prototype._write = _write;
  */
  */
 function sendMetadata(responseMetadata) {
 function sendMetadata(responseMetadata) {
   /* jshint validthis: true */
   /* jshint validthis: true */
+  var self = this;
   if (!this.call.metadataSent) {
   if (!this.call.metadataSent) {
     this.call.metadataSent = true;
     this.call.metadataSent = true;
     var batch = [];
     var batch = [];
@@ -312,7 +314,7 @@ function sendMetadata(responseMetadata) {
         responseMetadata._getCoreRepresentation();
         responseMetadata._getCoreRepresentation();
     this.call.startBatch(batch, function(err) {
     this.call.startBatch(batch, function(err) {
       if (err) {
       if (err) {
-        this.emit('error', err);
+        self.emit('error', err);
         return;
         return;
       }
       }
     });
     });

+ 1 - 1
src/objective-c/GRPCClient/private/GRPCRequestHeaders.h

@@ -34,7 +34,7 @@
 #import <Foundation/Foundation.h>
 #import <Foundation/Foundation.h>
 #include <grpc/grpc.h>
 #include <grpc/grpc.h>
 
 
-#import "GRPCCall.h"
+#import "../GRPCCall.h"
 
 
 @interface GRPCRequestHeaders : NSObject<GRPCRequestHeaders>
 @interface GRPCRequestHeaders : NSObject<GRPCRequestHeaders>
 
 

+ 0 - 1
src/objective-c/GRPCClient/private/GRPCRequestHeaders.m

@@ -35,7 +35,6 @@
 
 
 #import <Foundation/Foundation.h>
 #import <Foundation/Foundation.h>
 
 
-#import "../GRPCCall.h"
 #import "NSDictionary+GRPC.h"
 #import "NSDictionary+GRPC.h"
 
 
 // Used by the setter.
 // Used by the setter.

+ 0 - 1
src/objective-c/examples/RemoteTestClient/test.proto

@@ -45,7 +45,6 @@ service TestService {
   rpc EmptyCall(grpc.testing.Empty) returns (grpc.testing.Empty);
   rpc EmptyCall(grpc.testing.Empty) returns (grpc.testing.Empty);
 
 
   // One request followed by one response.
   // One request followed by one response.
-  // TODO(Issue 527): Describe required server behavior.
   rpc UnaryCall(SimpleRequest) returns (SimpleResponse);
   rpc UnaryCall(SimpleRequest) returns (SimpleResponse);
 
 
   // One request followed by a sequence of responses (streamed download).
   // One request followed by a sequence of responses (streamed download).

+ 0 - 1
src/objective-c/generated_libraries/RemoteTestClient/test.proto

@@ -45,7 +45,6 @@ service TestService {
   rpc EmptyCall(grpc.testing.Empty) returns (grpc.testing.Empty);
   rpc EmptyCall(grpc.testing.Empty) returns (grpc.testing.Empty);
 
 
   // One request followed by one response.
   // One request followed by one response.
-  // TODO(Issue 527): Describe required server behavior.
   rpc UnaryCall(SimpleRequest) returns (SimpleResponse);
   rpc UnaryCall(SimpleRequest) returns (SimpleResponse);
 
 
   // One request followed by a sequence of responses (streamed download).
   // One request followed by a sequence of responses (streamed download).

+ 136 - 6
src/php/README.md

@@ -5,7 +5,7 @@ This directory contains source code for PHP implementation of gRPC layered on sh
 
 
 #Status
 #Status
 
 
-Alpha : Ready for early adopters
+Beta
 
 
 ## Environment
 ## Environment
 
 
@@ -49,7 +49,7 @@ sudo apt-get install libgrpc-dev
 Install the gRPC PHP extension
 Install the gRPC PHP extension
 
 
 ```sh
 ```sh
-sudo pecl install grpc-alpha
+sudo pecl install grpc-beta
 ```
 ```
 
 
 **Mac OS X:**
 **Mac OS X:**
@@ -96,7 +96,7 @@ $ sudo make install   # 'make' should have been run by core grpc
 Install the gRPC PHP extension
 Install the gRPC PHP extension
 
 
 ```sh
 ```sh
-$ sudo pecl install grpc-alpha
+$ sudo pecl install grpc-beta
 ```
 ```
 
 
 OR
 OR
@@ -109,15 +109,19 @@ $ make
 $ sudo make install
 $ sudo make install
 ```
 ```
 
 
-In your php.ini file, add the line `extension=grpc.so` to load the extension
-at PHP startup.
+Add this line to your `php.ini` file, e.g. `/etc/php5/cli/php.ini`
+
+```sh
+extension=grpc.so
+```
 
 
 Install Composer
 Install Composer
 
 
 ```sh
 ```sh
 $ cd grpc/src/php
 $ cd grpc/src/php
 $ curl -sS https://getcomposer.org/installer | php
 $ curl -sS https://getcomposer.org/installer | php
-$ php composer.phar install
+$ sudo mv composer.phar /usr/local/bin/composer
+$ composer install
 ```
 ```
 
 
 ## Unit Tests
 ## Unit Tests
@@ -164,6 +168,132 @@ $ cd grpc/src/php
 $ ./bin/run_gen_code_test.sh
 $ ./bin/run_gen_code_test.sh
 ```
 ```
 
 
+## Use the gRPC PHP extension with Apache
+
+Install `apache2`, in addition to `php5` above
+
+```sh
+$ sudo apt-get install apache2
+```
+
+Add this line to your `php.ini` file, e.g. `/etc/php5/apache2/php.ini`
+
+```sh
+extension=grpc.so
+```
+
+Restart apache
+
+```sh
+$ sudo service apache2 restart
+```
+
+Make sure the Node math server is still running, as above. 
+
+```sh
+$ cd grpc/src/node
+$ nodejs examples/math_server.js
+```
+
+Make sure you have run `composer install` to generate the `vendor/autoload.php` file
+
+```sh
+$ composer install
+```
+
+Make sure you have generated the client stub `math.php`
+
+```sh
+$ ./bin/generate_proto_php.sh
+```
+
+Copy the `math_client.php` file into your Apache document root, e.g.
+
+```sh
+$ cp tests/generated_code/math_client.php /var/www/html
+```
+
+You may have to fix the first two lines to point the includes to your installation:
+
+```php
+include 'vendor/autoload.php';
+include 'tests/generated_code/math.php';
+```
+
+Connect to `localhost/math_client.php` in your browser, or run this from command line:
+
+```sh
+$ curl localhost/math_client.php
+```
+
+## Use the gRPC PHP extension with Nginx/PHP-FPM
+
+Install `nginx` and `php5-fpm`, in addition to `php5` above
+
+```sh
+$ sudo apt-get install nginx php5-fpm
+```
+
+Add this line to your `php.ini` file, e.g. `/etc/php5/fpm/php.ini`
+
+```sh
+extension=grpc.so
+```
+
+Uncomment the following lines in your `/etc/nginx/sites-available/default` file:
+
+```
+location ~ \.php$ {
+    include snippets/fastcgi-php.conf;
+    fastcgi_pass unix:/var/run/php5-fpm.sock;
+}
+```
+
+Restart nginx and php-fpm
+
+```sh
+$ sudo service nginx restart
+$ sudo service php5-fpm restart
+```
+
+Make sure the Node math server is still running, as above. 
+
+```sh
+$ cd grpc/src/node
+$ nodejs examples/math_server.js
+```
+
+Make sure you have run `composer install` to generate the `vendor/autoload.php` file
+
+```sh
+$ composer install
+```
+
+Make sure you have generated the client stub `math.php`
+
+```sh
+$ ./bin/generate_proto_php.sh
+```
+
+Copy the `math_client.php` file into your Nginx document root, e.g.
+
+```sh
+$ cp tests/generated_code/math_client.php /var/www/html
+```
+
+You may have to fix the first two lines to point the includes to your installation:
+
+```php
+include 'vendor/autoload.php';
+include 'tests/generated_code/math.php';
+```
+
+Connect to `localhost/math_client.php` in your browser, or run this from command line:
+
+```sh
+$ curl localhost/math_client.php
+```
+
 [homebrew]:http://brew.sh
 [homebrew]:http://brew.sh
 [gRPC install script]:https://raw.githubusercontent.com/grpc/homebrew-grpc/master/scripts/install
 [gRPC install script]:https://raw.githubusercontent.com/grpc/homebrew-grpc/master/scripts/install
 [Node]:https://github.com/grpc/grpc/tree/master/src/node/examples
 [Node]:https://github.com/grpc/grpc/tree/master/src/node/examples

+ 5 - 1
src/php/bin/run_tests.sh

@@ -31,7 +31,11 @@
 # Loads the local shared library, and runs all of the test cases in tests/
 # Loads the local shared library, and runs all of the test cases in tests/
 # against it
 # against it
 set -e
 set -e
-cd $(dirname $0)
+cd $(dirname $0)/../../..
+root=$(pwd)
+cd src/php/bin
 source ./determine_extension_dir.sh
 source ./determine_extension_dir.sh
+# in some jenkins macos machine, somehow the PHP build script can't find libgrpc.dylib
+export DYLD_LIBRARY_PATH=$root/libs/$config
 php $extension_dir $(which phpunit) -v --debug --strict \
 php $extension_dir $(which phpunit) -v --debug --strict \
   ../tests/unit_tests
   ../tests/unit_tests

+ 102 - 0
src/php/tests/generated_code/math_client.php

@@ -0,0 +1,102 @@
+<?php
+/*
+ *
+ * Copyright 2015, Google Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ *     * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+# Fix the following two lines to point to your installation
+include 'vendor/autoload.php';
+include 'tests/generated_code/math.php';
+
+function p($line) {
+  print("$line<br/>\n");
+}
+
+$host = "localhost:50051";
+p("Connecting to host: $host");
+$client = new math\MathClient($host, []);
+p("Client class: ".get_class($client));
+p('');
+
+p("Running unary call test:");
+$dividend = 7;
+$divisor = 4;
+$div_arg = new math\DivArgs();
+$div_arg->setDividend($dividend);
+$div_arg->setDivisor($divisor);
+$call = $client->Div($div_arg);
+p("Call peer: ".$call->getPeer());
+p("Dividing $dividend by $divisor");
+list($response, $status) = $call->wait();
+p("quotient = ".$response->getQuotient());
+p("remainder = ".$response->getRemainder());
+p('');
+
+p("Running server streaming test:");
+$limit = 7;
+$fib_arg = new math\FibArgs();
+$fib_arg->setLimit($limit);
+$call = $client->Fib($fib_arg);
+$result_array = iterator_to_array($call->responses());
+$result = '';
+foreach ($result_array as $num) {
+  $result .= ' '.$num->getNum();
+}
+p("The first $limit Fibonacci numbers are:".$result);
+p('');
+
+p("Running client streaming test:");
+$call = $client->Sum();
+for ($i = 0; $i <= $limit; $i++) {
+  $num = new math\Num();
+  $num->setNum($i);
+  $call->write($num);
+}
+list($response, $status) = $call->wait();
+p(sprintf("The first %d positive integers sum to: %d",
+          $limit, $response->getNum()));
+p('');
+
+p("Running bidi-streaming test:");
+$call = $client->DivMany();
+for ($i = 0; $i < 7; $i++) {
+  $div_arg = new math\DivArgs();
+  $dividend = 2 * $i + 1;
+  $divisor = 3;
+  $div_arg->setDividend($dividend);
+  $div_arg->setDivisor($divisor);
+  $call->write($div_arg);
+  p("client writing: $dividend / $divisor");
+  $response = $call->read();
+  p(sprintf("server writing: quotient = %d, remainder = %d",
+            $response->getQuotient(), $response->getRemainder()));
+}
+$call->writesDone();

+ 0 - 1
src/php/tests/interop/test.proto

@@ -44,7 +44,6 @@ service TestService {
   rpc EmptyCall(grpc.testing.EmptyMessage) returns (grpc.testing.EmptyMessage);
   rpc EmptyCall(grpc.testing.EmptyMessage) returns (grpc.testing.EmptyMessage);
 
 
   // One request followed by one response.
   // One request followed by one response.
-  // TODO(Issue 527): Describe required server behavior.
   rpc UnaryCall(SimpleRequest) returns (SimpleResponse);
   rpc UnaryCall(SimpleRequest) returns (SimpleResponse);
 
 
   // One request followed by a sequence of responses (streamed download).
   // One request followed by a sequence of responses (streamed download).

+ 2 - 2
src/php/tests/unit_tests/EndToEndTest.php

@@ -204,11 +204,11 @@ class EndToEndTest extends PHPUnit_Framework_TestCase{
   }
   }
 
 
   public function testWatchConnectivityStateFailed() {
   public function testWatchConnectivityStateFailed() {
-    $idle_state = $this->channel->getConnectivityState(true);
+    $idle_state = $this->channel->getConnectivityState();
     $this->assertTrue($idle_state == Grpc\CHANNEL_IDLE);
     $this->assertTrue($idle_state == Grpc\CHANNEL_IDLE);
 
 
     $now = Grpc\Timeval::now();
     $now = Grpc\Timeval::now();
-    $delta = new Grpc\Timeval(1);
+    $delta = new Grpc\Timeval(500000); // should timeout
     $deadline = $now->add($delta);
     $deadline = $now->add($delta);
 
 
     $this->assertFalse($this->channel->watchConnectivityState(
     $this->assertFalse($this->channel->watchConnectivityState(

+ 1 - 1
src/python/grpcio/grpc/beta/implementations.py

@@ -147,7 +147,7 @@ def secure_channel(host, port, client_credentials):
     A secure Channel to the remote host through which RPCs may be conducted.
     A secure Channel to the remote host through which RPCs may be conducted.
   """
   """
   intermediary_low_channel = _intermediary_low.Channel(
   intermediary_low_channel = _intermediary_low.Channel(
-      '%s:%d' % (host, port), client_credentials.intermediary_low_credentials)
+      '%s:%d' % (host, port), client_credentials._intermediary_low_credentials)
   return Channel(intermediary_low_channel._internal, intermediary_low_channel)  # pylint: disable=protected-access
   return Channel(intermediary_low_channel._internal, intermediary_low_channel)  # pylint: disable=protected-access
 
 
 
 

Some files were not shown because too many files changed in this diff