thrift 0.10.0.0 → 0.14.2
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.
- 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
|