diff options
Diffstat (limited to 'spec/ruby/library/socket/basicsocket/recv_nonblock_spec.rb')
| -rw-r--r-- | spec/ruby/library/socket/basicsocket/recv_nonblock_spec.rb | 71 |
1 files changed, 61 insertions, 10 deletions
diff --git a/spec/ruby/library/socket/basicsocket/recv_nonblock_spec.rb b/spec/ruby/library/socket/basicsocket/recv_nonblock_spec.rb index b6ab8a9cea..8aca7d0332 100644 --- a/spec/ruby/library/socket/basicsocket/recv_nonblock_spec.rb +++ b/spec/ruby/library/socket/basicsocket/recv_nonblock_spec.rb @@ -16,7 +16,7 @@ describe "Socket::BasicSocket#recv_nonblock" do platform_is_not :windows do describe 'using an unbound socket' do it 'raises an exception extending IO::WaitReadable' do - -> { @s1.recv_nonblock(1) }.should raise_error(IO::WaitReadable) + -> { @s1.recv_nonblock(1) }.should.raise(IO::WaitReadable) end end end @@ -25,12 +25,12 @@ describe "Socket::BasicSocket#recv_nonblock" do @s1.bind(Socket.pack_sockaddr_in(0, ip_address)) -> { @s1.recv_nonblock(5) - }.should raise_error(IO::WaitReadable) { |e| + }.should.raise(IO::WaitReadable) { |e| platform_is_not :windows do - e.should be_kind_of(Errno::EAGAIN) + e.should.is_a?(Errno::EAGAIN) end platform_is :windows do - e.should be_kind_of(Errno::EWOULDBLOCK) + e.should.is_a?(Errno::EWOULDBLOCK) end } end @@ -52,9 +52,19 @@ describe "Socket::BasicSocket#recv_nonblock" do @s2.send("data", 0, @s1.getsockname) IO.select([@s1], nil, nil, 2) - buf = "foo" - @s1.recv_nonblock(5, 0, buf) - buf.should == "data" + buffer = +"foo" + @s1.recv_nonblock(5, 0, buffer).should.equal?(buffer) + buffer.should == "data" + end + + it "preserves the encoding of the given buffer" do + @s1.bind(Socket.pack_sockaddr_in(0, ip_address)) + @s2.send("data", 0, @s1.getsockname) + IO.select([@s1], nil, nil, 2) + + buffer = ''.encode(Encoding::ISO_8859_1) + @s1.recv_nonblock(5, 0, buffer) + buffer.encoding.should == Encoding::ISO_8859_1 end it "does not block if there's no data available" do @@ -64,7 +74,7 @@ describe "Socket::BasicSocket#recv_nonblock" do @s1.recv_nonblock(1).should == "a" -> { @s1.recv_nonblock(5) - }.should raise_error(IO::WaitReadable) + }.should.raise(IO::WaitReadable) end end @@ -79,13 +89,54 @@ describe "Socket::BasicSocket#recv_nonblock" do end it "raises Errno::ENOTCONN" do - -> { @server.recv_nonblock(1) }.should raise_error { |e| + -> { @server.recv_nonblock(1) }.should.raise { |e| [Errno::ENOTCONN, Errno::EINVAL].should.include?(e.class) } - -> { @server.recv_nonblock(1, exception: false) }.should raise_error { |e| + -> { @server.recv_nonblock(1, exception: false) }.should.raise { |e| [Errno::ENOTCONN, Errno::EINVAL].should.include?(e.class) } end end end end + +describe "Socket::BasicSocket#recv_nonblock" do + context "when recvfrom(2) returns 0 (if no messages are available to be received and the peer has performed an orderly shutdown)" do + describe "stream socket" do + before :each do + @server = TCPServer.new('127.0.0.1', 0) + @port = @server.addr[1] + end + + after :each do + @server.close unless @server.closed? + end + + it "returns nil on a closed stream socket" do + ready = false + + t = Thread.new do + client = @server.accept + + Thread.pass while !ready + begin + client.recv_nonblock(10) + rescue IO::EAGAINWaitReadable + retry + end + ensure + client.close if client + end + + Thread.pass while t.status and t.status != "sleep" + t.status.should_not == nil + + socket = TCPSocket.new('127.0.0.1', @port) + socket.close + ready = true + + t.value.should == nil + end + end + end +end |
