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