thrift-mavericks 0.8.0 → 0.9.0.1

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 (59) hide show
  1. checksums.yaml +8 -8
  2. data/ext/binary_protocol_accelerated.c +21 -2
  3. data/ext/bytes.c +36 -0
  4. data/ext/bytes.h +31 -0
  5. data/ext/compact_protocol.c +24 -7
  6. data/ext/constants.h +5 -5
  7. data/ext/extconf.rb +3 -1
  8. data/ext/memory_buffer.c +11 -8
  9. data/ext/protocol.c +0 -185
  10. data/ext/protocol.h +0 -20
  11. data/ext/struct.c +0 -3
  12. data/ext/thrift_native.c +10 -11
  13. data/lib/thrift.rb +3 -0
  14. data/lib/thrift/bytes.rb +131 -0
  15. data/lib/thrift/exceptions.rb +3 -0
  16. data/lib/thrift/protocol/base_protocol.rb +96 -9
  17. data/lib/thrift/protocol/binary_protocol.rb +15 -7
  18. data/lib/thrift/protocol/compact_protocol.rb +14 -6
  19. data/lib/thrift/protocol/json_protocol.rb +766 -0
  20. data/lib/thrift/server/mongrel_http_server.rb +2 -0
  21. data/lib/thrift/server/thin_http_server.rb +91 -0
  22. data/lib/thrift/struct.rb +1 -1
  23. data/lib/thrift/struct_union.rb +2 -2
  24. data/lib/thrift/transport/base_transport.rb +22 -20
  25. data/lib/thrift/transport/buffered_transport.rb +16 -10
  26. data/lib/thrift/transport/framed_transport.rb +11 -10
  27. data/lib/thrift/transport/http_client_transport.rb +11 -6
  28. data/lib/thrift/transport/io_stream_transport.rb +1 -1
  29. data/lib/thrift/transport/memory_buffer_transport.rb +6 -6
  30. data/lib/thrift/transport/socket.rb +4 -2
  31. data/spec/ThriftSpec.thrift +52 -1
  32. data/spec/base_protocol_spec.rb +108 -51
  33. data/spec/base_transport_spec.rb +49 -50
  34. data/spec/binary_protocol_accelerated_spec.rb +9 -13
  35. data/spec/binary_protocol_spec.rb +15 -10
  36. data/spec/binary_protocol_spec_shared.rb +92 -12
  37. data/spec/bytes_spec.rb +160 -0
  38. data/spec/client_spec.rb +13 -14
  39. data/spec/compact_protocol_spec.rb +4 -5
  40. data/spec/exception_spec.rb +39 -40
  41. data/spec/gen-rb/thrift_spec_types.rb +192 -0
  42. data/spec/http_client_spec.rb +65 -9
  43. data/spec/json_protocol_spec.rb +513 -0
  44. data/spec/nonblocking_server_spec.rb +18 -20
  45. data/spec/processor_spec.rb +13 -16
  46. data/spec/serializer_spec.rb +17 -19
  47. data/spec/server_socket_spec.rb +6 -7
  48. data/spec/server_spec.rb +46 -58
  49. data/spec/socket_spec.rb +11 -11
  50. data/spec/socket_spec_shared.rb +1 -1
  51. data/spec/spec_helper.rb +13 -10
  52. data/spec/struct_nested_containers_spec.rb +191 -0
  53. data/spec/struct_spec.rb +84 -86
  54. data/spec/thin_http_server_spec.rb +140 -0
  55. data/spec/types_spec.rb +65 -66
  56. data/spec/union_spec.rb +57 -47
  57. data/spec/unix_socket_spec.rb +8 -9
  58. metadata +72 -14
  59. data/spec/mongrel_http_server_spec.rb +0 -117
@@ -34,8 +34,9 @@ module Thrift
34
34
 
35
35
  def open
36
36
  begin
37
- addrinfo = ::Socket::getaddrinfo(@host, @port).first
37
+ addrinfo = ::Socket::getaddrinfo(@host, @port, nil, ::Socket::SOCK_STREAM).first
38
38
  @handle = ::Socket.new(addrinfo[4], ::Socket::SOCK_STREAM, 0)
39
+ @handle.setsockopt(::Socket::IPPROTO_TCP, ::Socket::TCP_NODELAY, 1)
39
40
  sockaddr = ::Socket.sockaddr_in(addrinfo[1], addrinfo[3])
40
41
  begin
41
42
  @handle.connect_nonblock(sockaddr)
@@ -60,6 +61,7 @@ module Thrift
60
61
 
61
62
  def write(str)
