thrift 0.8.0 → 0.9.0
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.
- data/benchmark/gen-rb/benchmark_constants.rb +3 -2
- data/benchmark/gen-rb/benchmark_service.rb +52 -52
- data/benchmark/gen-rb/benchmark_types.rb +3 -2
- data/ext/binary_protocol_accelerated.c +5 -2
- data/ext/bytes.c +36 -0
- data/ext/bytes.h +31 -0
- data/ext/compact_protocol.c +7 -4
- data/ext/constants.h +4 -0
- data/ext/extconf.rb +3 -1
- data/ext/memory_buffer.c +11 -8
- data/ext/thrift_native.c +9 -0
- data/lib/thrift.rb +2 -0
- data/lib/thrift/bytes.rb +131 -0
- data/lib/thrift/protocol/base_protocol.rb +10 -0
- data/lib/thrift/protocol/binary_protocol.rb +5 -5
- data/lib/thrift/protocol/compact_protocol.rb +4 -3
- data/lib/thrift/protocol/json_protocol.rb +765 -0
- data/lib/thrift/transport/base_transport.rb +22 -20
- data/lib/thrift/transport/buffered_transport.rb +16 -10
- data/lib/thrift/transport/framed_transport.rb +11 -10
- data/lib/thrift/transport/http_client_transport.rb +7 -5
- data/lib/thrift/transport/io_stream_transport.rb +1 -1
- data/lib/thrift/transport/memory_buffer_transport.rb +6 -6
- data/lib/thrift/transport/socket.rb +4 -2
- data/spec/ThriftSpec.thrift +52 -1
- data/spec/base_protocol_spec.rb +44 -45
- data/spec/base_transport_spec.rb +49 -50
- data/spec/binary_protocol_accelerated_spec.rb +9 -13
- data/spec/binary_protocol_spec.rb +15 -10
- data/spec/binary_protocol_spec_shared.rb +62 -12
- data/spec/bytes_spec.rb +160 -0
- data/spec/client_spec.rb +13 -14
- data/spec/compact_protocol_spec.rb +3 -2
- data/spec/exception_spec.rb +39 -40
- data/spec/gen-rb/nonblocking_service.rb +193 -193
- data/spec/gen-rb/thrift_spec_constants.rb +3 -2
- data/spec/gen-rb/thrift_spec_types.rb +455 -262
- data/spec/http_client_spec.rb +16 -9
- data/spec/json_protocol_spec.rb +513 -0
- data/spec/mongrel_http_server_spec.rb +19 -22
- data/spec/nonblocking_server_spec.rb +18 -20
- data/spec/processor_spec.rb +13 -16
- data/spec/serializer_spec.rb +17 -19
- data/spec/server_socket_spec.rb +6 -7
- data/spec/server_spec.rb +46 -58
- data/spec/socket_spec.rb +11 -11
- data/spec/socket_spec_shared.rb +1 -1
- data/spec/spec_helper.rb +13 -10
- data/spec/struct_nested_containers_spec.rb +191 -0
- data/spec/struct_spec.rb +84 -86
- data/spec/types_spec.rb +65 -66
- data/spec/union_spec.rb +44 -46
- data/spec/unix_socket_spec.rb +8 -9
- data/test/debug_proto/gen-rb/debug_proto_test_constants.rb +8 -7
- data/test/debug_proto/gen-rb/debug_proto_test_types.rb +24 -23
- data/test/debug_proto/gen-rb/empty_service.rb +1 -1
- data/test/debug_proto/gen-rb/inherited.rb +3 -3
- data/test/debug_proto/gen-rb/reverse_order_service.rb +1 -1
- data/test/debug_proto/gen-rb/service_for_exception_with_a_map.rb +3 -3
- data/test/debug_proto/gen-rb/srv.rb +2 -2
- metadata +43 -49
data/spec/socket_spec.rb
CHANGED
@@ -17,18 +17,18 @@
|
|
17
17
|
# under the License.
|
18
18
|
#
|
19
19
|
|
20
|
-
require
|
20
|
+
require 'spec_helper'
|
21
21
|
require File.expand_path("#{File.dirname(__FILE__)}/socket_spec_shared")
|
22
22
|
|
23
|
-
|
24
|
-
include Thrift
|
23
|
+
describe 'Socket' do
|
25
24
|
|
26
|
-
describe Socket do
|
25
|
+
describe Thrift::Socket do
|
27
26
|
before(:each) do
|
28
|
-
@socket = Socket.new
|
27
|
+
@socket = Thrift::Socket.new
|
29
28
|
@handle = mock("Handle", :closed? => false)
|
30
29
|
@handle.stub!(:close)
|
31
30
|
@handle.stub!(:connect_nonblock)
|
31
|
+
@handle.stub!(:setsockopt)
|
32
32
|
::Socket.stub!(:new).and_return(@handle)
|
33
33
|
end
|
34
34
|
|
@@ -40,22 +40,22 @@ class ThriftSocketSpec < Spec::ExampleGroup
|
|
40
40
|
end
|
41
41
|
|
42
42
|
it "should open a ::Socket with default args" do
|
43
|
-
::Socket.should_receive(:new).and_return(mock("Handle", :connect_nonblock => true))
|
44
|
-
::Socket.should_receive(:getaddrinfo).with("localhost", 9090).and_return([[]])
|
43
|
+
::Socket.should_receive(:new).and_return(mock("Handle", :connect_nonblock => true, :setsockopt => nil))
|
44
|
+
::Socket.should_receive(:getaddrinfo).with("localhost", 9090, nil, ::Socket::SOCK_STREAM).and_return([[]])
|
45
45
|
::Socket.should_receive(:sockaddr_in)
|
46
46
|
@socket.open
|
47
47
|
end
|
48
48
|
|
49
49
|
it "should accept host/port options" do
|
50
|
-
::Socket.should_receive(:new).and_return(mock("Handle", :connect_nonblock => true))
|
51
|
-
::Socket.should_receive(:getaddrinfo).with("my.domain", 1234).and_return([[]])
|
50
|
+
::Socket.should_receive(:new).and_return(mock("Handle", :connect_nonblock => true, :setsockopt => nil))
|
51
|
+
::Socket.should_receive(:getaddrinfo).with("my.domain", 1234, nil, ::Socket::SOCK_STREAM).and_return([[]])
|
52
52
|
::Socket.should_receive(:sockaddr_in)
|
53
|
-
Socket.new('my.domain', 1234).open
|
53
|
+
Thrift::Socket.new('my.domain', 1234).open
|
54
54
|
end
|
55
55
|
|
56
56
|
it "should accept an optional timeout" do
|
57
57
|
::Socket.stub!(:new)
|
58
|
-
Socket.new('localhost', 8080, 5).timeout.should == 5
|
58
|
+
Thrift::Socket.new('localhost', 8080, 5).timeout.should == 5
|
59
59
|
end
|
60
60
|
end
|
61
61
|
end
|
data/spec/socket_spec_shared.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# encoding: UTF-8
|
1
2
|
#
|
2
3
|
# Licensed to the Apache Software Foundation (ASF) under one
|
3
4
|
# or more contributor license agreements. See the NOTICE file
|
@@ -18,7 +19,7 @@
|
|
18
19
|
#
|
19
20
|
|
20
21
|
require 'rubygems'
|
21
|
-
require '
|
22
|
+
require 'rspec'
|
22
23
|
|
23
24
|
$:.unshift File.join(File.dirname(__FILE__), *%w[.. ext])
|
24
25
|
|
@@ -26,25 +27,27 @@ $:.unshift File.join(File.dirname(__FILE__), *%w[.. ext])
|
|
26
27
|
# will get screwed up
|
27
28
|
# $" << 'fastthread.bundle'
|
28
29
|
|
29
|
-
require
|
30
|
+
require 'thrift'
|
30
31
|
|
31
|
-
|
32
|
-
#
|
33
|
-
|
34
|
-
block
|
35
|
-
|
32
|
+
unless Object.method_defined? :tap
|
33
|
+
# if Object#tap isn't defined, then add it; this should only happen in Ruby < 1.8.7
|
34
|
+
class Object
|
35
|
+
def tap(&block)
|
36
|
+
block.call(self)
|
37
|
+
self
|
38
|
+
end
|
36
39
|
end
|
37
40
|
end
|
38
41
|
|
39
|
-
|
42
|
+
RSpec.configure do |configuration|
|
40
43
|
configuration.before(:each) do
|
41
44
|
Thrift.type_checking = true
|
42
45
|
end
|
43
46
|
end
|
44
47
|
|
45
48
|
$:.unshift File.join(File.dirname(__FILE__), *%w[.. test debug_proto gen-rb])
|
46
|
-
require
|
47
|
-
require
|
49
|
+
require 'srv'
|
50
|
+
require 'debug_proto_test_constants'
|
48
51
|
|
49
52
|
$:.unshift File.join(File.dirname(__FILE__), *%w[gen-rb])
|
50
53
|
require 'thrift_spec_types'
|
@@ -0,0 +1,191 @@
|
|
1
|
+
#
|
2
|
+
# Licensed to the Apache Software Foundation (ASF) under one
|
3
|
+
# or more contributor license agreements. See the NOTICE file
|
4
|
+
# distributed with this work for additional information
|
5
|
+
# regarding copyright ownership. The ASF licenses this file
|
6
|
+
# to you under the Apache License, Version 2.0 (the
|
7
|
+
# "License"); you may not use this file except in compliance
|
8
|
+
# with the License. You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing,
|
13
|
+
# software distributed under the License is distributed on an
|
14
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
15
|
+
# KIND, either express or implied. See the License for the
|
16
|
+
# specific language governing permissions and limitations
|
17
|
+
# under the License.
|
18
|
+
#
|
19
|
+
|
20
|
+
require 'spec_helper'
|
21
|
+
|
22
|
+
describe 'StructNestedContainers' do
|
23
|
+
|
24
|
+
def with_type_checking
|
25
|
+
saved_type_checking, Thrift.type_checking = Thrift.type_checking, true
|
26
|
+
begin
|
27
|
+
yield
|
28
|
+
ensure
|
29
|
+
Thrift.type_checking = saved_type_checking
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe Thrift::Struct do
|
34
|
+
# Nested container tests, see THRIFT-369.
|
35
|
+
it "should support nested lists inside lists" do
|
36
|
+
with_type_checking do
|
37
|
+
a, b = SpecNamespace::NestedListInList.new, SpecNamespace::NestedListInList.new
|
38
|
+
[a, b].each do |thrift_struct|
|
39
|
+
thrift_struct.value = [ [1, 2, 3], [2, 3, 4] ]
|
40
|
+
thrift_struct.validate
|
41
|
+
end
|
42
|
+
a.should == b
|
43
|
+
b.value.push [3, 4, 5]
|
44
|
+
a.should_not == b
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should support nested lists inside sets" do
|
49
|
+
with_type_checking do
|
50
|
+
a, b = SpecNamespace::NestedListInSet.new, SpecNamespace::NestedListInSet.new
|
51
|
+
[a, b].each do |thrift_struct|
|
52
|
+
thrift_struct.value = [ [1, 2, 3], [2, 3, 4] ].to_set
|
53
|
+
thrift_struct.validate
|
54
|
+
end
|
55
|
+
a.should == b
|
56
|
+
b.value.add [3, 4, 5]
|
57
|
+
a.should_not == b
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should support nested lists in map keys" do
|
62
|
+
with_type_checking do
|
63
|
+
a, b = SpecNamespace::NestedListInMapKey.new, SpecNamespace::NestedListInMapKey.new
|
64
|
+
[a, b].each do |thrift_struct|
|
65
|
+
thrift_struct.value = { [1, 2, 3] => 1, [2, 3, 4] => 2 }
|
66
|
+
thrift_struct.validate
|
67
|
+
end
|
68
|
+
a.should == b
|
69
|
+
b.value[[3, 4, 5]] = 3
|
70
|
+
a.should_not == b
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should support nested lists in map values" do
|
75
|
+
with_type_checking do
|
76
|
+
a, b = SpecNamespace::NestedListInMapValue.new, SpecNamespace::NestedListInMapValue.new
|
77
|
+
[a, b].each do |thrift_struct|
|
78
|
+
thrift_struct.value = { 1 => [1, 2, 3], 2 => [2, 3, 4] }
|
79
|
+
thrift_struct.validate
|
80
|
+
end
|
81
|
+
a.should == b
|
82
|
+
b.value[3] = [3, 4, 5]
|
83
|
+
a.should_not == b
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should support nested sets inside lists" do
|
88
|
+
with_type_checking do
|
89
|
+
a, b = SpecNamespace::NestedSetInList.new, SpecNamespace::NestedSetInList.new
|
90
|
+
[a, b].each do |thrift_struct|
|
91
|
+
thrift_struct.value = [ [1, 2, 3].to_set, [2, 3, 4].to_set ]
|
92
|
+
thrift_struct.validate
|
93
|
+
end
|
94
|
+
a.should == b
|
95
|
+
b.value.push([3, 4, 5].to_set)
|
96
|
+
a.should_not == b
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should support nested sets inside sets" do
|
101
|
+
with_type_checking do
|
102
|
+
a, b = SpecNamespace::NestedSetInSet.new, SpecNamespace::NestedSetInSet.new
|
103
|
+
[a, b].each do |thrift_struct|
|
104
|
+
thrift_struct.value = [ [1, 2, 3].to_set, [2, 3, 4].to_set ].to_set
|
105
|
+
thrift_struct.validate
|
106
|
+
end
|
107
|
+
a.should == b
|
108
|
+
b.value.add([3, 4, 5].to_set)
|
109
|
+
a.should_not == b
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
it "should support nested sets in map keys" do
|
114
|
+
with_type_checking do
|
115
|
+
a, b = SpecNamespace::NestedSetInMapKey.new, SpecNamespace::NestedSetInMapKey.new
|
116
|
+
[a, b].each do |thrift_struct|
|
117
|
+
thrift_struct.value = { [1, 2, 3].to_set => 1, [2, 3, 4].to_set => 2 }
|
118
|
+
thrift_struct.validate
|
119
|
+
end
|
120
|
+
a.should == b
|
121
|
+
b.value[[3, 4, 5].to_set] = 3
|
122
|
+
a.should_not == b
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should support nested sets in map values" do
|
127
|
+
with_type_checking do
|
128
|
+
a, b = SpecNamespace::NestedSetInMapValue.new, SpecNamespace::NestedSetInMapValue.new
|
129
|
+
[a, b].each do |thrift_struct|
|
130
|
+
thrift_struct.value = { 1 => [1, 2, 3].to_set, 2 => [2, 3, 4].to_set }
|
131
|
+
thrift_struct.validate
|
132
|
+
end
|
133
|
+
a.should == b
|
134
|
+
b.value[3] = [3, 4, 5].to_set
|
135
|
+
a.should_not == b
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
it "should support nested maps inside lists" do
|
140
|
+
with_type_checking do
|
141
|
+
a, b = SpecNamespace::NestedMapInList.new, SpecNamespace::NestedMapInList.new
|
142
|
+
[a, b].each do |thrift_struct|
|
143
|
+
thrift_struct.value = [ {1 => 2, 3 => 4}, {2 => 3, 4 => 5} ]
|
144
|
+
thrift_struct.validate
|
145
|
+
end
|
146
|
+
a.should == b
|
147
|
+
b.value.push({ 3 => 4, 5 => 6 })
|
148
|
+
a.should_not == b
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
it "should support nested maps inside sets" do
|
153
|
+
with_type_checking do
|
154
|
+
a, b = SpecNamespace::NestedMapInSet.new, SpecNamespace::NestedMapInSet.new
|
155
|
+
[a, b].each do |thrift_struct|
|
156
|
+
thrift_struct.value = [ {1 => 2, 3 => 4}, {2 => 3, 4 => 5} ].to_set
|
157
|
+
thrift_struct.validate
|
158
|
+
end
|
159
|
+
a.should == b
|
160
|
+
b.value.add({ 3 => 4, 5 => 6 })
|
161
|
+
a.should_not == b
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
it "should support nested maps in map keys" do
|
166
|
+
with_type_checking do
|
167
|
+
a, b = SpecNamespace::NestedMapInMapKey.new, SpecNamespace::NestedMapInMapKey.new
|
168
|
+
[a, b].each do |thrift_struct|
|
169
|
+
thrift_struct.value = { { 1 => 2, 3 => 4} => 1, {2 => 3, 4 => 5} => 2 }
|
170
|
+
thrift_struct.validate
|
171
|
+
end
|
172
|
+
a.should == b
|
173
|
+
b.value[{3 => 4, 5 => 6}] = 3
|
174
|
+
a.should_not == b
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
it "should support nested maps in map values" do
|
179
|
+
with_type_checking do
|
180
|
+
a, b = SpecNamespace::NestedMapInMapValue.new, SpecNamespace::NestedMapInMapValue.new
|
181
|
+
[a, b].each do |thrift_struct|
|
182
|
+
thrift_struct.value = { 1 => { 1 => 2, 3 => 4}, 2 => {2 => 3, 4 => 5} }
|
183
|
+
thrift_struct.validate
|
184
|
+
end
|
185
|
+
a.should == b
|
186
|
+
b.value[3] = { 3 => 4, 5 => 6 }
|
187
|
+
a.should_not == b
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
data/spec/struct_spec.rb
CHANGED
@@ -17,25 +17,23 @@
|
|
17
17
|
# under the License.
|
18
18
|
#
|
19
19
|
|
20
|
-
require
|
20
|
+
require 'spec_helper'
|
21
21
|
|
22
|
-
|
23
|
-
include Thrift
|
24
|
-
include SpecNamespace
|
22
|
+
describe 'Struct' do
|
25
23
|
|
26
|
-
describe Struct do
|
24
|
+
describe Thrift::Struct do
|
27
25
|
it "should iterate over all fields properly" do
|
28
26
|
fields = {}
|
29
|
-
Foo.new.each_field { |fid,field_info| fields[fid] = field_info }
|
30
|
-
fields.should == Foo::FIELDS
|
27
|
+
SpecNamespace::Foo.new.each_field { |fid,field_info| fields[fid] = field_info }
|
28
|
+
fields.should == SpecNamespace::Foo::FIELDS
|
31
29
|
end
|
32
30
|
|
33
31
|
it "should initialize all fields to defaults" do
|
34
|
-
validate_default_arguments(Foo.new)
|
32
|
+
validate_default_arguments(SpecNamespace::Foo.new)
|
35
33
|
end
|
36
34
|
|
37
35
|
it "should initialize all fields to defaults and accept a block argument" do
|
38
|
-
Foo.new do |f|
|
36
|
+
SpecNamespace::Foo.new do |f|
|
39
37
|
validate_default_arguments(f)
|
40
38
|
end
|
41
39
|
end
|
@@ -43,7 +41,7 @@ class ThriftStructSpec < Spec::ExampleGroup
|
|
43
41
|
def validate_default_arguments(object)
|
44
42
|
object.simple.should == 53
|
45
43
|
object.words.should == "words"
|
46
|
-
object.hello.should == Hello.new(:greeting => 'hello, world!')
|
44
|
+
object.hello.should == SpecNamespace::Hello.new(:greeting => 'hello, world!')
|
47
45
|
object.ints.should == [1, 2, 2, 3]
|
48
46
|
object.complex.should be_nil
|
49
47
|
object.shorts.should == Set.new([5, 17, 239])
|
@@ -51,79 +49,79 @@ class ThriftStructSpec < Spec::ExampleGroup
|
|
51
49
|
|
52
50
|
it "should not share default values between instances" do
|
53
51
|
begin
|
54
|
-
struct = Foo.new
|
52
|
+
struct = SpecNamespace::Foo.new
|
55
53
|
struct.ints << 17
|
56
|
-
Foo.new.ints.should == [1,2,2,3]
|
54
|
+
SpecNamespace::Foo.new.ints.should == [1,2,2,3]
|
57
55
|
ensure
|
58
56
|
# ensure no leakage to other tests
|
59
|
-
Foo::FIELDS[4][:default] = [1,2,2,3]
|
57
|
+
SpecNamespace::Foo::FIELDS[4][:default] = [1,2,2,3]
|
60
58
|
end
|
61
59
|
end
|
62
60
|
|
63
61
|
it "should properly initialize boolean values" do
|
64
|
-
struct = BoolStruct.new(:yesno => false)
|
62
|
+
struct = SpecNamespace::BoolStruct.new(:yesno => false)
|
65
63
|
struct.yesno.should be_false
|
66
64
|
end
|
67
65
|
|
68
66
|
it "should have proper == semantics" do
|
69
|
-
Foo.new.should_not == Hello.new
|
70
|
-
Foo.new.should == Foo.new
|
71
|
-
Foo.new(:simple => 52).should_not == Foo.new
|
67
|
+
SpecNamespace::Foo.new.should_not == SpecNamespace::Hello.new
|
68
|
+
SpecNamespace::Foo.new.should == SpecNamespace::Foo.new
|
69
|
+
SpecNamespace::Foo.new(:simple => 52).should_not == SpecNamespace::Foo.new
|
72
70
|
end
|
73
71
|
|
74
72
|
it "should print enum value names in inspect" do
|
75
|
-
StructWithSomeEnum.new(:some_enum => SomeEnum::ONE).inspect.should == "<SpecNamespace::StructWithSomeEnum some_enum:ONE (0)>"
|
73
|
+
SpecNamespace::StructWithSomeEnum.new(:some_enum => SpecNamespace::SomeEnum::ONE).inspect.should == "<SpecNamespace::StructWithSomeEnum some_enum:ONE (0)>"
|
76
74
|
|
77
|
-
StructWithEnumMap.new(:my_map => {SomeEnum::ONE => [SomeEnum::TWO]}).inspect.should == "<SpecNamespace::StructWithEnumMap my_map:{ONE (0): [TWO (1)]}>"
|
75
|
+
SpecNamespace::StructWithEnumMap.new(:my_map => {SpecNamespace::SomeEnum::ONE => [SpecNamespace::SomeEnum::TWO]}).inspect.should == "<SpecNamespace::StructWithEnumMap my_map:{ONE (0): [TWO (1)]}>"
|
78
76
|
end
|
79
77
|
|
80
78
|
it "should pretty print binary fields" do
|
81
|
-
Foo2.new(:my_binary => "\001\002\003").inspect.should == "<SpecNamespace::Foo2 my_binary:010203>"
|
79
|
+
SpecNamespace::Foo2.new(:my_binary => "\001\002\003").inspect.should == "<SpecNamespace::Foo2 my_binary:010203>"
|
82
80
|
end
|
83
81
|
|
84
82
|
it "should offer field? methods" do
|
85
|
-
Foo.new.opt_string?.should be_false
|
86
|
-
Foo.new(:simple => 52).simple?.should be_true
|
87
|
-
Foo.new(:my_bool => false).my_bool?.should be_true
|
88
|
-
Foo.new(:my_bool => true).my_bool?.should be_true
|
83
|
+
SpecNamespace::Foo.new.opt_string?.should be_false
|
84
|
+
SpecNamespace::Foo.new(:simple => 52).simple?.should be_true
|
85
|
+
SpecNamespace::Foo.new(:my_bool => false).my_bool?.should be_true
|
86
|
+
SpecNamespace::Foo.new(:my_bool => true).my_bool?.should be_true
|
89
87
|
end
|
90
88
|
|
91
89
|
it "should be comparable" do
|
92
|
-
s1 = StructWithSomeEnum.new(:some_enum => SomeEnum::ONE)
|
93
|
-
s2 = StructWithSomeEnum.new(:some_enum => SomeEnum::TWO)
|
90
|
+
s1 = SpecNamespace::StructWithSomeEnum.new(:some_enum => SpecNamespace::SomeEnum::ONE)
|
91
|
+
s2 = SpecNamespace::StructWithSomeEnum.new(:some_enum => SpecNamespace::SomeEnum::TWO)
|
94
92
|
|
95
93
|
(s1 <=> s2).should == -1
|
96
94
|
(s2 <=> s1).should == 1
|
97
95
|
(s1 <=> s1).should == 0
|
98
|
-
(s1 <=> StructWithSomeEnum.new()).should == -1
|
96
|
+
(s1 <=> SpecNamespace::StructWithSomeEnum.new()).should == -1
|
99
97
|
end
|
100
98
|
|
101
99
|
it "should read itself off the wire" do
|
102
|
-
struct = Foo.new
|
103
|
-
prot = BaseProtocol.new(mock("transport"))
|
100
|
+
struct = SpecNamespace::Foo.new
|
101
|
+
prot = Thrift::BaseProtocol.new(mock("transport"))
|
104
102
|
prot.should_receive(:read_struct_begin).twice
|
105
103
|
prot.should_receive(:read_struct_end).twice
|
106
104
|
prot.should_receive(:read_field_begin).and_return(
|
107
|
-
['complex', Types::MAP, 5], # Foo
|
108
|
-
['words', Types::STRING, 2], # Foo
|
109
|
-
['hello', Types::STRUCT, 3], # Foo
|
110
|
-
['greeting', Types::STRING, 1], # Hello
|
111
|
-
[nil, Types::STOP, 0], # Hello
|
112
|
-
['simple', Types::I32, 1], # Foo
|
113
|
-
['ints', Types::LIST, 4], # Foo
|
114
|
-
['shorts', Types::SET, 6], # Foo
|
115
|
-
[nil, Types::STOP, 0] # Hello
|
105
|
+
['complex', Thrift::Types::MAP, 5], # Foo
|
106
|
+
['words', Thrift::Types::STRING, 2], # Foo
|
107
|
+
['hello', Thrift::Types::STRUCT, 3], # Foo
|
108
|
+
['greeting', Thrift::Types::STRING, 1], # Hello
|
109
|
+
[nil, Thrift::Types::STOP, 0], # Hello
|
110
|
+
['simple', Thrift::Types::I32, 1], # Foo
|
111
|
+
['ints', Thrift::Types::LIST, 4], # Foo
|
112
|
+
['shorts', Thrift::Types::SET, 6], # Foo
|
113
|
+
[nil, Thrift::Types::STOP, 0] # Hello
|
116
114
|
)
|
117
115
|
prot.should_receive(:read_field_end).exactly(7).times
|
118
116
|
prot.should_receive(:read_map_begin).and_return(
|
119
|
-
[Types::I32, Types::MAP, 2], # complex
|
120
|
-
[Types::STRING, Types::DOUBLE, 2], # complex/1/value
|
121
|
-
[Types::STRING, Types::DOUBLE, 1] # complex/2/value
|
117
|
+
[Thrift::Types::I32, Thrift::Types::MAP, 2], # complex
|
118
|
+
[Thrift::Types::STRING, Thrift::Types::DOUBLE, 2], # complex/1/value
|
119
|
+
[Thrift::Types::STRING, Thrift::Types::DOUBLE, 1] # complex/2/value
|
122
120
|
)
|
123
121
|
prot.should_receive(:read_map_end).exactly(3).times
|
124
|
-
prot.should_receive(:read_list_begin).and_return([Types::I32, 4])
|
122
|
+
prot.should_receive(:read_list_begin).and_return([Thrift::Types::I32, 4])
|
125
123
|
prot.should_receive(:read_list_end)
|
126
|
-
prot.should_receive(:read_set_begin).and_return([Types::I16, 2])
|
124
|
+
prot.should_receive(:read_set_begin).and_return([Thrift::Types::I16, 2])
|
127
125
|
prot.should_receive(:read_set_end)
|
128
126
|
prot.should_receive(:read_i32).and_return(
|
129
127
|
1, 14, # complex keys
|
@@ -138,83 +136,83 @@ class ThriftStructSpec < Spec::ExampleGroup
|
|
138
136
|
|
139
137
|
struct.simple.should == 42
|
140
138
|
struct.complex.should == {1 => {"pi" => Math::PI, "e" => Math::E}, 14 => {"feigenbaum" => 4.669201609}}
|
141
|
-
struct.hello.should == Hello.new(:greeting => "what's up?")
|
139
|
+
struct.hello.should == SpecNamespace::Hello.new(:greeting => "what's up?")
|
142
140
|
struct.words.should == "apple banana"
|
143
141
|
struct.ints.should == [4, 23, 4, 29]
|
144
142
|
struct.shorts.should == Set.new([3, 2])
|
145
143
|
end
|
146
144
|
|
147
145
|
it "should serialize false boolean fields correctly" do
|
148
|
-
b = BoolStruct.new(:yesno => false)
|
149
|
-
prot = BinaryProtocol.new(MemoryBufferTransport.new)
|
146
|
+
b = SpecNamespace::BoolStruct.new(:yesno => false)
|
147
|
+
prot = Thrift::BinaryProtocol.new(Thrift::MemoryBufferTransport.new)
|
150
148
|
prot.should_receive(:write_bool).with(false)
|
151
149
|
b.write(prot)
|
152
150
|
end
|
153
151
|
|
154
152
|
it "should skip unexpected fields in structs and use default values" do
|
155
|
-
struct = Foo.new
|
156
|
-
prot = BaseProtocol.new(mock("transport"))
|
153
|
+
struct = SpecNamespace::Foo.new
|
154
|
+
prot = Thrift::BaseProtocol.new(mock("transport"))
|
157
155
|
prot.should_receive(:read_struct_begin)
|
158
156
|
prot.should_receive(:read_struct_end)
|
159
157
|
prot.should_receive(:read_field_begin).and_return(
|
160
|
-
['simple', Types::I32, 1],
|
161
|
-
['complex', Types::STRUCT, 5],
|
162
|
-
['thinz', Types::MAP, 7],
|
163
|
-
['foobar', Types::I32, 3],
|
164
|
-
['words', Types::STRING, 2],
|
165
|
-
[nil, Types::STOP, 0]
|
158
|
+
['simple', Thrift::Types::I32, 1],
|
159
|
+
['complex', Thrift::Types::STRUCT, 5],
|
160
|
+
['thinz', Thrift::Types::MAP, 7],
|
161
|
+
['foobar', Thrift::Types::I32, 3],
|
162
|
+
['words', Thrift::Types::STRING, 2],
|
163
|
+
[nil, Thrift::Types::STOP, 0]
|
166
164
|
)
|
167
165
|
prot.should_receive(:read_field_end).exactly(5).times
|
168
166
|
prot.should_receive(:read_i32).and_return(42)
|
169
167
|
prot.should_receive(:read_string).and_return("foobar")
|
170
|
-
prot.should_receive(:skip).with(Types::STRUCT)
|
171
|
-
prot.should_receive(:skip).with(Types::MAP)
|
172
|
-
# prot.should_receive(:read_map_begin).and_return([Types::I32, Types::I32, 0])
|
168
|
+
prot.should_receive(:skip).with(Thrift::Types::STRUCT)
|
169
|
+
prot.should_receive(:skip).with(Thrift::Types::MAP)
|
170
|
+
# prot.should_receive(:read_map_begin).and_return([Thrift::Types::I32, Thrift::Types::I32, 0])
|
173
171
|
# prot.should_receive(:read_map_end)
|
174
|
-
prot.should_receive(:skip).with(Types::I32)
|
172
|
+
prot.should_receive(:skip).with(Thrift::Types::I32)
|
175
173
|
struct.read(prot)
|
176
174
|
|
177
175
|
struct.simple.should == 42
|
178
176
|
struct.complex.should be_nil
|
179
177
|
struct.words.should == "foobar"
|
180
|
-
struct.hello.should == Hello.new(:greeting => 'hello, world!')
|
178
|
+
struct.hello.should == SpecNamespace::Hello.new(:greeting => 'hello, world!')
|
181
179
|
struct.ints.should == [1, 2, 2, 3]
|
182
180
|
struct.shorts.should == Set.new([5, 17, 239])
|
183
181
|
end
|
184
182
|
|
185
183
|
it "should write itself to the wire" do
|
186
|
-
prot = BaseProtocol.new(mock("transport")) #mock("Protocol")
|
184
|
+
prot = Thrift::BaseProtocol.new(mock("transport")) #mock("Protocol")
|
187
185
|
prot.should_receive(:write_struct_begin).with("SpecNamespace::Foo")
|
188
186
|
prot.should_receive(:write_struct_begin).with("SpecNamespace::Hello")
|
189
187
|
prot.should_receive(:write_struct_end).twice
|
190
|
-
prot.should_receive(:write_field_begin).with('ints', Types::LIST, 4)
|
188
|
+
prot.should_receive(:write_field_begin).with('ints', Thrift::Types::LIST, 4)
|
191
189
|
prot.should_receive(:write_i32).with(1)
|
192
190
|
prot.should_receive(:write_i32).with(2).twice
|
193
191
|
prot.should_receive(:write_i32).with(3)
|
194
|
-
prot.should_receive(:write_field_begin).with('complex', Types::MAP, 5)
|
192
|
+
prot.should_receive(:write_field_begin).with('complex', Thrift::Types::MAP, 5)
|
195
193
|
prot.should_receive(:write_i32).with(5)
|
196
194
|
prot.should_receive(:write_string).with('foo')
|
197
195
|
prot.should_receive(:write_double).with(1.23)
|
198
|
-
prot.should_receive(:write_field_begin).with('shorts', Types::SET, 6)
|
196
|
+
prot.should_receive(:write_field_begin).with('shorts', Thrift::Types::SET, 6)
|
199
197
|
prot.should_receive(:write_i16).with(5)
|
200
198
|
prot.should_receive(:write_i16).with(17)
|
201
199
|
prot.should_receive(:write_i16).with(239)
|
202
200
|
prot.should_receive(:write_field_stop).twice
|
203
201
|
prot.should_receive(:write_field_end).exactly(6).times
|
204
|
-
prot.should_receive(:write_field_begin).with('simple', Types::I32, 1)
|
202
|
+
prot.should_receive(:write_field_begin).with('simple', Thrift::Types::I32, 1)
|
205
203
|
prot.should_receive(:write_i32).with(53)
|
206
|
-
prot.should_receive(:write_field_begin).with('hello', Types::STRUCT, 3)
|
207
|
-
prot.should_receive(:write_field_begin).with('greeting', Types::STRING, 1)
|
204
|
+
prot.should_receive(:write_field_begin).with('hello', Thrift::Types::STRUCT, 3)
|
205
|
+
prot.should_receive(:write_field_begin).with('greeting', Thrift::Types::STRING, 1)
|
208
206
|
prot.should_receive(:write_string).with('hello, world!')
|
209
|
-
prot.should_receive(:write_map_begin).with(Types::I32, Types::MAP, 1)
|
210
|
-
prot.should_receive(:write_map_begin).with(Types::STRING, Types::DOUBLE, 1)
|
207
|
+
prot.should_receive(:write_map_begin).with(Thrift::Types::I32, Thrift::Types::MAP, 1)
|
208
|
+
prot.should_receive(:write_map_begin).with(Thrift::Types::STRING, Thrift::Types::DOUBLE, 1)
|
211
209
|
prot.should_receive(:write_map_end).twice
|
212
|
-
prot.should_receive(:write_list_begin).with(Types::I32, 4)
|
210
|
+
prot.should_receive(:write_list_begin).with(Thrift::Types::I32, 4)
|
213
211
|
prot.should_receive(:write_list_end)
|
214
|
-
prot.should_receive(:write_set_begin).with(Types::I16, 3)
|
212
|
+
prot.should_receive(:write_set_begin).with(Thrift::Types::I16, 3)
|
215
213
|
prot.should_receive(:write_set_end)
|
216
214
|
|
217
|
-
struct = Foo.new
|
215
|
+
struct = SpecNamespace::Foo.new
|
218
216
|
struct.words = nil
|
219
217
|
struct.complex = {5 => {"foo" => 1.23}}
|
220
218
|
struct.write(prot)
|
@@ -222,48 +220,48 @@ class ThriftStructSpec < Spec::ExampleGroup
|
|
222
220
|
|
223
221
|
it "should raise an exception if presented with an unknown container" do
|
224
222
|
# yeah this is silly, but I'm going for code coverage here
|
225
|
-
struct = Foo.new
|
223
|
+
struct = SpecNamespace::Foo.new
|
226
224
|
lambda { struct.send :write_container, nil, nil, {:type => "foo"} }.should raise_error(StandardError, "Not a container type: foo")
|
227
225
|
end
|
228
226
|
|
229
227
|
it "should support optional type-checking in Thrift::Struct.new" do
|
230
228
|
Thrift.type_checking = true
|
231
229
|
begin
|
232
|
-
lambda { Hello.new(:greeting => 3) }.should raise_error(TypeError, "Expected Types::STRING, received Fixnum for field greeting")
|
230
|
+
lambda { SpecNamespace::Hello.new(:greeting => 3) }.should raise_error(Thrift::TypeError, "Expected Types::STRING, received Fixnum for field greeting")
|
233
231
|
ensure
|
234
232
|
Thrift.type_checking = false
|
235
233
|
end
|
236
|
-
lambda { Hello.new(:greeting => 3) }.should_not raise_error(TypeError)
|
234
|
+
lambda { SpecNamespace::Hello.new(:greeting => 3) }.should_not raise_error(Thrift::TypeError)
|
237
235
|
end
|
238
236
|
|
239
237
|
it "should support optional type-checking in field accessors" do
|
240
238
|
Thrift.type_checking = true
|
241
239
|
begin
|
242
|
-
hello = Hello.new
|
243
|
-
lambda { hello.greeting = 3 }.should raise_error(TypeError, "Expected Types::STRING, received Fixnum for field greeting")
|
240
|
+
hello = SpecNamespace::Hello.new
|
241
|
+
lambda { hello.greeting = 3 }.should raise_error(Thrift::TypeError, "Expected Types::STRING, received Fixnum for field greeting")
|
244
242
|
ensure
|
245
243
|
Thrift.type_checking = false
|
246
244
|
end
|
247
|
-
lambda { hello.greeting = 3 }.should_not raise_error(TypeError)
|
245
|
+
lambda { hello.greeting = 3 }.should_not raise_error(Thrift::TypeError)
|
248
246
|
end
|
249
247
|
|
250
248
|
it "should raise an exception when unknown types are given to Thrift::Struct.new" do
|
251
|
-
lambda { Hello.new(:fish => 'salmon') }.should raise_error(Exception, "Unknown key given to SpecNamespace::Hello.new: fish")
|
249
|
+
lambda { SpecNamespace::Hello.new(:fish => 'salmon') }.should raise_error(Exception, "Unknown key given to SpecNamespace::Hello.new: fish")
|
252
250
|
end
|
253
251
|
|
254
252
|
it "should support `raise Xception, 'message'` for Exception structs" do
|
255
253
|
begin
|
256
|
-
raise Xception, "something happened"
|
254
|
+
raise SpecNamespace::Xception, "something happened"
|
257
255
|
rescue Thrift::Exception => e
|
258
256
|
e.message.should == "something happened"
|
259
257
|
e.code.should == 1
|
260
258
|
# ensure it gets serialized properly, this is the really important part
|
261
|
-
prot = BaseProtocol.new(mock("trans"))
|
259
|
+
prot = Thrift::BaseProtocol.new(mock("trans"))
|
262
260
|
prot.should_receive(:write_struct_begin).with("SpecNamespace::Xception")
|
263
261
|
prot.should_receive(:write_struct_end)
|
264
|
-
prot.should_receive(:write_field_begin).with('message', Types::STRING, 1)#, "something happened")
|
262
|
+
prot.should_receive(:write_field_begin).with('message', Thrift::Types::STRING, 1)#, "something happened")
|
265
263
|
prot.should_receive(:write_string).with("something happened")
|
266
|
-
prot.should_receive(:write_field_begin).with('code', Types::I32, 2)#, 1)
|
264
|
+
prot.should_receive(:write_field_begin).with('code', Thrift::Types::I32, 2)#, 1)
|
267
265
|
prot.should_receive(:write_i32).with(1)
|
268
266
|
prot.should_receive(:write_field_stop)
|
269
267
|
prot.should_receive(:write_field_end).twice
|
@@ -274,16 +272,16 @@ class ThriftStructSpec < Spec::ExampleGroup
|
|
274
272
|
|
275
273
|
it "should support the regular initializer for exception structs" do
|
276
274
|
begin
|
277
|
-
raise Xception, :message => "something happened", :code => 5
|
275
|
+
raise SpecNamespace::Xception, :message => "something happened", :code => 5
|
278
276
|
rescue Thrift::Exception => e
|
279
277
|
e.message.should == "something happened"
|
280
278
|
e.code.should == 5
|
281
|
-
prot = BaseProtocol.new(mock("trans"))
|
279
|
+
prot = Thrift::BaseProtocol.new(mock("trans"))
|
282
280
|
prot.should_receive(:write_struct_begin).with("SpecNamespace::Xception")
|
283
281
|
prot.should_receive(:write_struct_end)
|
284
|
-
prot.should_receive(:write_field_begin).with('message', Types::STRING, 1)
|
282
|
+
prot.should_receive(:write_field_begin).with('message', Thrift::Types::STRING, 1)
|
285
283
|
prot.should_receive(:write_string).with("something happened")
|
286
|
-
prot.should_receive(:write_field_begin).with('code', Types::I32, 2)
|
284
|
+
prot.should_receive(:write_field_begin).with('code', Thrift::Types::I32, 2)
|
287
285
|
prot.should_receive(:write_i32).with(5)
|
288
286
|
prot.should_receive(:write_field_stop)
|
289
287
|
prot.should_receive(:write_field_end).twice
|