grpc 1.12.0 → 1.13.0.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (245) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +314 -23
  3. data/include/grpc/impl/codegen/fork.h +4 -4
  4. data/include/grpc/impl/codegen/grpc_types.h +1 -1
  5. data/include/grpc/impl/codegen/port_platform.h +3 -0
  6. data/src/boringssl/err_data.c +256 -246
  7. data/src/core/ext/filters/client_channel/channel_connectivity.cc +1 -1
  8. data/src/core/ext/filters/client_channel/client_channel.cc +367 -272
  9. data/src/core/ext/filters/client_channel/lb_policy.h +1 -3
  10. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +11 -9
  11. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +42 -32
  12. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +36 -0
  13. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +36 -102
  14. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +37 -32
  15. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +22 -19
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -1
  17. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +1 -1
  18. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +1 -1
  19. data/src/core/ext/filters/client_channel/resolver.h +1 -3
  20. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +3 -3
  21. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  22. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +0 -1
  23. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +4 -4
  24. data/src/core/ext/filters/client_channel/subchannel.cc +3 -3
  25. data/src/core/ext/filters/http/client_authority_filter.cc +5 -4
  26. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +4 -4
  27. data/src/core/ext/filters/http/server/http_server_filter.cc +123 -131
  28. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +1 -1
  29. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +9 -8
  30. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +19 -19
  31. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +10 -6
  32. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -3
  33. data/src/core/ext/transport/chttp2/transport/parsing.cc +14 -12
  34. data/src/core/ext/transport/chttp2/transport/writing.cc +6 -6
  35. data/src/core/lib/channel/channel_stack.cc +0 -5
  36. data/src/core/lib/channel/channel_stack.h +1 -1
  37. data/src/core/lib/channel/channel_stack_builder.cc +0 -3
  38. data/src/core/lib/channel/channel_stack_builder.h +0 -2
  39. data/src/core/lib/channel/channel_trace.cc +3 -3
  40. data/src/core/lib/channel/channelz_registry.cc +77 -0
  41. data/src/core/lib/channel/channelz_registry.h +99 -0
  42. data/src/core/lib/channel/handshaker.cc +20 -1
  43. data/src/core/lib/debug/stats.h +7 -0
  44. data/src/core/lib/debug/stats_data.cc +5 -0
  45. data/src/core/lib/debug/stats_data.h +120 -0
  46. data/src/core/lib/debug/trace.h +11 -9
  47. data/src/core/lib/gprpp/fork.cc +260 -0
  48. data/src/core/lib/gprpp/fork.h +79 -0
  49. data/src/core/lib/gprpp/memory.h +12 -0
  50. data/src/core/lib/gprpp/orphanable.h +2 -6
  51. data/src/core/lib/gprpp/ref_counted.h +2 -6
  52. data/src/core/lib/gprpp/thd.h +0 -3
  53. data/src/core/lib/gprpp/thd_posix.cc +4 -53
  54. data/src/core/lib/gprpp/thd_windows.cc +0 -7
  55. data/src/core/lib/http/httpcli_security_connector.cc +1 -3
  56. data/src/core/lib/iomgr/combiner.cc +19 -2
  57. data/src/core/lib/iomgr/combiner.h +1 -1
  58. data/src/core/lib/iomgr/ev_epoll1_linux.cc +2 -2
  59. data/src/core/lib/iomgr/ev_epollex_linux.cc +59 -3
  60. data/src/core/lib/iomgr/ev_epollsig_linux.cc +1 -1
  61. data/src/core/lib/iomgr/ev_poll_posix.cc +2 -2
  62. data/src/core/lib/iomgr/ev_posix.cc +11 -4
  63. data/src/core/lib/iomgr/ev_posix.h +6 -0
  64. data/src/core/lib/iomgr/exec_ctx.cc +9 -9
  65. data/src/core/lib/iomgr/exec_ctx.h +39 -20
  66. data/src/core/lib/iomgr/fork_posix.cc +30 -18
  67. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  68. data/src/core/lib/iomgr/polling_entity.cc +11 -2
  69. data/src/core/lib/iomgr/pollset_custom.cc +2 -2
  70. data/src/core/lib/iomgr/port.h +38 -1
  71. data/src/core/lib/iomgr/resolve_address.h +1 -1
  72. data/src/core/lib/iomgr/resolve_address_posix.cc +1 -1
  73. data/src/core/lib/iomgr/resource_quota.cc +1 -1
  74. data/src/core/lib/iomgr/sockaddr_posix.h +1 -1
  75. data/src/core/lib/iomgr/socket_factory_posix.cc +1 -1
  76. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -1
  77. data/src/core/lib/iomgr/tcp_client_custom.cc +3 -3
  78. data/src/core/lib/iomgr/tcp_client_posix.cc +3 -2
  79. data/src/core/lib/iomgr/tcp_custom.cc +1 -1
  80. data/src/core/lib/iomgr/tcp_posix.cc +18 -10
  81. data/src/core/lib/iomgr/tcp_server_posix.cc +9 -8
  82. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
  83. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +16 -4
  84. data/src/core/lib/iomgr/timer.h +1 -1
  85. data/src/core/lib/iomgr/timer_generic.cc +113 -41
  86. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  87. data/src/core/lib/security/credentials/credentials.h +1 -0
  88. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +88 -115
  89. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +16 -0
  90. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +10 -6
  91. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
  92. data/src/core/lib/security/security_connector/alts_security_connector.cc +2 -1
  93. data/src/core/lib/security/security_connector/security_connector.cc +7 -7
  94. data/src/core/lib/security/transport/security_handshaker.cc +1 -0
  95. data/src/core/lib/security/util/json_util.cc +4 -0
  96. data/src/core/lib/slice/slice_buffer.cc +15 -3
  97. data/src/core/lib/surface/call.cc +31 -17
  98. data/src/core/lib/surface/call.h +5 -0
  99. data/src/core/lib/surface/channel.cc +2 -5
  100. data/src/core/lib/surface/completion_queue.cc +1 -3
  101. data/src/core/lib/surface/completion_queue.h +0 -1
  102. data/src/core/lib/surface/init.cc +7 -8
  103. data/src/core/lib/surface/version.cc +2 -2
  104. data/src/core/lib/transport/byte_stream.cc +1 -1
  105. data/src/core/lib/transport/transport.cc +2 -1
  106. data/src/core/lib/transport/transport.h +4 -8
  107. data/src/core/lib/transport/transport_op_string.cc +1 -1
  108. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +19 -7
  109. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +10 -0
  110. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +28 -2
  111. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +3 -0
  112. data/src/core/tsi/fake_transport_security.cc +1 -0
  113. data/src/core/tsi/ssl_transport_security.cc +238 -110
  114. data/src/core/tsi/transport_security.cc +14 -0
  115. data/src/core/tsi/transport_security.h +2 -0
  116. data/src/core/tsi/transport_security_interface.h +11 -1
  117. data/src/ruby/bin/math_client.rb +17 -9
  118. data/src/ruby/lib/grpc/generic/rpc_server.rb +2 -1
  119. data/src/ruby/lib/grpc/version.rb +1 -1
  120. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +4 -1
  121. data/third_party/boringssl/crypto/asn1/a_int.c +33 -28
  122. data/third_party/boringssl/crypto/asn1/a_mbstr.c +24 -22
  123. data/third_party/boringssl/crypto/asn1/a_utf8.c +13 -11
  124. data/third_party/boringssl/crypto/asn1/asn1_locl.h +3 -0
  125. data/third_party/boringssl/crypto/bio/fd.c +1 -0
  126. data/third_party/boringssl/crypto/bio/file.c +2 -0
  127. data/third_party/boringssl/crypto/bn_extra/convert.c +6 -5
  128. data/third_party/boringssl/crypto/bytestring/ber.c +1 -4
  129. data/third_party/boringssl/crypto/bytestring/cbb.c +116 -16
  130. data/third_party/boringssl/crypto/bytestring/cbs.c +150 -20
  131. data/third_party/boringssl/crypto/cipher_extra/e_aesccm.c +171 -0
  132. data/third_party/boringssl/crypto/cipher_extra/e_rc2.c +2 -0
  133. data/third_party/boringssl/crypto/cipher_extra/e_tls.c +1 -2
  134. data/third_party/boringssl/crypto/cpu-aarch64-fuchsia.c +55 -0
  135. data/third_party/boringssl/crypto/cpu-aarch64-linux.c +2 -1
  136. data/third_party/boringssl/crypto/dsa/dsa.c +16 -54
  137. data/third_party/boringssl/crypto/fipsmodule/bcm.c +11 -542
  138. data/third_party/boringssl/crypto/fipsmodule/bn/add.c +33 -64
  139. data/third_party/boringssl/crypto/fipsmodule/bn/asm/x86_64-gcc.c +4 -3
  140. data/third_party/boringssl/crypto/fipsmodule/bn/bn.c +122 -70
  141. data/third_party/boringssl/crypto/fipsmodule/bn/bytes.c +32 -71
  142. data/third_party/boringssl/crypto/fipsmodule/bn/cmp.c +58 -112
  143. data/third_party/boringssl/crypto/fipsmodule/bn/div.c +198 -122
  144. data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +31 -65
  145. data/third_party/boringssl/crypto/fipsmodule/bn/generic.c +2 -1
  146. data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +98 -15
  147. data/third_party/boringssl/crypto/fipsmodule/bn/jacobi.c +1 -1
  148. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +124 -81
  149. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery_inv.c +8 -30
  150. data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +303 -347
  151. data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +2 -3
  152. data/third_party/boringssl/crypto/fipsmodule/bn/random.c +3 -4
  153. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.c +199 -222
  154. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.h +27 -47
  155. data/third_party/boringssl/crypto/fipsmodule/bn/shift.c +45 -28
  156. data/third_party/boringssl/crypto/fipsmodule/bn/sqrt.c +1 -1
  157. data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +10 -10
  158. data/third_party/boringssl/crypto/fipsmodule/des/internal.h +2 -0
  159. data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +78 -47
  160. data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +35 -54
  161. data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +3 -10
  162. data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +36 -22
  163. data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +59 -90
  164. data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +29 -48
  165. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +17 -26
  166. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.h +15 -11
  167. data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +45 -51
  168. data/third_party/boringssl/crypto/fipsmodule/ec/{util-64.c → util.c} +0 -5
  169. data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +144 -264
  170. data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +78 -56
  171. data/third_party/boringssl/crypto/fipsmodule/modes/ccm.c +256 -0
  172. data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +36 -32
  173. data/third_party/boringssl/crypto/fipsmodule/rand/ctrdrbg.c +9 -7
  174. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +16 -10
  175. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +255 -102
  176. data/third_party/boringssl/crypto/fipsmodule/self_check/self_check.c +581 -0
  177. data/third_party/boringssl/crypto/fipsmodule/tls/internal.h +39 -0
  178. data/third_party/boringssl/crypto/fipsmodule/tls/kdf.c +165 -0
  179. data/third_party/boringssl/crypto/internal.h +65 -2
  180. data/third_party/boringssl/crypto/mem.c +0 -2
  181. data/third_party/boringssl/crypto/obj/obj.c +6 -73
  182. data/third_party/boringssl/crypto/thread_pthread.c +35 -5
  183. data/third_party/boringssl/crypto/x509/a_strex.c +11 -11
  184. data/third_party/boringssl/crypto/x509/x_name.c +13 -0
  185. data/third_party/boringssl/include/openssl/aead.h +4 -0
  186. data/third_party/boringssl/include/openssl/asn1.h +1 -3
  187. data/third_party/boringssl/include/openssl/base.h +1 -14
  188. data/third_party/boringssl/include/openssl/bio.h +1 -1
  189. data/third_party/boringssl/include/openssl/bn.h +49 -15
  190. data/third_party/boringssl/include/openssl/bytestring.h +49 -24
  191. data/third_party/boringssl/include/openssl/crypto.h +4 -0
  192. data/third_party/boringssl/include/openssl/ec_key.h +7 -3
  193. data/third_party/boringssl/include/openssl/err.h +9 -9
  194. data/third_party/boringssl/include/openssl/evp.h +1 -1
  195. data/third_party/boringssl/include/openssl/rsa.h +34 -10
  196. data/third_party/boringssl/include/openssl/ssl.h +160 -17
  197. data/third_party/boringssl/include/openssl/stack.h +1 -1
  198. data/third_party/boringssl/include/openssl/tls1.h +10 -2
  199. data/third_party/boringssl/include/openssl/x509.h +3 -0
  200. data/third_party/boringssl/ssl/d1_both.cc +16 -2
  201. data/third_party/boringssl/ssl/dtls_method.cc +1 -1
  202. data/third_party/boringssl/ssl/handoff.cc +285 -0
  203. data/third_party/boringssl/ssl/handshake.cc +26 -12
  204. data/third_party/boringssl/ssl/handshake_client.cc +65 -31
  205. data/third_party/boringssl/ssl/handshake_server.cc +14 -2
  206. data/third_party/boringssl/ssl/internal.h +132 -79
  207. data/third_party/boringssl/ssl/s3_both.cc +2 -2
  208. data/third_party/boringssl/ssl/s3_lib.cc +3 -1
  209. data/third_party/boringssl/ssl/s3_pkt.cc +0 -18
  210. data/third_party/boringssl/ssl/ssl_aead_ctx.cc +1 -4
  211. data/third_party/boringssl/ssl/ssl_asn1.cc +47 -43
  212. data/third_party/boringssl/ssl/ssl_cipher.cc +8 -8
  213. data/third_party/boringssl/ssl/ssl_key_share.cc +3 -1
  214. data/third_party/boringssl/ssl/ssl_lib.cc +83 -14
  215. data/third_party/boringssl/ssl/ssl_privkey.cc +6 -0
  216. data/third_party/boringssl/ssl/ssl_stat.cc +6 -6
  217. data/third_party/boringssl/ssl/ssl_versions.cc +12 -85
  218. data/third_party/boringssl/ssl/ssl_x509.cc +59 -61
  219. data/third_party/boringssl/ssl/t1_enc.cc +73 -124
  220. data/third_party/boringssl/ssl/t1_lib.cc +367 -41
  221. data/third_party/boringssl/ssl/tls13_both.cc +8 -0
  222. data/third_party/boringssl/ssl/tls13_client.cc +98 -184
  223. data/third_party/boringssl/ssl/tls13_enc.cc +88 -158
  224. data/third_party/boringssl/ssl/tls13_server.cc +91 -137
  225. data/third_party/boringssl/ssl/tls_method.cc +0 -17
  226. data/third_party/boringssl/ssl/tls_record.cc +1 -10
  227. data/third_party/boringssl/third_party/fiat/curve25519.c +921 -2753
  228. data/third_party/boringssl/third_party/fiat/curve25519_tables.h +7880 -0
  229. data/third_party/boringssl/third_party/fiat/internal.h +32 -20
  230. data/third_party/boringssl/third_party/fiat/p256.c +1824 -0
  231. metadata +64 -64
  232. data/src/core/lib/channel/channel_trace_registry.cc +0 -80
  233. data/src/core/lib/channel/channel_trace_registry.h +0 -43
  234. data/src/core/lib/gpr/fork.cc +0 -78
  235. data/src/core/lib/gpr/fork.h +0 -35
  236. data/src/core/tsi/transport_security_adapter.cc +0 -235
  237. data/src/core/tsi/transport_security_adapter.h +0 -41
  238. data/src/ruby/bin/apis/google/protobuf/empty.rb +0 -29
  239. data/src/ruby/bin/apis/pubsub_demo.rb +0 -241
  240. data/src/ruby/bin/apis/tech/pubsub/proto/pubsub.rb +0 -159
  241. data/src/ruby/bin/apis/tech/pubsub/proto/pubsub_services.rb +0 -88
  242. data/src/ruby/pb/test/client.rb +0 -764
  243. data/src/ruby/pb/test/server.rb +0 -252
  244. data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +0 -247
  245. data/third_party/boringssl/crypto/fipsmodule/ec/p256-64.c +0 -1674