62
63
  raise IOError, "closed stream" unless open?
64
+ str = Bytes.force_binary_encoding(str)
63
65
  begin
64
66
  if @timeout.nil? or @timeout == 0
65
67
  @handle.write(str)
@@ -134,4 +136,4 @@ module Thrift
134
136
  @handle
135
137
  end
136
138
  end
137
- end
139
+ end
@@ -129,4 +129,55 @@ struct Struct_with_union {
129
129
 
130
130
  struct StructWithEnumMap {
131
131
  1: map<SomeEnum, list<SomeEnum>> my_map;
132
- }
132
+ }
133
+
134
+ # Nested lists
135
+ struct NestedListInList {
136
+ 1: list<list<byte>> value
137
+ }
138
+
139
+ struct NestedListInSet {
140
+ 1: set<list<byte>> value
141
+ }
142
+
143
+ struct NestedListInMapKey {
144
+ 1: map<list<byte>, byte> value
145
+ }
146
+
147
+ struct NestedListInMapValue {
148
+ 1: map<byte, list<byte>> value
149
+ }
150
+
151
+ # Nested sets
152
+ struct NestedSetInList {
153
+ 1: list<set<byte>> value
154
+ }
155
+
156
+ struct NestedSetInSet {
157
+ 1: set<set<byte>> value
158
+ }
159
+
160
+ struct NestedSetInMapKey {
161
+ 1: map<set<byte>, byte> value
162
+ }
163
+
164
+ struct NestedSetInMapValue {
165
+ 1: map<byte, set<byte>> value
166
+ }
167
+
168
+ # Nested maps
169
+ struct NestedMapInList {
170
+ 1: list<map<byte, byte>> value
171
+ }
172
+
173
+ struct NestedMapInSet {
174
+ 1: set<map<byte, byte>> value
175
+ }
176
+
177
+ struct NestedMapInMapKey {
178
+ 2: map<map<byte, byte>, byte> value
179
+ }
180
+
181
+ struct NestedMapInMapValue {
182
+ 2: map<byte, map<byte, byte>> value
183
+ }
@@ -17,31 +17,61 @@
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 ThriftBaseProtocolSpec < Spec::ExampleGroup
23
- include Thrift
22
+ describe 'BaseProtocol' do
24
23
 
25
24
  before(:each) do
26
25
  @trans = mock("MockTransport")
27
- @prot = BaseProtocol.new(@trans)
26
+ @prot = Thrift::BaseProtocol.new(@trans)
28
27
  end
29
28
 
30
- describe BaseProtocol do
29
+ describe Thrift::BaseProtocol do
31
30
  # most of the methods are stubs, so we can ignore them
32
31
 
33
32
  it "should make trans accessible" do
34
33
  @prot.trans.should eql(@trans)
35
34
  end
36
35
 
37
- it "should write out a field nicely" do
36
+ it 'should write out a field nicely (deprecated write_field signature)' do
38
37
  @prot.should_receive(:write_field_begin).with('field', 'type', 'fid').ordered
39
- @prot.should_receive(:write_type).with('type', 'value').ordered
38
+ @prot.should_receive(:write_type).with({:name => 'field', :type => 'type'}, 'value').ordered
40
39
  @prot.should_receive(:write_field_end).ordered
41
40
  @prot.write_field('field', 'type', 'fid', 'value')
42
41
  end
43
42
 
44
- it "should write out the different types" do
43
+ it 'should write out a field nicely' do
44
+ @prot.should_receive(:write_field_begin).with('field', 'type', 'fid').ordered
45
+ @prot.should_receive(:write_type).with({:name => 'field', :type => 'type', :binary => false}, 'value').ordered
46
+ @prot.should_receive(:write_field_end).ordered
47
+ @prot.write_field({:name => 'field', :type => 'type', :binary => false}, 'fid', 'value')
48
+ end
49
+
50
+ it 'should write out the different types (deprecated write_type signature)' do
51
+ @prot.should_receive(:write_bool).with('bool').ordered
52
+ @prot.should_receive(:write_byte).with('byte').ordered
53
+ @prot.should_receive(:write_double).with('double').ordered
54
+ @prot.should_receive(:write_i16).with('i16').ordered
55
+ @prot.should_receive(:write_i32).with('i32').ordered
56
+ @prot.should_receive(:write_i64).with('i64').ordered
57
+ @prot.should_receive(:write_string).with('string').ordered
58
+ struct = mock('Struct')
59
+ struct.should_receive(:write).with(@prot).ordered
60
+ @prot.write_type(Thrift::Types::BOOL, 'bool')
61
+ @prot.write_type(Thrift::Types::BYTE, 'byte')
62
+ @prot.write_type(Thrift::Types::DOUBLE, 'double')
63
+ @prot.write_type(Thrift::Types::I16, 'i16')
64
+ @prot.write_type(Thrift::Types::I32, 'i32')
65
+ @prot.write_type(Thrift::Types::I64, 'i64')
66
+ @prot.write_type(Thrift::Types::STRING, 'string')
67
+ @prot.write_type(Thrift::Types::STRUCT, struct)
68
+ # all other types are not implemented
69
+ [Thrift::Types::STOP, Thrift::Types::VOID, Thrift::Types::MAP, Thrift::Types::SET, Thrift::Types::LIST].each do |type|
70
+ expect { @prot.write_type(type, type.to_s) }.to raise_error(NotImplementedError)
71
+ end
72
+ end
73
+
74
+ it 'should write out the different types' do
45
75
  @prot.should_receive(:write_bool).with('bool').ordered
