grpc 1.30.2-x86-linux

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

Potentially problematic release.


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

Files changed (121) hide show
  1. checksums.yaml +7 -0
  2. data/etc/roots.pem +4644 -0
  3. data/grpc_c.32.ruby +0 -0
  4. data/grpc_c.64.ruby +0 -0
  5. data/src/ruby/bin/math_client.rb +140 -0
  6. data/src/ruby/bin/math_pb.rb +34 -0
  7. data/src/ruby/bin/math_server.rb +191 -0
  8. data/src/ruby/bin/math_services_pb.rb +51 -0
  9. data/src/ruby/bin/noproto_client.rb +93 -0
  10. data/src/ruby/bin/noproto_server.rb +97 -0
  11. data/src/ruby/ext/grpc/ext-export.clang +1 -0
  12. data/src/ruby/ext/grpc/ext-export.gcc +6 -0
  13. data/src/ruby/ext/grpc/extconf.rb +107 -0
  14. data/src/ruby/ext/grpc/rb_byte_buffer.c +64 -0
  15. data/src/ruby/ext/grpc/rb_byte_buffer.h +35 -0
  16. data/src/ruby/ext/grpc/rb_call.c +1050 -0
  17. data/src/ruby/ext/grpc/rb_call.h +53 -0
  18. data/src/ruby/ext/grpc/rb_call_credentials.c +297 -0
  19. data/src/ruby/ext/grpc/rb_call_credentials.h +31 -0
  20. data/src/ruby/ext/grpc/rb_channel.c +835 -0
  21. data/src/ruby/ext/grpc/rb_channel.h +34 -0
  22. data/src/ruby/ext/grpc/rb_channel_args.c +155 -0
  23. data/src/ruby/ext/grpc/rb_channel_args.h +38 -0
  24. data/src/ruby/ext/grpc/rb_channel_credentials.c +267 -0
  25. data/src/ruby/ext/grpc/rb_channel_credentials.h +32 -0
  26. data/src/ruby/ext/grpc/rb_completion_queue.c +100 -0
  27. data/src/ruby/ext/grpc/rb_completion_queue.h +36 -0
  28. data/src/ruby/ext/grpc/rb_compression_options.c +470 -0
  29. data/src/ruby/ext/grpc/rb_compression_options.h +29 -0
  30. data/src/ruby/ext/grpc/rb_enable_cpp.cc +22 -0
  31. data/src/ruby/ext/grpc/rb_event_thread.c +143 -0
  32. data/src/ruby/ext/grpc/rb_event_thread.h +21 -0
  33. data/src/ruby/ext/grpc/rb_grpc.c +328 -0
  34. data/src/ruby/ext/grpc/rb_grpc.h +76 -0
  35. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +573 -0
  36. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +865 -0
  37. data/src/ruby/ext/grpc/rb_loader.c +57 -0
  38. data/src/ruby/ext/grpc/rb_loader.h +25 -0
  39. data/src/ruby/ext/grpc/rb_server.c +372 -0
  40. data/src/ruby/ext/grpc/rb_server.h +32 -0
  41. data/src/ruby/ext/grpc/rb_server_credentials.c +243 -0
  42. data/src/ruby/ext/grpc/rb_server_credentials.h +32 -0
  43. data/src/ruby/lib/grpc.rb +37 -0
  44. data/src/ruby/lib/grpc/2.3/grpc_c.so +0 -0
  45. data/src/ruby/lib/grpc/2.4/grpc_c.so +0 -0
  46. data/src/ruby/lib/grpc/2.5/grpc_c.so +0 -0
  47. data/src/ruby/lib/grpc/2.6/grpc_c.so +0 -0
  48. data/src/ruby/lib/grpc/2.7/grpc_c.so +0 -0
  49. data/src/ruby/lib/grpc/core/status_codes.rb +135 -0
  50. data/src/ruby/lib/grpc/core/time_consts.rb +56 -0
  51. data/src/ruby/lib/grpc/errors.rb +277 -0
  52. data/src/ruby/lib/grpc/generic/active_call.rb +669 -0
  53. data/src/ruby/lib/grpc/generic/bidi_call.rb +233 -0
  54. data/src/ruby/lib/grpc/generic/client_stub.rb +501 -0
  55. data/src/ruby/lib/grpc/generic/interceptor_registry.rb +53 -0
  56. data/src/ruby/lib/grpc/generic/interceptors.rb +186 -0
  57. data/src/ruby/lib/grpc/generic/rpc_desc.rb +204 -0
  58. data/src/ruby/lib/grpc/generic/rpc_server.rb +551 -0
  59. data/src/ruby/lib/grpc/generic/service.rb +211 -0
  60. data/src/ruby/lib/grpc/google_rpc_status_utils.rb +40 -0
  61. data/src/ruby/lib/grpc/grpc.rb +24 -0
  62. data/src/ruby/lib/grpc/logconfig.rb +44 -0
  63. data/src/ruby/lib/grpc/notifier.rb +45 -0
  64. data/src/ruby/lib/grpc/structs.rb +15 -0
  65. data/src/ruby/lib/grpc/version.rb +18 -0
  66. data/src/ruby/pb/README.md +42 -0
  67. data/src/ruby/pb/generate_proto_ruby.sh +51 -0
  68. data/src/ruby/pb/grpc/health/checker.rb +75 -0
  69. data/src/ruby/pb/grpc/health/v1/health_pb.rb +31 -0
  70. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +62 -0
  71. data/src/ruby/pb/grpc/testing/duplicate/echo_duplicate_services_pb.rb +44 -0
  72. data/src/ruby/pb/grpc/testing/metrics_pb.rb +28 -0
  73. data/src/ruby/pb/grpc/testing/metrics_services_pb.rb +49 -0
  74. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +17 -0
  75. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +105 -0
  76. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +16 -0
  77. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +118 -0
  78. data/src/ruby/pb/test/client.rb +769 -0
  79. data/src/ruby/pb/test/server.rb +252 -0
  80. data/src/ruby/pb/test/xds_client.rb +213 -0
  81. data/src/ruby/spec/call_credentials_spec.rb +42 -0
  82. data/src/ruby/spec/call_spec.rb +180 -0
  83. data/src/ruby/spec/channel_connection_spec.rb +126 -0
  84. data/src/ruby/spec/channel_credentials_spec.rb +82 -0
  85. data/src/ruby/spec/channel_spec.rb +234 -0
  86. data/src/ruby/spec/client_auth_spec.rb +126 -0
  87. data/src/ruby/spec/client_server_spec.rb +664 -0
  88. data/src/ruby/spec/compression_options_spec.rb +149 -0
  89. data/src/ruby/spec/debug_message_spec.rb +134 -0
  90. data/src/ruby/spec/error_sanity_spec.rb +49 -0
  91. data/src/ruby/spec/errors_spec.rb +142 -0
  92. data/src/ruby/spec/generic/active_call_spec.rb +672 -0
  93. data/src/ruby/spec/generic/client_interceptors_spec.rb +153 -0
  94. data/src/ruby/spec/generic/client_stub_spec.rb +1083 -0
  95. data/src/ruby/spec/generic/interceptor_registry_spec.rb +65 -0
  96. data/src/ruby/spec/generic/rpc_desc_spec.rb +374 -0
  97. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +127 -0
  98. data/src/ruby/spec/generic/rpc_server_spec.rb +748 -0
  99. data/src/ruby/spec/generic/server_interceptors_spec.rb +218 -0
  100. data/src/ruby/spec/generic/service_spec.rb +263 -0
  101. data/src/ruby/spec/google_rpc_status_utils_spec.rb +282 -0
  102. data/src/ruby/spec/pb/codegen/grpc/testing/package_options.proto +28 -0
  103. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import.proto +22 -0
  104. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_import2.proto +23 -0
  105. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +41 -0
  106. data/src/ruby/spec/pb/codegen/package_option_spec.rb +82 -0
  107. data/src/ruby/spec/pb/duplicate/codegen_spec.rb +57 -0
  108. data/src/ruby/spec/pb/health/checker_spec.rb +236 -0
  109. data/src/ruby/spec/server_credentials_spec.rb +79 -0
  110. data/src/ruby/spec/server_spec.rb +209 -0
  111. data/src/ruby/spec/spec_helper.rb +61 -0
  112. data/src/ruby/spec/support/helpers.rb +107 -0
  113. data/src/ruby/spec/support/services.rb +160 -0
  114. data/src/ruby/spec/testdata/README +1 -0
  115. data/src/ruby/spec/testdata/ca.pem +20 -0
  116. data/src/ruby/spec/testdata/client.key +28 -0
  117. data/src/ruby/spec/testdata/client.pem +20 -0
  118. data/src/ruby/spec/testdata/server1.key +28 -0
  119. data/src/ruby/spec/testdata/server1.pem +22 -0
  120. data/src/ruby/spec/time_consts_spec.rb +74 -0
  121. metadata +394 -0
