grpc 1.28.0-x64-mingw32 → 1.30.0.pre1-x64-mingw32

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.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3860d138d600c5eac247dc4c22698e7fc22829ac5fc94a11c6db3429b44cd645
4
- data.tar.gz: 1938694cccaeee154b304717e1c05eab8a60fc2ad3baa0f129126203ea4aab01
3
+ metadata.gz: 4535d5e9ef012161c458c03ae55d5442d8ad590420320968632c88da5761af09
4
+ data.tar.gz: d78606b13c095a867cf83422ed00843a2a1f67f6afd31e88f81051993a908019
5
5
  SHA512:
6
- metadata.gz: e85846906d5da619aa7093d13591b0ae4403fb532ee7388b215216f673700d7c6d0187b7eba745d2390b683014ce3fd064090490666a0f9afaf95fd6d6eb5efc
7
- data.tar.gz: 8daa4561269af2b5ca07fc7f6d4a2b5fef68893aee06229a110a34b495923e467c978ed274efc8865003666833afb78967f797e90de5fd4fba88e0676349a87e
6
+ metadata.gz: c2e41091ba4b058f436f3211e4aa52dd3b21f2ef1a0de95e024c02f1a9f1b9abe629e44fa313043d8baadb2648aeea843135bb5b9885573f02cf8339d8812767
7
+ data.tar.gz: e82556fda0dba2ef334eed8fbb3b4f5ef34f76c91506b819e307dbe248f8b25ddcba6b308bad13750f155f8195366b0e3f2387aa6b954af75e08170a4ab114ce
Binary file
Binary file
@@ -620,6 +620,7 @@ typedef struct run_batch_stack {
620
620
  int recv_cancelled;
621
621
  grpc_status_code recv_status;
622
622
  grpc_slice recv_status_details;
623
+ const char* recv_status_debug_error_string;
623
624
  unsigned write_flag;
624
625
  grpc_slice send_status_details;
625
626
  } run_batch_stack;
@@ -729,6 +730,8 @@ static void grpc_run_batch_stack_fill_ops(run_batch_stack* st, VALUE ops_hash) {
729
730
  &st->recv_status;
730
731
  st->ops[st->op_num].data.recv_status_on_client.status_details =
731
732
  &st->recv_status_details;
733
+ st->ops[st->op_num].data.recv_status_on_client.error_string =
734
+ &st->recv_status_debug_error_string;
732
735
  break;
733
736
  case GRPC_OP_RECV_CLOSE_ON_SERVER:
734
737
  st->ops[st->op_num].data.recv_close_on_server.cancelled =
@@ -780,7 +783,12 @@ static VALUE grpc_run_batch_stack_build_result(run_batch_stack* st) {
780
783
  (GRPC_SLICE_START_PTR(st->recv_status_details) == NULL
781
784
  ? Qnil
782
785
  : grpc_rb_slice_to_ruby_string(st->recv_status_details)),
783
- grpc_rb_md_ary_to_h(&st->recv_trailing_metadata), NULL));
786
+ grpc_rb_md_ary_to_h(&st->recv_trailing_metadata),
787
+ st->recv_status_debug_error_string == NULL
788
+ ? Qnil
789
+ : rb_str_new_cstr(st->recv_status_debug_error_string),
790
+ NULL));
791
+ gpr_free((void*)st->recv_status_debug_error_string);
784
792
  break;
785
793
  case GRPC_OP_RECV_CLOSE_ON_SERVER:
786
794
  rb_struct_aset(result, sym_send_close, Qtrue);
@@ -30,18 +30,26 @@ module GRPC
30
30
  # https://github.com/grpc/grpc/blob/master/include/grpc/impl/codegen/status.h
31
31
  # for detailed descriptions of each status code.
32
32
  class BadStatus < StandardError
33
- attr_reader :code, :details, :metadata
33
+ attr_reader :code, :details, :metadata, :debug_error_string
34
34
 
35
35
  include GRPC::Core::StatusCodes
36
36
 
37
37
  # @param code [Numeric] the status code
38
38
  # @param details [String] the details of the exception
39
39
  # @param metadata [Hash] the error's metadata
40
- def initialize(code, details = 'unknown cause', metadata = {})
41
- super("#{code}:#{details}")
40
+ def initialize(code,
41
+ details = 'unknown cause',
42
+ metadata = {},
43
+ debug_error_string = nil)
44
+ exception_message = "#{code}:#{details}"
45
+ if debug_error_string
46
+ exception_message += ". debug_error_string:#{debug_error_string}"
47
+ end
48
+ super(exception_message)
42
49
  @code = code
43
50
  @details = details
44
51
  @metadata = metadata
52
+ @debug_error_string = debug_error_string
45
53
  end
46
54
 
47
55
  # Converts the exception to a {Struct::Status} for use in the networking
@@ -49,7 +57,7 @@ module GRPC
49
57
  #
50
58
  # @return [Struct::Status] with the same code and details
51
59
  def to_status
52
- Struct::Status.new(code, details, metadata)
60
+ Struct::Status.new(code, details, metadata, debug_error_string)
53
61
  end
54
62
 
55
63
  # Converts the exception to a deserialized {Google::Rpc::Status} object.
@@ -66,8 +74,10 @@ module GRPC
66
74
  nil
67
75
  end
68
76
 
69
- def self.new_status_exception(code, details = 'unknown cause',
70
- metadata = {})
77
+ def self.new_status_exception(code,
78
+ details = 'unknown cause',
79
+ metadata = {},
80
+ debug_error_string = nil)
71
81
  codes = {}
72
82
  codes[OK] = Ok
73
83
  codes[CANCELLED] = Cancelled
@@ -88,129 +98,180 @@ module GRPC
88
98
  codes[DATA_LOSS] = DataLoss
89
99
 
90
100
  if codes[code].nil?
91
- BadStatus.new(code, details, metadata)
101
+ BadStatus.new(code, details, metadata, debug_error_string)
92
102
  else
93
- codes[code].new(details, metadata)
103
+ codes[code].new(details, metadata, debug_error_string)
94
104
  end
95
105
  end
96
106
  end
97
107
 
98
108
  # GRPC status code corresponding to status OK
99
109
  class Ok < BadStatus
100
- def initialize(details = 'unknown cause', metadata = {})
101
- super(Core::StatusCodes::OK, details, metadata)
110
+ def initialize(details = 'unknown cause',
111
+ metadata = {},
112
+ debug_error_string = nil)
113
+ super(Core::StatusCodes::OK,
114
+ details, metadata, debug_error_string)
102
115
  end
103
116
  end
104
117
 
105
118
  # GRPC status code corresponding to status CANCELLED
106
119
  class Cancelled < BadStatus
107
- def initialize(details = 'unknown cause', metadata = {})
108
- super(Core::StatusCodes::CANCELLED, details, metadata)
120
+ def initialize(details = 'unknown cause',
121
+ metadata = {},
122
+ debug_error_string = nil)
123
+ super(Core::StatusCodes::CANCELLED,
124
+ details, metadata, debug_error_string)
109
125
  end
110
126
  end
111
127
 
112
128
  # GRPC status code corresponding to status UNKNOWN
113
129
  class Unknown < BadStatus
114
- def initialize(details = 'unknown cause', metadata = {})
115
- super(Core::StatusCodes::UNKNOWN, details, metadata)
130
+ def initialize(details = 'unknown cause',
131
+ metadata = {},
132
+ debug_error_string = nil)
133
+ super(Core::StatusCodes::UNKNOWN,
134
+ details, metadata, debug_error_string)
116
135
  end
117
136
  end
118
137
 
119
138
  # GRPC status code corresponding to status INVALID_ARGUMENT
120
139
  class InvalidArgument < BadStatus
121
- def initialize(details = 'unknown cause', metadata = {})
122
- super(Core::StatusCodes::INVALID_ARGUMENT, details, metadata)
140
+ def initialize(details = 'unknown cause',
141
+ metadata = {},
142
+ debug_error_string = nil)
143
+ super(Core::StatusCodes::INVALID_ARGUMENT,
144
+ details, metadata, debug_error_string)
123
145
  end
124
146
  end
125
147
 
126
148
  # GRPC status code corresponding to status DEADLINE_EXCEEDED
127
149
  class DeadlineExceeded < BadStatus
128
- def initialize(details = 'unknown cause', metadata = {})
129
- super(Core::StatusCodes::DEADLINE_EXCEEDED, details, metadata)
150
+ def initialize(details = 'unknown cause',
151
+ metadata = {},
152
+ debug_error_string = nil)
153
+ super(Core::StatusCodes::DEADLINE_EXCEEDED,
154
+ details, metadata, debug_error_string)
130
155
  end
131
156
  end
132
157
 
133
158
  # GRPC status code corresponding to status NOT_FOUND
134
159
  class NotFound < BadStatus
135
- def initialize(details = 'unknown cause', metadata = {})
136
- super(Core::StatusCodes::NOT_FOUND, details, metadata)
160
+ def initialize(details = 'unknown cause',
161
+ metadata = {},
162
+ debug_error_string = nil)
163
+ super(Core::StatusCodes::NOT_FOUND,
164
+ details, metadata, debug_error_string)
137
165
  end