46
76
  @prot.should_receive(:write_byte).with('byte').ordered
47
77
  @prot.should_receive(:write_double).with('double').ordered
@@ -49,23 +79,47 @@ class ThriftBaseProtocolSpec < Spec::ExampleGroup
49
79
  @prot.should_receive(:write_i32).with('i32').ordered
50
80
  @prot.should_receive(:write_i64).with('i64').ordered
51
81
  @prot.should_receive(:write_string).with('string').ordered
82
+ @prot.should_receive(:write_binary).with('binary').ordered
52
83
  struct = mock('Struct')
53
84
  struct.should_receive(:write).with(@prot).ordered
54
- @prot.write_type(Types::BOOL, 'bool')
55
- @prot.write_type(Types::BYTE, 'byte')
56
- @prot.write_type(Types::DOUBLE, 'double')
57
- @prot.write_type(Types::I16, 'i16')
58
- @prot.write_type(Types::I32, 'i32')
59
- @prot.write_type(Types::I64, 'i64')
60
- @prot.write_type(Types::STRING, 'string')
61
- @prot.write_type(Types::STRUCT, struct)
85
+ @prot.write_type({:type => Thrift::Types::BOOL}, 'bool')
86
+ @prot.write_type({:type => Thrift::Types::BYTE}, 'byte')
87
+ @prot.write_type({:type => Thrift::Types::DOUBLE}, 'double')
88
+ @prot.write_type({:type => Thrift::Types::I16}, 'i16')
89
+ @prot.write_type({:type => Thrift::Types::I32}, 'i32')
90
+ @prot.write_type({:type => Thrift::Types::I64}, 'i64')
91
+ @prot.write_type({:type => Thrift::Types::STRING}, 'string')
92
+ @prot.write_type({:type => Thrift::Types::STRING, :binary => true}, 'binary')
93
+ @prot.write_type({:type => Thrift::Types::STRUCT}, struct)
94
+ # all other types are not implemented
95
+ [Thrift::Types::STOP, Thrift::Types::VOID, Thrift::Types::MAP, Thrift::Types::SET, Thrift::Types::LIST].each do |type|
96
+ expect { @prot.write_type({:type => type}, type.to_s) }.to raise_error(NotImplementedError)
97
+ end
98
+ end
99
+
100
+ it 'should read the different types (deprecated read_type signature)' do
101
+ @prot.should_receive(:read_bool).ordered
102
+ @prot.should_receive(:read_byte).ordered
103
+ @prot.should_receive(:read_i16).ordered
104
+ @prot.should_receive(:read_i32).ordered
105
+ @prot.should_receive(:read_i64).ordered
106
+ @prot.should_receive(:read_double).ordered
107
+ @prot.should_receive(:read_string).ordered
108
+ @prot.read_type(Thrift::Types::BOOL)
109
+ @prot.read_type(Thrift::Types::BYTE)
110
+ @prot.read_type(Thrift::Types::I16)
111
+ @prot.read_type(Thrift::Types::I32)
112
+ @prot.read_type(Thrift::Types::I64)
113
+ @prot.read_type(Thrift::Types::DOUBLE)
114
+ @prot.read_type(Thrift::Types::STRING)
62
115
  # all other types are not implemented
63
- [Types::STOP, Types::VOID, Types::MAP, Types::SET, Types::LIST].each do |type|
64
- lambda { @prot.write_type(type, type.to_s) }.should raise_error(NotImplementedError)
116
+ [Thrift::Types::STOP, Thrift::Types::VOID, Thrift::Types::MAP,
117
+ Thrift::Types::SET, Thrift::Types::LIST, Thrift::Types::STRUCT].each do |type|
118
+ expect { @prot.read_type(type) }.to raise_error(NotImplementedError)
65
119
  end
