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,65 +17,62 @@
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 'thrift/server/mongrel_http_server'
22
22
 
23
- class ThriftHTTPServerSpec < Spec::ExampleGroup
24
- include Thrift
23
+ describe 'HTTPServer' do
25
24
 
26
- Handler = MongrelHTTPServer::Handler
27
-
28
- describe MongrelHTTPServer do
25
+ describe Thrift::MongrelHTTPServer do
29
26
  it "should have appropriate defaults" do
30
27
  mock_factory = mock("BinaryProtocolFactory")
31
28
  mock_proc = mock("Processor")
32
- BinaryProtocolFactory.should_receive(:new).and_return(mock_factory)
29
+ Thrift::BinaryProtocolFactory.should_receive(:new).and_return(mock_factory)
33
30
  Mongrel::HttpServer.should_receive(:new).with("0.0.0.0", 80).and_return do
34
- mock("Mongrel::HttpServer").tee do |mock|
31
+ mock("Mongrel::HttpServer").tap do |mock|
35
32
  handler = mock("Handler")
36
- Handler.should_receive(:new).with(mock_proc, mock_factory).and_return(handler)
33
+ Thrift::MongrelHTTPServer::Handler.should_receive(:new).with(mock_proc, mock_factory).and_return(handler)
37
34
  mock.should_receive(:register).with("/", handler)
38
35
  end
39
36
  end
40
- MongrelHTTPServer.new(mock_proc)
37
+ Thrift::MongrelHTTPServer.new(mock_proc)
41
38
  end
42
39
 
43
40
  it "should understand :ip, :port, :path, and :protocol_factory" do
44
41
  mock_proc = mock("Processor")
45
42
  mock_factory = mock("ProtocolFactory")
46
43
  Mongrel::HttpServer.should_receive(:new).with("1.2.3.4", 1234).and_return do
47
- mock("Mongrel::HttpServer").tee do |mock|
44
+ mock("Mongrel::HttpServer").tap do |mock|
48
45
  handler = mock("Handler")
49
- Handler.should_receive(:new).with(mock_proc, mock_factory).and_return(handler)
46
+ Thrift::MongrelHTTPServer::Handler.should_receive(:new).with(mock_proc, mock_factory).and_return(handler)
50
47
  mock.should_receive(:register).with("/foo", handler)
51
48
  end
52
49
  end
