summaryrefslogtreecommitdiff
path: root/spec/ruby/library/socket/basicsocket/recv_nonblock_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/ruby/library/socket/basicsocket/recv_nonblock_spec.rb')
-rw-r--r--spec/ruby/library/socket/basicsocket/recv_nonblock_spec.rb71
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