66
120
  end
67
121
 
68
- it "should read the different types" do
122
+ it 'should read the different types' do
69
123
  @prot.should_receive(:read_bool).ordered
70
124
  @prot.should_receive(:read_byte).ordered
71
125
  @prot.should_receive(:read_i16).ordered
@@ -73,16 +127,19 @@ class ThriftBaseProtocolSpec < Spec::ExampleGroup
73
127
  @prot.should_receive(:read_i64).ordered
74
128
  @prot.should_receive(:read_double).ordered
75
129
  @prot.should_receive(:read_string).ordered
76
- @prot.read_type(Types::BOOL)
77
- @prot.read_type(Types::BYTE)
78
- @prot.read_type(Types::I16)
79
- @prot.read_type(Types::I32)
80
- @prot.read_type(Types::I64)
81
- @prot.read_type(Types::DOUBLE)
82
- @prot.read_type(Types::STRING)
130
+ @prot.should_receive(:read_binary).ordered
131
+ @prot.read_type({:type => Thrift::Types::BOOL})
132
+ @prot.read_type({:type => Thrift::Types::BYTE})
133
+ @prot.read_type({:type => Thrift::Types::I16})
134
+ @prot.read_type({:type => Thrift::Types::I32})
135
+ @prot.read_type({:type => Thrift::Types::I64})
136
+ @prot.read_type({:type => Thrift::Types::DOUBLE})
137
+ @prot.read_type({:type => Thrift::Types::STRING})
138
+ @prot.read_type({:type => Thrift::Types::STRING, :binary => true})
83
139
  # all other types are not implemented
84
- [Types::STOP, Types::VOID, Types::MAP, Types::SET, Types::LIST].each do |type|
85
- lambda { @prot.read_type(type) }.should raise_error(NotImplementedError)
140
+ [Thrift::Types::STOP, Thrift::Types::VOID, Thrift::Types::MAP,
141
+ Thrift::Types::SET, Thrift::Types::LIST, Thrift::Types::STRUCT].each do |type|
142
+ expect { @prot.read_type({:type => type}) }.to raise_error(NotImplementedError)
86
143
  end
87
144
  end
88
145
 
@@ -94,67 +151,67 @@ class ThriftBaseProtocolSpec < Spec::ExampleGroup
94
151
  @prot.should_receive(:read_i64).ordered
95
152
  @prot.should_receive(:read_double).ordered
96
153
  @prot.should_receive(:read_string).ordered
97
- @prot.skip(Types::BOOL)
98
- @prot.skip(Types::BYTE)
99
- @prot.skip(Types::I16)
100
- @prot.skip(Types::I32)
101
- @prot.skip(Types::I64)
102
- @prot.skip(Types::DOUBLE)
103
- @prot.skip(Types::STRING)
104
- @prot.skip(Types::STOP) # should do absolutely nothing
154
+ @prot.skip(Thrift::Types::BOOL)
155
+ @prot.skip(Thrift::Types::BYTE)
156
+ @prot.skip(Thrift::Types::I16)
157
+ @prot.skip(Thrift::Types::I32)
158
+ @prot.skip(Thrift::Types::I64)
159
+ @prot.skip(Thrift::Types::DOUBLE)
160
+ @prot.skip(Thrift::Types::STRING)
161
+ @prot.skip(Thrift::Types::STOP) # should do absolutely nothing
105
162
  end
106
163
 
107
164
  it "should skip structs" do
108
165
  real_skip = @prot.method(:skip)
109
166
  @prot.should_receive(:read_struct_begin).ordered
110
167
  @prot.should_receive(:read_field_begin).exactly(4).times.and_return(
111
- ['field 1', Types::STRING, 1],
112
- ['field 2', Types::I32, 2],
113
- ['field 3', Types::MAP, 3],
114
- [nil, Types::STOP, 0]
168
+ ['field 1', Thrift::Types::STRING, 1],
169
+ ['field 2', Thrift::Types::I32, 2],
170
+ ['field 3', Thrift::Types::MAP, 3],
171
+ [nil, Thrift::Types::STOP, 0]
115
172
  )
116
173
  @prot.should_receive(:read_field_end).exactly(3).times
117
174
  @prot.should_receive(:read_string).exactly(3).times
118
175
  @prot.should_receive(:read_i32).ordered
