spec/celluloid/io/actor_spec.rb in celluloid-io-0.17.2 vs spec/celluloid/io/actor_spec.rb in celluloid-io-0.17.3

- old
+ new

@@ -1,5 +1,58 @@ require "spec_helper" RSpec.describe Celluloid::IO, library: :IO do - it_behaves_like "a Celluloid Actor", Celluloid::IO + it_behaves_like "a Celluloid Actor", Celluloid::IO do + let(:example_port) { assign_port } + + context :timeouts do + let :sleeping_actor_class do + Class.new do + include Celluloid::IO + def initialize(addr, port) + @server = Celluloid::IO::TCPServer.new(addr, port) + async { @server.accept ; sleep 10 } + end + end + end + let :foo_actor_class do + Class.new do + include Celluloid::IO + def initialize(addr, port) + @sock = Celluloid::IO::TCPSocket.new(addr, port) + end + + # returns true if the operation timedout + def timedout_read(duration) + begin + timeout(duration) do + @sock.wait_readable + end + rescue Celluloid::TaskTimeout + return true + end + false + end + + # returns true if it cannot write (socket is already registered) + def failed_write + begin + @sock.wait_readable + rescue ArgumentError # IO Selector Exception + return true + end + false + end + end + end + + it "frees up the socket when a timeout error occurs" do + a1 = sleeping_actor_class.new(example_addr, example_port) + a2 = foo_actor_class.new(example_addr, example_port) + + expect(a2.timedout_read(1)).to eq true # this ensures that the socket timeouted trying to read + skip "not implemented" + expect(a2.failed_write).to eq false # this ensures that the socket isn't usable anymore + end + end + end end