thrift 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. data/benchmark/gen-rb/benchmark_constants.rb +3 -2
  2. data/benchmark/gen-rb/benchmark_service.rb +52 -52
  3. data/benchmark/gen-rb/benchmark_types.rb +3 -2
  4. data/ext/binary_protocol_accelerated.c +5 -2
  5. data/ext/bytes.c +36 -0
  6. data/ext/bytes.h +31 -0
  7. data/ext/compact_protocol.c +7 -4
  8. data/ext/constants.h +4 -0
  9. data/ext/extconf.rb +3 -1
  10. data/ext/memory_buffer.c +11 -8
  11. data/ext/thrift_native.c +9 -0
  12. data/lib/thrift.rb +2 -0
  13. data/lib/thrift/bytes.rb +131 -0
  14. data/lib/thrift/protocol/base_protocol.rb +10 -0
  15. data/lib/thrift/protocol/binary_protocol.rb +5 -5
  16. data/lib/thrift/protocol/compact_protocol.rb +4 -3
  17. data/lib/thrift/protocol/json_protocol.rb +765 -0
  18. data/lib/thrift/transport/base_transport.rb +22 -20
  19. data/lib/thrift/transport/buffered_transport.rb +16 -10
  20. data/lib/thrift/transport/framed_transport.rb +11 -10
  21. data/lib/thrift/transport/http_client_transport.rb +7 -5
  22. data/lib/thrift/transport/io_stream_transport.rb +1 -1
  23. data/lib/thrift/transport/memory_buffer_transport.rb +6 -6
  24. data/lib/thrift/transport/socket.rb +4 -2
  25. data/spec/ThriftSpec.thrift +52 -1
  26. data/spec/base_protocol_spec.rb +44 -45
  27. data/spec/base_transport_spec.rb +49 -50
  28. data/spec/binary_protocol_accelerated_spec.rb +9 -13
  29. data/spec/binary_protocol_spec.rb +15 -10
  30. data/spec/binary_protocol_spec_shared.rb +62 -12
  31. data/spec/bytes_spec.rb +160 -0
  32. data/spec/client_spec.rb +13 -14
  33. data/spec/compact_protocol_spec.rb +3 -2
  34. data/spec/exception_spec.rb +39 -40
  35. data/spec/gen-rb/nonblocking_service.rb +193 -193
  36. data/spec/gen-rb/thrift_spec_constants.rb +3 -2
  37. data/spec/gen-rb/thrift_spec_types.rb +455 -262
  38. data/spec/http_client_spec.rb +16 -9
  39. data/spec/json_protocol_spec.rb +513 -0
  40. data/spec/mongrel_http_server_spec.rb +19 -22
  41. data/spec/nonblocking_server_spec.rb +18 -20
  42. data/spec/processor_spec.rb +13 -16
  43. data/spec/serializer_spec.rb +17 -19
  44. data/spec/server_socket_spec.rb +6 -7
  45. data/spec/server_spec.rb +46 -58
  46. data/spec/socket_spec.rb +11 -11
  47. data/spec/socket_spec_shared.rb +1 -1
  48. data/spec/spec_helper.rb +13 -10
  49. data/spec/struct_nested_containers_spec.rb +191 -0
  50. data/spec/struct_spec.rb +84 -86
  51. data/spec/types_spec.rb +65 -66
  52. data/spec/union_spec.rb +44 -46
  53. data/spec/unix_socket_spec.rb +8 -9
  54. data/test/debug_proto/gen-rb/debug_proto_test_constants.rb +8 -7
  55. data/test/debug_proto/gen-rb/debug_proto_test_types.rb +24 -23
  56. data/test/debug_proto/gen-rb/empty_service.rb +1 -1
  57. data/test/debug_proto/gen-rb/inherited.rb +3 -3
  58. data/test/debug_proto/gen-rb/reverse_order_service.rb +1 -1
  59. data/test/debug_proto/gen-rb/service_for_exception_with_a_map.rb +3 -3
  60. data/test/debug_proto/gen-rb/srv.rb +2 -2
  61. metadata +43 -49
@@ -17,18 +17,18 @@
17
17
  # under the License.
18
18
  #
19
19
 
20
- require File.expand_path("#{File.dirname(__FILE__)}/spec_helper")
20
+ require 'spec_helper'
21
21
  require File.expand_path("#{File.dirname(__FILE__)}/socket_spec_shared")
22
22
 
23
- class ThriftSocketSpec < Spec::ExampleGroup
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
@@ -17,7 +17,7 @@
17
17
  # under the License.
18
18
  #
19
19
 
20
- require File.expand_path("#{File.dirname(__FILE__)}/spec_helper")
20
+ require 'spec_helper'
21
21
 
22
22
  shared_examples_for "a socket" do
23
23
  it "should open a socket" do
@@ -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 'spec'
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 File.dirname(__FILE__) + '/../lib/thrift'
30
+ require 'thrift'
30
31
 
31
- class Object
32
- # tee is a useful method, so let's let our tests have it
33
- def tee(&block)
34
- block.call(self)
35
- self
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
- Spec::Runner.configure do |configuration|
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 "srv"
47
- require "debug_proto_test_constants"
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
@@ -17,25 +17,23 @@
17
17
  # under the License.
18
18
  #
19
19
 
20
- require File.expand_path("#{File.dirname(__FILE__)}/spec_helper")
20
+ require 'spec_helper'
21
21
 
22
- class ThriftStructSpec < Spec::ExampleGroup
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