summaryrefslogtreecommitdiff
path: root/spec/ruby/library/socket/basicsocket/recv_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/ruby/library/socket/basicsocket/recv_spec.rb')
-rw-r--r--spec/ruby/library/socket/basicsocket/recv_spec.rb120
1 files changed, 95 insertions, 25 deletions
diff --git a/spec/ruby/library/socket/basicsocket/recv_spec.rb b/spec/ruby/library/socket/basicsocket/recv_spec.rb
index b6ccda5d00..5c393218bc 100644
--- a/spec/ruby/library/socket/basicsocket/recv_spec.rb
+++ b/spec/ruby/library/socket/basicsocket/recv_spec.rb
@@ -1,4 +1,4 @@
-# -*- encoding: binary -*-
+# encoding: binary
require_relative '../spec_helper'
require_relative '../fixtures/classes'
@@ -22,7 +22,7 @@ describe "BasicSocket#recv" do
client.close
end
Thread.pass while t.status and t.status != "sleep"
- t.status.should_not be_nil
+ t.status.should_not == nil
socket = TCPSocket.new('127.0.0.1', @port)
socket.send('hello', 0)
@@ -32,28 +32,26 @@ describe "BasicSocket#recv" do
ScratchPad.recorded.should == 'hello'
end
- platform_is_not :solaris do
- it "accepts flags to specify unusual receiving behaviour" do
- t = Thread.new do
- client = @server.accept
+ it "accepts flags to specify unusual receiving behaviour" do
+ t = Thread.new do
+ client = @server.accept
- # in-band data (TCP), doesn't receive the flag.
- ScratchPad.record client.recv(10)
+ # in-band data (TCP), doesn't receive the flag.
+ ScratchPad.record client.recv(10)
- # this recv is important (TODO: explain)
- client.recv(10)
- client.close
- end
- Thread.pass while t.status and t.status != "sleep"
- t.status.should_not be_nil
-
- socket = TCPSocket.new('127.0.0.1', @port)
- socket.send('helloU', Socket::MSG_OOB)
- socket.shutdown(1)
- t.join
- socket.close
- ScratchPad.recorded.should == 'hello'
+ # this recv is important (TODO: explain)
+ client.recv(10)
+ client.close
end
+ Thread.pass while t.status and t.status != "sleep"
+ t.status.should_not == nil
+
+ socket = TCPSocket.new('127.0.0.1', @port)
+ socket.send('helloU', Socket::MSG_OOB)
+ socket.shutdown(1)
+ t.join
+ socket.close
+ ScratchPad.recorded.should == 'hello'
end
it "gets lines delimited with a custom separator" do
@@ -66,7 +64,7 @@ describe "BasicSocket#recv" do
client.close
end
Thread.pass while t.status and t.status != "sleep"
- t.status.should_not be_nil
+ t.status.should_not == nil
socket = TCPSocket.new('127.0.0.1', @port)
socket.write("firstline\377secondline\377")
@@ -81,13 +79,29 @@ describe "BasicSocket#recv" do
socket.write("data")
client = @server.accept
- buf = "foo"
+ buffer = +"foo"
+ begin
+ client.recv(4, 0, buffer).should.equal?(buffer)
+ ensure
+ client.close
+ end
+ buffer.should == "data"
+
+ socket.close
+ end
+
+ it "preserves the encoding of the given buffer" do
+ socket = TCPSocket.new('127.0.0.1', @port)
+ socket.write("data")
+
+ client = @server.accept
+ buffer = ''.encode(Encoding::ISO_8859_1)
begin
- client.recv(4, 0, buf)
+ client.recv(4, 0, buffer)
ensure
client.close
end
- buf.should == "data"
+ buffer.encoding.should == Encoding::ISO_8859_1
socket.close
end
@@ -157,3 +171,59 @@ describe 'BasicSocket#recv' do
end
end
end
+
+describe "BasicSocket#recv" 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
+ t = Thread.new do
+ client = @server.accept
+ client.recv(10)
+ 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
+
+ t.value.should == nil
+ end
+ end
+
+ describe "datagram socket" do
+ SocketSpecs.each_ip_protocol do |family, ip_address|
+ before :each do
+ @server = UDPSocket.new(family)
+ @client = UDPSocket.new(family)
+ end
+
+ after :each do
+ @server.close unless @server.closed?
+ @client.close unless @client.closed?
+ end
+
+ it "returns empty String" do
+ @server.bind(ip_address, 0)
+ addr = @server.connect_address
+ @client.connect(addr.ip_address, addr.ip_port)
+
+ @client.send('', 0)
+
+ @server.recv(1).should == ""
+ end
+ end
+ end
+ end
+end