thrift 0.9.1 → 0.13.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.
- checksums.yaml +6 -14
 - data/{README → README.md} +0 -0
 - data/ext/binary_protocol_accelerated.c +12 -12
 - data/ext/compact_protocol.c +4 -2
 - data/ext/constants.h +3 -0
 - data/ext/extconf.rb +3 -1
 - data/ext/memory_buffer.c +1 -1
 - data/ext/strlcpy.h +7 -3
 - data/ext/struct.c +27 -4
 - data/ext/thrift_native.c +6 -0
 - data/lib/thrift.rb +8 -5
 - data/lib/thrift/client.rb +13 -4
 - data/lib/thrift/multiplexed_processor.rb +76 -0
 - data/lib/thrift/processor.rb +24 -6
 - data/lib/thrift/protocol/base_protocol.rb +13 -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 +10 -1
 - data/lib/thrift/protocol/json_protocol.rb +23 -6
 - data/lib/thrift/protocol/multiplexed_protocol.rb +44 -0
 - data/lib/thrift/protocol/protocol_decorator.rb +194 -0
 - 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 +5 -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 +21 -17
 - data/lib/thrift/transport/ssl_server_socket.rb +41 -0
 - data/lib/thrift/transport/ssl_socket.rb +51 -0
 - data/lib/thrift/transport/unix_server_socket.rb +5 -1
 - data/lib/thrift/transport/unix_socket.rb +5 -1
 - data/lib/thrift/union.rb +3 -6
 - data/spec/BaseService.thrift +27 -0
 - data/spec/ExtendedService.thrift +25 -0
 - data/spec/Referenced.thrift +44 -0
 - data/spec/ThriftNamespacedSpec.thrift +53 -0
 - 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 +75 -72
 - data/spec/bytes_spec.rb +38 -38
 - data/spec/client_spec.rb +41 -42
 - data/spec/compact_protocol_spec.rb +32 -17
 - data/spec/exception_spec.rb +54 -54
 - data/spec/flat_spec.rb +62 -0
 - data/spec/http_client_spec.rb +52 -33
 - data/spec/json_protocol_spec.rb +170 -131
 - data/spec/namespaced_spec.rb +67 -0
 - 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/spec_helper.rb +4 -1
 - data/spec/ssl_server_socket_spec.rb +34 -0
 - data/spec/ssl_socket_spec.rb +78 -0
 - data/spec/struct_nested_containers_spec.rb +24 -24
 - data/spec/struct_spec.rb +120 -120
 - data/spec/thin_http_server_spec.rb +19 -18
 - data/spec/types_spec.rb +56 -53
 - data/spec/union_spec.rb +51 -40
 - data/spec/unix_socket_spec.rb +43 -34
 - metadata +189 -123
 - data/CHANGELOG +0 -1
 
| 
         @@ -0,0 +1,67 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #
         
     | 
| 
      
 2 
     | 
    
         
            +
            # Licensed to the Apache Software Foundation (ASF) under one
         
     | 
| 
      
 3 
     | 
    
         
            +
            # or more contributor license agreements. See the NOTICE file
         
     | 
| 
      
 4 
     | 
    
         
            +
            # distributed with this work for additional information
         
     | 
| 
      
 5 
     | 
    
         
            +
            # regarding copyright ownership. The ASF licenses this file
         
     | 
| 
      
 6 
     | 
    
         
            +
            # to you under the Apache License, Version 2.0 (the
         
     | 
| 
      
 7 
     | 
    
         
            +
            # "License"); you may not use this file except in compliance
         
     | 
| 
      
 8 
     | 
    
         
            +
            # with the License. You may obtain a copy of the License at
         
     | 
| 
      
 9 
     | 
    
         
            +
            #
         
     | 
| 
      
 10 
     | 
    
         
            +
            #   http://www.apache.org/licenses/LICENSE-2.0
         
     | 
| 
      
 11 
     | 
    
         
            +
            #
         
     | 
| 
      
 12 
     | 
    
         
            +
            # Unless required by applicable law or agreed to in writing,
         
     | 
| 
      
 13 
     | 
    
         
            +
            # software distributed under the License is distributed on an
         
     | 