53
- MongrelHTTPServer.new(mock_proc, :ip => "1.2.3.4", :port => 1234, :path => "foo",
50
+ Thrift::MongrelHTTPServer.new(mock_proc, :ip => "1.2.3.4", :port => 1234, :path => "foo",
54
51
  :protocol_factory => mock_factory)
55
52
  end
56
53
 
57
54
  it "should serve using Mongrel::HttpServer" do
58
- BinaryProtocolFactory.stub!(:new)
55
+ Thrift::BinaryProtocolFactory.stub!(:new)
59
56
  Mongrel::HttpServer.should_receive(:new).and_return do
60
- mock("Mongrel::HttpServer").tee do |mock|
61
- Handler.stub!(:new)
57
+ mock("Mongrel::HttpServer").tap do |mock|
58
+ Thrift::MongrelHTTPServer::Handler.stub!(:new)
62
59
  mock.stub!(:register)
63
60
  mock.should_receive(:run).and_return do
64
- mock("Mongrel::HttpServer.run").tee do |runner|
61
+ mock("Mongrel::HttpServer.run").tap do |runner|
65
62
  runner.should_receive(:join)
66
63
  end
67
64
  end
68
65
  end
69
66
  end
70
- MongrelHTTPServer.new(nil).serve
67
+ Thrift::MongrelHTTPServer.new(nil).serve
71
68
  end
72
69
  end
73
70
 
74
- describe MongrelHTTPServer::Handler do
71
+ describe Thrift::MongrelHTTPServer::Handler do
75
72
  before(:each) do
76
73
  @processor = mock("Processor")
77
74
  @factory = mock("ProtocolFactory")
78
- @handler = Handler.new(@processor, @factory)
75
+ @handler = described_class.new(@processor, @factory)
79
76
  end
80
77
 
81
78
  it "should return 404 for non-POST requests" do
@@ -91,7 +88,7 @@ class ThriftHTTPServerSpec < Spec::ExampleGroup
91
88
  response = mock("response")
92
89
  head = mock("head")
93
90
  head.should_receive(:[]=).with("Content-Type", "application/x-thrift")
94
- IOStreamTransport.stub!(:new)
91
+ Thrift::IOStreamTransport.stub!(:new)
95
92
  @factory.stub!(:get_protocol)
96
93
  @processor.stub!(:process)
97
94
  response.should_receive(:start).with(200).and_yield(head, nil)
@@ -107,7 +104,7 @@ class ThriftHTTPServerSpec < Spec::ExampleGroup
107
104
  out = mock("out")
108
105
  protocol = mock("protocol")
109
106
  transport = mock("transport")
110
- IOStreamTransport.should_receive(:new).with(body, out).and_return(transport)
107
+ Thrift::IOStreamTransport.should_receive(:new).with(body, out).and_return(transport)
111
108
  @factory.should_receive(:get_protocol).with(transport).and_return(protocol)
112
109
  @processor.should_receive(:process).with(protocol, protocol)
113
110
  response.should_receive(:start).with(200).and_yield(head, out)
@@ -17,11 +17,9 @@
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 ThriftNonblockingServerSpec < Spec::ExampleGroup
23
- include Thrift
24
- include SpecNamespace
22
+ describe 'NonblockingServer' do
25
23
 
26
24
  class Handler
27
25
  def initialize
@@ -55,7 +53,7 @@ class ThriftNonblockingServerSpec < Spec::ExampleGroup
55
53
  end
56
54
  end
57
55
 
58
- class SpecTransport < BaseTransport
56
+ class SpecTransport < Thrift::BaseTransport
59
57
  def initialize(transport, queue)
60
58
  @transport = transport
61
59
  @queue = queue
@@ -89,7 +87,7 @@ class ThriftNonblockingServerSpec < Spec::ExampleGroup
89
87
  end
90
88
  end
91
89
 
92
- class SpecServerSocket < ServerSocket
90
+ class SpecServerSocket < Thrift::ServerSocket
93
91
  def initialize(host, port, queue)
94
92
  super(host, port)
95
93
  @queue = queue
@@ -105,13 +103,13 @@ class ThriftNonblockingServerSpec < Spec::ExampleGroup
105
103
  before(:each) do
106
104
  @port = 43251
107
105
  handler = Handler.new
108
- processor = NonblockingService::Processor.new(handler)
106
+ processor = SpecNamespace::NonblockingService::Processor.new(handler)
109
107
  queue = Queue.new
110
108
  @transport = SpecServerSocket.new('localhost', @port, queue)
111
- transport_factory = FramedTransportFactory.new
109
+ transport_factory = Thrift::FramedTransportFactory.new
112
110
  logger = Logger.new(STDERR)
113
111
  logger.level = Logger::WARN
114
- @server = NonblockingServer.new(processor, @transport, transport_factory, nil, 5, logger)
112
+ @server = Thrift::NonblockingServer.new(processor, @transport, transport_factory, nil, 5, logger)
115
113
  handler.server = @server
116
114
  @server_thread = Thread.new(Thread.current) do |master_thread|
117
115
  begin
@@ -136,9 +134,9 @@ class ThriftNonblockingServerSpec < Spec::ExampleGroup
136
134
  end
137
135
 
138
136
  def setup_client(queue = nil)
139
- transport = SpecTransport.new(FramedTransport.new(Socket.new('localhost', @port)), queue)
140
- protocol = BinaryProtocol.new(transport)
141
- client = NonblockingService::Client.new(protocol)
137
+ transport = SpecTransport.new(Thrift::FramedTransport.new(Thrift::Socket.new('localhost', @port)), queue)
138
+ protocol = Thrift::BinaryProtocol.new(transport)
139
+ client = SpecNamespace::NonblockingService::Client.new(protocol)
142
140
  transport.open
143
141
  @clients << [client, transport]
144
142
  client
@@ -178,8 +176,8 @@ class ThriftNonblockingServerSpec < Spec::ExampleGroup
178
176
 
179
177
  it "should handle basic message passing" do
180
178
  client = setup_client
181
- client.greeting(true).should == Hello.new
182
- client.greeting(false).should == Hello.new(:greeting => 'Aloha!')
179
+ client.greeting(true).should == SpecNamespace::Hello.new
180
+ client.greeting(false).should == SpecNamespace::Hello.new(:greeting => 'Aloha!')
183
181
  @server.shutdown
184
182
  end
185
183
 
@@ -214,15 +212,15 @@ class ThriftNonblockingServerSpec < Spec::ExampleGroup
214
212
  queues[4] << :hello
215
213
  queues[5] << :hello
216
214
  queues[6] << :hello
217
- 3.times { result.pop.should == Hello.new }
218
- client.greeting(true).should == Hello.new
215
+ 3.times { result.pop.should == SpecNamespace::Hello.new }
216
+ client.greeting(true).should == SpecNamespace::Hello.new
219
217
  queues[5] << [:unblock, 4]
220
218
  4.times { result.pop.should be_true }
221
219
  queues[2] << :hello
222
- result.pop.should == Hello.new
223
- client.greeting(false).should == Hello.new(:greeting => 'Aloha!')
220
+ result.pop.should == SpecNamespace::Hello.new
221
+ client.greeting(false).should == SpecNamespace::Hello.new(:greeting => 'Aloha!')
224
222
  7.times { queues.shift << :exit }
225
- client.greeting(true).should == Hello.new
223
+ client.greeting(true).should == SpecNamespace::Hello.new
226
224
  @server.shutdown
227
225
  end
228
226
 
@@ -257,7 +255,7 @@ class ThriftNonblockingServerSpec < Spec::ExampleGroup
257
255
 
258
256
  it "should allow shutting down in response to a message" do
259
257
  client = setup_client
260
- client.greeting(true).should == Hello.new
258
+ client.greeting(true).should == SpecNamespace::Hello.new
261
259
  client.shutdown
262
260
  @server_thread.join(2).should_not be_nil
263
261
  end
@@ -17,16 +17,15 @@
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 ThriftProcessorSpec < Spec::ExampleGroup
23
- include Thrift
22
+ describe 'Processor' do
24
23
 
25
24
  class ProcessorSpec
26
25
  include Thrift::Processor
27
26
  end
28
27
 
29
- describe "Processor" do
28
+ describe Thrift::Processor do
30
29
  before(:each) do
31
30
  @processor = ProcessorSpec.new(mock("MockHandler"))
32
31
  @prot = mock("MockProtocol")
@@ -34,28 +33,26 @@ class ThriftProcessorSpec < Spec::ExampleGroup
34
33
 
35
34
  def mock_trans(obj)
36
35
  obj.should_receive(:trans).ordered.and_return do
37
- mock("trans").tee do |trans|
36
+ mock("trans").tap do |trans|
38
37
  trans.should_receive(:flush).ordered
39
38
  end
40
39
  end
41
40
  end
42
41
 
43
42
  it "should call process_<message> when it receives that message" do
44
- @prot.should_receive(:read_message_begin).ordered.and_return ['testMessage', MessageTypes::CALL, 17]
43
+ @prot.should_receive(:read_message_begin).ordered.and_return ['testMessage', Thrift::MessageTypes::CALL, 17]
45
44
  @processor.should_receive(:process_testMessage).with(17, @prot, @prot).ordered
46
45
  @processor.process(@prot, @prot).should == true
47
46
  end
48
47
 
49
48
  it "should raise an ApplicationException when the received message cannot be processed" do
50
- @prot.should_receive(:read_message_begin).ordered.and_return ['testMessage', MessageTypes::CALL, 4]
51
- @prot.should_receive(:skip).with(Types::STRUCT).ordered
49
+ @prot.should_receive(:read_message_begin).ordered.and_return ['testMessage', Thrift::MessageTypes::CALL, 4]
50
+ @prot.should_receive(:skip).with(Thrift::Types::STRUCT).ordered
52
51
  @prot.should_receive(:read_message_end).ordered
53
- @prot.should_receive(:write_message_begin).with('testMessage', MessageTypes::EXCEPTION, 4).ordered
54
- ApplicationException.should_receive(:new).with(ApplicationException::UNKNOWN_METHOD, "Unknown function testMessage").and_return do
55
- mock(ApplicationException).tee do |e|
56
- e.should_receive(:write).with(@prot).ordered
57
- end
58
- end
52
+ @prot.should_receive(:write_message_begin).with('testMessage', Thrift::MessageTypes::EXCEPTION, 4).ordered
53
+ e = mock(Thrift::ApplicationException)
54
+ e.should_receive(:write).with(@prot).ordered
55
+ Thrift::ApplicationException.should_receive(:new).with(Thrift::ApplicationException::UNKNOWN_METHOD, "Unknown function testMessage").and_return(e)
59
56
  @prot.should_receive(:write_message_end).ordered
60
57
  mock_trans(@prot)
61
58
  @processor.process(@prot, @prot)
@@ -63,7 +60,7 @@ class ThriftProcessorSpec < Spec::ExampleGroup
63
60
 
64
61
  it "should pass args off to the args class" do
65
62
  args_class = mock("MockArgsClass")
66
- args = mock("#<MockArgsClass:mock>").tee do |args|
63
+ args = mock("#<MockArgsClass:mock>").tap do |args|
67
64
  args.should_receive(:read).with(@prot).ordered
68
65
  end
69
66
  args_class.should_receive(:new).and_return args
@@ -72,7 +69,7 @@ class ThriftProcessorSpec < Spec::ExampleGroup
72
69
  end
73
70
 
74
71
  it "should write out a reply when asked" do
75
- @prot.should_receive(:write_message_begin).with('testMessage', MessageTypes::REPLY, 23).ordered
72
+ @prot.should_receive(:write_message_begin).with('testMessage', Thrift::MessageTypes::REPLY, 23).ordered
76
73
  result = mock("MockResult")
77
74
  result.should_receive(:write).with(@prot).ordered
78
75
  @prot.should_receive(:write_message_end).ordered
@@ -17,53 +17,51 @@
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 ThriftSerializerSpec < Spec::ExampleGroup
23
- include Thrift
24
- include SpecNamespace
22
+ describe 'Serializer' do
25
23
 
26
- describe Serializer do
24
+ describe Thrift::Serializer do
27
25
  it "should serialize structs to binary by default" do
28
- serializer = Serializer.new(Thrift::BinaryProtocolAcceleratedFactory.new)
29
- data = serializer.serialize(Hello.new(:greeting => "'Ello guv'nor!"))
26
+ serializer = Thrift::Serializer.new(Thrift::BinaryProtocolAcceleratedFactory.new)
27
+ data = serializer.serialize(SpecNamespace::Hello.new(:greeting => "'Ello guv'nor!"))
30
28
  data.should == "\x0B\x00\x01\x00\x00\x00\x0E'Ello guv'nor!\x00"
31
29
  end
32
30
 
33
31
  it "should serialize structs to the given protocol" do
34
- protocol = BaseProtocol.new(mock("transport"))
32
+ protocol = Thrift::BaseProtocol.new(mock("transport"))
35
33
  protocol.should_receive(:write_struct_begin).with("SpecNamespace::Hello")
36
- protocol.should_receive(:write_field_begin).with("greeting", Types::STRING, 1)
34
+ protocol.should_receive(:write_field_begin).with("greeting", Thrift::Types::STRING, 1)
37
35
  protocol.should_receive(:write_string).with("Good day")
38
36
  protocol.should_receive(:write_field_end)
39
37
  protocol.should_receive(:write_field_stop)
40
38
  protocol.should_receive(:write_struct_end)
41
39
  protocol_factory = mock("ProtocolFactory")
42
40
  protocol_factory.stub!(:get_protocol).and_return(protocol)
43
- serializer = Serializer.new(protocol_factory)
44
- serializer.serialize(Hello.new(:greeting => "Good day"))
41
+ serializer = Thrift::Serializer.new(protocol_factory)
42
+ serializer.serialize(SpecNamespace::Hello.new(:greeting => "Good day"))
45
43
  end
46
44
  end
47
45
 
48
- describe Deserializer do
46
+ describe Thrift::Deserializer do
49
47
  it "should deserialize structs from binary by default" do
50
- deserializer = Deserializer.new
48
+ deserializer = Thrift::Deserializer.new
51
49
  data = "\x0B\x00\x01\x00\x00\x00\x0E'Ello guv'nor!\x00"
52
- deserializer.deserialize(Hello.new, data).should == Hello.new(:greeting => "'Ello guv'nor!")
50
+ deserializer.deserialize(SpecNamespace::Hello.new, data).should == SpecNamespace::Hello.new(:greeting => "'Ello guv'nor!")
53
51
  end
54
52
 
55
53
  it "should deserialize structs from the given protocol" do
56
- protocol = BaseProtocol.new(mock("transport"))
54
+ protocol = Thrift::BaseProtocol.new(mock("transport"))
57
55
  protocol.should_receive(:read_struct_begin).and_return("SpecNamespace::Hello")
58
- protocol.should_receive(:read_field_begin).and_return(["greeting", Types::STRING, 1],
59
- [nil, Types::STOP, 0])
56
+ protocol.should_receive(:read_field_begin).and_return(["greeting", Thrift::Types::STRING, 1],
57
+ [nil, Thrift::Types::STOP, 0])
60
58
  protocol.should_receive(:read_string).and_return("Good day")
61
59
  protocol.should_receive(:read_field_end)
62
60
  protocol.should_receive(:read_struct_end)
63
61
  protocol_factory = mock("ProtocolFactory")
64
62
  protocol_factory.stub!(:get_protocol).and_return(protocol)
65
- deserializer = Deserializer.new(protocol_factory)
66
- deserializer.deserialize(Hello.new, "").should == Hello.new(:greeting => "Good day")
63
+ deserializer = Thrift::Deserializer.new(protocol_factory)
64
+ deserializer.deserialize(SpecNamespace::Hello.new, "").should == SpecNamespace::Hello.new(:greeting => "Good day")
67
65
  end
68
66
  end
69
67
  end
@@ -17,15 +17,14 @@
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 ThriftServerSocketSpec < Spec::ExampleGroup
24
- include Thrift
23
+ describe 'Thrift::ServerSocket' do
25
24
 
26
- describe ServerSocket do
25
+ describe Thrift::ServerSocket do
27
26
  before(:each) do
28
- @socket = ServerSocket.new(1234)
27
+ @socket = Thrift::ServerSocket.new(1234)
29
28
  end
30
29
 
31
30
  it "should create a handle when calling listen" do
@@ -34,7 +33,7 @@ class ThriftServerSocketSpec < Spec::ExampleGroup
34
33
  end
35
34
 
36
35
  it "should accept an optional host argument" do
37
- @socket = ServerSocket.new('localhost', 1234)
36
+ @socket = Thrift::ServerSocket.new('localhost', 1234)
38
37
  TCPServer.should_receive(:new).with('localhost', 1234)
39
38
  @socket.listen
40
39
  end
@@ -46,7 +45,7 @@ class ThriftServerSocketSpec < Spec::ExampleGroup
46
45
  sock = mock("sock")
47
46
  handle.should_receive(:accept).and_return(sock)
48
47
  trans = mock("Socket")
49
- Socket.should_receive(:new).and_return(trans)
48
+ Thrift::Socket.should_receive(:new).and_return(trans)
50
49
  trans.should_receive(:handle=).with(sock)
51
50
  @socket.accept.should == trans
52
51
  end
@@ -16,39 +16,30 @@
16
16
  # specific language governing permissions and limitations
17
17
  # under the License.
18
18
  #
19
- require File.expand_path("#{File.dirname(__FILE__)}/spec_helper")
19
+ require 'spec_helper'
20
20
 
21
- class ThriftServerSpec < Spec::ExampleGroup
22
- include Thrift
21
+ describe 'Server' do
23
22
 
24
- describe BaseServer do
23
+ describe Thrift::BaseServer do
25
24
  it "should default to BaseTransportFactory and BinaryProtocolFactory when not specified" do
26
- server = BaseServer.new(mock("Processor"), mock("BaseServerTransport"))
27
- server.instance_variable_get(:'@transport_factory').should be_an_instance_of(BaseTransportFactory)
28
- server.instance_variable_get(:'@protocol_factory').should be_an_instance_of(BinaryProtocolFactory)
25
+ server = Thrift::BaseServer.new(mock("Processor"), mock("BaseServerTransport"))
26
+ server.instance_variable_get(:'@transport_factory').should be_an_instance_of(Thrift::BaseTransportFactory)
27
+ server.instance_variable_get(:'@protocol_factory').should be_an_instance_of(Thrift::BinaryProtocolFactory)
29
28
  end
30
29
 
31
30
  # serve is a noop, so can't test that
32
31
  end
33
32
 
34
- shared_examples_for "servers" do
33
+ describe Thrift::SimpleServer do
35
34
  before(:each) do
36
35
  @processor = mock("Processor")
37
36
  @serverTrans = mock("ServerTransport")
38
37
  @trans = mock("BaseTransport")
39
38
  @prot = mock("BaseProtocol")
40
39
  @client = mock("Client")
41
- @server = server_type.new(@processor, @serverTrans, @trans, @prot)
40
+ @server = described_class.new(@processor, @serverTrans, @trans, @prot)
42
41
  end
43
- end
44
-
45
- describe SimpleServer do
46
- it_should_behave_like "servers"
47
-
48
- def server_type
49
- SimpleServer
50
- end
51
-
42
+
52
43
  it "should serve in the main thread" do
53
44
  @serverTrans.should_receive(:listen).ordered
54
45
  @serverTrans.should_receive(:accept).exactly(3).times.and_return(@client)
@@ -68,11 +59,14 @@ class ThriftServerSpec < Spec::ExampleGroup
68
59
  end
69
60
  end
70
61
 
71
- describe ThreadedServer do
72
- it_should_behave_like "servers"
73
-
74
- def server_type
75
- ThreadedServer
62
+ describe Thrift::ThreadedServer do
63
+ before(:each) do
64
+ @processor = mock("Processor")
65
+ @serverTrans = mock("ServerTransport")
66
+ @trans = mock("BaseTransport")
67
+ @prot = mock("BaseProtocol")
68
+ @client = mock("Client")
69
+ @server = described_class.new(@processor, @serverTrans, @trans, @prot)
76
70
  end
77
71
 
78
72
  it "should serve using threads" do
@@ -95,50 +89,44 @@ class ThriftServerSpec < Spec::ExampleGroup
95
89
  end
96
90
  end
97
91
 
98
- describe ThreadPoolServer do
99
- it_should_behave_like "servers"
100
-
101
- def server_type
102
- # put this stuff here so it runs before the server is created
103
- @threadQ = mock("SizedQueue")
104
- SizedQueue.should_receive(:new).with(20).and_return(@threadQ)
105
- @excQ = mock("Queue")
106
- Queue.should_receive(:new).and_return(@excQ)
107
- ThreadPoolServer
108
- end
109
-
110
- it "should set up the queues" do
111
- @server.instance_variable_get(:'@thread_q').should be(@threadQ)
112
- @server.instance_variable_get(:'@exception_q').should be(@excQ)
92
+ describe Thrift::ThreadPoolServer do
93
+ before(:each) do
94
+ @processor = mock("Processor")
95
+ @server_trans = mock("ServerTransport")
96
+ @trans = mock("BaseTransport")
97
+ @prot = mock("BaseProtocol")
98
+ @client = mock("Client")
99
+ @server = described_class.new(@processor, @server_trans, @trans, @prot)
113
100
  end
114
101
 
115
102
  it "should serve inside a thread" do
116
- Thread.should_receive(:new).and_return do |block|
117
- @server.should_receive(:serve)
118
- block.call
119
- @server.rspec_verify
103
+ exception_q = @server.instance_variable_get(:@exception_q)
104
+ described_class.any_instance.should_receive(:serve) do
105
+ exception_q.push(StandardError.new('ERROR'))
120
106
  end
121
- @excQ.should_receive(:pop).and_throw(:popped)
122
- lambda { @server.rescuable_serve }.should throw_symbol(:popped)
107
+ expect { @server.rescuable_serve }.to(raise_error('ERROR'))
123
108
  end
124
109
 
125
110
  it "should avoid running the server twice when retrying rescuable_serve" do
126
- Thread.should_receive(:new).and_return do |block|
127
- @server.should_receive(:serve)
128
- block.call
129
- @server.rspec_verify
111
+ exception_q = @server.instance_variable_get(:@exception_q)
112
+ described_class.any_instance.should_receive(:serve) do
113
+ exception_q.push(StandardError.new('ERROR1'))
114
+ exception_q.push(StandardError.new('ERROR2'))
130
115
  end
131
- @excQ.should_receive(:pop).twice.and_throw(:popped)
132
- lambda { @server.rescuable_serve }.should throw_symbol(:popped)
133
- lambda { @server.rescuable_serve }.should throw_symbol(:popped)
116
+ expect { @server.rescuable_serve }.to(raise_error('ERROR1'))
117
+ expect { @server.rescuable_serve }.to(raise_error('ERROR2'))
134
118
  end
135
119
 
136
120
  it "should serve using a thread pool" do
137
- @serverTrans.should_receive(:listen).ordered
138
- @threadQ.should_receive(:push).with(:token)
139
- @threadQ.should_receive(:pop)
121
+ thread_q = mock("SizedQueue")
122
+ exception_q = mock("Queue")
123
+ @server.instance_variable_set(:@thread_q, thread_q)
124
+ @server.instance_variable_set(:@exception_q, exception_q)
125
+ @server_trans.should_receive(:listen).ordered
126
+ thread_q.should_receive(:push).with(:token)
127
+ thread_q.should_receive(:pop)
140
128
  Thread.should_receive(:new).and_yield
141
- @serverTrans.should_receive(:accept).exactly(3).times.and_return(@client)
129
+ @server_trans.should_receive(:accept).exactly(3).times.and_return(@client)
142
130
  @trans.should_receive(:get_transport).exactly(3).times.and_return(@trans)
143
131
  @prot.should_receive(:get_protocol).exactly(3).times.and_return(@prot)
144
132
  x = 0
@@ -151,9 +139,9 @@ class ThriftServerSpec < Spec::ExampleGroup
151
139
  end
152
140
  end
153
141
  @trans.should_receive(:close).exactly(3).times
154
- @excQ.should_receive(:push).with(error).and_throw(:stop)
155
- @serverTrans.should_receive(:close)
156
- lambda { @server.serve }.should throw_symbol(:stop)
142
+ exception_q.should_receive(:push).with(error).and_throw(:stop)
143
+ @server_trans.should_receive(:close)
144
+ expect { @server.serve }.to(throw_symbol(:stop))
157
145
  end
158
146
  end
159
147
  end