grpc 1.28.0-x86-mingw32 → 1.30.0.pre1-x86-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 +4 -4
- data/grpc_c.32.ruby +0 -0
- data/grpc_c.64.ruby +0 -0
- data/src/ruby/ext/grpc/rb_call.c +9 -1
- data/src/ruby/lib/grpc/2.3/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/2.4/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/2.5/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/2.6/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/2.7/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/errors.rb +103 -42
- data/src/ruby/lib/grpc/generic/active_call.rb +2 -3
- data/src/ruby/lib/grpc/generic/interceptors.rb +4 -4
- data/src/ruby/lib/grpc/generic/rpc_server.rb +9 -10
- data/src/ruby/lib/grpc/generic/service.rb +5 -4
- data/src/ruby/lib/grpc/structs.rb +1 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/generate_proto_ruby.sh +5 -3
- data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +11 -0
- data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +16 -0
- data/src/ruby/pb/test/xds_client.rb +213 -0
- data/src/ruby/spec/debug_message_spec.rb +134 -0
- data/src/ruby/spec/generic/service_spec.rb +2 -0
- data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +5 -0
- data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -0
- data/src/ruby/spec/testdata/ca.pem +18 -13
- data/src/ruby/spec/testdata/client.key +26 -14
- data/src/ruby/spec/testdata/client.pem +18 -12
- data/src/ruby/spec/testdata/server1.key +26 -14
- data/src/ruby/spec/testdata/server1.pem +20 -14
- metadata +39 -36
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 02cb545d0ad6c8a3ad5c6f7d33ee67349236bc5798b9fc14a15a914458969c14
|
4
|
+
data.tar.gz: 3dc120116685374f0e2a9b5fc011e7b5617e313d6a4c0c7d2e9c176f370a21fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ed74e7455dc7ac52081ce27b09204dfb12008d0cf28ee396ca1c95412656ba8a9335651b0a7ee1ccffc2c3fa9d1290b705fd720715bb493ce8fdca64f5f73c2a
|
7
|
+
data.tar.gz: 85c7dd6cae98602f1f00963b10090b9ab1178537084980a46c07e4eac74eb6915e469ab7793b97e6934d382f14bdc0a9d6116538a2774336fae7e735e6ab7843
|
data/grpc_c.32.ruby
CHANGED
Binary file
|
data/grpc_c.64.ruby
CHANGED
Binary file
|
data/src/ruby/ext/grpc/rb_call.c
CHANGED
@@ -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),
|
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);
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/src/ruby/lib/grpc/errors.rb
CHANGED
@@ -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,
|
41
|
-
|
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,
|
70
|
-
|
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',
|
101
|
-
|
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',
|
108
|
-
|
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',
|
115
|
-
|
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',
|
122
|
-
|
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',
|
129
|
-
|
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',
|
136
|
-
|
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',
|
143
|
-
|
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',
|
150
|
-
|
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',
|
157
|
-
|
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',
|
164
|
-
|
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',
|
171
|
-
|
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',
|
178
|
-
|
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',
|
185
|
-
|
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',
|
192
|
-
|
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',
|
199
|
-
|
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',
|
206
|
-
|
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',
|
213
|
-
|
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,
|
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 [
|
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 [
|
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 [
|
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 [
|
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
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
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?(
|
404
|
-
Signal.trap(
|
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 "#{
|
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
|
@@ -14,11 +14,13 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
|
16
16
|
# Regenerates gRPC service stubs from proto files.
|
17
|
-
set
|
17
|
+
set -e
|
18
18
|
cd $(dirname $0)/../../..
|
19
19
|
|
20
|
-
|
21
|
-
|
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
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
+
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
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
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
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
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
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
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
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
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
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.
|
4
|
+
version: 1.30.0.pre1
|
5
5
|
platform: x86-mingw32
|
6
6
|
authors:
|
7
7
|
- gRPC Authors
|
8
8
|
autorequire:
|
9
9
|
bindir: src/ruby/bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
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.
|
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.
|
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:
|
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:
|
347
|
+
version: 1.3.1
|
346
348
|
requirements: []
|
347
|
-
rubygems_version: 3.1.
|
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/
|
386
|
-
- src/ruby/spec/
|
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/
|
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
|