138
166
  end
139
167
 
140
168
  # GRPC status code corresponding to status ALREADY_EXISTS
141
169
  class AlreadyExists < BadStatus
142
- def initialize(details = 'unknown cause', metadata = {})
143
- super(Core::StatusCodes::ALREADY_EXISTS, details, metadata)
170
+ def initialize(details = 'unknown cause',
171
+ metadata = {},
172
+ debug_error_string = nil)
173
+ super(Core::StatusCodes::ALREADY_EXISTS,
174
+ details, metadata, debug_error_string)
144
175
  end
145
176
  end
146
177
 
147
178
  # GRPC status code corresponding to status PERMISSION_DENIED
148
179
  class PermissionDenied < BadStatus
149
- def initialize(details = 'unknown cause', metadata = {})
150
- super(Core::StatusCodes::PERMISSION_DENIED, details, metadata)
180
+ def initialize(details = 'unknown cause',
181
+ metadata = {},
182
+ debug_error_string = nil)
183
+ super(Core::StatusCodes::PERMISSION_DENIED,
184
+ details, metadata, debug_error_string)
151
185
  end
152
186
  end
153
187
 
154
188
  # GRPC status code corresponding to status UNAUTHENTICATED
155
189
  class Unauthenticated < BadStatus
156
- def initialize(details = 'unknown cause', metadata = {})
157
- super(Core::StatusCodes::UNAUTHENTICATED, details, metadata)
190
+ def initialize(details = 'unknown cause',
191
+ metadata = {},
192
+ debug_error_string = nil)
193
+ super(Core::StatusCodes::UNAUTHENTICATED,
194
+ details, metadata, debug_error_string)
158
195
  end
159
196
  end
160
197
 
161
198
  # GRPC status code corresponding to status RESOURCE_EXHAUSTED
162
199
  class ResourceExhausted < BadStatus
163
- def initialize(details = 'unknown cause', metadata = {})
164
- super(Core::StatusCodes::RESOURCE_EXHAUSTED, details, metadata)
200
+ def initialize(details = 'unknown cause',
201
+ metadata = {},
202
+ debug_error_string = nil)
203
+ super(Core::StatusCodes::RESOURCE_EXHAUSTED,
204
+ details, metadata, debug_error_string)
165
205
  end
166
206
  end
167
207
 
168
208
  # GRPC status code corresponding to status FAILED_PRECONDITION
169
209
  class FailedPrecondition < BadStatus
170
- def initialize(details = 'unknown cause', metadata = {})
171
- super(Core::StatusCodes::FAILED_PRECONDITION, details, metadata)
210
+ def initialize(details = 'unknown cause',
211
+ metadata = {},
212
+ debug_error_string = nil)
213
+ super(Core::StatusCodes::FAILED_PRECONDITION,
214
+ details, metadata, debug_error_string)
172
215
  end
173
216
  end
174
217
 
175
218
  # GRPC status code corresponding to status ABORTED
176
219
  class Aborted < BadStatus
177
- def initialize(details = 'unknown cause', metadata = {})
178
- super(Core::StatusCodes::ABORTED, details, metadata)
220
+ def initialize(details = 'unknown cause',
221
+ metadata = {},
222
+ debug_error_string = nil)
223
+ super(Core::StatusCodes::ABORTED,
224
+ details, metadata, debug_error_string)
179
225
  end
180
226
  end
181
227
 
182
228
  # GRPC status code corresponding to status OUT_OF_RANGE
183
229
  class OutOfRange < BadStatus
184
- def initialize(details = 'unknown cause', metadata = {})
185
- super(Core::StatusCodes::OUT_OF_RANGE, details, metadata)
230
+ def initialize(details = 'unknown cause',
231
+ metadata = {},
232
+ debug_error_string = nil)
233
+ super(Core::StatusCodes::OUT_OF_RANGE,
234
+ details, metadata, debug_error_string)
186
235
  end
187
236
  end
188
237
 
189
238
  # GRPC status code corresponding to status UNIMPLEMENTED
190
239
  class Unimplemented < BadStatus
191
- def initialize(details = 'unknown cause', metadata = {})
192
- super(Core::StatusCodes::UNIMPLEMENTED, details, metadata)
240
+ def initialize(details = 'unknown cause',
241
+ metadata = {},
242
+ debug_error_string = nil)
243
+ super(Core::StatusCodes::UNIMPLEMENTED,
244
+ details, metadata, debug_error_string)
193
245
  end
194
246
  end
195
247
 
196
248
  # GRPC status code corresponding to status INTERNAL
197
249
  class Internal < BadStatus
198
- def initialize(details = 'unknown cause', metadata = {})
199
- super(Core::StatusCodes::INTERNAL, details, metadata)
250
+ def initialize(details = 'unknown cause',
251
+ metadata = {},
252
+ debug_error_string = nil)
253
+ super(Core::StatusCodes::INTERNAL,
254
+ details, metadata, debug_error_string)
200
255
  end
201
256
  end
202
257
 
203
258
  # GRPC status code corresponding to status UNAVAILABLE
204
259
  class Unavailable < BadStatus
205
- def initialize(details = 'unknown cause', metadata = {})
206
- super(Core::StatusCodes::UNAVAILABLE, details, metadata)
260
+ def initialize(details = 'unknown cause',
261
+ metadata = {},
262
+ debug_error_string = nil)
263
+ super(Core::StatusCodes::UNAVAILABLE,
264
+ details, metadata, debug_error_string)
207
265
  end
208
266
  end
209
267
 
210
268
  # GRPC status code corresponding to status DATA_LOSS
211
269
  class DataLoss < BadStatus
212
- def initialize(details = 'unknown cause', metadata = {})
213
- super(Core::StatusCodes::DATA_LOSS, details, metadata)
270
+ def initialize(details = 'unknown cause',
271
+ metadata = {},
272
+ debug_error_string = nil)
273
+ super(Core::StatusCodes::DATA_LOSS,
274
+ details, metadata, debug_error_string)
214
275
  end
215
276
  end
216
277
  end
@@ -23,13 +23,12 @@ class Struct
23
23
  # is non-nil and not OK.
24
24
  def check_status
25
25
  return nil if status.nil?
26
- fail GRPC::Cancelled if status.code == GRPC::Core::StatusCodes::CANCELLED
27
26
  if status.code != GRPC::Core::StatusCodes::OK
28
27
  GRPC.logger.debug("Failing with status #{status}")
29
28
  # raise BadStatus, propagating the metadata if present.
30
- md = status.metadata
31
29
  fail GRPC::BadStatus.new_status_exception(
32
- status.code, status.details, md)
30
+ status.code, status.details, status.metadata,
31
+ status.debug_error_string)
33
32
  end
34
33
  status
35
34
  end
@@ -38,7 +38,7 @@ module GRPC
38
38
  #
39
39
  # @param [Object] request
40
40
  # @param [GRPC::ActiveCall] call
41
- # @param [Method] method
41
+ # @param [String] method
42
42
  # @param [Hash] metadata
43
43
  #
44
44
  def request_response(request: nil, call: nil, method: nil, metadata: nil)
@@ -52,7 +52,7 @@ module GRPC
52
52
  #
53
53
  # @param [Enumerable] requests
54
54
  # @param [GRPC::ActiveCall] call
55
- # @param [Method] method
55
+ # @param [String] method
56
56
  # @param [Hash] metadata
57
57
  #
58
58
  def client_streamer(requests: nil, call: nil, method: nil, metadata: nil)
@@ -66,7 +66,7 @@ module GRPC
66
66
  #
67
67
  # @param [Object] request
68
68
  # @param [GRPC::ActiveCall] call
69
- # @param [Method] method
69
+ # @param [String] method
70
70
  # @param [Hash] metadata
71
71
  #
72
72
  def server_streamer(request: nil, call: nil, method: nil, metadata: nil)
@@ -80,7 +80,7 @@ module GRPC
80
80
  #
81
81
  # @param [Enumerable] requests
82
82
  # @param [GRPC::ActiveCall] call
83
- # @param [Method] method
83
+ # @param [String] method
84
84
  # @param [Hash] metadata
85
85
  #
86
86
  def bidi_streamer(requests: nil, call: nil, method: nil, metadata: nil)
@@ -391,22 +391,21 @@ module GRPC
391
391
  # register signal handlers
392
392
  signals.each do |sig|
393
393
  # input validation
394
- if sig.class == String
395
- sig.upcase!
396
- if sig.start_with?('SIG')
397
- # cut out the SIG prefix to see if valid signal
398
- sig = sig[3..-1]
399
- end
400
- end
394
+ target_sig = if sig.class == String
395
+ # cut out the SIG prefix to see if valid signal
396
+ sig.upcase.start_with?('SIG') ? sig.upcase[3..-1] : sig.upcase
397
+ else
398
+ sig
399
+ end
401
400
 
