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.
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