119
- @prot.should_receive(:read_map_begin).ordered.and_return([Types::STRING, Types::STRING, 1])
176
+ @prot.should_receive(:read_map_begin).ordered.and_return([Thrift::Types::STRING, Thrift::Types::STRING, 1])
120
177
  # @prot.should_receive(:read_string).exactly(2).times
121
178
  @prot.should_receive(:read_map_end).ordered
122
179
  @prot.should_receive(:read_struct_end).ordered
123
- real_skip.call(Types::STRUCT)
180
+ real_skip.call(Thrift::Types::STRUCT)
124
181
  end
125
182
 
126
183
  it "should skip maps" do
127
184
  real_skip = @prot.method(:skip)
128
- @prot.should_receive(:read_map_begin).ordered.and_return([Types::STRING, Types::STRUCT, 1])
185
+ @prot.should_receive(:read_map_begin).ordered.and_return([Thrift::Types::STRING, Thrift::Types::STRUCT, 1])
129
186
  @prot.should_receive(:read_string).ordered
130
187
  @prot.should_receive(:read_struct_begin).ordered.and_return(["some_struct"])
131
- @prot.should_receive(:read_field_begin).ordered.and_return([nil, Types::STOP, nil]);
188
+ @prot.should_receive(:read_field_begin).ordered.and_return([nil, Thrift::Types::STOP, nil]);
132
189
  @prot.should_receive(:read_struct_end).ordered
133
190
  @prot.should_receive(:read_map_end).ordered
134
- real_skip.call(Types::MAP)
191
+ real_skip.call(Thrift::Types::MAP)
135
192
  end
136
193
 
137
194
  it "should skip sets" do
138
195
  real_skip = @prot.method(:skip)
139
- @prot.should_receive(:read_set_begin).ordered.and_return([Types::I64, 9])
196
+ @prot.should_receive(:read_set_begin).ordered.and_return([Thrift::Types::I64, 9])
140
197
  @prot.should_receive(:read_i64).ordered.exactly(9).times
141
198
  @prot.should_receive(:read_set_end)
142
- real_skip.call(Types::SET)
199
+ real_skip.call(Thrift::Types::SET)
143
200
  end
144
201
 
145
202
  it "should skip lists" do
146
203
  real_skip = @prot.method(:skip)
147
- @prot.should_receive(:read_list_begin).ordered.and_return([Types::DOUBLE, 11])
204
+ @prot.should_receive(:read_list_begin).ordered.and_return([Thrift::Types::DOUBLE, 11])
148
205
  @prot.should_receive(:read_double).ordered.exactly(11).times
149
206
  @prot.should_receive(:read_list_end)
150
- real_skip.call(Types::LIST)
207
+ real_skip.call(Thrift::Types::LIST)
151
208
  end
152
209
  end
153
210
 
154
- describe BaseProtocolFactory do
211
+ describe Thrift::BaseProtocolFactory do
155
212
  it "should raise NotImplementedError" do
156
213
  # returning nil since Protocol is just an abstract class
157
- lambda {BaseProtocolFactory.new.get_protocol(mock("MockTransport"))}.should raise_error(NotImplementedError)
214
+ lambda {Thrift::BaseProtocolFactory.new.get_protocol(mock("MockTransport"))}.should raise_error(NotImplementedError)
158
215
  end
159
216
  end
160
217
  end
@@ -17,22 +17,21 @@
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 ThriftBaseTransportSpec < Spec::ExampleGroup
23
- include Thrift
22
+ describe 'BaseTransport' do
24
23
 
25
- describe TransportException do
24
+ describe Thrift::TransportException do
26
25
  it "should make type accessible" do
27
- exc = TransportException.new(TransportException::ALREADY_OPEN, "msg")
28
- exc.type.should == TransportException::ALREADY_OPEN
26
+ exc = Thrift::TransportException.new(Thrift::TransportException::ALREADY_OPEN, "msg")
27
+ exc.type.should == Thrift::TransportException::ALREADY_OPEN
29
28
  exc.message.should == "msg"
30
29
  end
31
30
  end
32
31
 
33
- describe BaseTransport do
32
+ describe Thrift::BaseTransport do
34
33
  it "should read the specified size" do
35
- transport = BaseTransport.new
34
+ transport = Thrift::BaseTransport.new
36
35
  transport.should_receive(:read).with(40).ordered.and_return("10 letters")
37
36
  transport.should_receive(:read).with(30).ordered.and_return("fifteen letters")
38
37
  transport.should_receive(:read).with(15).ordered.and_return("more characters")