@@ -1,159 +0,0 @@
1
- # Copyright 2015 gRPC authors.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- # Generated by the protocol buffer compiler. DO NOT EDIT!
16
- # source: tech/pubsub/proto/pubsub.proto
17
-
18
- require 'google/protobuf'
19
-
20
- require 'google/protobuf/empty'
21
- Google::Protobuf::DescriptorPool.generated_pool.build do
22
- add_message "tech.pubsub.Topic" do
23
- optional :name, :string, 1
24
- end
25
- add_message "tech.pubsub.PubsubMessage" do
26
- optional :data, :string, 1
27
- optional :message_id, :string, 3
28
- end
29
- add_message "tech.pubsub.GetTopicRequest" do
30
- optional :topic, :string, 1
31
- end
32
- add_message "tech.pubsub.PublishRequest" do
33
- optional :topic, :string, 1
34
- optional :message, :message, 2, "tech.pubsub.PubsubMessage"
35
- end
36
- add_message "tech.pubsub.PublishBatchRequest" do
37
- optional :topic, :string, 1
38
- repeated :messages, :message, 2, "tech.pubsub.PubsubMessage"
39
- end
40
- add_message "tech.pubsub.PublishBatchResponse" do
41
- repeated :message_ids, :string, 1
42
- end
43
- add_message "tech.pubsub.ListTopicsRequest" do
44
- optional :query, :string, 1
45
- optional :max_results, :int32, 2
46
- optional :page_token, :string, 3
47
- end
48
- add_message "tech.pubsub.ListTopicsResponse" do
49
- repeated :topic, :message, 1, "tech.pubsub.Topic"
50
- optional :next_page_token, :string, 2
51
- end
52
- add_message "tech.pubsub.DeleteTopicRequest" do
53
- optional :topic, :string, 1
54
- end
55
- add_message "tech.pubsub.Subscription" do
56
- optional :name, :string, 1
57
- optional :topic, :string, 2
58
- optional :query, :string, 3
59
- optional :truncation_policy, :message, 4, "tech.pubsub.Subscription.TruncationPolicy"
60
- optional :push_config, :message, 5, "tech.pubsub.PushConfig"
61
- optional :ack_deadline_seconds, :int32, 6
62
- optional :garbage_collect_seconds, :int64, 7
63
- end
64
- add_message "tech.pubsub.Subscription.TruncationPolicy" do
65
- optional :max_bytes, :int64, 1
66
- optional :max_age_seconds, :int64, 2
67
- end
68
- add_message "tech.pubsub.PushConfig" do
69
- optional :push_endpoint, :string, 1
70
- end
71
- add_message "tech.pubsub.PubsubEvent" do
72
- optional :subscription, :string, 1
73
- optional :message, :message, 2, "tech.pubsub.PubsubMessage"
74
- optional :truncated, :bool, 3
75
- optional :deleted, :bool, 4
76
- end
77
- add_message "tech.pubsub.GetSubscriptionRequest" do
78
- optional :subscription, :string, 1
79
- end
80
- add_message "tech.pubsub.ListSubscriptionsRequest" do
81
- optional :query, :string, 1
82
- optional :max_results, :int32, 3
83
- optional :page_token, :string, 4
84
- end
85
- add_message "tech.pubsub.ListSubscriptionsResponse" do
86
- repeated :subscription, :message, 1, "tech.pubsub.Subscription"
87
- optional :next_page_token, :string, 2
88
- end
89
- add_message "tech.pubsub.TruncateSubscriptionRequest" do
90
- optional :subscription, :string, 1
91
- end
92
- add_message "tech.pubsub.DeleteSubscriptionRequest" do
93
- optional :subscription, :string, 1
94
- end
95
- add_message "tech.pubsub.ModifyPushConfigRequest" do
96
- optional :subscription, :string, 1
97
- optional :push_config, :message, 2, "tech.pubsub.PushConfig"
98
- end
99
- add_message "tech.pubsub.PullRequest" do
100
- optional :subscription, :string, 1
101
- optional :return_immediately, :bool, 2
102
- end
103
- add_message "tech.pubsub.PullResponse" do
104
- optional :ack_id, :string, 1
105
- optional :pubsub_event, :message, 2, "tech.pubsub.PubsubEvent"
106
- end
107
- add_message "tech.pubsub.PullBatchRequest" do
108
- optional :subscription, :string, 1
109
- optional :return_immediately, :bool, 2
110
- optional :max_events, :int32, 3
111
- end
112
- add_message "tech.pubsub.PullBatchResponse" do
113
- repeated :pull_responses, :message, 2, "tech.pubsub.PullResponse"
114
- end
115
- add_message "tech.pubsub.ModifyAckDeadlineRequest" do
116
- optional :subscription, :string, 1
117
- optional :ack_id, :string, 2
118
- optional :ack_deadline_seconds, :int32, 3
119
- end
120
- add_message "tech.pubsub.AcknowledgeRequest" do
121
- optional :subscription, :string, 1
122
- repeated :ack_id, :string, 2
123
- end
124
- add_message "tech.pubsub.NackRequest" do
125
- optional :subscription, :string, 1
126
- repeated :ack_id, :string, 2
127
- end
128
- end
129
-
130
- module Tech
131
- module Pubsub
132
- Topic = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.Topic").msgclass
133
- PubsubMessage = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.PubsubMessage").msgclass
134
- GetTopicRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.GetTopicRequest").msgclass
135
- PublishRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.PublishRequest").msgclass
136
- PublishBatchRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.PublishBatchRequest").msgclass
137
- PublishBatchResponse = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.PublishBatchResponse").msgclass
138
- ListTopicsRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.ListTopicsRequest").msgclass
139
- ListTopicsResponse = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.ListTopicsResponse").msgclass
140
- DeleteTopicRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.DeleteTopicRequest").msgclass
141
- Subscription = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.Subscription").msgclass
142
- Subscription::TruncationPolicy = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.Subscription.TruncationPolicy").msgclass
143
- PushConfig = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.PushConfig").msgclass
144
- PubsubEvent = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.PubsubEvent").msgclass
145
- GetSubscriptionRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.GetSubscriptionRequest").msgclass
146
- ListSubscriptionsRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.ListSubscriptionsRequest").msgclass
147
- ListSubscriptionsResponse = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.ListSubscriptionsResponse").msgclass
148
- TruncateSubscriptionRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.TruncateSubscriptionRequest").msgclass
149
- DeleteSubscriptionRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.DeleteSubscriptionRequest").msgclass
150
- ModifyPushConfigRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.ModifyPushConfigRequest").msgclass
151
- PullRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.PullRequest").msgclass
152
- PullResponse = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.PullResponse").msgclass
153
- PullBatchRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.PullBatchRequest").msgclass
154
- PullBatchResponse = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.PullBatchResponse").msgclass
155
- ModifyAckDeadlineRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.ModifyAckDeadlineRequest").msgclass
156
- AcknowledgeRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.AcknowledgeRequest").msgclass
157
- NackRequest = Google::Protobuf::DescriptorPool.generated_pool.lookup("tech.pubsub.NackRequest").msgclass
158
- end
159
- end
@@ -1,88 +0,0 @@
1
- # Copyright 2015 gRPC authors.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- # Generated by the protocol buffer compiler. DO NOT EDIT!
16
- # Source: tech/pubsub/proto/pubsub.proto for package 'tech.pubsub'
17
-
18
- require 'grpc'
19
- require 'google/protobuf/empty'
20
- require 'tech/pubsub/proto/pubsub'
21
-
22
- module Tech
23
- module Pubsub
24
- module PublisherService
25
-
26
- # TODO: add proto service documentation here
27
- class Service
28
-
29
- include GRPC::GenericService
30
-
31
- self.marshal_class_method = :encode
32
- self.unmarshal_class_method = :decode
33
- self.service_name = 'tech.pubsub.PublisherService'
34
-
35
- rpc :CreateTopic, Topic, Topic
36
- rpc :Publish, PublishRequest, Google::Protobuf::Empty
37
- rpc :PublishBatch, PublishBatchRequest, PublishBatchResponse
38
- rpc :GetTopic, GetTopicRequest, Topic
39
- rpc :ListTopics, ListTopicsRequest, ListTopicsResponse
40
- rpc :DeleteTopic, DeleteTopicRequest, Google::Protobuf::Empty
41
- end
42
-
43
- Stub = Service.rpc_stub_class
44
- end
45
- module SubscriberService
46
-
47
- # TODO: add proto service documentation here
48
- class Service
49
-
50
- include GRPC::GenericService
51
-
52
- self.marshal_class_method = :encode
53
- self.unmarshal_class_method = :decode
54
- self.service_name = 'tech.pubsub.SubscriberService'
55
-
56
- rpc :CreateSubscription, Subscription, Subscription
57
- rpc :GetSubscription, GetSubscriptionRequest, Subscription
58
- rpc :ListSubscriptions, ListSubscriptionsRequest, ListSubscriptionsResponse
59
- rpc :DeleteSubscription, DeleteSubscriptionRequest, Google::Protobuf::Empty
60
- rpc :TruncateSubscription, TruncateSubscriptionRequest, Google::Protobuf::Empty
61
- rpc :ModifyPushConfig, ModifyPushConfigRequest, Google::Protobuf::Empty
62
- rpc :Pull, PullRequest, PullResponse
63
- rpc :PullBatch, PullBatchRequest, PullBatchResponse
64
- rpc :ModifyAckDeadline, ModifyAckDeadlineRequest, Google::Protobuf::Empty
65
- rpc :Acknowledge, AcknowledgeRequest, Google::Protobuf::Empty
66
- rpc :Nack, NackRequest, Google::Protobuf::Empty
67
- end
68
-
69
- Stub = Service.rpc_stub_class
70
- end
71
- module PushEndpointService
72
-
73
- # TODO: add proto service documentation here
74
- class Service
75
-
76
- include GRPC::GenericService
77
-
78
- self.marshal_class_method = :encode
79
- self.unmarshal_class_method = :decode
80
- self.service_name = 'tech.pubsub.PushEndpointService'
81
-
82
- rpc :HandlePubsubEvent, PubsubEvent, Google::Protobuf::Empty
83
- end
84
-
85
- Stub = Service.rpc_stub_class
86
- end
87
- end
88
- end
@@ -1,764 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # Copyright 2015 gRPC authors.
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
-
17
- # client is a testing tool that accesses a gRPC interop testing server and runs
18
- # a test on it.
19
- #
20
- # Helps validate interoperation b/w different gRPC implementations.
21
- #
22
- # Usage: $ path/to/client.rb --server_host=<hostname> \
23
- # --server_port=<port> \
24
- # --test_case=<testcase_name>
25
-
26
- # These lines are required for the generated files to load grpc
27
- this_dir = File.expand_path(File.dirname(__FILE__))
28
- lib_dir = File.join(File.dirname(File.dirname(this_dir)), 'lib')
29
- pb_dir = File.dirname(this_dir)
30
- $LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
31
- $LOAD_PATH.unshift(pb_dir) unless $LOAD_PATH.include?(pb_dir)
32
-
33
- require 'optparse'
34
- require 'logger'
35
-
36
- require_relative '../../lib/grpc'
37
- require 'googleauth'
38
- require 'google/protobuf'
39
-
40
- require_relative '../src/proto/grpc/testing/empty_pb'
41
- require_relative '../src/proto/grpc/testing/messages_pb'
42
- require_relative '../src/proto/grpc/testing/test_services_pb'
43
-
44
- AUTH_ENV = Google::Auth::CredentialsLoader::ENV_VAR
45
-
46
- # RubyLogger defines a logger for gRPC based on the standard ruby logger.
47
- module RubyLogger
48
- def logger
49
- LOGGER
50
- end
51
-
52
- LOGGER = Logger.new(STDOUT)
53
- LOGGER.level = Logger::INFO
54
- end
55
-
56
- # GRPC is the general RPC module
57
- module GRPC
58
- # Inject the noop #logger if no module-level logger method has been injected.
59
- extend RubyLogger
60
- end
61
-
62
- # AssertionError is use to indicate interop test failures.
63
- class AssertionError < RuntimeError; end
64
-
65
- # Fails with AssertionError if the block does evaluate to true
66
- def assert(msg = 'unknown cause')
67
- fail 'No assertion block provided' unless block_given?
68
- fail AssertionError, msg unless yield
69
- end
70
-
71
- # loads the certificates used to access the test server securely.
72
- def load_test_certs
73
- this_dir = File.expand_path(File.dirname(__FILE__))
74
- data_dir = File.join(File.dirname(File.dirname(this_dir)), 'spec/testdata')
75
- files = ['ca.pem', 'server1.key', 'server1.pem']
76
- files.map { |f| File.open(File.join(data_dir, f)).read }
77
- end
78
-
79
- # creates SSL Credentials from the test certificates.
80
- def test_creds
81
- certs = load_test_certs
82
- GRPC::Core::ChannelCredentials.new(certs[0])
83
- end
84
-
85
- # creates SSL Credentials from the production certificates.
86
- def prod_creds
87
- GRPC::Core::ChannelCredentials.new()
88
- end
89
-
90
- # creates the SSL Credentials.
91
- def ssl_creds(use_test_ca)
92
- return test_creds if use_test_ca
93
- prod_creds
94
- end
95
-
96
- # creates a test stub that accesses host:port securely.
97
- def create_stub(opts)
98
- address = "#{opts.host}:#{opts.port}"
99
-
100
- # Provide channel args that request compression by default
101
- # for compression interop tests
102
- if ['client_compressed_unary',
103
- 'client_compressed_streaming'].include?(opts.test_case)
104
- compression_options =
105
- GRPC::Core::CompressionOptions.new(default_algorithm: :gzip)
106
- compression_channel_args = compression_options.to_channel_arg_hash
107
- else
108
- compression_channel_args = {}
109
- end
110
-
111
- if opts.secure
112
- creds = ssl_creds(opts.use_test_ca)
113
- stub_opts = {
114
- channel_args: {
115
- GRPC::Core::Channel::SSL_TARGET => opts.host_override
116
- }
117
- }
118
-
119
- # Add service account creds if specified
120
- wants_creds = %w(all compute_engine_creds service_account_creds)
121
- if wants_creds.include?(opts.test_case)
122
- unless opts.oauth_scope.nil?
123
- auth_creds = Google::Auth.get_application_default(opts.oauth_scope)
124
- call_creds = GRPC::Core::CallCredentials.new(auth_creds.updater_proc)
125
- creds = creds.compose call_creds
126
- end
127
- end
128
-
129
- if opts.test_case == 'oauth2_auth_token'
130
- auth_creds = Google::Auth.get_application_default(opts.oauth_scope)
131
- kw = auth_creds.updater_proc.call({}) # gives as an auth token
132
-
133
- # use a metadata update proc that just adds the auth token.
134
- call_creds = GRPC::Core::CallCredentials.new(proc { |md| md.merge(kw) })
135
- creds = creds.compose call_creds
136
- end
137
-
138
- if opts.test_case == 'jwt_token_creds' # don't use a scope
139
- auth_creds = Google::Auth.get_application_default
140
- call_creds = GRPC::Core::CallCredentials.new(auth_creds.updater_proc)
141
- creds = creds.compose call_creds
142
- end
143
-
144
- GRPC.logger.info("... connecting securely to #{address}")
145
- stub_opts[:channel_args].merge!(compression_channel_args)
146
- if opts.test_case == "unimplemented_service"
147
- Grpc::Testing::UnimplementedService::Stub.new(address, creds, **stub_opts)
148
- else
149
- Grpc::Testing::TestService::Stub.new(address, creds, **stub_opts)
150
- end
151
- else
152
- GRPC.logger.info("... connecting insecurely to #{address}")
153
- if opts.test_case == "unimplemented_service"
154
- Grpc::Testing::UnimplementedService::Stub.new(
155
- address,
156
- :this_channel_is_insecure,
157
- channel_args: compression_channel_args
158
- )
159
- else
160
- Grpc::Testing::TestService::Stub.new(
161
- address,
162
- :this_channel_is_insecure,
163
- channel_args: compression_channel_args
164
- )
165
- end
166
- end
167
- end
168
-
169
- # produces a string of null chars (\0) of length l.
170
- def nulls(l)
171
- fail 'requires #{l} to be +ve' if l < 0
172
- [].pack('x' * l).force_encoding('ascii-8bit')
173
- end
174
-
175
- # a PingPongPlayer implements the ping pong bidi test.
176
- class PingPongPlayer
177
- include Grpc::Testing
178
- include Grpc::Testing::PayloadType
179
- attr_accessor :queue
180
- attr_accessor :canceller_op
181
-
182
- # reqs is the enumerator over the requests
183
- def initialize(msg_sizes)
184
- @queue = Queue.new
185
- @msg_sizes = msg_sizes
186
- @canceller_op = nil # used to cancel after the first response
187
- end
188
-
189
- def each_item
190
- return enum_for(:each_item) unless block_given?
191
- req_cls, p_cls = StreamingOutputCallRequest, ResponseParameters # short
192
- count = 0
193
- @msg_sizes.each do |m|
194
- req_size, resp_size = m
195
- req = req_cls.new(payload: Payload.new(body: nulls(req_size)),
196
- response_type: :COMPRESSABLE,
197
- response_parameters: [p_cls.new(size: resp_size)])
198
- yield req
199
- resp = @queue.pop
200
- assert('payload type is wrong') { :COMPRESSABLE == resp.payload.type }
201
- assert("payload body #{count} has the wrong length") do
202
- resp_size == resp.payload.body.length
203
- end
204
- p "OK: ping_pong #{count}"
205
- count += 1
206
- unless @canceller_op.nil?
207
- canceller_op.cancel
208
- break
209
- end
210
- end
211
- end
212
- end
213
-
214
- class BlockingEnumerator
215
- include Grpc::Testing
216
- include Grpc::Testing::PayloadType
217
-
218
- def initialize(req_size, sleep_time)
219
- @req_size = req_size
220
- @sleep_time = sleep_time
221
- end
222
-
223
- def each_item
224
- return enum_for(:each_item) unless block_given?
225
- req_cls = StreamingOutputCallRequest
226
- req = req_cls.new(payload: Payload.new(body: nulls(@req_size)))
227
- yield req
228
- # Sleep until after the deadline should have passed
229
- sleep(@sleep_time)
230
- end
231
- end
232
-
233
- # Intended to be used to wrap a call_op, and to adjust
234
- # the write flag of the call_op in between messages yielded to it.
235
- class WriteFlagSettingStreamingInputEnumerable
236
- attr_accessor :call_op
237
-
238
- def initialize(requests_and_write_flags)
239
- @requests_and_write_flags = requests_and_write_flags
240
- end
241
-
242
- def each
243
- @requests_and_write_flags.each do |request_and_flag|
244
- @call_op.write_flag = request_and_flag[:write_flag]
245
- yield request_and_flag[:request]
246
- end
247
- end
248
- end
249
-
250
- # defines methods corresponding to each interop test case.
251
- class NamedTests
252
- include Grpc::Testing
253
- include Grpc::Testing::PayloadType
254
- include GRPC::Core::MetadataKeys
255
-
256
- def initialize(stub, args)
257
- @stub = stub
258
- @args = args
259
- end
260
-
261
- def empty_unary
262
- resp = @stub.empty_call(Empty.new)
263
- assert('empty_unary: invalid response') { resp.is_a?(Empty) }
264
- end
265
-
266
- def large_unary
267
- perform_large_unary
268
- end
269
-
270
- def client_compressed_unary
271
- # first request used also for the probe
272
- req_size, wanted_response_size = 271_828, 314_159
273
- expect_compressed = BoolValue.new(value: true)
274
- payload = Payload.new(type: :COMPRESSABLE, body: nulls(req_size))
275
- req = SimpleRequest.new(response_type: :COMPRESSABLE,
276
- response_size: wanted_response_size,
277
- payload: payload,
278
- expect_compressed: expect_compressed)
279
-
280
- # send a probe to see if CompressedResponse is supported on the server
281
- send_probe_for_compressed_request_support do
282
- request_uncompressed_args = {
283
- COMPRESSION_REQUEST_ALGORITHM => 'identity'
284
- }
285
- @stub.unary_call(req, metadata: request_uncompressed_args)
286
- end
287
-
288
- # make a call with a compressed message
289
- resp = @stub.unary_call(req)
290
- assert('Expected second unary call with compression to work') do
291
- resp.payload.body.length == wanted_response_size
292
- end
293
-
294
- # make a call with an uncompressed message
295
- stub_options = {
296
- COMPRESSION_REQUEST_ALGORITHM => 'identity'
297
- }
298
-
299
- req = SimpleRequest.new(
300
- response_type: :COMPRESSABLE,
301
- response_size: wanted_response_size,
302
- payload: payload,
303
- expect_compressed: BoolValue.new(value: false)
304
- )
305
-
306
- resp = @stub.unary_call(req, metadata: stub_options)
307
- assert('Expected second unary call with compression to work') do
308
- resp.payload.body.length == wanted_response_size
309
- end
310
- end
311
-
312
- def service_account_creds
313
- # ignore this test if the oauth options are not set
314
- if @args.oauth_scope.nil?
315
- p 'NOT RUN: service_account_creds; no service_account settings'
316
- return
317
- end
318
- json_key = File.read(ENV[AUTH_ENV])
319
- wanted_email = MultiJson.load(json_key)['client_email']
320
- resp = perform_large_unary(fill_username: true,
321
- fill_oauth_scope: true)
322
- assert("#{__callee__}: bad username") { wanted_email == resp.username }
323
- assert("#{__callee__}: bad oauth scope") do
324
- @args.oauth_scope.include?(resp.oauth_scope)
325
- end
326
- end
327
-
328
- def jwt_token_creds
329
- json_key = File.read(ENV[AUTH_ENV])
330
- wanted_email = MultiJson.load(json_key)['client_email']
331
- resp = perform_large_unary(fill_username: true)
332
- assert("#{__callee__}: bad username") { wanted_email == resp.username }
333
- end
334
-
335
- def compute_engine_creds
336
- resp = perform_large_unary(fill_username: true,
337
- fill_oauth_scope: true)
338
- assert("#{__callee__}: bad username") do
339
- @args.default_service_account == resp.username
340
- end
341
- end
342
-
343
- def oauth2_auth_token
344
- resp = perform_large_unary(fill_username: true,
345
- fill_oauth_scope: true)
346
- json_key = File.read(ENV[AUTH_ENV])
347
- wanted_email = MultiJson.load(json_key)['client_email']
348
- assert("#{__callee__}: bad username") { wanted_email == resp.username }
349
- assert("#{__callee__}: bad oauth scope") do
350
- @args.oauth_scope.include?(resp.oauth_scope)
351
- end
352
- end
353
-
354
- def per_rpc_creds
355
- auth_creds = Google::Auth.get_application_default(@args.oauth_scope)
356
- update_metadata = proc do |md|
357
- kw = auth_creds.updater_proc.call({})
358
- end
359
-
360
- call_creds = GRPC::Core::CallCredentials.new(update_metadata)
361
-
362
- resp = perform_large_unary(fill_username: true,
363
- fill_oauth_scope: true,
364
- credentials: call_creds)
365
- json_key = File.read(ENV[AUTH_ENV])
366
- wanted_email = MultiJson.load(json_key)['client_email']
367
- assert("#{__callee__}: bad username") { wanted_email == resp.username }
368
- assert("#{__callee__}: bad oauth scope") do
369
- @args.oauth_scope.include?(resp.oauth_scope)
370
- end
371
- end
372
-
373
- def client_streaming
374
- msg_sizes = [27_182, 8, 1828, 45_904]
375
- wanted_aggregate_size = 74_922
376
- reqs = msg_sizes.map do |x|
377
- req = Payload.new(body: nulls(x))
378
- StreamingInputCallRequest.new(payload: req)
379
- end
380
- resp = @stub.streaming_input_call(reqs)
381
- assert("#{__callee__}: aggregate payload size is incorrect") do
382
- wanted_aggregate_size == resp.aggregated_payload_size
383
- end
384
- end
385
-
386
- def client_compressed_streaming
387
- # first request used also by the probe
388
- first_request = StreamingInputCallRequest.new(
389
- payload: Payload.new(type: :COMPRESSABLE, body: nulls(27_182)),
390
- expect_compressed: BoolValue.new(value: true)
391
- )
392
-
393
- # send a probe to see if CompressedResponse is supported on the server
394
- send_probe_for_compressed_request_support do
395
- request_uncompressed_args = {
396
- COMPRESSION_REQUEST_ALGORITHM => 'identity'
397
- }
398
- @stub.streaming_input_call([first_request],
399
- metadata: request_uncompressed_args)
400
- end
401
-
402
- second_request = StreamingInputCallRequest.new(
403
- payload: Payload.new(type: :COMPRESSABLE, body: nulls(45_904)),
404
- expect_compressed: BoolValue.new(value: false)
405
- )
406
-
407
- # Create the requests messages and the corresponding write flags
408
- # for each message
409
- requests = WriteFlagSettingStreamingInputEnumerable.new([
410
- { request: first_request,
411
- write_flag: 0 },
412
- { request: second_request,
413
- write_flag: GRPC::Core::WriteFlags::NO_COMPRESS }
414
- ])
415
-
416
- # Create the call_op, pass it to the requests enumerable, and
417
- # run the call
418
- call_op = @stub.streaming_input_call(requests,
419
- return_op: true)
420
- requests.call_op = call_op
421
- resp = call_op.execute
422
-
423
- wanted_aggregate_size = 73_086
424
-
425
- assert("#{__callee__}: aggregate payload size is incorrect") do
426
- wanted_aggregate_size == resp.aggregated_payload_size
427
- end
428
- end
429
-
430
- def server_streaming
431
- msg_sizes = [31_415, 9, 2653, 58_979]
432
- response_spec = msg_sizes.map { |s| ResponseParameters.new(size: s) }
433
- req = StreamingOutputCallRequest.new(response_type: :COMPRESSABLE,
434
- response_parameters: response_spec)
435
- resps = @stub.streaming_output_call(req)
436
- resps.each_with_index do |r, i|
437
- assert("#{__callee__}: too many responses") { i < msg_sizes.length }
438
- assert("#{__callee__}: payload body #{i} has the wrong length") do
439
- msg_sizes[i] == r.payload.body.length
440
- end
441
- assert("#{__callee__}: payload type is wrong") do
442
- :COMPRESSABLE == r.payload.type
443
- end
444
- end
445
- end
446
-
447
- def ping_pong
448
- msg_sizes = [[27_182, 31_415], [8, 9], [1828, 2653], [45_904, 58_979]]
449
- ppp = PingPongPlayer.new(msg_sizes)
450
- resps = @stub.full_duplex_call(ppp.each_item)
451
- resps.each { |r| ppp.queue.push(r) }
452
- end
453
-
454
- def timeout_on_sleeping_server
455
- enum = BlockingEnumerator.new(27_182, 2)
456
- deadline = GRPC::Core::TimeConsts::from_relative_time(1)
457
- resps = @stub.full_duplex_call(enum.each_item, deadline: deadline)
458
- resps.each { } # wait to receive each request (or timeout)
459
- fail 'Should have raised GRPC::DeadlineExceeded'
460
- rescue GRPC::DeadlineExceeded
461
- end
462
-
463
- def empty_stream
464
- ppp = PingPongPlayer.new([])
465
- resps = @stub.full_duplex_call(ppp.each_item)
466
- count = 0
467
- resps.each do |r|
468
- ppp.queue.push(r)
469
- count += 1
470
- end
471
- assert("#{__callee__}: too many responses expected 0") do
472
- count == 0
473
- end
474
- end
475
-
476
- def cancel_after_begin
477
- msg_sizes = [27_182, 8, 1828, 45_904]
478
- reqs = msg_sizes.map do |x|
479
- req = Payload.new(body: nulls(x))
480
- StreamingInputCallRequest.new(payload: req)
481
- end
482
- op = @stub.streaming_input_call(reqs, return_op: true)
483
- op.cancel
484
- op.execute
485
- fail 'Should have raised GRPC:Cancelled'
486
- rescue GRPC::Cancelled
487
- assert("#{__callee__}: call operation should be CANCELLED") { op.cancelled? }
488
- end
489
-
490
- def cancel_after_first_response
491
- msg_sizes = [[27_182, 31_415], [8, 9], [1828, 2653], [45_904, 58_979]]
492
- ppp = PingPongPlayer.new(msg_sizes)
493
- op = @stub.full_duplex_call(ppp.each_item, return_op: true)
494
- ppp.canceller_op = op # causes ppp to cancel after the 1st message
495
- op.execute.each { |r| ppp.queue.push(r) }
496
- fail 'Should have raised GRPC:Cancelled'
497
- rescue GRPC::Cancelled
498
- assert("#{__callee__}: call operation should be CANCELLED") { op.cancelled? }
499
- op.wait
500
- end
501
-
502
- def unimplemented_method
503
- begin
504
- resp = @stub.unimplemented_call(Empty.new)
505
- rescue GRPC::Unimplemented => e
506
- return
507
- rescue Exception => e
508
- fail AssertionError, "Expected BadStatus. Received: #{e.inspect}"
509
- end
510
- fail AssertionError, "GRPC::Unimplemented should have been raised. Was not."
511
- end
512
-
513
- def unimplemented_service
514
- begin
515
- resp = @stub.unimplemented_call(Empty.new)
516
- rescue GRPC::Unimplemented => e
517
- return
518
- rescue Exception => e
519
- fail AssertionError, "Expected BadStatus. Received: #{e.inspect}"
520
- end
521
- fail AssertionError, "GRPC::Unimplemented should have been raised. Was not."
522
- end
523
-
524
- def status_code_and_message
525
-
526
- # Function wide constants.
527
- message = "test status method"
528
- code = GRPC::Core::StatusCodes::UNKNOWN
529
-
530
- # Testing with UnaryCall.
531
- payload = Payload.new(type: :COMPRESSABLE, body: nulls(1))
532
- echo_status = EchoStatus.new(code: code, message: message)
533
- req = SimpleRequest.new(response_type: :COMPRESSABLE,
534
- response_size: 1,
535
- payload: payload,
536
- response_status: echo_status)
537
- seen_correct_exception = false
538
- begin
539
- resp = @stub.unary_call(req)
540
- rescue GRPC::Unknown => e
541
- if e.details != message
542
- fail AssertionError,
543
- "Expected message #{message}. Received: #{e.details}"
544
- end
545
- seen_correct_exception = true
546
- rescue Exception => e
547
- fail AssertionError, "Expected BadStatus. Received: #{e.inspect}"
548
- end
549
-
550
- if not seen_correct_exception
551
- fail AssertionError, "Did not see expected status from UnaryCall"
552
- end
553
-
554
- # testing with FullDuplex
555
- req_cls, p_cls = StreamingOutputCallRequest, ResponseParameters
556
- duplex_req = req_cls.new(payload: Payload.new(body: nulls(1)),
557
- response_type: :COMPRESSABLE,
558
- response_parameters: [p_cls.new(size: 1)],
559
- response_status: echo_status)
560
- seen_correct_exception = false
561
- begin
562
- resp = @stub.full_duplex_call([duplex_req])
563
- resp.each { |r| }
564
- rescue GRPC::Unknown => e
565
- if e.details != message
566
- fail AssertionError,
567
- "Expected message #{message}. Received: #{e.details}"
568
- end
569
- seen_correct_exception = true
570
- rescue Exception => e
571
- fail AssertionError, "Expected BadStatus. Received: #{e.inspect}"
572
- end
573
-
574
- if not seen_correct_exception
575
- fail AssertionError, "Did not see expected status from FullDuplexCall"
576
- end
577
-
578
- end
579
-
580
-
581
- def custom_metadata
582
-
583
- # Function wide constants
584
- req_size, wanted_response_size = 271_828, 314_159
585
- initial_metadata_key = "x-grpc-test-echo-initial"
586
- initial_metadata_value = "test_initial_metadata_value"
587
- trailing_metadata_key = "x-grpc-test-echo-trailing-bin"
588
- trailing_metadata_value = "\x0a\x0b\x0a\x0b\x0a\x0b"
589
-
590
- metadata = {
591
- initial_metadata_key => initial_metadata_value,
592
- trailing_metadata_key => trailing_metadata_value
593
- }
594
-
595
- # Testing with UnaryCall
596
- payload = Payload.new(type: :COMPRESSABLE, body: nulls(req_size))
597
- req = SimpleRequest.new(response_type: :COMPRESSABLE,
598
- response_size: wanted_response_size,
599
- payload: payload)
600
-
601
- op = @stub.unary_call(req, metadata: metadata, return_op: true)
602
- op.execute
603
- if not op.metadata.has_key?(initial_metadata_key)
604
- fail AssertionError, "Expected initial metadata. None received"
605
- elsif op.metadata[initial_metadata_key] != metadata[initial_metadata_key]
606
- fail AssertionError,
607
- "Expected initial metadata: #{metadata[initial_metadata_key]}. "\
608
- "Received: #{op.metadata[initial_metadata_key]}"
609
- end
610
- if not op.trailing_metadata.has_key?(trailing_metadata_key)
611
- fail AssertionError, "Expected trailing metadata. None received"
612
- elsif op.trailing_metadata[trailing_metadata_key] !=
613
- metadata[trailing_metadata_key]
614
- fail AssertionError,
615
- "Expected trailing metadata: #{metadata[trailing_metadata_key]}. "\
616
- "Received: #{op.trailing_metadata[trailing_metadata_key]}"
617
- end
618
-
619
- # Testing with FullDuplex
620
- req_cls, p_cls = StreamingOutputCallRequest, ResponseParameters
621
- duplex_req = req_cls.new(payload: Payload.new(body: nulls(req_size)),
622
- response_type: :COMPRESSABLE,
623
- response_parameters: [p_cls.new(size: wanted_response_size)])
624
-
625
- duplex_op = @stub.full_duplex_call([duplex_req], metadata: metadata,
626
- return_op: true)
627
- resp = duplex_op.execute
628
- resp.each { |r| } # ensures that the server sends trailing data
629
- duplex_op.wait
630
- if not duplex_op.metadata.has_key?(initial_metadata_key)
631
- fail AssertionError, "Expected initial metadata. None received"
632
- elsif duplex_op.metadata[initial_metadata_key] !=
633
- metadata[initial_metadata_key]
634
- fail AssertionError,
635
- "Expected initial metadata: #{metadata[initial_metadata_key]}. "\
636
- "Received: #{duplex_op.metadata[initial_metadata_key]}"
637
- end
638
- if not duplex_op.trailing_metadata[trailing_metadata_key]
639
- fail AssertionError, "Expected trailing metadata. None received"
640
- elsif duplex_op.trailing_metadata[trailing_metadata_key] !=
641
- metadata[trailing_metadata_key]
642
- fail AssertionError,
643
- "Expected trailing metadata: #{metadata[trailing_metadata_key]}. "\
644
- "Received: #{duplex_op.trailing_metadata[trailing_metadata_key]}"
645
- end
646
-
647
- end
648
-
649
- def all
650
- all_methods = NamedTests.instance_methods(false).map(&:to_s)
651
- all_methods.each do |m|
652
- next if m == 'all' || m.start_with?('assert')
653
- p "TESTCASE: #{m}"
654
- method(m).call
655
- end
656
- end
657
-
658
- private
659
-
660
- def perform_large_unary(fill_username: false, fill_oauth_scope: false, **kw)
661
- req_size, wanted_response_size = 271_828, 314_159
662
- payload = Payload.new(type: :COMPRESSABLE, body: nulls(req_size))
663
- req = SimpleRequest.new(response_type: :COMPRESSABLE,
664
- response_size: wanted_response_size,
665
- payload: payload)
666
- req.fill_username = fill_username
667
- req.fill_oauth_scope = fill_oauth_scope
668
- resp = @stub.unary_call(req, **kw)
669
- assert('payload type is wrong') do
670
- :COMPRESSABLE == resp.payload.type
671
- end
672
- assert('payload body has the wrong length') do
673
- wanted_response_size == resp.payload.body.length
674
- end
675
- assert('payload body is invalid') do
676
- nulls(wanted_response_size) == resp.payload.body
677
- end
678
- resp
679
- end
680
-
681
- # Send probing message for compressed request on the server, to see
682
- # if it's implemented.
683
- def send_probe_for_compressed_request_support(&send_probe)
684
- bad_status_occured = false
685
-
686
- begin
687
- send_probe.call
688
- rescue GRPC::BadStatus => e
689
- if e.code == GRPC::Core::StatusCodes::INVALID_ARGUMENT
690
- bad_status_occured = true
691
- else
692
- fail AssertionError, "Bad status received but code is #{e.code}"
693
- end
694
- rescue Exception => e
695
- fail AssertionError, "Expected BadStatus. Received: #{e.inspect}"
696
- end
697
-
698
- assert('CompressedRequest probe failed') do
699
- bad_status_occured
700
- end
701
- end
702
-
703
- end
704
-
705
- # Args is used to hold the command line info.
706
- Args = Struct.new(:default_service_account, :host, :host_override,
707
- :oauth_scope, :port, :secure, :test_case,
708
- :use_test_ca)
709
-
710
- # validates the command line options, returning them as a Hash.
711
- def parse_args
712
- args = Args.new
713
- args.host_override = 'foo.test.google.fr'
714
- OptionParser.new do |opts|
715
- opts.on('--oauth_scope scope',
716
- 'Scope for OAuth tokens') { |v| args['oauth_scope'] = v }
717
- opts.on('--server_host SERVER_HOST', 'server hostname') do |v|
718
- args['host'] = v
719
- end
720
- opts.on('--default_service_account email_address',
721
- 'email address of the default service account') do |v|
722
- args['default_service_account'] = v
723
- end
724
- opts.on('--server_host_override HOST_OVERRIDE',
725
- 'override host via a HTTP header') do |v|
726
- args['host_override'] = v
727
- end
728
- opts.on('--server_port SERVER_PORT', 'server port') { |v| args['port'] = v }
729
- # instance_methods(false) gives only the methods defined in that class
730
- test_cases = NamedTests.instance_methods(false).map(&:to_s)
731
- test_case_list = test_cases.join(',')
732
- opts.on('--test_case CODE', test_cases, {}, 'select a test_case',
733
- " (#{test_case_list})") { |v| args['test_case'] = v }
734
- opts.on('--use_tls USE_TLS', ['false', 'true'],
735
- 'require a secure connection?') do |v|
736
- args['secure'] = v == 'true'
737
- p end
738
- opts.on('--use_test_ca USE_TEST_CA', ['false', 'true'],
739
- 'if secure, use the test certificate?') do |v|
740
- args['use_test_ca'] = v == 'true'
741
- end
742
- end.parse!
743
- _check_args(args)
744
- end
745
-
746
- def _check_args(args)
747
- %w(host port test_case).each do |a|
748
- if args[a].nil?
749
- fail(OptionParser::MissingArgument, "please specify --#{a}")
750
- end
751
- end
752
- args
753
- end
754
-
755
- def main
756
- opts = parse_args
757
- stub = create_stub(opts)
758
- NamedTests.new(stub, opts).method(opts['test_case']).call
759
- p "OK: #{opts['test_case']}"
760
- end
761
-
762
- if __FILE__ == $0
763
- main
764
- end