thrift 0.10.0.0 → 0.14.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/lib/thrift/processor.rb +10 -1
- data/lib/thrift/protocol/base_protocol.rb +11 -3
- data/lib/thrift/protocol/binary_protocol.rb +8 -1
- data/lib/thrift/protocol/binary_protocol_accelerated.rb +8 -0
- data/lib/thrift/protocol/compact_protocol.rb +8 -0
- data/lib/thrift/protocol/json_protocol.rb +9 -1
- data/lib/thrift/protocol/multiplexed_protocol.rb +5 -1
- data/lib/thrift/server/base_server.rb +8 -2
- data/lib/thrift/server/simple_server.rb +5 -1
- data/lib/thrift/server/thread_pool_server.rb +5 -1
- data/lib/thrift/server/threaded_server.rb +5 -1
- data/lib/thrift/transport/base_server_transport.rb +1 -1
- data/lib/thrift/transport/base_transport.rb +8 -0
- data/lib/thrift/transport/buffered_transport.rb +9 -1
- data/lib/thrift/transport/framed_transport.rb +9 -1
- data/lib/thrift/transport/http_client_transport.rb +6 -0
- data/lib/thrift/transport/io_stream_transport.rb +4 -1
- data/lib/thrift/transport/memory_buffer_transport.rb +4 -0
- data/lib/thrift/transport/server_socket.rb +6 -1
- data/lib/thrift/transport/socket.rb +4 -2
- data/lib/thrift/transport/ssl_server_socket.rb +4 -0
- data/lib/thrift/transport/ssl_socket.rb +4 -0
- data/lib/thrift/transport/unix_server_socket.rb +5 -1
- data/lib/thrift/transport/unix_socket.rb +5 -1
- data/spec/base_protocol_spec.rb +79 -71
- data/spec/base_transport_spec.rb +155 -117
- data/spec/binary_protocol_accelerated_spec.rb +6 -2
- data/spec/binary_protocol_spec.rb +16 -8
- data/spec/binary_protocol_spec_shared.rb +73 -70
- data/spec/bytes_spec.rb +38 -38
- data/spec/client_spec.rb +41 -42
- data/spec/compact_protocol_spec.rb +23 -8
- data/spec/exception_spec.rb +54 -54
- data/spec/flat_spec.rb +5 -5
- data/spec/http_client_spec.rb +64 -38
- data/spec/json_protocol_spec.rb +146 -138
- data/spec/namespaced_spec.rb +5 -5
- data/spec/nonblocking_server_spec.rb +16 -16
- data/spec/processor_spec.rb +26 -26
- data/spec/serializer_spec.rb +20 -20
- data/spec/server_socket_spec.rb +27 -22
- data/spec/server_spec.rb +91 -51
- data/spec/socket_spec.rb +23 -16
- data/spec/socket_spec_shared.rb +31 -31
- data/spec/ssl_server_socket_spec.rb +34 -0
- data/spec/ssl_socket_spec.rb +26 -22
- data/spec/struct_nested_containers_spec.rb +24 -24
- data/spec/struct_spec.rb +120 -120
- data/spec/thin_http_server_spec.rb +18 -18
- data/spec/types_spec.rb +56 -53
- data/spec/union_spec.rb +42 -43
- data/spec/unix_socket_spec.rb +43 -34
- metadata +131 -94
data/spec/namespaced_spec.rb
CHANGED
@@ -32,7 +32,7 @@ describe 'namespaced generation' do
|
|
32
32
|
"other_namespace/referenced_constants.rb",
|
33
33
|
"other_namespace/referenced_types.rb"
|
34
34
|
].each do |name|
|
35
|
-
File.exist?(File.join(prefix, name)).
|
35
|
+
expect(File.exist?(File.join(prefix, name))).to be_truthy
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
@@ -44,20 +44,20 @@ describe 'namespaced generation' do
|
|
44
44
|
"referenced_constants.rb",
|
45
45
|
"referenced_types.rb"
|
46
46
|
].each do |name|
|
47
|
-
File.exist?(File.join(prefix, name)).
|
47
|
+
expect(File.exist?(File.join(prefix, name))).not_to be_truthy
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
51
|
it "has a service class in the right place" do
|
52
|
-
defined?(NamespacedSpecNamespace::NamespacedNonblockingService).
|
52
|
+
expect(defined?(NamespacedSpecNamespace::NamespacedNonblockingService)).to be_truthy
|
53
53
|
end
|
54
54
|
|
55
55
|
it "has a struct in the right place" do
|
56
|
-
defined?(NamespacedSpecNamespace::Hello).
|
56
|
+
expect(defined?(NamespacedSpecNamespace::Hello)).to be_truthy
|
57
57
|
end
|
58
58
|
|
59
59
|
it "required an included file" do
|
60
|
-
defined?(OtherNamespace::SomeEnum).
|
60
|
+
expect(defined?(OtherNamespace::SomeEnum)).to be_truthy
|
61
61
|
end
|
62
62
|
|
63
63
|
it "extended a service" do
|
@@ -176,8 +176,8 @@ describe 'NonblockingServer' do
|
|
176
176
|
|
177
177
|
it "should handle basic message passing" do
|
178
178
|
client = setup_client
|
179
|
-
client.greeting(true).
|
180
|
-
client.greeting(false).
|
179
|
+
expect(client.greeting(true)).to eq(SpecNamespace::Hello.new)
|
180
|
+
expect(client.greeting(false)).to eq(SpecNamespace::Hello.new(:greeting => 'Aloha!'))
|
181
181
|
@server.shutdown
|
182
182
|
end
|
183
183
|
|
@@ -195,7 +195,7 @@ describe 'NonblockingServer' do
|
|
195
195
|
end
|
196
196
|
4.times { trans_queue.pop }
|
197
197
|
setup_client.unblock(4)
|
198
|
-
4.times { queue.pop.
|
198
|
+
4.times { expect(queue.pop).to be_truthy }
|
199
199
|
@server.shutdown
|
200
200
|
end
|
201
201
|
|
@@ -212,15 +212,15 @@ describe 'NonblockingServer' do
|
|
212
212
|
queues[4] << :hello
|
213
213
|
queues[5] << :hello
|
214
214
|
queues[6] << :hello
|
215
|
-
3.times { result.pop.
|
216
|
-
client.greeting(true).
|
215
|
+
3.times { expect(result.pop).to eq(SpecNamespace::Hello.new) }
|
216
|
+
expect(client.greeting(true)).to eq(SpecNamespace::Hello.new)
|
217
217
|
queues[5] << [:unblock, 4]
|
218
|
-
4.times { result.pop.
|
218
|
+
4.times { expect(result.pop).to be_truthy }
|
219
219
|
queues[2] << :hello
|
220
|
-
result.pop.
|
221
|
-
client.greeting(false).
|
220
|
+
expect(result.pop).to eq(SpecNamespace::Hello.new)
|
221
|
+
expect(client.greeting(false)).to eq(SpecNamespace::Hello.new(:greeting => 'Aloha!'))
|
222
222
|
7.times { queues.shift << :exit }
|
223
|
-
client.greeting(true).
|
223
|
+
expect(client.greeting(true)).to eq(SpecNamespace::Hello.new)
|
224
224
|
@server.shutdown
|
225
225
|
end
|
226
226
|
|
@@ -229,7 +229,7 @@ describe 'NonblockingServer' do
|
|
229
229
|
client = setup_client
|
230
230
|
client.greeting(false) # force a message pass
|
231
231
|
@server.shutdown
|
232
|
-
@server_thread.join(2).
|
232
|
+
expect(@server_thread.join(2)).to be_an_instance_of(Thread)
|
233
233
|
end
|
234
234
|
|
235
235
|
it "should continue processing active messages when shutting down" do
|
@@ -238,8 +238,8 @@ describe 'NonblockingServer' do
|
|
238
238
|
client << :sleep
|
239
239
|
sleep 0.1 # give the server time to start processing the client's message
|
240
240
|
@server.shutdown
|
241
|
-
@server_thread.join(2).
|
242
|
-
result.pop.
|
241
|
+
expect(@server_thread.join(2)).to be_an_instance_of(Thread)
|
242
|
+
expect(result.pop).to eq(:slept)
|
243
243
|
end
|
244
244
|
|
245
245
|
it "should kill active messages when they don't expire while shutting down" do
|
@@ -249,15 +249,15 @@ describe 'NonblockingServer' do
|
|
249
249
|
sleep 0.1 # start processing the client's message
|
250
250
|
@server.shutdown(1)
|
251
251
|
@catch_exceptions = true
|
252
|
-
@server_thread.join(3).
|
253
|
-
result.
|
252
|
+
expect(@server_thread.join(3)).not_to be_nil
|
253
|
+
expect(result).to be_empty
|
254
254
|
end
|
255
255
|
|
256
256
|
it "should allow shutting down in response to a message" do
|
257
257
|
client = setup_client
|
258
|
-
client.greeting(true).
|
258
|
+
expect(client.greeting(true)).to eq(SpecNamespace::Hello.new)
|
259
259
|
client.shutdown
|
260
|
-
@server_thread.join(2).
|
260
|
+
expect(@server_thread.join(2)).not_to be_nil
|
261
261
|
end
|
262
262
|
end
|
263
263
|
end
|
data/spec/processor_spec.rb
CHANGED
@@ -27,52 +27,52 @@ describe 'Processor' do
|
|
27
27
|
|
28
28
|
describe Thrift::Processor do
|
29
29
|
before(:each) do
|
30
|
-
@processor = ProcessorSpec.new(
|
31
|
-
@prot =
|
30
|
+
@processor = ProcessorSpec.new(double("MockHandler"))
|
31
|
+
@prot = double("MockProtocol")
|
32
32
|
end
|
33
33
|
|
34
34
|
def mock_trans(obj)
|
35
|
-
obj.
|
36
|
-
|
37
|
-
trans.
|
35
|
+
expect(obj).to receive(:trans).ordered do
|
36
|
+
double("trans").tap do |trans|
|
37
|
+
expect(trans).to receive(:flush).ordered
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
42
|
it "should call process_<message> when it receives that message" do
|
43
|
-
@prot.
|
44
|
-
@processor.
|
45
|
-
@processor.process(@prot, @prot).
|
43
|
+
expect(@prot).to receive(:read_message_begin).ordered.and_return ['testMessage', Thrift::MessageTypes::CALL, 17]
|
44
|
+
expect(@processor).to receive(:process_testMessage).with(17, @prot, @prot).ordered
|
45
|
+
expect(@processor.process(@prot, @prot)).to eq(true)
|
46
46
|
end
|
47
47
|
|
48
48
|
it "should raise an ApplicationException when the received message cannot be processed" do
|
49
|
-
@prot.
|
50
|
-
@prot.
|
51
|
-
@prot.
|
52
|
-
@prot.
|
53
|
-
e =
|
54
|
-
e.
|
55
|
-
Thrift::ApplicationException.
|
56
|
-
@prot.
|
49
|
+
expect(@prot).to receive(:read_message_begin).ordered.and_return ['testMessage', Thrift::MessageTypes::CALL, 4]
|
50
|
+
expect(@prot).to receive(:skip).with(Thrift::Types::STRUCT).ordered
|
51
|
+
expect(@prot).to receive(:read_message_end).ordered
|
52
|
+
expect(@prot).to receive(:write_message_begin).with('testMessage', Thrift::MessageTypes::EXCEPTION, 4).ordered
|
53
|
+
e = double(Thrift::ApplicationException)
|
54
|
+
expect(e).to receive(:write).with(@prot).ordered
|
55
|
+
expect(Thrift::ApplicationException).to receive(:new).with(Thrift::ApplicationException::UNKNOWN_METHOD, "Unknown function testMessage").and_return(e)
|
56
|
+
expect(@prot).to receive(:write_message_end).ordered
|
57
57
|
mock_trans(@prot)
|
58
58
|
@processor.process(@prot, @prot)
|
59
59
|
end
|
60
60
|
|
61
61
|
it "should pass args off to the args class" do
|
62
|
-
args_class =
|
63
|
-
args =
|
64
|
-
args.
|
62
|
+
args_class = double("MockArgsClass")
|
63
|
+
args = double("#<MockArgsClass:mock>").tap do |args|
|
64
|
+
expect(args).to receive(:read).with(@prot).ordered
|
65
65
|
end
|
66
|
-
args_class.
|
67
|
-
@prot.
|
68
|
-
@processor.read_args(@prot, args_class).
|
66
|
+
expect(args_class).to receive(:new).and_return args
|
67
|
+
expect(@prot).to receive(:read_message_end).ordered
|
68
|
+
expect(@processor.read_args(@prot, args_class)).to eql(args)
|
69
69
|
end
|
70
70
|
|
71
71
|
it "should write out a reply when asked" do
|
72
|
-
@prot.
|
73
|
-
result =
|
74
|
-
result.
|
75
|
-
@prot.
|
72
|
+
expect(@prot).to receive(:write_message_begin).with('testMessage', Thrift::MessageTypes::REPLY, 23).ordered
|
73
|
+
result = double("MockResult")
|
74
|
+
expect(result).to receive(:write).with(@prot).ordered
|
75
|
+
expect(@prot).to receive(:write_message_end).ordered
|
76
76
|
mock_trans(@prot)
|
77
77
|
@processor.write_result(result, @prot, 'testMessage', 23)
|
78
78
|
end
|
data/spec/serializer_spec.rb
CHANGED
@@ -25,19 +25,19 @@ describe 'Serializer' do
|
|
25
25
|
it "should serialize structs to binary by default" do
|
26
26
|
serializer = Thrift::Serializer.new(Thrift::BinaryProtocolAcceleratedFactory.new)
|
27
27
|
data = serializer.serialize(SpecNamespace::Hello.new(:greeting => "'Ello guv'nor!"))
|
28
|
-
data.
|
28
|
+
expect(data).to eq("\x0B\x00\x01\x00\x00\x00\x0E'Ello guv'nor!\x00")
|
29
29
|
end
|
30
30
|
|
31
31
|
it "should serialize structs to the given protocol" do
|
32
|
-
protocol = Thrift::BaseProtocol.new(
|
33
|
-
protocol.
|
34
|
-
protocol.
|
35
|
-
protocol.
|
36
|
-
protocol.
|
37
|
-
protocol.
|
38
|
-
protocol.
|
39
|
-
protocol_factory =
|
40
|
-
protocol_factory.
|
32
|
+
protocol = Thrift::BaseProtocol.new(double("transport"))
|
33
|
+
expect(protocol).to receive(:write_struct_begin).with("SpecNamespace::Hello")
|
34
|
+
expect(protocol).to receive(:write_field_begin).with("greeting", Thrift::Types::STRING, 1)
|
35
|
+
expect(protocol).to receive(:write_string).with("Good day")
|
36
|
+
expect(protocol).to receive(:write_field_end)
|
37
|
+
expect(protocol).to receive(:write_field_stop)
|
38
|
+
expect(protocol).to receive(:write_struct_end)
|
39
|
+
protocol_factory = double("ProtocolFactory")
|
40
|
+
allow(protocol_factory).to receive(:get_protocol).and_return(protocol)
|
41
41
|
serializer = Thrift::Serializer.new(protocol_factory)
|
42
42
|
serializer.serialize(SpecNamespace::Hello.new(:greeting => "Good day"))
|
43
43
|
end
|
@@ -47,21 +47,21 @@ describe 'Serializer' do
|
|
47
47
|
it "should deserialize structs from binary by default" do
|
48
48
|
deserializer = Thrift::Deserializer.new
|
49
49
|
data = "\x0B\x00\x01\x00\x00\x00\x0E'Ello guv'nor!\x00"
|
50
|
-
deserializer.deserialize(SpecNamespace::Hello.new, data).
|
50
|
+
expect(deserializer.deserialize(SpecNamespace::Hello.new, data)).to eq(SpecNamespace::Hello.new(:greeting => "'Ello guv'nor!"))
|
51
51
|
end
|
52
52
|
|
53
53
|
it "should deserialize structs from the given protocol" do
|
54
|
-
protocol = Thrift::BaseProtocol.new(
|
55
|
-
protocol.
|
56
|
-
protocol.
|
54
|
+
protocol = Thrift::BaseProtocol.new(double("transport"))
|
55
|
+
expect(protocol).to receive(:read_struct_begin).and_return("SpecNamespace::Hello")
|
56
|
+
expect(protocol).to receive(:read_field_begin).and_return(["greeting", Thrift::Types::STRING, 1],
|
57
57
|
[nil, Thrift::Types::STOP, 0])
|
58
|
-
protocol.
|
59
|
-
protocol.
|
60
|
-
protocol.
|
61
|
-
protocol_factory =
|
62
|
-
protocol_factory.
|
58
|
+
expect(protocol).to receive(:read_string).and_return("Good day")
|
59
|
+
expect(protocol).to receive(:read_field_end)
|
60
|
+
expect(protocol).to receive(:read_struct_end)
|
61
|
+
protocol_factory = double("ProtocolFactory")
|
62
|
+
allow(protocol_factory).to receive(:get_protocol).and_return(protocol)
|
63
63
|
deserializer = Thrift::Deserializer.new(protocol_factory)
|
64
|
-
deserializer.deserialize(SpecNamespace::Hello.new, "").
|
64
|
+
expect(deserializer.deserialize(SpecNamespace::Hello.new, "")).to eq(SpecNamespace::Hello.new(:greeting => "Good day"))
|
65
65
|
end
|
66
66
|
end
|
67
67
|
end
|
data/spec/server_socket_spec.rb
CHANGED
@@ -28,52 +28,57 @@ describe 'Thrift::ServerSocket' do
|
|
28
28
|
end
|
29
29
|
|
30
30
|
it "should create a handle when calling listen" do
|
31
|
-
TCPServer.
|
31
|
+
expect(TCPServer).to receive(:new).with(nil, 1234)
|
32
32
|
@socket.listen
|
33
33
|
end
|
34
34
|
|
35
35
|
it "should accept an optional host argument" do
|
36
36
|
@socket = Thrift::ServerSocket.new('localhost', 1234)
|
37
|
-
TCPServer.
|
37
|
+
expect(TCPServer).to receive(:new).with('localhost', 1234)
|
38
|
+
@socket.to_s == "server(localhost:1234)"
|
38
39
|
@socket.listen
|
39
40
|
end
|
40
41
|
|
41
42
|
it "should create a Thrift::Socket to wrap accepted sockets" do
|
42
|
-
handle =
|
43
|
-
TCPServer.
|
43
|
+
handle = double("TCPServer")
|
44
|
+
expect(TCPServer).to receive(:new).with(nil, 1234).and_return(handle)
|
44
45
|
@socket.listen
|
45
|
-
sock =
|
46
|
-
handle.
|
47
|
-
trans =
|
48
|
-
Thrift::Socket.
|
49
|
-
trans.
|
50
|
-
@socket.accept.
|
46
|
+
sock = double("sock")
|
47
|
+
expect(handle).to receive(:accept).and_return(sock)
|
48
|
+
trans = double("Socket")
|
49
|
+
expect(Thrift::Socket).to receive(:new).and_return(trans)
|
50
|
+
expect(trans).to receive(:handle=).with(sock)
|
51
|
+
expect(@socket.accept).to eq(trans)
|
51
52
|
end
|
52
53
|
|
53
54
|
it "should close the handle when closed" do
|
54
|
-
handle =
|
55
|
-
TCPServer.
|
55
|
+
handle = double("TCPServer", :closed? => false)
|
56
|
+
expect(TCPServer).to receive(:new).with(nil, 1234).and_return(handle)
|
56
57
|
@socket.listen
|
57
|
-
handle.
|
58
|
+
expect(handle).to receive(:close)
|
58
59
|
@socket.close
|
59
60
|
end
|
60
61
|
|
61
62
|
it "should return nil when accepting if there is no handle" do
|
62
|
-
@socket.accept.
|
63
|
+
expect(@socket.accept).to be_nil
|
63
64
|
end
|
64
65
|
|
65
66
|
it "should return true for closed? when appropriate" do
|
66
|
-
handle =
|
67
|
-
TCPServer.
|
67
|
+
handle = double("TCPServer", :closed? => false)
|
68
|
+
allow(TCPServer).to receive(:new).and_return(handle)
|
68
69
|
@socket.listen
|
69
|
-
@socket.
|
70
|
-
handle.
|
70
|
+
expect(@socket).not_to be_closed
|
71
|
+
allow(handle).to receive(:close)
|
71
72
|
@socket.close
|
72
|
-
@socket.
|
73
|
+
expect(@socket).to be_closed
|
73
74
|
@socket.listen
|
74
|
-
@socket.
|
75
|
-
handle.
|
76
|
-
@socket.
|
75
|
+
expect(@socket).not_to be_closed
|
76
|
+
allow(handle).to receive(:closed?).and_return(true)
|
77
|
+
expect(@socket).to be_closed
|
78
|
+
end
|
79
|
+
|
80
|
+
it "should provide a reasonable to_s" do
|
81
|
+
expect(@socket.to_s).to eq("socket(:1234)")
|
77
82
|
end
|
78
83
|
end
|
79
84
|
end
|
data/spec/server_spec.rb
CHANGED
@@ -21,95 +21,135 @@ require 'spec_helper'
|
|
21
21
|
describe 'Server' do
|
22
22
|
|
23
23
|
describe Thrift::BaseServer do
|
24
|
+
before(:each) do
|
25
|
+
@processor = double("Processor")
|
26
|
+
@serverTrans = double("ServerTransport")
|
27
|
+
@trans = double("BaseTransport")
|
28
|
+
@prot = double("BaseProtocol")
|
29
|
+
@server = described_class.new(@processor, @serverTrans, @trans, @prot)
|
30
|
+
end
|
31
|
+
|
24
32
|
it "should default to BaseTransportFactory and BinaryProtocolFactory when not specified" do
|
25
|
-
server = Thrift::BaseServer.new(
|
26
|
-
server.instance_variable_get(:'@transport_factory').
|
27
|
-
server.instance_variable_get(:'@protocol_factory').
|
33
|
+
@server = Thrift::BaseServer.new(double("Processor"), double("BaseServerTransport"))
|
34
|
+
expect(@server.instance_variable_get(:'@transport_factory')).to be_an_instance_of(Thrift::BaseTransportFactory)
|
35
|
+
expect(@server.instance_variable_get(:'@protocol_factory')).to be_an_instance_of(Thrift::BinaryProtocolFactory)
|
28
36
|
end
|
29
37
|
|
30
|
-
|
38
|
+
it "should not serve" do
|
39
|
+
expect { @server.serve()}.to raise_error(NotImplementedError)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should provide a reasonable to_s" do
|
43
|
+
expect(@serverTrans).to receive(:to_s).once.and_return("serverTrans")
|
44
|
+
expect(@trans).to receive(:to_s).once.and_return("trans")
|
45
|
+
expect(@prot).to receive(:to_s).once.and_return("prot")
|
46
|
+
expect(@server.to_s).to eq("server(prot(trans(serverTrans)))")
|
47
|
+
end
|
31
48
|
end
|
32
49
|
|
33
50
|
describe Thrift::SimpleServer do
|
34
51
|
before(:each) do
|
35
|
-
@processor =
|
36
|
-
@serverTrans =
|
37
|
-
@trans =
|
38
|
-
@prot =
|
39
|
-
@client =
|
52
|
+
@processor = double("Processor")
|
53
|
+
@serverTrans = double("ServerTransport")
|
54
|
+
@trans = double("BaseTransport")
|
55
|
+
@prot = double("BaseProtocol")
|
56
|
+
@client = double("Client")
|
40
57
|
@server = described_class.new(@processor, @serverTrans, @trans, @prot)
|
41
58
|
end
|
42
59
|
|
60
|
+
it "should provide a reasonable to_s" do
|
61
|
+
expect(@serverTrans).to receive(:to_s).once.and_return("serverTrans")
|
62
|
+
expect(@trans).to receive(:to_s).once.and_return("trans")
|
63
|
+
expect(@prot).to receive(:to_s).once.and_return("prot")
|
64
|
+
expect(@server.to_s).to eq("simple(server(prot(trans(serverTrans))))")
|
65
|
+
end
|
66
|
+
|
43
67
|
it "should serve in the main thread" do
|
44
|
-
@serverTrans.
|
45
|
-
@serverTrans.
|
46
|
-
@trans.
|
47
|
-
@prot.
|
68
|
+
expect(@serverTrans).to receive(:listen).ordered
|
69
|
+
expect(@serverTrans).to receive(:accept).exactly(3).times.and_return(@client)
|
70
|
+
expect(@trans).to receive(:get_transport).exactly(3).times.with(@client).and_return(@trans)
|
71
|
+
expect(@prot).to receive(:get_protocol).exactly(3).times.with(@trans).and_return(@prot)
|
48
72
|
x = 0
|
49
|
-
@processor.
|
73
|
+
expect(@processor).to receive(:process).exactly(3).times.with(@prot, @prot) do
|
50
74
|
case (x += 1)
|
51
75
|
when 1 then raise Thrift::TransportException
|
52
76
|
when 2 then raise Thrift::ProtocolException
|
53
77
|
when 3 then throw :stop
|
54
78
|
end
|
55
79
|
end
|
56
|
-
@trans.
|
57
|
-
@serverTrans.
|
58
|
-
|
80
|
+
expect(@trans).to receive(:close).exactly(3).times
|
81
|
+
expect(@serverTrans).to receive(:close).ordered
|
82
|
+
expect { @server.serve }.to throw_symbol(:stop)
|
59
83
|
end
|
60
84
|
end
|
61
85
|
|
62
86
|
describe Thrift::ThreadedServer do
|
63
87
|
before(:each) do
|
64
|
-
@processor =
|
65
|
-
@serverTrans =
|
66
|
-
@trans =
|
67
|
-
@prot =
|
68
|
-
@client =
|
88
|
+
@processor = double("Processor")
|
89
|
+
@serverTrans = double("ServerTransport")
|
90
|
+
@trans = double("BaseTransport")
|
91
|
+
@prot = double("BaseProtocol")
|
92
|
+
@client = double("Client")
|
69
93
|
@server = described_class.new(@processor, @serverTrans, @trans, @prot)
|
70
94
|
end
|
71
95
|
|
96
|
+
it "should provide a reasonable to_s" do
|
97
|
+
expect(@serverTrans).to receive(:to_s).once.and_return("serverTrans")
|
98
|
+
expect(@trans).to receive(:to_s).once.and_return("trans")
|
99
|
+
expect(@prot).to receive(:to_s).once.and_return("prot")
|
100
|
+
expect(@server.to_s).to eq("threaded(server(prot(trans(serverTrans))))")
|
101
|
+
end
|
102
|
+
|
72
103
|
it "should serve using threads" do
|
73
|
-
@serverTrans.
|
74
|
-
@serverTrans.
|
75
|
-
@trans.
|
76
|
-
@prot.
|
77
|
-
Thread.
|
104
|
+
expect(@serverTrans).to receive(:listen).ordered
|
105
|
+
expect(@serverTrans).to receive(:accept).exactly(3).times.and_return(@client)
|
106
|
+
expect(@trans).to receive(:get_transport).exactly(3).times.with(@client).and_return(@trans)
|
107
|
+
expect(@prot).to receive(:get_protocol).exactly(3).times.with(@trans).and_return(@prot)
|
108
|
+
expect(Thread).to receive(:new).with(@prot, @trans).exactly(3).times.and_yield(@prot, @trans)
|
78
109
|
x = 0
|
79
|
-
@processor.
|
110
|
+
expect(@processor).to receive(:process).exactly(3).times.with(@prot, @prot) do
|
80
111
|
case (x += 1)
|
81
112
|
when 1 then raise Thrift::TransportException
|
82
113
|
when 2 then raise Thrift::ProtocolException
|
83
114
|
when 3 then throw :stop
|
84
115
|
end
|
85
116
|
end
|
86
|
-
@trans.
|
87
|
-
@serverTrans.
|
88
|
-
|
117
|
+
expect(@trans).to receive(:close).exactly(3).times
|
118
|
+
expect(@serverTrans).to receive(:close).ordered
|
119
|
+
expect { @server.serve }.to throw_symbol(:stop)
|
89
120
|
end
|
90
121
|
end
|
91
122
|
|
92
123
|
describe Thrift::ThreadPoolServer do
|
93
124
|
before(:each) do
|
94
|
-
@processor =
|
95
|
-
@server_trans =
|
96
|
-
@trans =
|
97
|
-
@prot =
|
98
|
-
@client =
|
125
|
+
@processor = double("Processor")
|
126
|
+
@server_trans = double("ServerTransport")
|
127
|
+
@trans = double("BaseTransport")
|
128
|
+
@prot = double("BaseProtocol")
|
129
|
+
@client = double("Client")
|
99
130
|
@server = described_class.new(@processor, @server_trans, @trans, @prot)
|
131
|
+
sleep(0.15)
|
100
132
|
end
|
101
133
|
|
134
|
+
it "should provide a reasonable to_s" do
|
135
|
+
expect(@server_trans).to receive(:to_s).once.and_return("server_trans")
|
136
|
+
expect(@trans).to receive(:to_s).once.and_return("trans")
|
137
|
+
expect(@prot).to receive(:to_s).once.and_return("prot")
|
138
|
+
expect(@server.to_s).to eq("threadpool(server(prot(trans(server_trans))))")
|
139
|
+
end
|
140
|
+
|
102
141
|
it "should serve inside a thread" do
|
103
142
|
exception_q = @server.instance_variable_get(:@exception_q)
|
104
|
-
described_class.
|
143
|
+
expect_any_instance_of(described_class).to receive(:serve) do
|
105
144
|
exception_q.push(StandardError.new('ERROR'))
|
106
145
|
end
|
107
146
|
expect { @server.rescuable_serve }.to(raise_error('ERROR'))
|
147
|
+
sleep(0.15)
|
108
148
|
end
|
109
149
|
|
110
150
|
it "should avoid running the server twice when retrying rescuable_serve" do
|
111
151
|
exception_q = @server.instance_variable_get(:@exception_q)
|
112
|
-
described_class.
|
152
|
+
expect_any_instance_of(described_class).to receive(:serve) do
|
113
153
|
exception_q.push(StandardError.new('ERROR1'))
|
114
154
|
exception_q.push(StandardError.new('ERROR2'))
|
115
155
|
end
|
@@ -118,29 +158,29 @@ describe 'Server' do
|
|
118
158
|
end
|
119
159
|
|
120
160
|
it "should serve using a thread pool" do
|
121
|
-
thread_q =
|
122
|
-
exception_q =
|
161
|
+
thread_q = double("SizedQueue")
|
162
|
+
exception_q = double("Queue")
|
123
163
|
@server.instance_variable_set(:@thread_q, thread_q)
|
124
164
|
@server.instance_variable_set(:@exception_q, exception_q)
|
125
|
-
@server_trans.
|
126
|
-
thread_q.
|
127
|
-
thread_q.
|
128
|
-
Thread.
|
129
|
-
@server_trans.
|
130
|
-
@trans.
|
131
|
-
@prot.
|
165
|
+
expect(@server_trans).to receive(:listen).ordered
|
166
|
+
expect(thread_q).to receive(:push).with(:token)
|
167
|
+
expect(thread_q).to receive(:pop)
|
168
|
+
expect(Thread).to receive(:new).and_yield
|
169
|
+
expect(@server_trans).to receive(:accept).exactly(3).times.and_return(@client)
|
170
|
+
expect(@trans).to receive(:get_transport).exactly(3).times.and_return(@trans)
|
171
|
+
expect(@prot).to receive(:get_protocol).exactly(3).times.and_return(@prot)
|
132
172
|
x = 0
|
133
173
|
error = RuntimeError.new("Stopped")
|
134
|
-
@processor.
|
174
|
+
expect(@processor).to receive(:process).exactly(3).times.with(@prot, @prot) do
|
135
175
|
case (x += 1)
|
136
176
|
when 1 then raise Thrift::TransportException
|
137
177
|
when 2 then raise Thrift::ProtocolException
|
138
178
|
when 3 then raise error
|
139
179
|
end
|
140
180
|
end
|
141
|
-
@trans.
|
142
|
-
exception_q.
|
143
|
-
@server_trans.
|
181
|
+
expect(@trans).to receive(:close).exactly(3).times
|
182
|
+
expect(exception_q).to receive(:push).with(error).and_throw(:stop)
|
183
|
+
expect(@server_trans).to receive(:close)
|
144
184
|
expect { @server.serve }.to(throw_symbol(:stop))
|
145
185
|
end
|
146
186
|
end
|