@@ -42,47 +41,47 @@ class ThriftBaseTransportSpec < Spec::ExampleGroup
42
41
  it "should stub out the rest of the methods" do
43
42
  # can't test for stubbiness, so just make sure they're defined
44
43
  [:open?, :open, :close, :read, :write, :flush].each do |sym|
45
- BaseTransport.method_defined?(sym).should be_true
44
+ Thrift::BaseTransport.method_defined?(sym).should be_true
46
45
  end
47
46
  end
48
47
 
49
48
  it "should alias << to write" do
50
- BaseTransport.instance_method(:<<).should == BaseTransport.instance_method(:write)
49
+ Thrift::BaseTransport.instance_method(:<<).should == Thrift::BaseTransport.instance_method(:write)
51
50
  end
52
51
  end
53
52
 
54
- describe BaseServerTransport do
53
+ describe Thrift::BaseServerTransport do
55
54
  it "should stub out its methods" do
56
55
  [:listen, :accept, :close].each do |sym|
57
- BaseServerTransport.method_defined?(sym).should be_true
56
+ Thrift::BaseServerTransport.method_defined?(sym).should be_true
58
57
  end
59
58
  end
60
59
  end
61
60
 
62
- describe BaseTransportFactory do
61
+ describe Thrift::BaseTransportFactory do
63
62
  it "should return the transport it's given" do
64
63
  transport = mock("Transport")
65
- BaseTransportFactory.new.get_transport(transport).should eql(transport)
64
+ Thrift::BaseTransportFactory.new.get_transport(transport).should eql(transport)
66
65
  end
67
66
  end
68
67
 
69
- describe BufferedTransport do
68
+ describe Thrift::BufferedTransport do
70
69
  it "should pass through everything but write/flush/read" do
71
70
  trans = mock("Transport")
72
71
  trans.should_receive(:open?).ordered.and_return("+ open?")
73
72
  trans.should_receive(:open).ordered.and_return("+ open")
74
73
  trans.should_receive(:flush).ordered # from the close
75
74
  trans.should_receive(:close).ordered.and_return("+ close")
76
- btrans = BufferedTransport.new(trans)
75
+ btrans = Thrift::BufferedTransport.new(trans)
77
76
  btrans.open?.should == "+ open?"
78
77
  btrans.open.should == "+ open"
79
78
  btrans.close.should == "+ close"
80
79
  end
81
-
82
- it "should buffer reads in chunks of #{BufferedTransport::DEFAULT_BUFFER}" do
80
+
81
+ it "should buffer reads in chunks of #{Thrift::BufferedTransport::DEFAULT_BUFFER}" do
83
82
  trans = mock("Transport")
84
- trans.should_receive(:read).with(BufferedTransport::DEFAULT_BUFFER).and_return("lorum ipsum dolor emet")
85
- btrans = BufferedTransport.new(trans)
83
+ trans.should_receive(:read).with(Thrift::BufferedTransport::DEFAULT_BUFFER).and_return("lorum ipsum dolor emet")
84
+ btrans = Thrift::BufferedTransport.new(trans)
86
85
  btrans.read(6).should == "lorum "
87
86
  btrans.read(6).should == "ipsum "
88
87
  btrans.read(6).should == "dolor "
@@ -91,7 +90,7 @@ class ThriftBaseTransportSpec < Spec::ExampleGroup
91
90
 
92
91
  it "should buffer writes and send them on flush" do
93
92
  trans = mock("Transport")
94
- btrans = BufferedTransport.new(trans)
93
+ btrans = Thrift::BufferedTransport.new(trans)
95
94
  btrans.write("one/")
96
95
  btrans.write("two/")
97
96
  btrans.write("three/")
@@ -102,7 +101,7 @@ class ThriftBaseTransportSpec < Spec::ExampleGroup
102
101
 
103
102
  it "should only send buffered data once" do
104
103
  trans = mock("Transport")
105
- btrans = BufferedTransport.new(trans)
104
+ btrans = Thrift::BufferedTransport.new(trans)
106
105
  btrans.write("one/")
107
106
  btrans.write("two/")
108
107
  btrans.write("three/")
@@ -112,39 +111,39 @@ class ThriftBaseTransportSpec < Spec::ExampleGroup
112
111
  # Nothing to flush with no data
113
112
  btrans.flush
114
113
  end
115
-
114
+
116
115
  it "should flush on close" do
117
116
  trans = mock("Transport")
118
117
  trans.should_receive(:close)
119
- btrans = BufferedTransport.new(trans)
118
+ btrans = Thrift::BufferedTransport.new(trans)
120
119
  btrans.should_receive(:flush)