| 
      
 14 
     | 
    
         
            +
            # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
         
     | 
| 
      
 15 
     | 
    
         
            +
            # KIND, either express or implied. See the License for the
         
     | 
| 
      
 16 
     | 
    
         
            +
            # specific language governing permissions and limitations
         
     | 
| 
      
 17 
     | 
    
         
            +
            # under the License.
         
     | 
| 
      
 18 
     | 
    
         
            +
            #
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            require 'spec_helper'
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            describe 'namespaced generation' do
         
     | 
| 
      
 23 
     | 
    
         
            +
              before do
         
     | 
| 
      
 24 
     | 
    
         
            +
                require 'namespaced_spec_namespace/namespaced_nonblocking_service'
         
     | 
| 
      
 25 
     | 
    
         
            +
              end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
              it "generated the right files" do
         
     | 
| 
      
 28 
     | 
    
         
            +
                prefix = File.expand_path("../gen-rb", __FILE__)
         
     | 
| 
      
 29 
     | 
    
         
            +
                ["namespaced_spec_namespace/namespaced_nonblocking_service.rb",
         
     | 
| 
      
 30 
     | 
    
         
            +
                 "namespaced_spec_namespace/thrift_namespaced_spec_constants.rb",
         
     | 
| 
      
 31 
     | 
    
         
            +
                 "namespaced_spec_namespace/thrift_namespaced_spec_types.rb",
         
     | 
| 
      
 32 
     | 
    
         
            +
                 "other_namespace/referenced_constants.rb",
         
     | 
| 
      
 33 
     | 
    
         
            +
                 "other_namespace/referenced_types.rb"
         
     | 
| 
      
 34 
     | 
    
         
            +
                ].each do |name|
         
     | 
| 
      
 35 
     | 
    
         
            +
                  expect(File.exist?(File.join(prefix, name))).to be_truthy
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
              end
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
              it "did not generate the wrong files" do
         
     | 
| 
      
 40 
     | 
    
         
            +
                prefix = File.expand_path("../gen-rb", __FILE__)
         
     | 
| 
      
 41 
     | 
    
         
            +
                ["namespaced_nonblocking_service.rb",
         
     | 
| 
      
 42 
     | 
    
         
            +
                 "thrift_namespaced_spec_constants.rb",
         
     | 
| 
      
 43 
     | 
    
         
            +
                 "thrift_namespaced_spec_types.rb",
         
     | 
| 
      
 44 
     | 
    
         
            +
                 "referenced_constants.rb",
         
     | 
| 
      
 45 
     | 
    
         
            +
                 "referenced_types.rb"
         
     | 
| 
      
 46 
     | 
    
         
            +
                ].each do |name|
         
     | 
| 
      
 47 
     | 
    
         
            +
                  expect(File.exist?(File.join(prefix, name))).not_to be_truthy
         
     | 
| 
      
 48 
     | 
    
         
            +
                end
         
     | 
| 
      
 49 
     | 
    
         
            +
              end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
              it "has a service class in the right place" do
         
     | 
| 
      
 52 
     | 
    
         
            +
                expect(defined?(NamespacedSpecNamespace::NamespacedNonblockingService)).to be_truthy
         
     | 
| 
      
 53 
     | 
    
         
            +
              end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
              it "has a struct in the right place" do
         
     | 
| 
      
 56 
     | 
    
         
            +
                expect(defined?(NamespacedSpecNamespace::Hello)).to be_truthy
         
     | 
| 
      
 57 
     | 
    
         
            +
              end
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
              it "required an included file" do
         
     | 
| 
      
 60 
     | 
    
         
            +
                expect(defined?(OtherNamespace::SomeEnum)).to be_truthy
         
     | 
| 
      
 61 
     | 
    
         
            +
              end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
              it "extended a service" do
         
     | 
| 
      
 64 
     | 
    
         
            +
                require "extended/extended_service"
         
     | 
| 
      
 65 
     | 
    
         
            +
              end
         
     | 
| 
      
 66 
     | 
    
         
            +
             
     | 
| 
      
 67 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -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
         
     |