protobuf 2.0.0.rc2 → 2.0.0.rc3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/ext/ruby_generator/Makefile +10 -0
- data/ext/ruby_generator/RubyGenerator.cpp +85 -70
- data/ext/ruby_generator/RubyGenerator.h +23 -4
- data/lib/protobuf.rb +33 -26
- data/lib/protobuf/cli.rb +18 -13
- data/lib/protobuf/enum.rb +39 -34
- data/lib/protobuf/enum_value.rb +29 -0
- data/lib/protobuf/field/base_field.rb +34 -5
- data/lib/protobuf/field/enum_field.rb +6 -14
- data/lib/protobuf/field/extension_fields.rb +13 -5
- data/lib/protobuf/field/field_array.rb +17 -7
- data/lib/protobuf/field/varint_field.rb +4 -6
- data/lib/protobuf/message.rb +44 -148
- data/lib/protobuf/rpc/server.rb +2 -2
- data/lib/protobuf/version.rb +1 -1
- data/spec/benchmark/tasks.rb +7 -8
- data/spec/functional/evented_server_spec.rb +9 -9
- data/spec/functional/socket_server_spec.rb +8 -8
- data/spec/functional/zmq_server_spec.rb +8 -8
- data/spec/lib/protobuf/cli_spec.rb +30 -11
- data/spec/lib/protobuf/enum_spec.rb +90 -0
- data/spec/lib/protobuf/enum_value_spec.rb +13 -0
- data/spec/lib/protobuf/message/encoder_spec.rb +1 -1
- data/spec/lib/protobuf/message_spec.rb +50 -0
- data/spec/lib/protobuf/rpc/client_spec.rb +23 -23
- data/spec/lib/protobuf/rpc/servers/evented_server_spec.rb +1 -1
- data/spec/lib/protobuf/rpc/servers/socket_server_spec.rb +1 -1
- data/spec/lib/protobuf/rpc/service_spec.rb +18 -18
- data/spec/lib/protobuf_spec.rb +62 -0
- data/spec/spec_helper.rb +12 -1
- data/spec/support/all.rb +0 -1
- data/spec/support/server.rb +1 -1
- data/spec/support/test/enum.pb.rb +32 -0
- data/spec/support/test/enum.proto +12 -0
- data/spec/support/test/resource.pb.rb +52 -0
- data/spec/{proto/test.proto → support/test/resource.proto} +2 -2
- data/spec/support/test/resource_service.rb +14 -0
- metadata +51 -48
- data/ext/Makefile +0 -11
- data/spec/lib/protobuf/message/enum_spec.rb +0 -13
- data/spec/lib/protobuf/message/message_spec.rb +0 -67
- data/spec/proto/test.pb.rb +0 -54
- data/spec/proto/test_service.rb +0 -30
- data/spec/proto/test_service_impl.rb +0 -18
- data/spec/support/silent_constants.rb +0 -44
@@ -1,24 +1,24 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'spec/
|
2
|
+
require 'spec/support/test/resource_service'
|
3
3
|
|
4
4
|
describe Protobuf::Rpc::Client do
|
5
5
|
before(:each) do
|
6
6
|
load 'protobuf/evented.rb'
|
7
7
|
::Protobuf::Rpc::Connector.connector_for_client(true)
|
8
|
-
::
|
8
|
+
::Test::ResourceService.configure(::Test::ResourceService::DEFAULT_LOCATION)
|
9
9
|
end
|
10
10
|
|
11
11
|
context "when using fiber based calls" do
|
12
12
|
it "waits for response when running synchronously" do
|
13
13
|
EventMachine.fiber_run do
|
14
14
|
StubServer.new(:delay => 3) do |server|
|
15
|
-
client =
|
15
|
+
client = Test::ResourceService.client(:async => false)
|
16
16
|
start = now
|
17
17
|
|
18
18
|
client.find(:name => "Test Name", :active => true) do |c|
|
19
19
|
c.on_success do |succ|
|
20
20
|
succ.name.should eq("Test Name")
|
21
|
-
succ.status.should eq(
|
21
|
+
succ.status.should eq(Test::StatusType::ENABLED)
|
22
22
|
end
|
23
23
|
|
24
24
|
c.on_failure do |err|
|
@@ -36,7 +36,7 @@ describe Protobuf::Rpc::Client do
|
|
36
36
|
it "doesn't wait for response when running async call inside fiber" do
|
37
37
|
EventMachine.fiber_run do
|
38
38
|
StubServer.new(:delay => 3) do |server|
|
39
|
-
client =
|
39
|
+
client = Test::ResourceService.client(:async => true)
|
40
40
|
start = now
|
41
41
|
client.find(:name => "Test Name", :active => true)
|
42
42
|
|
@@ -50,7 +50,7 @@ describe Protobuf::Rpc::Client do
|
|
50
50
|
subject = Proc.new do
|
51
51
|
EventMachine.run do
|
52
52
|
StubServer.new(:delay => 1) do |server|
|
53
|
-
client =
|
53
|
+
client = Test::ResourceService.client(:async => false)
|
54
54
|
client.find(:name => "Test Name", :active => true)
|
55
55
|
end
|
56
56
|
end
|
@@ -64,7 +64,7 @@ describe Protobuf::Rpc::Client do
|
|
64
64
|
test_proc = Proc.new do
|
65
65
|
EventMachine.fiber_run do
|
66
66
|
StubServer.new(:delay => 2) do |server|
|
67
|
-
client =
|
67
|
+
client = Test::ResourceService.client(:async => false, :timeout => 1)
|
68
68
|
client.find(:name => "Test Name", :active => true) do |cl|
|
69
69
|
cl.on_success {}
|
70
70
|
cl.on_failure {|f| error = f}
|
@@ -83,7 +83,7 @@ describe Protobuf::Rpc::Client do
|
|
83
83
|
it "throws a timeout when client timeout is exceeded" do
|
84
84
|
subject = Proc.new do
|
85
85
|
StubServer.new(:delay => 2) do |server|
|
86
|
-
client =
|
86
|
+
client = Test::ResourceService.client(:async => false, :timeout => 1)
|
87
87
|
client.find(:name => "Test Name", :active => true)
|
88
88
|
end
|
89
89
|
end
|
@@ -96,7 +96,7 @@ describe Protobuf::Rpc::Client do
|
|
96
96
|
|
97
97
|
subject = Proc.new do
|
98
98
|
StubServer.new(:delay => 2) do |server|
|
99
|
-
client =
|
99
|
+
client = Test::ResourceService.client(:async => false, :timeout => 1)
|
100
100
|
client.find(:name => "Test Name", :active => true) do |c|
|
101
101
|
c.on_failure do |f|
|
102
102
|
failure_message = f.message
|
@@ -116,38 +116,38 @@ describe Protobuf::Rpc::Client do
|
|
116
116
|
context 'when creating a client from a service' do
|
117
117
|
|
118
118
|
it 'should be able to get a client through the Service#client helper method' do
|
119
|
-
|
119
|
+
Test::ResourceService.client(:port => 9191).should eq(Protobuf::Rpc::Client.new(:service => Test::ResourceService, :port => 9191))
|
120
120
|
end
|
121
121
|
|
122
122
|
it "should be able to override a service location's host and port" do
|
123
|
-
|
124
|
-
clean_client =
|
123
|
+
Test::ResourceService.located_at 'somewheregreat.com:12345'
|
124
|
+
clean_client = Test::ResourceService.client
|
125
125
|
clean_client.options[:host].should eq('somewheregreat.com')
|
126
126
|
clean_client.options[:port].should eq(12345)
|
127
127
|
|
128
|
-
updated_client =
|
128
|
+
updated_client = Test::ResourceService.client(:host => 'amazing.com', :port => 54321)
|
129
129
|
updated_client.options[:host].should eq('amazing.com')
|
130
130
|
updated_client.options[:port].should eq(54321)
|
131
131
|
end
|
132
132
|
|
133
133
|
it 'should be able to define the syncronicity of the client request' do
|
134
|
-
client =
|
134
|
+
client = Test::ResourceService.client(:async => false)
|
135
135
|
client.options[:async].should be_false
|
136
136
|
client.async?.should be_false
|
137
137
|
|
138
|
-
client =
|
138
|
+
client = Test::ResourceService.client(:async => true)
|
139
139
|
client.options[:async].should be_true
|
140
140
|
client.async?.should be_true
|
141
141
|
end
|
142
142
|
|
143
143
|
it 'should be able to define which service to create itself for' do
|
144
|
-
client = Protobuf::Rpc::Client.new :service =>
|
145
|
-
client.options[:service].should eq(
|
144
|
+
client = Protobuf::Rpc::Client.new :service => Test::ResourceService
|
145
|
+
client.options[:service].should eq(Test::ResourceService)
|
146
146
|
end
|
147
147
|
|
148
148
|
it 'should have a hard default for host and port on a service that has not been configured' do
|
149
|
-
reset_service_location
|
150
|
-
client =
|
149
|
+
reset_service_location Test::ResourceService
|
150
|
+
client = Test::ResourceService.client
|
151
151
|
client.options[:host].should eq(Protobuf::Rpc::Service::DEFAULT_LOCATION[:host])
|
152
152
|
client.options[:port].should eq(Protobuf::Rpc::Service::DEFAULT_LOCATION[:port])
|
153
153
|
end
|
@@ -161,7 +161,7 @@ describe Protobuf::Rpc::Client do
|
|
161
161
|
# namely the :find method
|
162
162
|
|
163
163
|
it 'should respond to defined service methods' do
|
164
|
-
client =
|
164
|
+
client = Test::ResourceService.client
|
165
165
|
client.should_receive(:send_request).and_return(nil)
|
166
166
|
expect { client.find(nil) }.to_not raise_error
|
167
167
|
end
|
@@ -173,7 +173,7 @@ describe Protobuf::Rpc::Client do
|
|
173
173
|
it 'should be able to set and get local variables within client response blocks' do
|
174
174
|
outer_value = 'OUTER'
|
175
175
|
inner_value = 'INNER'
|
176
|
-
client =
|
176
|
+
client = Test::ResourceService.client(:async => true)
|
177
177
|
|
178
178
|
EM.should_receive(:reactor_running?).and_return(true)
|
179
179
|
EM.stub!(:next_tick) do
|
@@ -194,10 +194,10 @@ describe Protobuf::Rpc::Client do
|
|
194
194
|
context 'when receiving request objects' do
|
195
195
|
|
196
196
|
it 'should be able to create the correct request object if passed a hash' do
|
197
|
-
client =
|
197
|
+
client = Test::ResourceService.client
|
198
198
|
client.should_receive(:send_request)
|
199
199
|
client.find({:name => 'Test Name', :active => false})
|
200
|
-
client.options[:request].should be_a(
|
200
|
+
client.options[:request].should be_a(Test::ResourceFindRequest)
|
201
201
|
client.options[:request].name.should eq('Test Name')
|
202
202
|
client.options[:request].active.should eq(false)
|
203
203
|
end
|
@@ -1,45 +1,45 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'spec/
|
2
|
+
require 'spec/support/test/resource_service'
|
3
3
|
|
4
4
|
describe Protobuf::Rpc::Service do
|
5
5
|
|
6
6
|
context 'when configuring' do
|
7
7
|
before :each do
|
8
|
-
reset_service_location
|
8
|
+
reset_service_location Test::ResourceService
|
9
9
|
end
|
10
10
|
|
11
11
|
it 'should have a default location configured' do
|
12
|
-
|
13
|
-
|
12
|
+
Test::ResourceService.host.should == Protobuf::Rpc::Service::DEFAULT_LOCATION[:host]
|
13
|
+
Test::ResourceService.port.should == Protobuf::Rpc::Service::DEFAULT_LOCATION[:port]
|
14
14
|
end
|
15
15
|
|
16
16
|
it "should be able to pre-configure a service location for clients" do
|
17
|
-
|
18
|
-
client =
|
17
|
+
Test::ResourceService.located_at 'google.com:12345'
|
18
|
+
client = Test::ResourceService.client
|
19
19
|
client.options[:host].should == 'google.com'
|
20
20
|
client.options[:port].should == 12345
|
21
21
|
end
|
22
22
|
|
23
23
|
context 'configuring host' do
|
24
|
-
before(:each) {
|
25
|
-
after(:each) {
|
24
|
+
before(:each) { Test::ResourceService.configure :host => 'somehost.com' }
|
25
|
+
after(:each) { Test::ResourceService.configure :host => '127.0.0.1' }
|
26
26
|
|
27
27
|
it 'should be able to configure and read the host' do
|
28
|
-
|
28
|
+
Test::ResourceService.host.should == 'somehost.com'
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
32
|
it 'should be able to configure and read the port' do
|
33
|
-
|
34
|
-
|
33
|
+
Test::ResourceService.configure :port => 12345
|
34
|
+
Test::ResourceService.port.should == 12345
|
35
35
|
end
|
36
36
|
|
37
37
|
it 'should skip configuring location if the location passed does not match host:port syntax' do
|
38
38
|
invalid_locations = [nil, 'myhost:', ':9939', 'badhost123']
|
39
39
|
invalid_locations.each do |location|
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
Test::ResourceService.located_at location
|
41
|
+
Test::ResourceService.host.should == Protobuf::Rpc::Service::DEFAULT_LOCATION[:host]
|
42
|
+
Test::ResourceService.port.should == Protobuf::Rpc::Service::DEFAULT_LOCATION[:port]
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
@@ -48,8 +48,8 @@ describe Protobuf::Rpc::Service do
|
|
48
48
|
|
49
49
|
before(:all) do
|
50
50
|
class ::NewTestService < Protobuf::Rpc::Service
|
51
|
-
rpc :bad_method,
|
52
|
-
rpc :bad_var,
|
51
|
+
rpc :bad_method, Test::ResourceFindRequest, Test::Resource
|
52
|
+
rpc :bad_var, Test::ResourceFindRequest, Test::Resource
|
53
53
|
def bad_method
|
54
54
|
hash = {}
|
55
55
|
hash[:one].explode
|
@@ -62,14 +62,14 @@ describe Protobuf::Rpc::Service do
|
|
62
62
|
|
63
63
|
it 'raises an undefined method name error when calling a method on a non-existant object' do
|
64
64
|
expect {
|
65
|
-
req = mock('RequestWrapper', :request_proto =>
|
65
|
+
req = mock('RequestWrapper', :request_proto => Test::ResourceFindRequest.new(:name => 'mmeh').to_s)
|
66
66
|
::NewTestService.new.bad_method(req)
|
67
67
|
}.to raise_error(NoMethodError)
|
68
68
|
end
|
69
69
|
|
70
70
|
it 'raises a name error when accessing a non-existant object' do
|
71
71
|
expect {
|
72
|
-
req = mock('RequestWrapper', :request_proto =>
|
72
|
+
req = mock('RequestWrapper', :request_proto => Test::ResourceFindRequest.new(:name => 'mmeh').to_s)
|
73
73
|
::NewTestService.new.bad_var(req)
|
74
74
|
}.to raise_error(NameError)
|
75
75
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'protobuf'
|
3
|
+
|
4
|
+
describe ::Protobuf do
|
5
|
+
|
6
|
+
describe '.connector_type' do
|
7
|
+
before { described_class.instance_variable_set(:@_connector_type, nil) }
|
8
|
+
|
9
|
+
it 'defaults to socket' do
|
10
|
+
described_class.connector_type.should eq :socket
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'accepts socket, evented, or zmq' do
|
14
|
+
[:socket, :evented, :zmq].each do |type|
|
15
|
+
described_class.connector_type = type
|
16
|
+
described_class.connector_type.should eq type
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'does not accept other types' do
|
21
|
+
[:hello, :world].each do |type|
|
22
|
+
expect {
|
23
|
+
described_class.connector_type = type
|
24
|
+
}.to raise_error(ArgumentError)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe '.gc_pause_server_request?' do
|
30
|
+
before { described_class.instance_variable_set(:@_gc_pause_server_request, nil) }
|
31
|
+
|
32
|
+
it 'defaults to a false value' do
|
33
|
+
described_class.gc_pause_server_request?.should be_false
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'is settable' do
|
37
|
+
described_class.gc_pause_server_request = true
|
38
|
+
described_class.gc_pause_server_request?.should be_true
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '.print_deprecation_warnings?' do
|
43
|
+
before { described_class.instance_variable_set(:@_print_deprecation_warnings, nil) }
|
44
|
+
|
45
|
+
it 'defaults to a true value' do
|
46
|
+
described_class.print_deprecation_warnings?.should be_true
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'is settable' do
|
50
|
+
described_class.print_deprecation_warnings = false
|
51
|
+
described_class.print_deprecation_warnings?.should be_false
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'when ENV["PB_IGNORE_DEPRECATIONS"] present' do
|
55
|
+
it 'defaults to a false value' do
|
56
|
+
ENV['PB_IGNORE_DEPRECATIONS'] = '1'
|
57
|
+
described_class.print_deprecation_warnings?.should be_false
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -19,9 +19,20 @@ if ENV["DEBUG"]
|
|
19
19
|
end
|
20
20
|
|
21
21
|
::RSpec.configure do |c|
|
22
|
-
c.include(::SilentConstants)
|
23
22
|
c.include(::Sander6::CustomMatchers)
|
24
23
|
c.mock_with :rspec
|
24
|
+
|
25
|
+
c.before(:suite) do
|
26
|
+
unless ENV['NO_COMPILE_TEST_PROTOS']
|
27
|
+
$stdout.puts 'Compiling test protos (use NO_COMPILE_TEST_PROTOS=1 to skip)'
|
28
|
+
proto_path = File.expand_path("../support/", __FILE__)
|
29
|
+
%x{ rprotoc --proto_path=#{proto_path} --ruby_out=#{proto_path} #{File.join(proto_path, '**', '*.proto')} }
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
Dir[File.expand_path('../support/**/*.pb.rb', __FILE__)].each do |proto_file|
|
35
|
+
require proto_file
|
25
36
|
end
|
26
37
|
|
27
38
|
class ::Protobuf::Rpc::Client
|
data/spec/support/all.rb
CHANGED
data/spec/support/server.rb
CHANGED
@@ -5,7 +5,7 @@ require 'protobuf/rpc/servers/socket/server'
|
|
5
5
|
require 'protobuf/rpc/servers/socket_runner'
|
6
6
|
require 'protobuf/rpc/servers/zmq/server'
|
7
7
|
require 'protobuf/rpc/servers/zmq_runner'
|
8
|
-
require 'spec/
|
8
|
+
require 'spec/support/test/resource_service'
|
9
9
|
|
10
10
|
# Want to abort if server dies?
|
11
11
|
Thread.abort_on_exception = true
|
@@ -0,0 +1,32 @@
|
|
1
|
+
##
|
2
|
+
# This file is auto-generated. DO NOT EDIT!
|
3
|
+
#
|
4
|
+
require 'protobuf/message'
|
5
|
+
|
6
|
+
module Test
|
7
|
+
##
|
8
|
+
# Enum Classes
|
9
|
+
#
|
10
|
+
class EnumTestType < ::Protobuf::Enum; end
|
11
|
+
|
12
|
+
##
|
13
|
+
# Message Classes
|
14
|
+
#
|
15
|
+
class EnumTestMessage < ::Protobuf::Message; end
|
16
|
+
|
17
|
+
##
|
18
|
+
# Enum Values
|
19
|
+
#
|
20
|
+
::Test::EnumTestType.define :ONE, 1
|
21
|
+
::Test::EnumTestType.define :TWO, 2
|
22
|
+
|
23
|
+
|
24
|
+
##
|
25
|
+
# Message Fields
|
26
|
+
#
|
27
|
+
::Test::EnumTestMessage.optional(::Test::EnumTestType, :non_default_enum, 1)
|
28
|
+
::Test::EnumTestMessage.optional(::Test::EnumTestType, :default_enum, 2, :default => ::Test::EnumTestType::ONE)
|
29
|
+
::Test::EnumTestMessage.repeated(::Test::EnumTestType, :repeated_enums, 3)
|
30
|
+
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
##
|
2
|
+
# This file is auto-generated. DO NOT EDIT!
|
3
|
+
#
|
4
|
+
require 'protobuf/message'
|
5
|
+
require 'protobuf/rpc/service'
|
6
|
+
|
7
|
+
module Test
|
8
|
+
##
|
9
|
+
# Enum Classes
|
10
|
+
#
|
11
|
+
class StatusType < ::Protobuf::Enum; end
|
12
|
+
|
13
|
+
##
|
14
|
+
# Message Classes
|
15
|
+
#
|
16
|
+
class ResourceFindRequest < ::Protobuf::Message; end
|
17
|
+
class Resource < ::Protobuf::Message; end
|
18
|
+
class Nested < ::Protobuf::Message; end
|
19
|
+
|
20
|
+
##
|
21
|
+
# Enum Values
|
22
|
+
#
|
23
|
+
::Test::StatusType.define :PENDING, 0
|
24
|
+
::Test::StatusType.define :ENABLED, 1
|
25
|
+
::Test::StatusType.define :DISABLED, 2
|
26
|
+
::Test::StatusType.define :DELETED, 3
|
27
|
+
|
28
|
+
|
29
|
+
##
|
30
|
+
# Message Fields
|
31
|
+
#
|
32
|
+
::Test::ResourceFindRequest.required(::Protobuf::Field::StringField, :name, 1)
|
33
|
+
::Test::ResourceFindRequest.optional(::Protobuf::Field::BoolField, :active, 2)
|
34
|
+
|
35
|
+
::Test::Resource.required(::Protobuf::Field::StringField, :name, 1)
|
36
|
+
::Test::Resource.optional(::Protobuf::Field::Int64Field, :date_created, 2)
|
37
|
+
::Test::Resource.optional(::Test::StatusType, :status, 3)
|
38
|
+
::Test::Resource.repeated(::Test::StatusType, :repeated_enum, 4)
|
39
|
+
|
40
|
+
::Test::Nested.optional(::Protobuf::Field::StringField, :name, 1)
|
41
|
+
::Test::Nested.optional(::Test::Resource, :resource, 2)
|
42
|
+
::Test::Nested.repeated(::Test::Resource, :multiple_resources, 3)
|
43
|
+
::Test::Nested.optional(::Test::StatusType, :status, 4)
|
44
|
+
|
45
|
+
|
46
|
+
##
|
47
|
+
# Services
|
48
|
+
#
|
49
|
+
class ResourceService < ::Protobuf::Rpc::Service
|
50
|
+
rpc :find, ::Test::ResourceFindRequest, ::Test::Resource
|
51
|
+
end
|
52
|
+
end
|