121
120
  btrans.close
122
121
  end
123
-
122
+
124
123
  it "should not write to socket if there's no data" do
125
124
  trans = mock("Transport")
126
125
  trans.should_receive(:flush)
127
- btrans = BufferedTransport.new(trans)
126
+ btrans = Thrift::BufferedTransport.new(trans)
128
127
  btrans.flush
129
128
  end
130
129
  end
131
130
 
132
- describe BufferedTransportFactory do
131
+ describe Thrift::BufferedTransportFactory do
133
132
  it "should wrap the given transport in a BufferedTransport" do
134
133
  trans = mock("Transport")
135
134
  btrans = mock("BufferedTransport")
136
- BufferedTransport.should_receive(:new).with(trans).and_return(btrans)
137
- BufferedTransportFactory.new.get_transport(trans).should == btrans
135
+ Thrift::BufferedTransport.should_receive(:new).with(trans).and_return(btrans)
136
+ Thrift::BufferedTransportFactory.new.get_transport(trans).should == btrans
138
137
  end
139
138
  end
140
139
 
141
- describe FramedTransport do
140
+ describe Thrift::FramedTransport do
142
141
  before(:each) do
143
142
  @trans = mock("Transport")
144
143
  end
145
144
 
146
145
  it "should pass through open?/open/close" do
147
- ftrans = FramedTransport.new(@trans)
146
+ ftrans = Thrift::FramedTransport.new(@trans)
148
147
  @trans.should_receive(:open?).ordered.and_return("+ open?")
149
148
  @trans.should_receive(:open).ordered.and_return("+ open")
150
149
  @trans.should_receive(:close).ordered.and_return("+ close")
@@ -154,13 +153,13 @@ class ThriftBaseTransportSpec < Spec::ExampleGroup
154
153
  end
155
154
 
156
155
  it "should pass through read when read is turned off" do
157
- ftrans = FramedTransport.new(@trans, false, true)
156
+ ftrans = Thrift::FramedTransport.new(@trans, false, true)
158
157
  @trans.should_receive(:read).with(17).ordered.and_return("+ read")
159
158
  ftrans.read(17).should == "+ read"
160
159
  end
161
160
 
162
161
  it "should pass through write/flush when write is turned off" do
163
- ftrans = FramedTransport.new(@trans, true, false)
162
+ ftrans = Thrift::FramedTransport.new(@trans, true, false)
164
163
  @trans.should_receive(:write).with("foo").ordered.and_return("+ write")
165
164
  @trans.should_receive(:flush).ordered.and_return("+ flush")
166
165
  ftrans.write("foo").should == "+ write"
@@ -171,21 +170,21 @@ class ThriftBaseTransportSpec < Spec::ExampleGroup
171
170
  frame = "this is a frame"
172
171
  @trans.should_receive(:read_all).with(4).and_return("\000\000\000\017")
173
172
  @trans.should_receive(:read_all).with(frame.length).and_return(frame)
174
- FramedTransport.new(@trans).read(frame.length + 10).should == frame
173
+ Thrift::FramedTransport.new(@trans).read(frame.length + 10).should == frame
175
174
  end
176
175
 
177
176
  it "should return slices of the frame when asked for < the frame's length" do
178
177
  frame = "this is a frame"
179
178
  @trans.should_receive(:read_all).with(4).and_return("\000\000\000\017")
180
179
  @trans.should_receive(:read_all).with(frame.length).and_return(frame)
181
- ftrans = FramedTransport.new(@trans)
180
+ ftrans = Thrift::FramedTransport.new(@trans)
182
181
  ftrans.read(4).should == "this"
183
182
  ftrans.read(4).should == " is "
184
183
  ftrans.read(16).should == "a frame"
185
184
  end
186
185
 
187
186
  it "should return nothing if asked for <= 0" do
188
- FramedTransport.new(@trans).read(-2).should == ""
187
+ Thrift::FramedTransport.new(@trans).read(-2).should == ""
189
188
  end
190
189
 
191
190
  it "should pull a new frame when the first is exhausted" do
@@ -194,7 +193,7 @@ class ThriftBaseTransportSpec < Spec::ExampleGroup
194
193
  @trans.should_receive(:read_all).with(4).and_return("\000\000\000\017", "\000\000\000\021")
195
194
  @trans.should_receive(:read_all).with(frame.length).and_return(frame)
196
195
  @trans.should_receive(:read_all).with(frame2.length).and_return(frame2)
197
- ftrans = FramedTransport.new(@trans)
196
+ ftrans = Thrift::FramedTransport.new(@trans)
198
197
  ftrans.read(4).should == "this"