402
401
  # register signal traps for all valid signals
403
- if valid_signals.value?(sig) || valid_signals.key?(sig)
404
- Signal.trap(sig) do
402
+ if valid_signals.value?(target_sig) || valid_signals.key?(target_sig)
403
+ Signal.trap(target_sig) do
405
404
  @stop_server = true
406
405
  @stop_server_cv.broadcast
407
406
  end
408
407
  else
409
- fail "#{sig} not a valid signal"
408
+ fail "#{target_sig} not a valid signal"
410
409
  end
411
410
  end
412
411
 
@@ -31,6 +31,7 @@ module GRPC
31
31
  #
32
32
  # @param s [String] the string to be converted.
33
33
  def self.underscore(s)
34
+ s = +s # Avoid mutating the argument, as it might be frozen.
34
35
  s.gsub!(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
35
36
  s.gsub!(/([a-z\d])([A-Z])/, '\1_\2')
36
37
  s.tr!('-', '_')
@@ -167,22 +168,22 @@ module GRPC
167
168
  if desc.request_response?
168
169
  define_method(mth_name) do |req, metadata = {}|
169
170
  GRPC.logger.debug("calling #{@host}:#{route}")
170
- request_response(route, req, marshal, unmarshal, metadata)
171
+ request_response(route, req, marshal, unmarshal, **metadata)
171
172
  end
172
173
  elsif desc.client_streamer?
173
174
  define_method(mth_name) do |reqs, metadata = {}|
174
175
  GRPC.logger.debug("calling #{@host}:#{route}")
175
- client_streamer(route, reqs, marshal, unmarshal, metadata)
176
+ client_streamer(route, reqs, marshal, unmarshal, **metadata)
176
177
  end
177
178
  elsif desc.server_streamer?
178
179
  define_method(mth_name) do |req, metadata = {}, &blk|
179
180
  GRPC.logger.debug("calling #{@host}:#{route}")
180
- server_streamer(route, req, marshal, unmarshal, metadata, &blk)
181
+ server_streamer(route, req, marshal, unmarshal, **metadata, &blk)
181
182
  end
182
183
  else # is a bidi_stream
183
184
  define_method(mth_name) do |reqs, metadata = {}, &blk|
184
185
  GRPC.logger.debug("calling #{@host}:#{route}")
185
- bidi_streamer(route, reqs, marshal, unmarshal, metadata, &blk)
186
+ bidi_streamer(route, reqs, marshal, unmarshal, **metadata, &blk)
186
187
  end
187
188
  end
188
189
  end
@@ -12,4 +12,4 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- Struct.new('Status', :code, :details, :metadata)
15
+ Struct.new('Status', :code, :details, :metadata, :debug_error_string)
@@ -14,5 +14,5 @@
14
14
 
15
15
  # GRPC contains the General RPC module.
16
16
  module GRPC
17
- VERSION = '1.28.0'
17
+ VERSION = '1.30.0.pre1'
18
18
  end
@@ -14,11 +14,13 @@
14
14
  # limitations under the License.
15
15
 
16
16
  # Regenerates gRPC service stubs from proto files.
17
- set +e
17
+ set -e
18
18
  cd $(dirname $0)/../../..
19
19
 
20
- PROTOC=bins/opt/protobuf/protoc
21
- PLUGIN=protoc-gen-grpc=bins/opt/grpc_ruby_plugin
20
+ # protoc and grpc_*_plugin binaries can be obtained by running
21
+ # $ bazel build @com_google_protobuf//:protoc //src/compiler:all
22
+ PROTOC=bazel-bin/external/com_google_protobuf/protoc
23
+ PLUGIN=protoc-gen-grpc=bazel-bin/src/compiler/grpc_ruby_plugin
22
24
 
23
25
  $PROTOC -I src/proto src/proto/grpc/health/v1/health.proto \
24
26
  --grpc_out=src/ruby/pb \
@@ -34,6 +34,7 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
34
34
  optional :oauth_scope, :string, 3
35
35
  optional :server_id, :string, 4
36
36
  optional :grpclb_route_type, :enum, 5, "grpc.testing.GrpclbRouteType"
37
+ optional :hostname, :string, 6
37
38
  end
38
39
  add_message "grpc.testing.StreamingInputCallRequest" do
39
40
  optional :payload, :message, 1, "grpc.testing.Payload"
@@ -63,6 +64,14 @@ Google::Protobuf::DescriptorPool.generated_pool.build do
63
64
  optional :passed, :bool, 1
64
65
  repeated :backoff_ms, :int32, 2
65
66
  end
67
+ add_message "grpc.testing.LoadBalancerStatsRequest" do
68
+ optional :num_rpcs, :int32, 1
69
+ optional :timeout_sec, :int32, 2
70
+ end
71
+ add_message "grpc.testing.LoadBalancerStatsResponse" do
72
+ map :rpcs_by_peer, :string, :int32, 1
73
+ optional :num_failures, :int32, 2
74
+ end
66
75
  add_enum "grpc.testing.PayloadType" do
67
76
  value :COMPRESSABLE, 0
68
77
  end
@@ -88,6 +97,8 @@ module Grpc
88
97
  StreamingOutputCallResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.StreamingOutputCallResponse").msgclass
89
98
  ReconnectParams = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ReconnectParams").msgclass
90
99
  ReconnectInfo = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.ReconnectInfo").msgclass
100
+ LoadBalancerStatsRequest = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.LoadBalancerStatsRequest").msgclass
101
+ LoadBalancerStatsResponse = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.LoadBalancerStatsResponse").msgclass
91
102
  PayloadType = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.PayloadType").enummodule
92
103
  GrpclbRouteType = ::Google::Protobuf::DescriptorPool.generated_pool.lookup("grpc.testing.GrpclbRouteType").enummodule
93
104
  end
@@ -96,6 +96,22 @@ module Grpc
96
96
  rpc :Stop, Empty, ReconnectInfo
97
97
  end
98
98
 
99
+ Stub = Service.rpc_stub_class
100
+ end
101
+ module LoadBalancerStatsService
102
+ # A service used to obtain stats for verifying LB behavior.
103
+ class Service
104
+
105
+ include GRPC::GenericService
106
+
107
+ self.marshal_class_method = :encode
108
+ self.unmarshal_class_method = :decode
109
+ self.service_name = 'grpc.testing.LoadBalancerStatsService'
110
+
111
+ # Gets the backend distribution for RPCs sent by a test client.
112
+ rpc :GetClientStats, LoadBalancerStatsRequest, LoadBalancerStatsResponse
113
+ end
114
+
99
115
  Stub = Service.rpc_stub_class
100
116
  end
101
117
  end
@@ -0,0 +1,213 @@
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
+ # This is the xDS interop test Ruby client. This is meant to be run by
18
+ # the run_xds_tests.py test runner.
19
+ #
20
+ # Usage: $ tools/run_tests/run_xds_tests.py --test_case=... ...
21
+ # --client_cmd="path/to/xds_client.rb --server=<hostname> \
22
+ # --stats_port=<port> \
23
+ # --qps=<qps>"
24
+
25
+ # These lines are required for the generated files to load grpc
26
+ this_dir = File.expand_path(File.dirname(__FILE__))
27
+ lib_dir = File.join(File.dirname(File.dirname(this_dir)), 'lib')
28
+ pb_dir = File.dirname(this_dir)
29
+ $LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
30
+ $LOAD_PATH.unshift(pb_dir) unless $LOAD_PATH.include?(pb_dir)
31
+
32
+ require 'optparse'
33
+ require 'logger'
34
+
35
+ require_relative '../../lib/grpc'
36
+ require 'google/protobuf'
37
+
38
+ require_relative '../src/proto/grpc/testing/empty_pb'
39
+ require_relative '../src/proto/grpc/testing/messages_pb'
40
+ require_relative '../src/proto/grpc/testing/test_services_pb'
41
+
42
+ # Some global variables to be shared by server and client
43
+ $watchers = Array.new
44
+ $watchers_mutex = Mutex.new
45
+ $watchers_cv = ConditionVariable.new
46
+ $shutdown = false
47
+
48
+ # RubyLogger defines a logger for gRPC based on the standard ruby logger.
49
+ module RubyLogger
50
+ def logger
51
+ LOGGER
52
+ end
53
+
54
+ LOGGER = Logger.new(STDOUT)
55
+ LOGGER.level = Logger::INFO
56
+ end
57
+
58
+ # GRPC is the general RPC module
59
+ module GRPC
60
+ # Inject the noop #logger if no module-level logger method has been injected.
61
+ extend RubyLogger
62
+ end
63
+
64
+ # creates a test stub
65
+ def create_stub(opts)
66
+ address = "#{opts.server}"
67
+ GRPC.logger.info("... connecting insecurely to #{address}")
68
+ Grpc::Testing::TestService::Stub.new(
69
+ address,
70
+ :this_channel_is_insecure,
71
+ )
72
+ end
73
+
74
+ # This implements LoadBalancerStatsService required by the test runner
75
+ class TestTarget < Grpc::Testing::LoadBalancerStatsService::Service
76
+ include Grpc::Testing
77
+
78
+ def get_client_stats(req, _call)
79
+ finish_time = Process.clock_gettime(Process::CLOCK_MONOTONIC) +
80
+ req['timeout_sec']
81
+ watcher = {}
82
+ $watchers_mutex.synchronize do
83
+ watcher = {
84
+ "rpcs_by_peer" => Hash.new(0),
85
+ "rpcs_needed" => req['num_rpcs'],
86
+ "no_remote_peer" => 0
87
+ }
88
+ $watchers << watcher
89
+ seconds_remaining = finish_time -
90
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
91
+ while watcher['rpcs_needed'] > 0 && seconds_remaining > 0
92
+ $watchers_cv.wait($watchers_mutex, seconds_remaining)
93
+ seconds_remaining = finish_time -
94
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
95
+ end
96
+ $watchers.delete_at($watchers.index(watcher))
97
+ end
98
+ LoadBalancerStatsResponse.new(
99
+ rpcs_by_peer: watcher['rpcs_by_peer'],
100
+ num_failures: watcher['no_remote_peer'] + watcher['rpcs_needed']
101
+ );
102
+ end
103
+ end
104
+
105
+ # send 1 rpc every 1/qps second
106
+ def run_test_loop(stub, target_seconds_between_rpcs, fail_on_failed_rpcs)
107
+ include Grpc::Testing
108
+ req = SimpleRequest.new()
109
+ target_next_start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
110
+ while !$shutdown
111
+ now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
112
+ sleep_seconds = target_next_start - now
113
+ if sleep_seconds < 0
114
+ target_next_start = now + target_seconds_between_rpcs
115
+ GRPC.logger.info(
116
+ "ruby xds: warning, rpc takes too long to finish. " \
117
+ "Deficit = %.1fms. " \
118
+ "If you consistently see this, the qps is too high." \
119
+ % [(sleep_seconds * 1000).abs().round(1)])
120
+ else
121
+ target_next_start += target_seconds_between_rpcs
122
+ sleep(sleep_seconds)
123
+ end
124
+ begin
125
+ deadline = GRPC::Core::TimeConsts::from_relative_time(30) # 30 seconds
126
+ resp = stub.unary_call(req, deadline: deadline)
127
+ remote_peer = resp.hostname
128
+ rescue GRPC::BadStatus => e
129
+ remote_peer = ""
130
+ GRPC.logger.info("ruby xds: rpc failed:|#{e.message}|, " \
131
+ "this may or may not be expected")
132
+ if fail_on_failed_rpcs
133
+ raise e
134
+ end
135
+ end
136
+ $watchers_mutex.synchronize do
137
+ $watchers.each do |watcher|
138
+ watcher['rpcs_needed'] -= 1
139
+ if remote_peer.strip.empty?
140
+ watcher['no_remote_peer'] += 1
141
+ else
142
+ watcher['rpcs_by_peer'][remote_peer] += 1
143
+ end
144
+ end
145
+ $watchers_cv.broadcast
146
+ end
147
+ end
148
+ end
149
+
150
+ # Args is used to hold the command line info.
151
+ Args = Struct.new(:fail_on_failed_rpcs, :num_channels,
152
+ :server, :stats_port, :qps)
153
+
154
+ # validates the command line options, returning them as a Hash.
155
+ def parse_args
156
+ args = Args.new
157
+ args['fail_on_failed_rpcs'] = false
158
+ args['num_channels'] = 1
159
+ OptionParser.new do |opts|
160
+ opts.on('--fail_on_failed_rpcs BOOL', ['false', 'true']) do |v|
161
+ args['fail_on_failed_rpcs'] = v == 'true'
162
+ end
163
+ opts.on('--num_channels CHANNELS', 'number of channels') do |v|
164
+ args['num_channels'] = v.to_i
165
+ end
166
+ opts.on('--server SERVER_HOST', 'server hostname') do |v|
167
+ GRPC.logger.info("ruby xds: server address is #{v}")
168
+ args['server'] = v
169
+ end
170
+ opts.on('--stats_port STATS_PORT', 'stats port') do |v|
171
+ GRPC.logger.info("ruby xds: stats port is #{v}")
172
+ args['stats_port'] = v
173
+ end
174
+ opts.on('--qps QPS', 'qps') do |v|
175
+ GRPC.logger.info("ruby xds: qps is #{v}")
176
+ args['qps'] = v
177
+ end
178
+ end.parse!
179
+ args
180
+ end
181
+
182
+ def main
183
+ opts = parse_args
184
+
185
+ # This server hosts the LoadBalancerStatsService
186
+ host = "0.0.0.0:#{opts['stats_port']}"
187
+ s = GRPC::RpcServer.new
188
+ s.add_http2_port(host, :this_port_is_insecure)
189
+ s.handle(TestTarget)
190
+ server_thread = Thread.new {
191
+ # run the server until the main test runner terminates this process
192
+ s.run_till_terminated_or_interrupted(['TERM'])
193
+ }
194
+
195
+ # The client just sends unary rpcs continuously in a regular interval
196
+ stub = create_stub(opts)
197
+ target_seconds_between_rpcs = (1.0 / opts['qps'].to_f)
198
+ client_threads = Array.new
199
+ opts['num_channels'].times {
200
+ client_threads << Thread.new {
201
+ run_test_loop(stub, target_seconds_between_rpcs,
202
+ opts['fail_on_failed_rpcs'])
203
+ }
204
+ }
205
+
206
+ server_thread.join
207
+ $shutdown = true
208
+ client_threads.each { |thd| thd.join }
209
+ end
210
+
211
+ if __FILE__ == $0
212
+ main
213
+ end
@@ -0,0 +1,134 @@
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
+ require 'spec_helper'
16
+
17
+ TEST_DEBUG_MESSAGE = 'raised by test server'.freeze
18
+
19
+ # a test service that checks the cert of its peer
20
+ class DebugMessageTestService
21
+ include GRPC::GenericService
22
+ rpc :an_rpc_raises_abort, EchoMsg, EchoMsg
23
+ rpc :an_rpc_raises_standarderror, EchoMsg, EchoMsg
24
+
25
+ def an_rpc_raises_abort(_req, _call)
26
+ fail GRPC::Aborted.new(
27
+ 'aborted',
28
+ {},
29
+ TEST_DEBUG_MESSAGE)
30
+ end
31
+
32
+ def an_rpc_raises_standarderror(_req, _call)
33
+ fail(StandardError, TEST_DEBUG_MESSAGE)
34
+ end
35
+ end
36
+
37
+ DebugMessageTestServiceStub = DebugMessageTestService.rpc_stub_class
38
+
39
+ describe 'surfacing and transmitting of debug messages' do
40
+ RpcServer = GRPC::RpcServer
41
+
42
+ before(:all) do
43
+ server_opts = {
44
+ poll_period: 1
45
+ }
46
+ @srv = new_rpc_server_for_testing(**server_opts)
47
+ @port = @srv.add_http2_port('0.0.0.0:0', :this_port_is_insecure)
48
+ @srv.handle(DebugMessageTestService)
49
+ @srv_thd = Thread.new { @srv.run }
50
+ @srv.wait_till_running
51
+ end
52
+
53
+ after(:all) do
54
+ expect(@srv.stopped?).to be(false)
55
+ @srv.stop
56
+ @srv_thd.join
57
+ end
58
+
59
+ it 'debug error message is not present BadStatus exceptions that dont set it' do
60
+ exception_message = ''
61
+ begin
62
+ fail GRPC::Unavailable('unavailable', {})
63
+ rescue StandardError => e
64
+ p "Got exception: #{e.message}"
65
+ exception_message = e.message
66
+ end
67
+ expect(exception_message.empty?).to be(false)
68
+ expect(exception_message.include?('debug_error_string')).to be(false)
69
+ end
70
+
71
+ it 'debug error message is present in locally generated errors' do
72
+ # Create a secure channel. This is just one way to force a
73
+ # connection handshake error, which shoud result in C-core
74
+ # generating a status and error message and surfacing them up.
75
+ test_root = File.join(File.dirname(__FILE__), 'testdata')
76
+ files = ['ca.pem', 'client.key', 'client.pem']
77
+ creds = files.map { |f| File.open(File.join(test_root, f)).read }
78
+ creds = GRPC::Core::ChannelCredentials.new(creds[0], creds[1], creds[2])
79
+ stub = DebugMessageTestServiceStub.new(
80
+ "localhost:#{@port}", creds)
81
+ begin
82
+ stub.an_rpc_raises_abort(EchoMsg.new)
83
+ rescue StandardError => e
84
+ p "Got exception: #{e.message}"
85
+ exception_message = e.message
86
+ # check that the RPC did actually result in a BadStatus exception
87
+ expect(e.is_a?(GRPC::BadStatus)).to be(true)
88
+ end
89
+ # just check that the debug_error_string is non-empty (we know that
90
+ # it's a JSON object, so the first character is '{').
91
+ expect(exception_message.include?('. debug_error_string:{')).to be(true)
92
+ end
93
+
94
+ it 'debug message is not transmitted from server to client' do
95
+ # in order to not accidentally leak internal details about a
96
+ # server to untrusted clients, avoid including the debug_error_string
97
+ # field of a BadStatusException raised at a server in the
98
+ # RPC status that it sends to clients.
99
+ stub = DebugMessageTestServiceStub.new(
100
+ "localhost:#{@port}", :this_channel_is_insecure)
101
+ exception_message = ''
102
+ begin
103
+ stub.an_rpc_raises_abort(EchoMsg.new)
104
+ rescue StandardError => e
105
+ p "Got exception: #{e.message}"
106
+ exception_message = e.message
107
+ # check that the status was aborted is an indirect way to
108
+ # tell that the RPC did actually get handled by the server
109
+ expect(e.is_a?(GRPC::Aborted)).to be(true)
110
+ end
111
+ # just assert that the contents of the server-side BadStatus
112
+ # debug_error_string field were *not* propagated to the client.
113
+ expect(exception_message.include?('. debug_error_string:{')).to be(true)
114
+ expect(exception_message.include?(TEST_DEBUG_MESSAGE)).to be(false)
115
+ end
116
+
117
+ it 'standard_error messages are transmitted from server to client' do
118
+ # this test exists mostly in order to understand the test case
119
+ # above, by comparison.
120
+ stub = DebugMessageTestServiceStub.new(
121
+ "localhost:#{@port}", :this_channel_is_insecure)
122
+ exception_message = ''
123
+ begin
124
+ stub.an_rpc_raises_standarderror(EchoMsg.new)
125
+ rescue StandardError => e
126
+ p "Got exception: #{e.message}"
127
+ exception_message = e.message
128
+ expect(e.is_a?(GRPC::BadStatus)).to be(true)
129
+ end
130
+ # assert that the contents of the StandardError exception message
131
+ # are propagated to the client.
132
+ expect(exception_message.include?(TEST_DEBUG_MESSAGE)).to be(true)
133
+ end
134
+ end
@@ -55,6 +55,8 @@ describe GenericService do
55
55
  expect(GenericService.underscore('AMethod')).to eq('a_method')
56
56
  expect(GenericService.underscore('PrintHTML')).to eq('print_html')
57
57
  expect(GenericService.underscore('SeeHTMLBooks')).to eq('see_html_books')
58
+
59
+ expect(GenericService.underscore('SeeHTMLBooks'.freeze)).to eq('see_html_books')
58
60
  end
59
61
  end
60
62
 
@@ -27,8 +27,13 @@ message AnotherTestResponse { }
27
27
 
28
28
  message Foo { }
29
29
 
30
+ message Bar {
31
+ message Baz { }
32
+ }
33
+
30
34
  service AnotherTestService {
31
35
  rpc GetTest(AnotherTestRequest) returns (AnotherTestResponse) { }
32
36
  rpc OtherTest(Thing) returns (Thing) { }
33
37
  rpc FooTest(Foo) returns (Foo) { }
38
+ rpc NestedMessageTest(Foo) returns (Bar.Baz) { }
34
39
  }
@@ -40,6 +40,8 @@ describe 'Code Generation Options' do
40
40
  expect(services[:OtherTest].output).to eq(A::Other::Thing)
41
41
  expect(services[:FooTest].input).to eq(RPC::Test::New::Package::Options::Foo)
42
42
  expect(services[:FooTest].output).to eq(RPC::Test::New::Package::Options::Foo)
43
+ expect(services[:NestedMessageTest].input).to eq(RPC::Test::New::Package::Options::Foo)
44
+ expect(services[:NestedMessageTest].output).to eq(RPC::Test::New::Package::Options::Bar::Baz)
43
45
  end
44
46
  end
45
47
  end
@@ -1,15 +1,20 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- MIICSjCCAbOgAwIBAgIJAJHGGR4dGioHMA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNV
3
- BAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBX
4
- aWRnaXRzIFB0eSBMdGQxDzANBgNVBAMTBnRlc3RjYTAeFw0xNDExMTEyMjMxMjla
5
- Fw0yNDExMDgyMjMxMjlaMFYxCzAJBgNVBAYTAkFVMRMwEQYDVQQIEwpTb21lLVN0
6
- YXRlMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMT
7
- BnRlc3RjYTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwEDfBV5MYdlHVHJ7
8
- +L4nxrZy7mBfAVXpOc5vMYztssUI7mL2/iYujiIXM+weZYNTEpLdjyJdu7R5gGUu
9
- g1jSVK/EPHfc74O7AyZU34PNIP4Sh33N+/A5YexrNgJlPY+E3GdVYi4ldWJjgkAd
10
- Qah2PH5ACLrIIC6tRka9hcaBlIECAwEAAaMgMB4wDAYDVR0TBAUwAwEB/zAOBgNV
11
- HQ8BAf8EBAMCAgQwDQYJKoZIhvcNAQELBQADgYEAHzC7jdYlzAVmddi/gdAeKPau
12
- sPBG/C2HCWqHzpCUHcKuvMzDVkY/MP2o6JIW2DBbY64bO/FceExhjcykgaYtCH/m
13
- oIU63+CFOTtR7otyQAWHqXa7q4SbCDlG7DyRFxqG0txPtGvy12lgldA2+RgcigQG
14
- Dfcog5wrJytaQ6UA0wE=
2
+ MIIDWjCCAkKgAwIBAgIUWrP0VvHcy+LP6UuYNtiL9gBhD5owDQYJKoZIhvcNAQEL
3
+ BQAwVjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
4
+ GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTIw
5
+ MDMxNzE4NTk1MVoXDTMwMDMxNTE4NTk1MVowVjELMAkGA1UEBhMCQVUxEzARBgNV
6
+ BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0
7
+ ZDEPMA0GA1UEAwwGdGVzdGNhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
8
+ AQEAsGL0oXflF0LzoM+Bh+qUU9yhqzw2w8OOX5mu/iNCyUOBrqaHi7mGHx73GD01
9
+ diNzCzvlcQqdNIH6NQSL7DTpBjca66jYT9u73vZe2MDrr1nVbuLvfu9850cdxiUO
10
+ Inv5xf8+sTHG0C+a+VAvMhsLiRjsq+lXKRJyk5zkbbsETybqpxoJ+K7CoSy3yc/k
11
+ QIY3TipwEtwkKP4hzyo6KiGd/DPexie4nBUInN3bS1BUeNZ5zeaIC2eg3bkeeW7c
12
+ qT55b+Yen6CxY0TEkzBK6AKt/WUialKMgT0wbTxRZO7kUCH3Sq6e/wXeFdJ+HvdV
13
+ LPlAg5TnMaNpRdQih/8nRFpsdwIDAQABoyAwHjAMBgNVHRMEBTADAQH/MA4GA1Ud
14
+ DwEB/wQEAwICBDANBgkqhkiG9w0BAQsFAAOCAQEAkTrKZjBrJXHps/HrjNCFPb5a
15
+ THuGPCSsepe1wkKdSp1h4HGRpLoCgcLysCJ5hZhRpHkRihhef+rFHEe60UePQO3S
16
+ CVTtdJB4CYWpcNyXOdqefrbJW5QNljxgi6Fhvs7JJkBqdXIkWXtFk2eRgOIP2Eo9
17
+ /OHQHlYnwZFrk6sp4wPyR+A95S0toZBcyDVz7u+hOW0pGK3wviOe9lvRgj/H3Pwt
18
+ bewb0l+MhRig0/DVHamyVxrDRbqInU1/GTNCwcZkXKYFWSf92U+kIcTth24Q1gcw
19
+ eZiLl5FfrWokUNytFElXob0V0a5/kbhiLc3yWmvWqHTpqCALbVyF+rKJo2f5Kw==
15
20
  -----END CERTIFICATE-----
@@ -1,16 +1,28 @@
1
1
  -----BEGIN PRIVATE KEY-----
2
- MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAOxUR9uhvhbeVUIM
3
- s5WbH0px0mehl2+6sZpNjzvE2KimZpHzMJHukVH0Ffkvhs0b8+S5Ut9VNUAqd3IM
4
- JCCAEGtRNoQhM1t9Yr2zAckSvbRacp+FL/Cj9eDmyo00KsVGaeefA4Dh4OW+ZhkT
5
- NKcldXqkSuj1sEf244JZYuqZp6/tAgMBAAECgYEAi2NSVqpZMafE5YYUTcMGe6QS
6
- k2jtpsqYgggI2RnLJ/2tNZwYI5pwP8QVSbnMaiF4gokD5hGdrNDfTnb2v+yIwYEH
7
- 0w8+oG7Z81KodsiZSIDJfTGsAZhVNwOz9y0VD8BBZZ1/274Zh52AUKLjZS/ZwIbS
8
- W2ywya855dPnH/wj+0ECQQD9X8D920kByTNHhBG18biAEZ4pxs9f0OAG8333eVcI
9
- w2lJDLsYDZrCB2ocgA3lUdozlzPC7YDYw8reg0tkiRY5AkEA7sdNzOeQsQRn7++5
10
- 0bP9DtT/iON1gbfxRzCfCfXdoOtfQWIzTePWtURt9X/5D9NofI0Rg5W2oGy/MLe5
11
- /sXHVQJBAIup5XrJDkQywNZyAUU2ecn2bCWBFjwtqd+LBmuMciI9fOKsZtEKZrz/
12
- U0lkeMRoSwvXE8wmGLjjrAbdfohrXFkCQQDZEx/LtIl6JINJQiswVe0tWr6k+ASP
13
- 1WXoTm+HYpoF/XUvv9LccNF1IazFj34hwRQwhx7w/V52Ieb+p0jUMYGxAkEAjDhd
14
- 9pBO1fKXWiXzi9ZKfoyTNcUq3eBSVKwPG2nItg5ycXengjT5sgcWDnciIzW7BIVI
15
- JiqOszq9GWESErAatg==
2
+ MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCyqYRp+DXVp72N
3
+ FbQH8hdhTZLycZXOlJhmMsrJmrjn2p7pI/8mTZ/0FC+SGWBGZV+ELiHrmCX5zfaI
4
+ Lr9Iuw7Ghr3Vzoefi8r62rLupVPNi/qdqyjWk2dECHC9Z3+Ag3KzKTyerXWjKcvy
5
+ KVmM0ZxE0RXhDW/RoQbqZsU2GKg1B2rhUU8KN0gVmKn0rJHOxzRVSYeYLYp5Yn7K
6
+ rtPJcKyo9aVuEr7dGANzpyF6lg/nYBWc+9SGwkoLdFvKvABYJMyrbNhHUQfv0fza
7
+ Z0P86dfTENrDxzALrzGnqcx3KTrwJjkZ/aSr1tyD0/tXvukRFiPxWBJhjHQ70GqT
8
+ FQY19RbhAgMBAAECggEAIL8JUhL4awyvpWhQ8xPgTSlWwbEn8BE0TacJnCILuhNM
9
+ BRdf8LlRk/8PKQwVpVF3TFbYSMI+U6b4hMVssfv3HVQc/083dHq+3XOwUCVlUstR
10
+ SAzTE2E5EDMr1stdh0SQhV4Nilfos9s5Uk1Z6IGSztoz1GgOErIc/mGPy/aA/hbr
11
+ fRWHvTp35+MbCJSvZuOeevX2iLs0dNzqdk6DiOWIH/BVGirVPtO6ykrkuTj1FWiN
12
+ hyZ3MBChShlNH2poNX46ntOc7nEus0qteOgxBK8lummFEtlehCA7hd/8xuvYlP0k
13
+ 7aN684LCRDajmAGpoZO57NSDYQhAFGZeUZ93SMFucQKBgQDe7GGkzZFEiv91u1q9
14
+ lgMy1h5dZjIZKgQaOarPC6wCQMUdqCf6cSLsAPr4T8EDoWsnY7dSnrTZ6YCIFL1T
15
+ idg8M3BQXipICCJkFORS76pKKZ0wMn3/NgkSepsmNct91WHr6okvx4tOaoRCtdzU
16
+ g7jt4Mr3sfLCiZtqTQyySdMUEwKBgQDNK+ZFKL0XhkWZP+PGKjWG8LWpPiK3d78/
17
+ wYBFXzSTGlkr6FvRmYtZeNwXWRYLB4UxZ9At4hbJVEdi/2dITOz/sehVDyCAjjs3
18
+ gycsc3UJqiZbcw5XKhI5TWBuWxkKENdbMSayogVbp2aSYoRblH764//t0ACmbfTW
19
+ KUQRQPB/uwKBgQC5QjjjfPL8w4cJkGoYpFKELO2PMR7xSrmeEc6hwlFwjeNCgjy3
20
+ JM6g0y++rIj7O2qRkY0IXFxvvF3UuWedxTCu1xC/uYHp2ti506LsScB7YZoAM/YB
21
+ 4iYn9Tx6xLoYGP0H0iGwU2SyBlNkHT8oXU+SYP5MWtYkVbeS3/VtNWz1gQKBgQCA
22
+ 6Nk4kN0mH7YxEKRzSOfyzeDF4oV7kuB2FYUbkTL+TirC3K58JiYY5Egc31trOKFm
23
+ Jlz1xz0b6DkmKWTiV3r9OPHKJ8P7IeJxAZWmZzCdDuwkv0i+WW+z0zsIe3JjEavN
24
+ 3zb6O7R0HtziksWoqMeTqZeO+wa9iw6vVKQw1wWEqwKBgFHfahFs0DZ5cUTpGpBt
25
+ F/AQG7ukgipB6N6AkB9kDbgCs1FLgd199MQrEncug5hfpq8QerbyMatmA+GXoGMb
26
+ 7vztKEH85yzp4n02FNL6H7xL4VVILvyZHdolmiORJ4qT2hZnl8pEQ2TYuF4RlHUd
27
+ nSwXX+2o0J/nF85fm4AwWKAc
16
28
  -----END PRIVATE KEY-----
@@ -1,14 +1,20 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- MIICHzCCAYgCAQEwDQYJKoZIhvcNAQEFBQAwVjELMAkGA1UEBhMCQVUxEzARBgNV
3
- BAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0
4
- ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTE0MDcxNzIzNTYwMloXDTI0MDcxNDIzNTYw
5
- MlowWjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
6
- GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDETMBEGA1UEAwwKdGVzdGNsaWVudDCB
7
- nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA7FRH26G+Ft5VQgyzlZsfSnHSZ6GX
8
- b7qxmk2PO8TYqKZmkfMwke6RUfQV+S+GzRvz5LlS31U1QCp3cgwkIIAQa1E2hCEz
9
- W31ivbMByRK9tFpyn4Uv8KP14ObKjTQqxUZp558DgOHg5b5mGRM0pyV1eqRK6PWw
10
- R/bjglli6pmnr+0CAwEAATANBgkqhkiG9w0BAQUFAAOBgQAStSm5PM7ubROiKK6/
11
- T2FkKlhiTOx+Ryenm3Eio59emq+jXl+1nhPySX5G2PQzSR5vd1dIhwgZSR4Gyttk
12
- tRZ57k/NI1brUW8joiEOMJA/Mr7H7asx7wIRYDE91Fs8GkKWd5LhoPAQj+qdG35C
13
- OO+svdkmqH0KZo320ZUqdl2ooQ==
2
+ MIIDNzCCAh8CFGyX00RCepOv/qCJ1oVdTtY92U83MA0GCSqGSIb3DQEBCwUAMFYx
3
+ CzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRl
4
+ cm5ldCBXaWRnaXRzIFB0eSBMdGQxDzANBgNVBAMMBnRlc3RjYTAeFw0yMDAzMTgw
5
+ MTA2MTBaFw0zMDAzMTYwMTA2MTBaMFoxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApT
6
+ b21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQxEzAR
7
+ BgNVBAMMCnRlc3RjbGllbnQwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
8
+ AQCyqYRp+DXVp72NFbQH8hdhTZLycZXOlJhmMsrJmrjn2p7pI/8mTZ/0FC+SGWBG
9
+ ZV+ELiHrmCX5zfaILr9Iuw7Ghr3Vzoefi8r62rLupVPNi/qdqyjWk2dECHC9Z3+A
10
+ g3KzKTyerXWjKcvyKVmM0ZxE0RXhDW/RoQbqZsU2GKg1B2rhUU8KN0gVmKn0rJHO
11
+ xzRVSYeYLYp5Yn7KrtPJcKyo9aVuEr7dGANzpyF6lg/nYBWc+9SGwkoLdFvKvABY
12
+ JMyrbNhHUQfv0fzaZ0P86dfTENrDxzALrzGnqcx3KTrwJjkZ/aSr1tyD0/tXvukR
13
+ FiPxWBJhjHQ70GqTFQY19RbhAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAFXCewK8
14
+ cWT+zWxXyGFnouFSBzTi0BMBJRrhsiNoiQxkqityJHWFExiQZie+7CA+EabXCQUB
15
+ +JwMSWM29j3mSw10DTfmC3rhheQqGxy304BZyUpdpvI2dt3p/mcsE7O+p4sQrSep
16
+ gijiDssKAfxTAmUM93N6+Q8yJK5immxlbeYfijoBvmkzyB/B+qNRPsx0n7aFGnfv
17
+ oWfkW296iPhWLiwknpC3xB6oK3vRbK4Zj1OaGb0grK7VN8EyhBix2xVF61i4dzCK
18
+ kMIpl7CUpw1Mb2z8q3F2bHBS7iF7g1Ccn5VGcO+aJ+6PWydaeqJ6VEBF0Nwv9woe
19
+ mL5AluNRLaqjZvE=
14
20
  -----END CERTIFICATE-----
@@ -1,16 +1,28 @@
1
1
  -----BEGIN PRIVATE KEY-----
2
- MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAOHDFScoLCVJpYDD
3
- M4HYtIdV6Ake/sMNaaKdODjDMsux/4tDydlumN+fm+AjPEK5GHhGn1BgzkWF+slf
4
- 3BxhrA/8dNsnunstVA7ZBgA/5qQxMfGAq4wHNVX77fBZOgp9VlSMVfyd9N8YwbBY
5
- AckOeUQadTi2X1S6OgJXgQ0m3MWhAgMBAAECgYAn7qGnM2vbjJNBm0VZCkOkTIWm
6
- V10okw7EPJrdL2mkre9NasghNXbE1y5zDshx5Nt3KsazKOxTT8d0Jwh/3KbaN+YY
7
- tTCbKGW0pXDRBhwUHRcuRzScjli8Rih5UOCiZkhefUTcRb6xIhZJuQy71tjaSy0p
8
- dHZRmYyBYO2YEQ8xoQJBAPrJPhMBkzmEYFtyIEqAxQ/o/A6E+E4w8i+KM7nQCK7q
9
- K4JXzyXVAjLfyBZWHGM2uro/fjqPggGD6QH1qXCkI4MCQQDmdKeb2TrKRh5BY1LR
10
- 81aJGKcJ2XbcDu6wMZK4oqWbTX2KiYn9GB0woM6nSr/Y6iy1u145YzYxEV/iMwff
11
- DJULAkB8B2MnyzOg0pNFJqBJuH29bKCcHa8gHJzqXhNO5lAlEbMK95p/P2Wi+4Hd
12
- aiEIAF1BF326QJcvYKmwSmrORp85AkAlSNxRJ50OWrfMZnBgzVjDx3xG6KsFQVk2
13
- ol6VhqL6dFgKUORFUWBvnKSyhjJxurlPEahV6oo6+A+mPhFY8eUvAkAZQyTdupP3
14
- XEFQKctGz+9+gKkemDp7LBBMEMBXrGTLPhpEfcjv/7KPdnFHYmhYeBTBnuVmTVWe
15
- F98XJ7tIFfJq
2
+ MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDnE443EknxvxBq
3
+ 6+hvn/t09hl8hx366EBYvZmVM/NC+7igXRAjiJiA/mIaCvL3MS0Iz5hBLxSGICU+
4
+ WproA3GCIFITIwcf/ETyWj/5xpgZ4AKrLrjQmmX8mhwUajfF3UvwMJrCOVqPp67t
5
+ PtP+2kBXaqrXdvnvXR41FsIB8V7zIAuIZB6bHQhiGVlc1sgZYsE2EGG9WMmHtS86
6
+ qkAOTjG2XyjmPTGAwhGDpYkYrpzp99IiDh4/Veai81hn0ssQkbry0XRD/Ig3jcHh
7
+ 23WiriPNJ0JsbgXUSLKRPZObA9VgOLy2aXoN84IMaeK3yy+cwSYG/99w93fUZJte
8
+ MXwz4oYZAgMBAAECggEBAIVn2Ncai+4xbH0OLWckabwgyJ4IM9rDc0LIU368O1kU
9
+ koais8qP9dujAWgfoh3sGh/YGgKn96VnsZjKHlyMgF+r4TaDJn3k2rlAOWcurGlj
10
+ 1qaVlsV4HiEzp7pxiDmHhWvp4672Bb6iBG+bsjCUOEk/n9o9KhZzIBluRhtxCmw5
11
+ nw4Do7z00PTvN81260uPWSc04IrytvZUiAIx/5qxD72bij2xJ8t/I9GI8g4FtoVB
12
+ 8pB6S/hJX1PZhh9VlU6Yk+TOfOVnbebG4W5138LkB835eqk3Zz0qsbc2euoi8Hxi
13
+ y1VGwQEmMQ63jXz4c6g+X55ifvUK9Jpn5E8pq+pMd7ECgYEA93lYq+Cr54K4ey5t
14
+ sWMa+ye5RqxjzgXj2Kqr55jb54VWG7wp2iGbg8FMlkQwzTJwebzDyCSatguEZLuB
15
+ gRGroRnsUOy9vBvhKPOch9bfKIl6qOgzMJB267fBVWx5ybnRbWN/I7RvMQf3k+9y
16
+ biCIVnxDLEEYyx7z85/5qxsXg/MCgYEA7wmWKtCTn032Hy9P8OL49T0X6Z8FlkDC
17
+ Rk42ygrc/MUbugq9RGUxcCxoImOG9JXUpEtUe31YDm2j+/nbvrjl6/bP2qWs0V7l
18
+ dTJl6dABP51pCw8+l4cWgBBX08Lkeen812AAFNrjmDCjX6rHjWHLJcpS18fnRRkP
19
+ V1d/AHWX7MMCgYEA6Gsw2guhp0Zf2GCcaNK5DlQab8OL4Hwrpttzo4kuTlwtqNKp
20
+ Q9H4al9qfF4Cr1TFya98+EVYf8yFRM3NLNjZpe3gwYf2EerlJj7VLcahw0KKzoN1
21
+ QBENfwgPLRk5sDkx9VhSmcfl/diLroZdpAwtv3vo4nEoxeuGFbKTGx3Qkf0CgYEA
22
+ xyR+dcb05Ygm3w4klHQTowQ10s1H80iaUcZBgQuR1ghEtDbUPZHsoR5t1xCB02ys
23
+ DgAwLv1bChIvxvH/L6KM8ovZ2LekBX4AviWxoBxJnfz/EVau98B0b1auRN6eSC83
24
+ FRuGldlSOW1z/nSh8ViizSYE5H5HX1qkXEippvFRE88CgYB3Bfu3YQY60ITWIShv
25
+ nNkdcbTT9eoP9suaRJjw92Ln+7ZpALYlQMKUZmJ/5uBmLs4RFwUTQruLOPL4yLTH
26
+ awADWUzs3IRr1fwn9E+zM8JVyKCnUEM3w4N5UZskGO2klashAd30hWO+knRv/y0r
27
+ uGIYs9Ek7YXlXIRVrzMwcsrt1w==
16
28
  -----END PRIVATE KEY-----
@@ -1,16 +1,22 @@
1
1
  -----BEGIN CERTIFICATE-----
2
- MIICnDCCAgWgAwIBAgIBBzANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJBVTET
3
- MBEGA1UECBMKU29tZS1TdGF0ZTEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQ
4
- dHkgTHRkMQ8wDQYDVQQDEwZ0ZXN0Y2EwHhcNMTUxMTA0MDIyMDI0WhcNMjUxMTAx
5
- MDIyMDI0WjBlMQswCQYDVQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNV
6
- BAcTB0NoaWNhZ28xFTATBgNVBAoTDEV4YW1wbGUsIENvLjEaMBgGA1UEAxQRKi50
7
- ZXN0Lmdvb2dsZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOHDFSco
8
- LCVJpYDDM4HYtIdV6Ake/sMNaaKdODjDMsux/4tDydlumN+fm+AjPEK5GHhGn1Bg
9
- zkWF+slf3BxhrA/8dNsnunstVA7ZBgA/5qQxMfGAq4wHNVX77fBZOgp9VlSMVfyd
10
- 9N8YwbBYAckOeUQadTi2X1S6OgJXgQ0m3MWhAgMBAAGjazBpMAkGA1UdEwQCMAAw
11
- CwYDVR0PBAQDAgXgME8GA1UdEQRIMEaCECoudGVzdC5nb29nbGUuZnKCGHdhdGVy
12
- em9vaS50ZXN0Lmdvb2dsZS5iZYISKi50ZXN0LnlvdXR1YmUuY29thwTAqAEDMA0G
13
- CSqGSIb3DQEBCwUAA4GBAJFXVifQNub1LUP4JlnX5lXNlo8FxZ2a12AFQs+bzoJ6
14
- hM044EDjqyxUqSbVePK0ni3w1fHQB5rY9yYC5f8G7aqqTY1QOhoUk8ZTSTRpnkTh
15
- y4jjdvTZeLDVBlueZUTDRmy2feY5aZIU18vFDK08dTG0A87pppuv1LNIR3loveU8
2
+ MIIDtDCCApygAwIBAgIUbJfTREJ6k6/+oInWhV1O1j3ZT0IwDQYJKoZIhvcNAQEL
3
+ BQAwVjELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
4
+ GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDEPMA0GA1UEAwwGdGVzdGNhMB4XDTIw
5
+ MDMxODAzMTA0MloXDTMwMDMxNjAzMTA0MlowZTELMAkGA1UEBhMCVVMxETAPBgNV
6
+ BAgMCElsbGlub2lzMRAwDgYDVQQHDAdDaGljYWdvMRUwEwYDVQQKDAxFeGFtcGxl
7
+ LCBDby4xGjAYBgNVBAMMESoudGVzdC5nb29nbGUuY29tMIIBIjANBgkqhkiG9w0B
8
+ AQEFAAOCAQ8AMIIBCgKCAQEA5xOONxJJ8b8Qauvob5/7dPYZfIcd+uhAWL2ZlTPz
9
+ Qvu4oF0QI4iYgP5iGgry9zEtCM+YQS8UhiAlPlqa6ANxgiBSEyMHH/xE8lo/+caY
10
+ GeACqy640Jpl/JocFGo3xd1L8DCawjlaj6eu7T7T/tpAV2qq13b5710eNRbCAfFe
11
+ 8yALiGQemx0IYhlZXNbIGWLBNhBhvVjJh7UvOqpADk4xtl8o5j0xgMIRg6WJGK6c
12
+ 6ffSIg4eP1XmovNYZ9LLEJG68tF0Q/yIN43B4dt1oq4jzSdCbG4F1EiykT2TmwPV
13
+ YDi8tml6DfOCDGnit8svnMEmBv/fcPd31GSbXjF8M+KGGQIDAQABo2swaTAJBgNV
14
+ HRMEAjAAMAsGA1UdDwQEAwIF4DBPBgNVHREESDBGghAqLnRlc3QuZ29vZ2xlLmZy
15
+ ghh3YXRlcnpvb2kudGVzdC5nb29nbGUuYmWCEioudGVzdC55b3V0dWJlLmNvbYcE
16
+ wKgBAzANBgkqhkiG9w0BAQsFAAOCAQEAS8hDQA8PSgipgAml7Q3/djwQ644ghWQv
17
+ C2Kb+r30RCY1EyKNhnQnIIh/OUbBZvh0M0iYsy6xqXgfDhCB93AA6j0i5cS8fkhH
18
+ Jl4RK0tSkGQ3YNY4NzXwQP/vmUgfkw8VBAZ4Y4GKxppdATjffIW+srbAmdDruIRM
19
+ wPeikgOoRrXf0LA1fi4TqxARzeRwenQpayNfGHTvVF9aJkl8HoaMunTAdG5pIVcr
20
+ 9GKi/gEMpXUJbbVv3U5frX1Wo4CFo+rZWJ/LyCMeb0jciNLxSdMwj/E/ZuExlyeZ
21
+ gc9ctPjSMvgSyXEKv6Vwobleeg88V2ZgzenziORoWj4KszG/lbQZvg==
16
22
  -----END CERTIFICATE-----
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grpc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.28.0
4
+ version: 1.30.0.pre1
5
5
  platform: x64-mingw32
6
6
  authors:
7
7
  - gRPC Authors
8
8
  autorequire:
9
9
  bindir: src/ruby/bin
10
10
  cert_chain: []
11
- date: 2020-04-01 00:00:00.000000000 Z
11
+ date: 2020-06-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: google-protobuf
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '3.11'
19
+ version: '3.12'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '3.11'
26
+ version: '3.12'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: googleapis-common-protos-types
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -199,7 +199,7 @@ dependencies:
199
199
  - !ruby/object:Gem::Version
200
200
  version: '0.10'
201
201
  description: Send RPCs from Ruby using GRPC
202
- email: temiola@google.com
202
+ email: grpc-io@googlegroups.com
203
203
  executables: []
204
204
  extensions: []
205
205
  extra_rdoc_files: []
@@ -282,6 +282,7 @@ files:
282
282
  - src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb
283
283
  - src/ruby/pb/test/client.rb
284
284
  - src/ruby/pb/test/server.rb
285
+ - src/ruby/pb/test/xds_client.rb
285
286
  - src/ruby/spec/call_credentials_spec.rb
286
287
  - src/ruby/spec/call_spec.rb
287
288
  - src/ruby/spec/channel_connection_spec.rb
@@ -290,6 +291,7 @@ files:
290
291
  - src/ruby/spec/client_auth_spec.rb
291
292
  - src/ruby/spec/client_server_spec.rb
292
293
  - src/ruby/spec/compression_options_spec.rb
294
+ - src/ruby/spec/debug_message_spec.rb
293
295
  - src/ruby/spec/error_sanity_spec.rb
294
296
  - src/ruby/spec/errors_spec.rb
295
297
  - src/ruby/spec/generic/active_call_spec.rb
@@ -340,50 +342,51 @@ required_ruby_version: !ruby/object:Gem::Requirement
340
342
  version: 2.8.dev
341
343
  required_rubygems_version: !ruby/object:Gem::Requirement
342
344
  requirements:
343
- - - ">="
345
+ - - ">"
344
346
  - !ruby/object:Gem::Version
345
- version: '0'
347
+ version: 1.3.1
346
348
  requirements: []
347
- rubygems_version: 3.1.2
349
+ rubygems_version: 3.1.4
348
350
  signing_key:
349
351
  specification_version: 4
350
352
  summary: GRPC system in Ruby
351
353
  test_files:
352
354
  - src/ruby/spec/time_consts_spec.rb
353
355
  - src/ruby/spec/client_auth_spec.rb
354
- - src/ruby/spec/generic/client_stub_spec.rb
355
- - src/ruby/spec/generic/rpc_desc_spec.rb
356
- - src/ruby/spec/generic/client_interceptors_spec.rb
357
- - src/ruby/spec/generic/interceptor_registry_spec.rb
358
- - src/ruby/spec/generic/service_spec.rb
359
- - src/ruby/spec/generic/rpc_server_pool_spec.rb
360
- - src/ruby/spec/generic/active_call_spec.rb
361
- - src/ruby/spec/generic/rpc_server_spec.rb
362
- - src/ruby/spec/generic/server_interceptors_spec.rb
363
- - src/ruby/spec/support/helpers.rb
364
- - src/ruby/spec/support/services.rb
365
356
  - src/ruby/spec/spec_helper.rb
366
- - src/ruby/spec/server_credentials_spec.rb
367
- - src/ruby/spec/channel_spec.rb
368
- - src/ruby/spec/call_spec.rb
369
- - src/ruby/spec/channel_connection_spec.rb
370
357
  - src/ruby/spec/channel_credentials_spec.rb
358
+ - src/ruby/spec/channel_connection_spec.rb
359
+ - src/ruby/spec/error_sanity_spec.rb
371
360
  - src/ruby/spec/client_server_spec.rb
372
- - src/ruby/spec/compression_options_spec.rb
373
- - src/ruby/spec/pb/duplicate/codegen_spec.rb
374
- - src/ruby/spec/pb/codegen/grpc/testing/package_options_import.proto
375
- - src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto
376
- - src/ruby/spec/pb/codegen/grpc/testing/package_options.proto
377
- - src/ruby/spec/pb/codegen/package_option_spec.rb
378
- - src/ruby/spec/pb/health/checker_spec.rb
379
- - src/ruby/spec/testdata/client.key
380
- - src/ruby/spec/testdata/server1.pem
381
361
  - src/ruby/spec/testdata/README
382
- - src/ruby/spec/testdata/client.pem
383
362
  - src/ruby/spec/testdata/ca.pem
363
+ - src/ruby/spec/testdata/client.pem
364
+ - src/ruby/spec/testdata/server1.pem
365
+ - src/ruby/spec/testdata/client.key
384
366
  - src/ruby/spec/testdata/server1.key
385
- - src/ruby/spec/errors_spec.rb
386
- - src/ruby/spec/error_sanity_spec.rb
367
+ - src/ruby/spec/channel_spec.rb
368
+ - src/ruby/spec/server_credentials_spec.rb
387
369
  - src/ruby/spec/google_rpc_status_utils_spec.rb
388
- - src/ruby/spec/server_spec.rb
370
+ - src/ruby/spec/debug_message_spec.rb
371
+ - src/ruby/spec/pb/codegen/package_option_spec.rb
372
+ - src/ruby/spec/pb/codegen/grpc/testing/package_options_import.proto
373
+ - src/ruby/spec/pb/codegen/grpc/testing/package_options.proto
374
+ - src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto
375
+ - src/ruby/spec/pb/health/checker_spec.rb
376
+ - src/ruby/spec/pb/duplicate/codegen_spec.rb
377
+ - src/ruby/spec/errors_spec.rb
378
+ - src/ruby/spec/support/helpers.rb
379
+ - src/ruby/spec/support/services.rb
380
+ - src/ruby/spec/compression_options_spec.rb
389
381
  - src/ruby/spec/call_credentials_spec.rb
382
+ - src/ruby/spec/server_spec.rb
383
+ - src/ruby/spec/call_spec.rb
384
+ - src/ruby/spec/generic/rpc_server_spec.rb
385
+ - src/ruby/spec/generic/client_interceptors_spec.rb
386
+ - src/ruby/spec/generic/client_stub_spec.rb
387
+ - src/ruby/spec/generic/interceptor_registry_spec.rb
388
+ - src/ruby/spec/generic/rpc_desc_spec.rb
389
+ - src/ruby/spec/generic/service_spec.rb
390
+ - src/ruby/spec/generic/rpc_server_pool_spec.rb
391
+ - src/ruby/spec/generic/server_interceptors_spec.rb
392
+ - src/ruby/spec/generic/active_call_spec.rb