@@ -0,0 +1,282 @@
1
+ # Copyright 2017 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
+ require_relative '../lib/grpc/google_rpc_status_utils'
17
+ require_relative '../pb/src/proto/grpc/testing/messages_pb'
18
+ require_relative '../pb/src/proto/grpc/testing/messages_pb'
19
+ require 'google/protobuf/well_known_types'
20
+
21
+ include GRPC::Core
22
+ include GRPC::Spec::Helpers
23
+
24
+ describe 'conversion from a status struct to a google protobuf status' do
25
+ it 'fails if the input is not a status struct' do
26
+ begin
27
+ GRPC::GoogleRpcStatusUtils.extract_google_rpc_status('string')
28
+ rescue => e
29
+ exception = e
30
+ end
31
+ expect(exception.is_a?(ArgumentError)).to be true
32
+ expect(exception.message.include?('bad type')).to be true
33
+ end
34
+
35
+ it 'returns nil if the header key is missing' do
36
+ status = Struct::Status.new(1, 'details', key: 'val')
37
+ expect(status.metadata.nil?).to be false
38
+ expect(GRPC::GoogleRpcStatusUtils.extract_google_rpc_status(
39
+ status)).to be(nil)
40
+ end
41
+
42
+ it 'fails with some error if the header key fails to deserialize' do
43
+ status = Struct::Status.new(1, 'details',
44
+ 'grpc-status-details-bin' => 'string_val')
45
+ expect do
46
+ GRPC::GoogleRpcStatusUtils.extract_google_rpc_status(status)
47
+ end.to raise_error(StandardError)
48
+ end
49
+
50
+ it 'silently ignores erroneous mismatch between messages in '\
51
+ 'status struct and protobuf status' do
52
+ proto = Google::Rpc::Status.new(code: 1, message: 'proto message')
53
+ encoded_proto = Google::Rpc::Status.encode(proto)
54
+ status = Struct::Status.new(1, 'struct message',
55
+ 'grpc-status-details-bin' => encoded_proto)
56
+ rpc_status = GRPC::GoogleRpcStatusUtils.extract_google_rpc_status(status)
57
+ expect(rpc_status).to eq(proto)
58
+ end
59
+
60
+ it 'silently ignores erroneous mismatch between codes in status struct '\
61
+ 'and protobuf status' do
62
+ proto = Google::Rpc::Status.new(code: 1, message: 'matching message')
63
+ encoded_proto = Google::Rpc::Status.encode(proto)
64
+ status = Struct::Status.new(2, 'matching message',
65
+ 'grpc-status-details-bin' => encoded_proto)
66
+ rpc_status = GRPC::GoogleRpcStatusUtils.extract_google_rpc_status(status)
67
+ expect(rpc_status).to eq(proto)
68
+ end
69
+
70
+ it 'can successfully convert a status struct into a google protobuf status '\
71
+ 'when there are no rpcstatus details' do
72
+ proto = Google::Rpc::Status.new(code: 1, message: 'matching message')
73
+ encoded_proto = Google::Rpc::Status.encode(proto)
74
+ status = Struct::Status.new(1, 'matching message',
75
+ 'grpc-status-details-bin' => encoded_proto)
76
+ out = GRPC::GoogleRpcStatusUtils.extract_google_rpc_status(status)
77
+ expect(out.code).to eq(1)
78
+ expect(out.message).to eq('matching message')
79
+ expect(out.details).to eq([])
80
+ end
81
+
82
+ it 'can successfully convert a status struct into a google protobuf '\
83
+ 'status when there are multiple rpcstatus details' do
84
+ simple_request_any = Google::Protobuf::Any.new
85
+ simple_request = Grpc::Testing::SimpleRequest.new(
86
+ payload: Grpc::Testing::Payload.new(body: 'request'))
87
+ simple_request_any.pack(simple_request)
88
+ simple_response_any = Google::Protobuf::Any.new
89
+ simple_response = Grpc::Testing::SimpleResponse.new(
90
+ payload: Grpc::Testing::Payload.new(body: 'response'))
91
+ simple_response_any.pack(simple_response)
92
+ payload_any = Google::Protobuf::Any.new
93
+ payload = Grpc::Testing::Payload.new(body: 'payload')
94
+ payload_any.pack(payload)
95
+ proto = Google::Rpc::Status.new(code: 1,
96
+ message: 'matching message',
97
+ details: [
98
+ simple_request_any,
99
+ simple_response_any,
100
+ payload_any
101
+ ])
102
+ encoded_proto = Google::Rpc::Status.encode(proto)
103
+ status = Struct::Status.new(1, 'matching message',
104
+ 'grpc-status-details-bin' => encoded_proto)
105
+ out = GRPC::GoogleRpcStatusUtils.extract_google_rpc_status(status)
106
+ expect(out.code).to eq(1)
107
+ expect(out.message).to eq('matching message')
108
+ expect(out.details[0].unpack(
109
+ Grpc::Testing::SimpleRequest)).to eq(simple_request)
110
+ expect(out.details[1].unpack(
111
+ Grpc::Testing::SimpleResponse)).to eq(simple_response)
112
+ expect(out.details[2].unpack(
113
+ Grpc::Testing::Payload)).to eq(payload)
114
+ end
115
+ end
116
+
117
+ # A test service that fills in the "reserved" grpc-status-details-bin trailer,
118
+ # for client-side testing of GoogleRpcStatus protobuf extraction from trailers.
119
+ class GoogleRpcStatusTestService
120
+ include GRPC::GenericService
121
+ rpc :an_rpc, EchoMsg, EchoMsg
122
+
123
+ def initialize(encoded_rpc_status)
124
+ @encoded_rpc_status = encoded_rpc_status
125
+ end
126
+
127
+ def an_rpc(_, _)
128
+ # TODO: create a server-side utility API for sending a google rpc status.
129
+ # Applications are not expected to set the grpc-status-details-bin
130
+ # ("grpc"-fixed and reserved for library use) manually.
131
+ # Doing so here is only for testing of the client-side api for extracting
132
+ # a google rpc status, which is useful
133
+ # when the interacting with a server that does fill in this trailer.
134
+ fail GRPC::Unknown.new('test message',
135
+ 'grpc-status-details-bin' => @encoded_rpc_status)
136
+ end
137
+ end
138
+
139
+ GoogleRpcStatusTestStub = GoogleRpcStatusTestService.rpc_stub_class
140
+
141
+ describe 'receving a google rpc status from a remote endpoint' do
142
+ def start_server(encoded_rpc_status)
143
+ @srv = new_rpc_server_for_testing(pool_size: 1)
144
+ @server_port = @srv.add_http2_port('localhost:0',
145
+ :this_port_is_insecure)
146
+ @srv.handle(GoogleRpcStatusTestService.new(encoded_rpc_status))
147
+ @server_thd = Thread.new { @srv.run }
148
+ @srv.wait_till_running
149
+ end
150
+
151
+ def stop_server
152
+ expect(@srv.stopped?).to be(false)
153
+ @srv.stop
154
+ @server_thd.join
155
+ expect(@srv.stopped?).to be(true)
156
+ end
157
+
158
+ before(:each) do
159
+ simple_request_any = Google::Protobuf::Any.new
160
+ simple_request = Grpc::Testing::SimpleRequest.new(
161
+ payload: Grpc::Testing::Payload.new(body: 'request'))
162
+ simple_request_any.pack(simple_request)
163
+ simple_response_any = Google::Protobuf::Any.new
164
+ simple_response = Grpc::Testing::SimpleResponse.new(
165
+ payload: Grpc::Testing::Payload.new(body: 'response'))
166
+ simple_response_any.pack(simple_response)
167
+ payload_any = Google::Protobuf::Any.new
168
+ payload = Grpc::Testing::Payload.new(body: 'payload')
169
+ payload_any.pack(payload)
170
+ @expected_proto = Google::Rpc::Status.new(
171
+ code: StatusCodes::UNKNOWN,
172
+ message: 'test message',
173
+ details: [simple_request_any, simple_response_any, payload_any])
174
+ start_server(Google::Rpc::Status.encode(@expected_proto))
175
+ end
176
+
177
+ after(:each) do
178
+ stop_server
179
+ end
180
+
181
+ it 'should receive be able to extract a google rpc status from the '\
182
+ 'status struct taken from a BadStatus exception' do
183
+ stub = GoogleRpcStatusTestStub.new("localhost:#{@server_port}",
184
+ :this_channel_is_insecure)
185
+ begin
186
+ stub.an_rpc(EchoMsg.new)
187
+ rescue GRPC::BadStatus => e
188
+ rpc_status = GRPC::GoogleRpcStatusUtils.extract_google_rpc_status(
189
+ e.to_status)
190
+ end
191
+ expect(rpc_status).to eq(@expected_proto)
192
+ end
193
+
194
+ it 'should receive be able to extract a google rpc status from the '\
195
+ 'status struct taken from the op view of a call' do
196
+ stub = GoogleRpcStatusTestStub.new("localhost:#{@server_port}",
197
+ :this_channel_is_insecure)
198
+ op = stub.an_rpc(EchoMsg.new, return_op: true)
199
+ begin
200
+ op.execute
201
+ rescue GRPC::BadStatus => e
202
+ status_from_exception = e.to_status
203
+ end
204
+ rpc_status = GRPC::GoogleRpcStatusUtils.extract_google_rpc_status(
205
+ op.status)
206
+ expect(rpc_status).to eq(@expected_proto)
207
+ # "to_status" on the bad status should give the same result
208
+ # as "status" on the "op view".
209
+ expect(GRPC::GoogleRpcStatusUtils.extract_google_rpc_status(
210
+ status_from_exception)).to eq(rpc_status)
211
+ end
212
+ end
213
+
214
+ # A test service that fails without explicitly setting the
215
+ # grpc-status-details-bin trailer. Tests assumptions about value
216
+ # of grpc-status-details-bin on the client side when the trailer wasn't
217
+ # set explicitly.
218
+ class NoStatusDetailsBinTestService
219
+ include GRPC::GenericService
220
+ rpc :an_rpc, EchoMsg, EchoMsg
221
+
222
+ def an_rpc(_, _)
223
+ fail GRPC::Unknown
224
+ end
225
+ end
226
+
227
+ NoStatusDetailsBinTestServiceStub = NoStatusDetailsBinTestService.rpc_stub_class
228
+
229
+ describe 'when the endpoint doesnt send grpc-status-details-bin' do
230
+ def start_server
231
+ @srv = new_rpc_server_for_testing(pool_size: 1)
232
+ @server_port = @srv.add_http2_port('localhost:0',
233
+ :this_port_is_insecure)
234
+ @srv.handle(NoStatusDetailsBinTestService)
235
+ @server_thd = Thread.new { @srv.run }
236
+ @srv.wait_till_running
237
+ end
238
+
239
+ def stop_server
240
+ expect(@srv.stopped?).to be(false)
241
+ @srv.stop
242
+ @server_thd.join
243
+ expect(@srv.stopped?).to be(true)
244
+ end
245
+
246
+ before(:each) do
247
+ start_server
248
+ end
249
+
250
+ after(:each) do
251
+ stop_server
252
+ end
253
+
254
+ it 'should receive nil when we extract try to extract a google '\
255
+ 'rpc status from a BadStatus exception that didnt have it' do
256
+ stub = NoStatusDetailsBinTestServiceStub.new("localhost:#{@server_port}",
257
+ :this_channel_is_insecure)
258
+ begin
259
+ stub.an_rpc(EchoMsg.new)
260
+ rescue GRPC::Unknown => e
261
+ rpc_status = GRPC::GoogleRpcStatusUtils.extract_google_rpc_status(
262
+ e.to_status)
263
+ end
264
+ expect(rpc_status).to be(nil)
265
+ end
266
+
267
+ it 'should receive nil when we extract try to extract a google '\
268
+ 'rpc status from an op views status object that didnt have it' do
269
+ stub = NoStatusDetailsBinTestServiceStub.new("localhost:#{@server_port}",
270
+ :this_channel_is_insecure)
271
+ op = stub.an_rpc(EchoMsg.new, return_op: true)
272
+ begin
273
+ op.execute
274
+ rescue GRPC::Unknown => e
275
+ status_from_exception = e.to_status
276
+ end
277
+ expect(GRPC::GoogleRpcStatusUtils.extract_google_rpc_status(
278
+ status_from_exception)).to be(nil)
279
+ expect(GRPC::GoogleRpcStatusUtils.extract_google_rpc_status(
280
+ op.status)).to be nil
281
+ end
282
+ end
@@ -0,0 +1,28 @@
1
+ // Copyright 2018 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
+ syntax = "proto3";
16
+
17
+ package grpc.testing;
18
+
19
+ // For sanity checking package definitions
20
+ option ruby_package = "Grpc.Testing.Package.Options";
21
+
22
+ message TestRequest { }
23
+
24
+ message TestResponse { }
25
+
26
+ service TestService {
27
+ rpc GetTest(TestRequest) returns (TestResponse) { }
28
+ }
@@ -0,0 +1,22 @@
1
+ // Copyright 2019 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
+ syntax = "proto3";
16
+
17
+ package grpc.testing;
18
+
19
+ // For sanity checking package definitions
20
+ option ruby_package = "A::Other";
21
+
22
+ message Thing { }
@@ -0,0 +1,23 @@
1
+ // Copyright 2020 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
+ syntax = "proto3";
16
+
17
+ package grpc.foo;
18
+
19
+ option ruby_package = "B::Other";
20
+
21
+ message Foo {
22
+ message Bar { }
23
+ }
@@ -0,0 +1,41 @@
1
+ // Copyright 2019 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
+ syntax = "proto3";
16
+
17
+ package grpc.testing;
18
+
19
+ import "grpc/testing/package_options_import.proto";
20
+ import "grpc/testing/package_options_import2.proto";
21
+
22
+ // For sanity checking package definitions
23
+ option ruby_package = "RPC::Test::New::Package::Options";
24
+
25
+ message AnotherTestRequest { }
26
+
27
+ message AnotherTestResponse { }
28
+
29
+ message Foo { }
30
+
31
+ message Bar {
32
+ message Baz { }
33
+ }
34
+
35
+ service AnotherTestService {
36
+ rpc GetTest(AnotherTestRequest) returns (AnotherTestResponse) { }
37
+ rpc OtherTest(Thing) returns (Thing) { }
38
+ rpc PackageTest(grpc.testing.Thing) returns (grpc.foo.Foo.Bar) { }
39
+ rpc FooTest(Foo) returns (Foo) { }
40
+ rpc NestedMessageTest(Foo) returns (Bar.Baz) { }
41
+ }
@@ -0,0 +1,82 @@
1
+ # Copyright 2018 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
+ require 'open3'
17
+ require 'tmpdir'
18
+
19
+ describe 'Code Generation Options' do
20
+ it 'should generate and respect package options' do
21
+ with_protos(%w[grpc/testing/package_options.proto]) do
22
+ expect { Grpc::Testing::Package::Options::TestService::Service }.to raise_error(NameError)
23
+ expect(require('grpc/testing/package_options_services_pb')).to be_truthy
24
+ expect { Grpc::Testing::Package::Options::TestService::Service }.to_not raise_error
25
+ expect { Grpc::Testing::TestService::Service }.to raise_error(NameError)
26
+ end
27
+ end
28
+
29
+ it 'should generate and respect Ruby style package options' do
30
+ with_protos(['grpc/testing/package_options_ruby_style.proto',
31
+ 'grpc/testing/package_options_import.proto',
32
+ 'grpc/testing/package_options_import2.proto']) do
33
+ expect { RPC::Test::New::Package::Options::AnotherTestService::Service }.to raise_error(NameError)
34
+ expect(require('grpc/testing/package_options_ruby_style_services_pb')).to be_truthy
35
+ expect { RPC::Test::New::Package::Options::AnotherTestService::Service }.to_not raise_error
36
+ expect { Grpc::Testing::AnotherTestService::Service }.to raise_error(NameError)
37
+
38
+ services = RPC::Test::New::Package::Options::AnotherTestService::Service.rpc_descs
39
+ expect(services[:GetTest].input).to eq(RPC::Test::New::Package::Options::AnotherTestRequest)
40
+ expect(services[:GetTest].output).to eq(RPC::Test::New::Package::Options::AnotherTestResponse)
41
+ expect(services[:OtherTest].input).to eq(A::Other::Thing)
42
+ expect(services[:OtherTest].output).to eq(A::Other::Thing)
43
+ expect(services[:PackageTest].input).to eq(A::Other::Thing)
44
+ expect(services[:PackageTest].output).to eq(B::Other::Foo::Bar)
45
+ expect(services[:FooTest].input).to eq(RPC::Test::New::Package::Options::Foo)
46
+ expect(services[:FooTest].output).to eq(RPC::Test::New::Package::Options::Foo)
47
+ expect(services[:NestedMessageTest].input).to eq(RPC::Test::New::Package::Options::Foo)
48
+ expect(services[:NestedMessageTest].output).to eq(RPC::Test::New::Package::Options::Bar::Baz)
49
+ end
50
+ end
51
+ end
52
+
53
+ def with_protos(file_paths)
54
+ fail 'CONFIG env variable unexpectedly unset' unless ENV['CONFIG']
55
+ bins_sub_dir = ENV['CONFIG']
56
+
57
+ pb_dir = File.dirname(__FILE__)
58
+ bins_dir = File.join('..', '..', '..', '..', '..', 'bins', bins_sub_dir)
59
+
60
+ plugin = File.join(bins_dir, 'grpc_ruby_plugin')
61
+ protoc = File.join(bins_dir, 'protobuf', 'protoc')
62
+
63
+ # Generate the service from the proto
64
+ Dir.mktmpdir(nil, File.dirname(__FILE__)) do |tmp_dir|
65
+ gen_file = system(protoc,
66
+ '-I.',
67
+ *file_paths,
68
+ "--grpc_out=#{tmp_dir}", # generate the service
69
+ "--ruby_out=#{tmp_dir}", # generate the definitions
70
+ "--plugin=protoc-gen-grpc=#{plugin}",
71
+ chdir: pb_dir,
72
+ out: File::NULL)
73
+
74
+ expect(gen_file).to be_truthy
75
+ begin
76
+ $LOAD_PATH.push(tmp_dir)
77
+ yield
78
+ ensure
79
+ $LOAD_PATH.delete(tmp_dir)
80
+ end
81
+ end
82
+ end