199
198
  ftrans.read(8).should == " is a fr"
200
199
  ftrans.read(6).should == "ame"
@@ -203,7 +202,7 @@ class ThriftBaseTransportSpec < Spec::ExampleGroup
203
202
  end
204
203
 
205
204
  it "should buffer writes" do
206
- ftrans = FramedTransport.new(@trans)
205
+ ftrans = Thrift::FramedTransport.new(@trans)
207
206
  @trans.should_not_receive(:write)
208
207
  ftrans.write("foo")
209
208
  ftrans.write("bar")
@@ -211,7 +210,7 @@ class ThriftBaseTransportSpec < Spec::ExampleGroup
211
210
  end
212
211
 
213
212
  it "should write slices of the buffer" do
214
- ftrans = FramedTransport.new(@trans)
213
+ ftrans = Thrift::FramedTransport.new(@trans)
215
214
  ftrans.write("foobar", 3)
216
215
  ftrans.write("barfoo", 1)
217
216
  @trans.stub!(:flush)
@@ -220,7 +219,7 @@ class ThriftBaseTransportSpec < Spec::ExampleGroup
220
219
  end
221
220
 
222
221
  it "should flush frames with a 4-byte header" do
223
- ftrans = FramedTransport.new(@trans)
222
+ ftrans = Thrift::FramedTransport.new(@trans)
224
223
  @trans.should_receive(:write).with("\000\000\000\035one/two/three/this is a frame").ordered
225
224
  @trans.should_receive(:flush).ordered
226
225
  ftrans.write("one/")
@@ -231,7 +230,7 @@ class ThriftBaseTransportSpec < Spec::ExampleGroup
231
230
  end
232
231
 
233
232
  it "should not flush the same buffered data twice" do
234
- ftrans = FramedTransport.new(@trans)
233
+ ftrans = Thrift::FramedTransport.new(@trans)
235
234
  @trans.should_receive(:write).with("\000\000\000\007foo/bar")
236
235
  @trans.stub!(:flush)
237
236
  ftrans.write("foo")
@@ -242,22 +241,22 @@ class ThriftBaseTransportSpec < Spec::ExampleGroup
242
241
  end
243
242
  end
244
243
 
245
- describe FramedTransportFactory do
244
+ describe Thrift::FramedTransportFactory do
246
245
  it "should wrap the given transport in a FramedTransport" do
247
246
  trans = mock("Transport")
248
- FramedTransport.should_receive(:new).with(trans)
249
- FramedTransportFactory.new.get_transport(trans)
247
+ Thrift::FramedTransport.should_receive(:new).with(trans)
248
+ Thrift::FramedTransportFactory.new.get_transport(trans)
250
249
  end
251
250
  end
252
251
 
253
- describe MemoryBufferTransport do
252
+ describe Thrift::MemoryBufferTransport do
254
253
  before(:each) do
255
- @buffer = MemoryBufferTransport.new
254
+ @buffer = Thrift::MemoryBufferTransport.new
256
255
  end
257
256
 
258
257
  it "should accept a buffer on input and use it directly" do
259
258
  s = "this is a test"
260
- @buffer = MemoryBufferTransport.new(s)
259
+ @buffer = Thrift::MemoryBufferTransport.new(s)
261
260
  @buffer.read(4).should == "this"
262
261
  s.slice!(-4..-1)
263
262
  @buffer.read(@buffer.available).should == " is a "
@@ -307,7 +306,7 @@ class ThriftBaseTransportSpec < Spec::ExampleGroup
307
306
  @buffer.write " bar"
308
307
  @buffer.read(@buffer.available).should == "foo bar"
309
308
  end
310
-
309
+
311
310
  it "should throw an EOFError when there isn't enough data in the buffer" do
312
311
  @buffer.reset_buffer("")
313
312
  lambda{@buffer.read(1)}.should raise_error(EOFError)
@@ -317,11 +316,11 @@ class ThriftBaseTransportSpec < Spec::ExampleGroup
317
316
  end
318
317
  end
319
318
 
320
- describe IOStreamTransport do
319
+ describe Thrift::IOStreamTransport do
321
320
  before(:each) do
322
321
  @input = mock("Input", :closed? => false)
323
322
  @output = mock("Output", :closed? => false)
324
- @trans = IOStreamTransport.new(@input, @output)
323
+ @trans = Thrift::IOStreamTransport.new(@input, @output)
325
324
  end
326
325
 
327
326
  it "should be open as long as both input or output are open" do