protobuf-cucumber 3.10.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +21 -0
- data/.rubocop.yml +70 -0
- data/.rubocop_todo.yml +145 -0
- data/.travis.yml +40 -0
- data/.yardopts +5 -0
- data/CHANGES.md +344 -0
- data/CONTRIBUTING.md +16 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +22 -0
- data/README.md +33 -0
- data/Rakefile +64 -0
- data/bin/protoc-gen-ruby +22 -0
- data/bin/rpc_server +5 -0
- data/install-protobuf.sh +28 -0
- data/lib/protobuf.rb +129 -0
- data/lib/protobuf/cli.rb +257 -0
- data/lib/protobuf/code_generator.rb +120 -0
- data/lib/protobuf/decoder.rb +28 -0
- data/lib/protobuf/deprecation.rb +117 -0
- data/lib/protobuf/descriptors.rb +3 -0
- data/lib/protobuf/descriptors/google/protobuf/compiler/plugin.pb.rb +62 -0
- data/lib/protobuf/descriptors/google/protobuf/descriptor.pb.rb +301 -0
- data/lib/protobuf/encoder.rb +11 -0
- data/lib/protobuf/enum.rb +365 -0
- data/lib/protobuf/exceptions.rb +9 -0
- data/lib/protobuf/field.rb +74 -0
- data/lib/protobuf/field/base_field.rb +380 -0
- data/lib/protobuf/field/base_field_object_definitions.rb +504 -0
- data/lib/protobuf/field/bool_field.rb +64 -0
- data/lib/protobuf/field/bytes_field.rb +78 -0
- data/lib/protobuf/field/double_field.rb +25 -0
- data/lib/protobuf/field/enum_field.rb +61 -0
- data/lib/protobuf/field/field_array.rb +104 -0
- data/lib/protobuf/field/field_hash.rb +122 -0
- data/lib/protobuf/field/fixed32_field.rb +25 -0
- data/lib/protobuf/field/fixed64_field.rb +28 -0
- data/lib/protobuf/field/float_field.rb +43 -0
- data/lib/protobuf/field/int32_field.rb +21 -0
- data/lib/protobuf/field/int64_field.rb +34 -0
- data/lib/protobuf/field/integer_field.rb +23 -0
- data/lib/protobuf/field/message_field.rb +51 -0
- data/lib/protobuf/field/sfixed32_field.rb +27 -0
- data/lib/protobuf/field/sfixed64_field.rb +28 -0
- data/lib/protobuf/field/signed_integer_field.rb +29 -0
- data/lib/protobuf/field/sint32_field.rb +21 -0
- data/lib/protobuf/field/sint64_field.rb +21 -0
- data/lib/protobuf/field/string_field.rb +51 -0
- data/lib/protobuf/field/uint32_field.rb +21 -0
- data/lib/protobuf/field/uint64_field.rb +21 -0
- data/lib/protobuf/field/varint_field.rb +77 -0
- data/lib/protobuf/generators/base.rb +85 -0
- data/lib/protobuf/generators/enum_generator.rb +39 -0
- data/lib/protobuf/generators/extension_generator.rb +27 -0
- data/lib/protobuf/generators/field_generator.rb +193 -0
- data/lib/protobuf/generators/file_generator.rb +262 -0
- data/lib/protobuf/generators/group_generator.rb +122 -0
- data/lib/protobuf/generators/message_generator.rb +104 -0
- data/lib/protobuf/generators/option_generator.rb +17 -0
- data/lib/protobuf/generators/printable.rb +160 -0
- data/lib/protobuf/generators/service_generator.rb +50 -0
- data/lib/protobuf/lifecycle.rb +33 -0
- data/lib/protobuf/logging.rb +39 -0
- data/lib/protobuf/message.rb +260 -0
- data/lib/protobuf/message/fields.rb +233 -0
- data/lib/protobuf/message/serialization.rb +85 -0
- data/lib/protobuf/optionable.rb +70 -0
- data/lib/protobuf/rpc/buffer.rb +78 -0
- data/lib/protobuf/rpc/client.rb +140 -0
- data/lib/protobuf/rpc/connectors/base.rb +221 -0
- data/lib/protobuf/rpc/connectors/ping.rb +89 -0
- data/lib/protobuf/rpc/connectors/socket.rb +78 -0
- data/lib/protobuf/rpc/connectors/zmq.rb +319 -0
- data/lib/protobuf/rpc/dynamic_discovery.pb.rb +50 -0
- data/lib/protobuf/rpc/env.rb +60 -0
- data/lib/protobuf/rpc/error.rb +28 -0
- data/lib/protobuf/rpc/error/client_error.rb +31 -0
- data/lib/protobuf/rpc/error/server_error.rb +43 -0
- data/lib/protobuf/rpc/middleware.rb +25 -0
- data/lib/protobuf/rpc/middleware/exception_handler.rb +40 -0
- data/lib/protobuf/rpc/middleware/logger.rb +95 -0
- data/lib/protobuf/rpc/middleware/request_decoder.rb +79 -0
- data/lib/protobuf/rpc/middleware/response_encoder.rb +83 -0
- data/lib/protobuf/rpc/middleware/runner.rb +18 -0
- data/lib/protobuf/rpc/rpc.pb.rb +64 -0
- data/lib/protobuf/rpc/rpc_method.rb +16 -0
- data/lib/protobuf/rpc/server.rb +39 -0
- data/lib/protobuf/rpc/servers/socket/server.rb +121 -0
- data/lib/protobuf/rpc/servers/socket/worker.rb +56 -0
- data/lib/protobuf/rpc/servers/socket_runner.rb +46 -0
- data/lib/protobuf/rpc/servers/zmq/broker.rb +194 -0
- data/lib/protobuf/rpc/servers/zmq/server.rb +321 -0
- data/lib/protobuf/rpc/servers/zmq/util.rb +48 -0
- data/lib/protobuf/rpc/servers/zmq/worker.rb +105 -0
- data/lib/protobuf/rpc/servers/zmq_runner.rb +70 -0
- data/lib/protobuf/rpc/service.rb +172 -0
- data/lib/protobuf/rpc/service_directory.rb +261 -0
- data/lib/protobuf/rpc/service_dispatcher.rb +45 -0
- data/lib/protobuf/rpc/service_filters.rb +250 -0
- data/lib/protobuf/rpc/stat.rb +119 -0
- data/lib/protobuf/socket.rb +21 -0
- data/lib/protobuf/tasks.rb +1 -0
- data/lib/protobuf/tasks/compile.rake +80 -0
- data/lib/protobuf/varint.rb +20 -0
- data/lib/protobuf/varint_pure.rb +31 -0
- data/lib/protobuf/version.rb +3 -0
- data/lib/protobuf/wire_type.rb +10 -0
- data/lib/protobuf/zmq.rb +21 -0
- data/profile.html +5103 -0
- data/proto/dynamic_discovery.proto +44 -0
- data/proto/google/protobuf/compiler/plugin.proto +147 -0
- data/proto/google/protobuf/descriptor.proto +779 -0
- data/proto/rpc.proto +69 -0
- data/protobuf-cucumber.gemspec +57 -0
- data/spec/benchmark/tasks.rb +143 -0
- data/spec/bin/protoc-gen-ruby_spec.rb +23 -0
- data/spec/encoding/all_types_spec.rb +103 -0
- data/spec/encoding/extreme_values_spec.rb +0 -0
- data/spec/functional/class_inheritance_spec.rb +52 -0
- data/spec/functional/code_generator_spec.rb +58 -0
- data/spec/functional/socket_server_spec.rb +59 -0
- data/spec/functional/zmq_server_spec.rb +105 -0
- data/spec/lib/protobuf/cli_spec.rb +317 -0
- data/spec/lib/protobuf/code_generator_spec.rb +87 -0
- data/spec/lib/protobuf/enum_spec.rb +307 -0
- data/spec/lib/protobuf/field/bool_field_spec.rb +91 -0
- data/spec/lib/protobuf/field/double_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/enum_field_spec.rb +44 -0
- data/spec/lib/protobuf/field/field_array_spec.rb +105 -0
- data/spec/lib/protobuf/field/field_hash_spec.rb +168 -0
- data/spec/lib/protobuf/field/fixed32_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/fixed64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/float_field_spec.rb +90 -0
- data/spec/lib/protobuf/field/int32_field_spec.rb +120 -0
- data/spec/lib/protobuf/field/int64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/message_field_spec.rb +132 -0
- data/spec/lib/protobuf/field/sfixed32_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/sfixed64_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/sint32_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/sint64_field_spec.rb +9 -0
- data/spec/lib/protobuf/field/string_field_spec.rb +79 -0
- data/spec/lib/protobuf/field/uint32_field_spec.rb +7 -0
- data/spec/lib/protobuf/field/uint64_field_spec.rb +7 -0
- data/spec/lib/protobuf/field_spec.rb +192 -0
- data/spec/lib/protobuf/generators/base_spec.rb +154 -0
- data/spec/lib/protobuf/generators/enum_generator_spec.rb +82 -0
- data/spec/lib/protobuf/generators/extension_generator_spec.rb +42 -0
- data/spec/lib/protobuf/generators/field_generator_spec.rb +197 -0
- data/spec/lib/protobuf/generators/file_generator_spec.rb +119 -0
- data/spec/lib/protobuf/generators/message_generator_spec.rb +0 -0
- data/spec/lib/protobuf/generators/service_generator_spec.rb +99 -0
- data/spec/lib/protobuf/lifecycle_spec.rb +94 -0
- data/spec/lib/protobuf/message_spec.rb +944 -0
- data/spec/lib/protobuf/optionable_spec.rb +265 -0
- data/spec/lib/protobuf/rpc/client_spec.rb +66 -0
- data/spec/lib/protobuf/rpc/connectors/base_spec.rb +226 -0
- data/spec/lib/protobuf/rpc/connectors/ping_spec.rb +69 -0
- data/spec/lib/protobuf/rpc/connectors/socket_spec.rb +34 -0
- data/spec/lib/protobuf/rpc/connectors/zmq_spec.rb +110 -0
- data/spec/lib/protobuf/rpc/middleware/exception_handler_spec.rb +62 -0
- data/spec/lib/protobuf/rpc/middleware/logger_spec.rb +49 -0
- data/spec/lib/protobuf/rpc/middleware/request_decoder_spec.rb +115 -0
- data/spec/lib/protobuf/rpc/middleware/response_encoder_spec.rb +91 -0
- data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +38 -0
- data/spec/lib/protobuf/rpc/servers/zmq/server_spec.rb +43 -0
- data/spec/lib/protobuf/rpc/servers/zmq/util_spec.rb +55 -0
- data/spec/lib/protobuf/rpc/servers/zmq/worker_spec.rb +35 -0
- data/spec/lib/protobuf/rpc/service_directory_spec.rb +293 -0
- data/spec/lib/protobuf/rpc/service_dispatcher_spec.rb +35 -0
- data/spec/lib/protobuf/rpc/service_filters_spec.rb +517 -0
- data/spec/lib/protobuf/rpc/service_spec.rb +162 -0
- data/spec/lib/protobuf/rpc/stat_spec.rb +101 -0
- data/spec/lib/protobuf/varint_spec.rb +29 -0
- data/spec/lib/protobuf_spec.rb +105 -0
- data/spec/spec_helper.rb +42 -0
- data/spec/support/all.rb +6 -0
- data/spec/support/packed_field.rb +23 -0
- data/spec/support/protos/all_types.data.bin +0 -0
- data/spec/support/protos/all_types.data.txt +119 -0
- data/spec/support/protos/enum.pb.rb +63 -0
- data/spec/support/protos/enum.proto +37 -0
- data/spec/support/protos/extreme_values.data.bin +0 -0
- data/spec/support/protos/google_unittest.bin +0 -0
- data/spec/support/protos/google_unittest.pb.rb +798 -0
- data/spec/support/protos/google_unittest.proto +884 -0
- data/spec/support/protos/google_unittest_custom_options.bin +0 -0
- data/spec/support/protos/google_unittest_custom_options.pb.rb +361 -0
- data/spec/support/protos/google_unittest_custom_options.proto +424 -0
- data/spec/support/protos/google_unittest_import.pb.rb +55 -0
- data/spec/support/protos/google_unittest_import.proto +73 -0
- data/spec/support/protos/google_unittest_import_public.pb.rb +31 -0
- data/spec/support/protos/google_unittest_import_public.proto +41 -0
- data/spec/support/protos/map-test.bin +157 -0
- data/spec/support/protos/map-test.pb.rb +85 -0
- data/spec/support/protos/map-test.proto +68 -0
- data/spec/support/protos/multi_field_extensions.pb.rb +59 -0
- data/spec/support/protos/multi_field_extensions.proto +35 -0
- data/spec/support/protos/resource.pb.rb +172 -0
- data/spec/support/protos/resource.proto +137 -0
- data/spec/support/resource_service.rb +23 -0
- data/spec/support/server.rb +65 -0
- data/spec/support/test_app_file.rb +2 -0
- data/varint_prof.rb +82 -0
- metadata +579 -0
@@ -0,0 +1,265 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'protobuf/optionable'
|
3
|
+
require 'protobuf/field/message_field'
|
4
|
+
require PROTOS_PATH.join('resource.pb')
|
5
|
+
|
6
|
+
RSpec.describe 'Optionable' do
|
7
|
+
describe '.{get,get!}_option' do
|
8
|
+
before do
|
9
|
+
stub_const("OptionableGetOptionTest", Class.new(::Protobuf::Message) do
|
10
|
+
set_option :deprecated, true
|
11
|
+
set_option :".package.message_field", :field => 33
|
12
|
+
|
13
|
+
optional :int32, :field, 1
|
14
|
+
end)
|
15
|
+
end
|
16
|
+
|
17
|
+
it '.get_option retrieves the option as a symbol' do
|
18
|
+
expect(OptionableGetOptionTest.get_option(:deprecated)).to be(true)
|
19
|
+
end
|
20
|
+
|
21
|
+
it '.get_option returns the default value for unset options' do
|
22
|
+
expect(OptionableGetOptionTest.get_option(:message_set_wire_format)).to be(false)
|
23
|
+
end
|
24
|
+
|
25
|
+
it '.get_option retrieves the option as a string' do
|
26
|
+
expect(OptionableGetOptionTest.get_option('deprecated')).to be(true)
|
27
|
+
end
|
28
|
+
|
29
|
+
it '.get_option errors if the option does not exist' do
|
30
|
+
expect { OptionableGetOptionTest.get_option(:baz) }.to raise_error(ArgumentError)
|
31
|
+
end
|
32
|
+
|
33
|
+
it '.get_option errors if the option is not accessed by its fully qualified name' do
|
34
|
+
message_field = ::Protobuf::Field::MessageField.new(
|
35
|
+
OptionableGetOptionTest, :optional, OptionableGetOptionTest, '.package.message_field', 2, '.message_field', {})
|
36
|
+
allow(::Google::Protobuf::MessageOptions).to receive(:get_field).and_return(message_field)
|
37
|
+
expect { OptionableGetOptionTest.get_option(message_field.name) }.to raise_error(ArgumentError)
|
38
|
+
end
|
39
|
+
|
40
|
+
it '.get_option can return an option representing a message' do
|
41
|
+
message_field = ::Protobuf::Field::MessageField.new(
|
42
|
+
OptionableGetOptionTest, :optional, OptionableGetOptionTest, '.package.message_field', 2, 'message_field', {})
|
43
|
+
allow(::Google::Protobuf::MessageOptions).to receive(:get_field).and_return(message_field)
|
44
|
+
expect(OptionableGetOptionTest.get_option(message_field.fully_qualified_name)).to eq(OptionableGetOptionTest.new(:field => 33))
|
45
|
+
end
|
46
|
+
|
47
|
+
it '.get_option! retrieves explicitly an set option' do
|
48
|
+
expect(OptionableGetOptionTest.get_option!(:deprecated)).to be(true)
|
49
|
+
end
|
50
|
+
|
51
|
+
it '.get_option! returns nil for unset options' do
|
52
|
+
expect(OptionableGetOptionTest.get_option!(:message_set_wire_format)).to be(nil)
|
53
|
+
end
|
54
|
+
|
55
|
+
it '.get_option! errors if the option does not exist' do
|
56
|
+
expect { OptionableGetOptionTest.get_option(:baz) }.to raise_error(ArgumentError)
|
57
|
+
end
|
58
|
+
|
59
|
+
it '#get_option retrieves the option as a symbol' do
|
60
|
+
expect(OptionableGetOptionTest.new.get_option(:deprecated)).to be(true)
|
61
|
+
end
|
62
|
+
|
63
|
+
it '#get_option returns the default value for unset options' do
|
64
|
+
expect(OptionableGetOptionTest.new.get_option(:message_set_wire_format)).to be(false)
|
65
|
+
end
|
66
|
+
|
67
|
+
it '#get_option retrieves the option as a string' do
|
68
|
+
expect(OptionableGetOptionTest.new.get_option('deprecated')).to be(true)
|
69
|
+
end
|
70
|
+
|
71
|
+
it '#get_option errors if the option is not accessed by its fully qualified name' do
|
72
|
+
message_field = ::Protobuf::Field::MessageField.new(
|
73
|
+
OptionableGetOptionTest, :optional, OptionableGetOptionTest, '.package.message_field', 2, 'message_field', {})
|
74
|
+
allow(::Google::Protobuf::MessageOptions).to receive(:get_field).and_return(message_field)
|
75
|
+
expect { OptionableGetOptionTest.new.get_option(message_field.name) }.to raise_error(ArgumentError)
|
76
|
+
end
|
77
|
+
|
78
|
+
it '#get_option can return an option representing a message' do
|
79
|
+
message_field = ::Protobuf::Field::MessageField.new(
|
80
|
+
OptionableGetOptionTest, :optional, OptionableGetOptionTest, '.package.message_field', 2, 'message_field', {})
|
81
|
+
allow(::Google::Protobuf::MessageOptions).to receive(:get_field).and_return(message_field)
|
82
|
+
expect(OptionableGetOptionTest.new.get_option(message_field.fully_qualified_name)).to eq(OptionableGetOptionTest.new(:field => 33))
|
83
|
+
end
|
84
|
+
|
85
|
+
it '#get_option errors if the option does not exist' do
|
86
|
+
expect { OptionableGetOptionTest.new.get_option(:baz) }.to raise_error(ArgumentError)
|
87
|
+
end
|
88
|
+
|
89
|
+
it '#get_option! retrieves explicitly an set option' do
|
90
|
+
expect(OptionableGetOptionTest.new.get_option!(:deprecated)).to be(true)
|
91
|
+
end
|
92
|
+
|
93
|
+
it '#get_option! returns nil for unset options' do
|
94
|
+
expect(OptionableGetOptionTest.new.get_option!(:message_set_wire_format)).to be(nil)
|
95
|
+
end
|
96
|
+
|
97
|
+
it '#get_option! errors if the option does not exist' do
|
98
|
+
expect { OptionableGetOptionTest.new.get_option(:baz) }.to raise_error(ArgumentError)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe '.inject' do
|
103
|
+
let(:klass) { Class.new }
|
104
|
+
|
105
|
+
it 'adds klass.{set,get}_option' do
|
106
|
+
expect { klass.get_option(:deprecated) }.to raise_error(NoMethodError)
|
107
|
+
expect { klass.__send__(:set_option, :deprecated, true) }.to raise_error(NoMethodError)
|
108
|
+
::Protobuf::Optionable.inject(klass) { ::Google::Protobuf::MessageOptions }
|
109
|
+
expect(klass.get_option(:deprecated)).to eq(false)
|
110
|
+
expect { klass.set_option(:deprecated, true) }.to raise_error(NoMethodError)
|
111
|
+
klass.__send__(:set_option, :deprecated, true)
|
112
|
+
expect(klass.get_option(:deprecated)).to eq(true)
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'adds klass#get_option' do
|
116
|
+
expect { klass.new.get_option(:deprecated) }.to raise_error(NoMethodError)
|
117
|
+
::Protobuf::Optionable.inject(klass) { ::Google::Protobuf::MessageOptions }
|
118
|
+
expect(klass.new.get_option(:deprecated)).to eq(false)
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'adds klass.optionable_descriptor_class' do
|
122
|
+
expect { klass.optionable_descriptor_class }.to raise_error(NoMethodError)
|
123
|
+
::Protobuf::Optionable.inject(klass) { ::Google::Protobuf::MessageOptions }
|
124
|
+
expect(klass.optionable_descriptor_class).to eq(::Google::Protobuf::MessageOptions)
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'does not add klass.optionable_descriptor_class twice' do
|
128
|
+
expect(klass).to receive(:define_singleton_method).once
|
129
|
+
::Protobuf::Optionable.inject(klass) { ::Google::Protobuf::MessageOptions }
|
130
|
+
klass.instance_eval do
|
131
|
+
def optionable_descriptor_class
|
132
|
+
::Google::Protobuf::MessageOptions
|
133
|
+
end
|
134
|
+
end
|
135
|
+
::Protobuf::Optionable.inject(klass) { ::Google::Protobuf::MessageOptions }
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'throws error when klass.optionable_descriptor_class defined twice with different args' do
|
139
|
+
::Protobuf::Optionable.inject(klass) { ::Google::Protobuf::MessageOptions }
|
140
|
+
expect { ::Protobuf::Optionable.inject(klass) { ::Google::Protobuf::FileOptions } }
|
141
|
+
.to raise_error('A class is being defined with two different descriptor classes, something is very wrong')
|
142
|
+
end
|
143
|
+
|
144
|
+
context 'extend_class = false' do
|
145
|
+
let(:object) { klass.new }
|
146
|
+
it 'adds object.{get,set}_option' do
|
147
|
+
expect { object.get_option(:deprecated) }.to raise_error(NoMethodError)
|
148
|
+
expect { object.__send__(:set_option, :deprecated, true) }.to raise_error(NoMethodError)
|
149
|
+
::Protobuf::Optionable.inject(klass, false) { ::Google::Protobuf::MessageOptions }
|
150
|
+
expect(object.get_option(:deprecated)).to eq(false)
|
151
|
+
expect { object.set_option(:deprecated, true) }.to raise_error(NoMethodError)
|
152
|
+
object.__send__(:set_option, :deprecated, true)
|
153
|
+
expect(object.get_option(:deprecated)).to eq(true)
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'does not add klass.{get,set}_option' do
|
157
|
+
expect { object.get_option(:deprecated) }.to raise_error(NoMethodError)
|
158
|
+
::Protobuf::Optionable.inject(klass, false) { ::Google::Protobuf::MessageOptions }
|
159
|
+
expect { klass.get_option(:deprecated) }.to raise_error(NoMethodError)
|
160
|
+
expect { klass.__send__(:set_option, :deprecated) }.to raise_error(NoMethodError)
|
161
|
+
end
|
162
|
+
|
163
|
+
it 'creates an instance method optionable_descriptor_class' do
|
164
|
+
expect { object.optionable_descriptor_class }.to raise_error(NoMethodError)
|
165
|
+
::Protobuf::Optionable.inject(klass, false) { ::Google::Protobuf::MessageOptions }
|
166
|
+
expect(object.optionable_descriptor_class).to eq(::Google::Protobuf::MessageOptions)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
describe 'getting options from generated code' do
|
172
|
+
context 'file options' do
|
173
|
+
it 'gets base options' do
|
174
|
+
expect(::Test.get_option!(:cc_generic_services)).to eq(true)
|
175
|
+
end
|
176
|
+
|
177
|
+
it 'gets unset options' do
|
178
|
+
expect(::Test.get_option!(:java_multiple_files)).to eq(nil)
|
179
|
+
expect(::Test.get_option(:java_multiple_files)).to eq(false)
|
180
|
+
end
|
181
|
+
|
182
|
+
it 'gets custom options' do
|
183
|
+
expect(::Test.get_option!(:".test.file_option")).to eq(9876543210)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
context 'field options' do
|
188
|
+
subject { ::Test::Resource.fields[0] }
|
189
|
+
|
190
|
+
it 'gets base options' do
|
191
|
+
expect(subject.get_option!(:ctype))
|
192
|
+
.to eq(::Google::Protobuf::FieldOptions::CType::CORD)
|
193
|
+
end
|
194
|
+
|
195
|
+
it 'gets unset options' do
|
196
|
+
expect(subject.get_option!(:lazy)).to eq(nil)
|
197
|
+
expect(subject.get_option(:lazy)).to eq(false)
|
198
|
+
end
|
199
|
+
|
200
|
+
it 'gets custom options' do
|
201
|
+
expect(subject.get_option!(:".test.field_option")).to eq(8765432109)
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
context 'enum options' do
|
206
|
+
subject { ::Test::StatusType }
|
207
|
+
|
208
|
+
it 'gets base options' do
|
209
|
+
expect(subject.get_option!(:allow_alias)).to eq(true)
|
210
|
+
end
|
211
|
+
|
212
|
+
it 'gets unset options' do
|
213
|
+
expect(subject.get_option!(:deprecated)).to eq(nil)
|
214
|
+
expect(subject.get_option(:deprecated)).to eq(false)
|
215
|
+
end
|
216
|
+
|
217
|
+
it 'gets custom options' do
|
218
|
+
expect(subject.get_option!(:".test.enum_option")).to eq(-789)
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
context 'message options' do
|
223
|
+
subject { ::Test::Resource }
|
224
|
+
|
225
|
+
it 'gets base options' do
|
226
|
+
expect(subject.get_option!(:map_entry)).to eq(false)
|
227
|
+
end
|
228
|
+
|
229
|
+
it 'gets unset options' do
|
230
|
+
expect(subject.get_option!(:deprecated)).to eq(nil)
|
231
|
+
expect(subject.get_option(:deprecated)).to eq(false)
|
232
|
+
end
|
233
|
+
|
234
|
+
it 'gets custom options' do
|
235
|
+
expect(subject.get_option!(:".test.message_option")).to eq(-56)
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
context 'service options' do
|
240
|
+
subject { ::Test::ResourceService }
|
241
|
+
|
242
|
+
it 'gets unset options' do
|
243
|
+
expect(subject.get_option!(:deprecated)).to eq(nil)
|
244
|
+
expect(subject.get_option(:deprecated)).to eq(false)
|
245
|
+
end
|
246
|
+
|
247
|
+
it 'gets custom options' do
|
248
|
+
expect(subject.get_option!(:".test.service_option")).to eq(-9876543210)
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
context 'method options' do
|
253
|
+
subject { ::Test::ResourceService.rpcs[:find] }
|
254
|
+
|
255
|
+
it 'gets unset options' do
|
256
|
+
expect(subject.get_option!(:deprecated)).to eq(nil)
|
257
|
+
expect(subject.get_option(:deprecated)).to eq(false)
|
258
|
+
end
|
259
|
+
|
260
|
+
it 'gets custom options' do
|
261
|
+
expect(subject.get_option!(:".test.method_option")).to eq(2)
|
262
|
+
end
|
263
|
+
end
|
264
|
+
end
|
265
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require SUPPORT_PATH.join('resource_service')
|
3
|
+
|
4
|
+
RSpec.describe Protobuf::Rpc::Client do
|
5
|
+
before(:each) do
|
6
|
+
load 'protobuf/socket.rb'
|
7
|
+
end
|
8
|
+
|
9
|
+
context 'when creating a client from a service' do
|
10
|
+
before { reset_service_location(Test::ResourceService) }
|
11
|
+
|
12
|
+
it 'should be able to get a client through the Service#client helper method' do
|
13
|
+
expect(::Test::ResourceService.client(:port => 9191)).to eq(Protobuf::Rpc::Client.new(:service => Test::ResourceService, :port => 9191))
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should be able to override a service location's host and port" do
|
17
|
+
Test::ResourceService.located_at 'somewheregreat.com:12345'
|
18
|
+
clean_client = Test::ResourceService.client
|
19
|
+
expect(clean_client.options[:host]).to eq('somewheregreat.com')
|
20
|
+
expect(clean_client.options[:port]).to eq(12345)
|
21
|
+
|
22
|
+
updated_client = Test::ResourceService.client(:host => 'amazing.com', :port => 54321)
|
23
|
+
expect(updated_client.options[:host]).to eq('amazing.com')
|
24
|
+
expect(updated_client.options[:port]).to eq(54321)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should be able to define which service to create itself for' do
|
28
|
+
client = Protobuf::Rpc::Client.new :service => Test::ResourceService
|
29
|
+
expect(client.options[:service]).to eq(Test::ResourceService)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'should have a hard default for host and port on a service that has not been configured' do
|
33
|
+
client = Test::ResourceService.client
|
34
|
+
expect(client.options[:host]).to eq(Protobuf::Rpc::Service::DEFAULT_HOST)
|
35
|
+
expect(client.options[:port]).to eq(Protobuf::Rpc::Service::DEFAULT_PORT)
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
context 'when calling methods on a service client' do
|
41
|
+
|
42
|
+
# NOTE: we are assuming the service methods are accurately
|
43
|
+
# defined inside spec/proto/test_service.rb,
|
44
|
+
# namely the :find method
|
45
|
+
|
46
|
+
it 'should respond to defined service methods' do
|
47
|
+
client = Test::ResourceService.client
|
48
|
+
expect(client).to receive(:send_request).and_return(nil)
|
49
|
+
expect { client.find(nil) }.to_not raise_error
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context 'when receiving request objects' do
|
54
|
+
|
55
|
+
it 'should be able to create the correct request object if passed a hash' do
|
56
|
+
client = Test::ResourceService.client
|
57
|
+
expect(client).to receive(:send_request)
|
58
|
+
client.find(:name => 'Test Name', :active => false)
|
59
|
+
expect(client.options[:request]).to be_a(Test::ResourceFindRequest)
|
60
|
+
expect(client.options[:request].name).to eq('Test Name')
|
61
|
+
expect(client.options[:request].active).to eq(false)
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
@@ -0,0 +1,226 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
RSpec.describe Protobuf::Rpc::Connectors::Base do
|
4
|
+
|
5
|
+
let(:options) do
|
6
|
+
{ :timeout => 60 }
|
7
|
+
end
|
8
|
+
|
9
|
+
subject { Protobuf::Rpc::Connectors::Base.new(options) }
|
10
|
+
|
11
|
+
context "API" do
|
12
|
+
specify { expect(subject.respond_to?(:any_callbacks?)).to be true }
|
13
|
+
specify { expect(subject.respond_to?(:request_caller)).to be true }
|
14
|
+
specify { expect(subject.respond_to?(:data_callback)).to be true }
|
15
|
+
specify { expect(subject.respond_to?(:error)).to be true }
|
16
|
+
specify { expect(subject.respond_to?(:failure)).to be true }
|
17
|
+
specify { expect(subject.respond_to?(:complete)).to be true }
|
18
|
+
specify { expect(subject.respond_to?(:parse_response)).to be true }
|
19
|
+
specify { expect(subject.respond_to?(:verify_options!)).to be true }
|
20
|
+
specify { expect(subject.respond_to?(:verify_callbacks)).to be true }
|
21
|
+
end
|
22
|
+
|
23
|
+
describe "#parse_response" do
|
24
|
+
let(:options) { { :response_type => Test::Resource, :port => 55589, :host => '127.3.4.5' } }
|
25
|
+
it "updates stats#server from the response" do
|
26
|
+
allow(subject).to receive(:close_connection)
|
27
|
+
subject.instance_variable_set(:@response_data, ::Protobuf::Socketrpc::Response.new(:server => "serverless").encode)
|
28
|
+
subject.initialize_stats
|
29
|
+
subject.parse_response
|
30
|
+
expect(subject.stats.server).to eq("serverless")
|
31
|
+
end
|
32
|
+
it "does not override stats#server when response.server is missing" do
|
33
|
+
allow(subject).to receive(:close_connection)
|
34
|
+
subject.instance_variable_set(:@response_data, ::Protobuf::Socketrpc::Response.new.encode)
|
35
|
+
subject.initialize_stats
|
36
|
+
subject.parse_response
|
37
|
+
expect(subject.stats.server).to eq("127.3.4.5:55589")
|
38
|
+
end
|
39
|
+
it "does not override stats#server when response.server is nil" do
|
40
|
+
allow(subject).to receive(:close_connection)
|
41
|
+
subject.instance_variable_set(:@response_data, ::Protobuf::Socketrpc::Response.new(:server => nil).encode)
|
42
|
+
subject.initialize_stats
|
43
|
+
subject.parse_response
|
44
|
+
expect(subject.stats.server).to eq("127.3.4.5:55589")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "#any_callbacks?" do
|
49
|
+
[:@complete_cb, :@success_cb, :@failure_cb].each do |cb|
|
50
|
+
it "returns true if #{cb} is provided" do
|
51
|
+
subject.instance_variable_set(cb, "something")
|
52
|
+
expect(subject.any_callbacks?).to be true
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
it "returns false when all callbacks are not provided" do
|
57
|
+
subject.instance_variable_set(:@complete_cb, nil)
|
58
|
+
subject.instance_variable_set(:@success_cb, nil)
|
59
|
+
subject.instance_variable_set(:@failure_cb, nil)
|
60
|
+
|
61
|
+
expect(subject.any_callbacks?).to be false
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "#data_callback" do
|
66
|
+
it "changes state to use the data callback" do
|
67
|
+
subject.data_callback("data")
|
68
|
+
expect(subject.instance_variable_get(:@used_data_callback)).to be true
|
69
|
+
end
|
70
|
+
|
71
|
+
it "sets the data var when using the data_callback" do
|
72
|
+
subject.data_callback("data")
|
73
|
+
expect(subject.instance_variable_get(:@data)).to eq("data")
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe "#send_request" do
|
78
|
+
it "raising an error when 'send_request' is not overridden" do
|
79
|
+
expect { subject.send_request }.to raise_error(RuntimeError, /inherit a Connector/)
|
80
|
+
end
|
81
|
+
|
82
|
+
it "does not raise error when 'send_request' is overridden" do
|
83
|
+
new_sub = Class.new(subject.class) { def send_request; end }.new(options)
|
84
|
+
expect { new_sub.send_request }.to_not raise_error
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
describe '.new' do
|
89
|
+
it 'assigns passed options and initializes success/failure callbacks' do
|
90
|
+
expect(subject.options).to eq(Protobuf::Rpc::Connectors::DEFAULT_OPTIONS.merge(options))
|
91
|
+
expect(subject.success_cb).to be_nil
|
92
|
+
expect(subject.failure_cb).to be_nil
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe '#success_cb' do
|
97
|
+
it 'allows setting the success callback and calling it' do
|
98
|
+
expect(subject.success_cb).to be_nil
|
99
|
+
cb = proc { |res| fail res }
|
100
|
+
subject.success_cb = cb
|
101
|
+
expect(subject.success_cb).to eq(cb)
|
102
|
+
expect { subject.success_cb.call('an error from cb') }.to raise_error 'an error from cb'
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
describe '#failure_cb' do
|
107
|
+
it 'allows setting the failure callback and calling it' do
|
108
|
+
expect(subject.failure_cb).to be_nil
|
109
|
+
cb = proc { |res| fail res }
|
110
|
+
subject.failure_cb = cb
|
111
|
+
expect(subject.failure_cb).to eq(cb)
|
112
|
+
expect { subject.failure_cb.call('an error from cb') }.to raise_error 'an error from cb'
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe '#request_bytes' do
|
117
|
+
let(:service) { Test::ResourceService }
|
118
|
+
let(:method) { :find }
|
119
|
+
let(:request) { '' }
|
120
|
+
let(:client_host) { 'myhost.myservice.com' }
|
121
|
+
let(:options) do
|
122
|
+
{
|
123
|
+
:service => service,
|
124
|
+
:method => method,
|
125
|
+
:request => request,
|
126
|
+
:client_host => client_host,
|
127
|
+
:timeout => 60,
|
128
|
+
}
|
129
|
+
end
|
130
|
+
|
131
|
+
let(:expected) do
|
132
|
+
::Protobuf::Socketrpc::Request.new(
|
133
|
+
:service_name => service.name,
|
134
|
+
:method_name => 'find',
|
135
|
+
:request_proto => '',
|
136
|
+
:caller => client_host,
|
137
|
+
)
|
138
|
+
end
|
139
|
+
|
140
|
+
before { allow(subject).to receive(:validate_request_type!).and_return(true) }
|
141
|
+
before { expect(subject).not_to receive(:failure) }
|
142
|
+
|
143
|
+
specify { expect(subject.request_bytes).to eq expected.encode }
|
144
|
+
end
|
145
|
+
|
146
|
+
describe '#request_caller' do
|
147
|
+
specify { expect(subject.request_caller).to eq ::Protobuf.client_host }
|
148
|
+
|
149
|
+
context 'when "client_host" option is given to initializer' do
|
150
|
+
let(:hostname) { 'myhost.myserver.com' }
|
151
|
+
let(:options) { { :client_host => hostname, :timeout => 60 } }
|
152
|
+
|
153
|
+
specify { expect(subject.request_caller).to_not eq ::Protobuf.client_host }
|
154
|
+
specify { expect(subject.request_caller).to eq hostname }
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
describe "#verify_callbacks" do
|
159
|
+
it "sets @failure_cb to #data_callback when no callbacks are defined" do
|
160
|
+
subject.verify_callbacks
|
161
|
+
expect(subject.instance_variable_get(:@failure_cb)).to eq(subject.method(:data_callback))
|
162
|
+
end
|
163
|
+
|
164
|
+
it "sets @success_cb to #data_callback when no callbacks are defined" do
|
165
|
+
subject.verify_callbacks
|
166
|
+
expect(subject.instance_variable_get(:@success_cb)).to eq(subject.method(:data_callback))
|
167
|
+
end
|
168
|
+
|
169
|
+
it "doesn't set @failure_cb when already defined" do
|
170
|
+
set_cb = -> { true }
|
171
|
+
subject.instance_variable_set(:@failure_cb, set_cb)
|
172
|
+
subject.verify_callbacks
|
173
|
+
expect(subject.instance_variable_get(:@failure_cb)).to eq(set_cb)
|
174
|
+
expect(subject.instance_variable_get(:@failure_cb)).to_not eq(subject.method(:data_callback))
|
175
|
+
end
|
176
|
+
|
177
|
+
it "doesn't set @success_cb when already defined" do
|
178
|
+
set_cb = -> { true }
|
179
|
+
subject.instance_variable_set(:@success_cb, set_cb)
|
180
|
+
subject.verify_callbacks
|
181
|
+
expect(subject.instance_variable_get(:@success_cb)).to eq(set_cb)
|
182
|
+
expect(subject.instance_variable_get(:@success_cb)).to_not eq(subject.method(:data_callback))
|
183
|
+
end
|
184
|
+
|
185
|
+
end
|
186
|
+
|
187
|
+
shared_examples "a ConnectorDisposition" do |meth, cb, *args|
|
188
|
+
|
189
|
+
it "calls #complete before exit" do
|
190
|
+
subject.stats = ::Protobuf::Rpc::Stat.new(:stop => true)
|
191
|
+
|
192
|
+
expect(subject).to receive(:complete)
|
193
|
+
subject.method(meth).call(*args)
|
194
|
+
end
|
195
|
+
|
196
|
+
it "calls the #{cb} callback when provided" do
|
197
|
+
stats = ::Protobuf::Rpc::Stat.new
|
198
|
+
allow(stats).to receive(:stop).and_return(true)
|
199
|
+
subject.stats = stats
|
200
|
+
some_cb = double("Object")
|
201
|
+
|
202
|
+
subject.instance_variable_set("@#{cb}", some_cb)
|
203
|
+
expect(some_cb).to receive(:call).and_return(true)
|
204
|
+
subject.method(meth).call(*args)
|
205
|
+
end
|
206
|
+
|
207
|
+
it "calls the complete callback when provided" do
|
208
|
+
stats = ::Protobuf::Rpc::Stat.new
|
209
|
+
allow(stats).to receive(:stop).and_return(true)
|
210
|
+
subject.stats = stats
|
211
|
+
comp_cb = double("Object")
|
212
|
+
|
213
|
+
subject.instance_variable_set(:@complete_cb, comp_cb)
|
214
|
+
expect(comp_cb).to receive(:call).and_return(true)
|
215
|
+
subject.method(meth).call(*args)
|
216
|
+
end
|
217
|
+
|
218
|
+
end
|
219
|
+
|
220
|
+
it_behaves_like("a ConnectorDisposition", :failure, "failure_cb", :RPC_ERROR, "message")
|
221
|
+
it_behaves_like("a ConnectorDisposition", :failure, "complete_cb", :RPC_ERROR, "message")
|
222
|
+
it_behaves_like("a ConnectorDisposition", :succeed, "complete_cb", "response")
|
223
|
+
it_behaves_like("a ConnectorDisposition", :succeed, "success_cb", "response")
|
224
|
+
it_behaves_like("a ConnectorDisposition", :complete, "complete_cb")
|
225
|
+
|
226
|
+
end
|