diff options
author | Eric Wong <normalperson@yhbt.net> | 2011-07-06 19:11:47 -0700 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2011-07-06 19:11:47 -0700 |
commit | c22f2b5ebccbca8e04aa22821964f67c4a81c675 (patch) | |
tree | a4771317e974c935cbc1ac564d32a8952641c2f1 /test | |
parent | 8e1a53f99a752d8ccba324560a9e52bf6e80680d (diff) | |
download | kgio-c22f2b5ebccbca8e04aa22821964f67c4a81c675.tar.gz |
It's more reliable than relying on IO::NONBLOCK and Fcntl::FD_CLOEXEC constants. The existing constants are not guaranteed to be equivalent to what accept4() takes even though the current Linux implementation does it this way.
Diffstat (limited to 'test')
-rw-r--r-- | test/test_accept_flags.rb | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/test/test_accept_flags.rb b/test/test_accept_flags.rb new file mode 100644 index 0000000..3aae216 --- /dev/null +++ b/test/test_accept_flags.rb @@ -0,0 +1,49 @@ +require 'test/unit' +require 'fcntl' +require 'io/nonblock' +$-w = true +require 'kgio' + +class TestAcceptFlags < Test::Unit::TestCase + def test_accept_flags + @host = ENV["TEST_HOST"] || '127.0.0.1' + @srv = Kgio::TCPServer.new(@host, 0) + @port = @srv.addr[1] + + client = TCPSocket.new(@host, @port) + accepted = @srv.kgio_accept(nil, Kgio::SOCK_NONBLOCK) + assert_instance_of Kgio::Socket, accepted + assert accepted.nonblock? + flags = accepted.fcntl(Fcntl::F_GETFD) + assert_equal 0, flags & Fcntl::FD_CLOEXEC + assert_nil client.close + assert_nil accepted.close + + client = TCPSocket.new(@host, @port) + accepted = @srv.kgio_accept(nil, Kgio::SOCK_CLOEXEC) + assert_instance_of Kgio::Socket, accepted + assert ! accepted.nonblock? + flags = accepted.fcntl(Fcntl::F_GETFD) + assert_equal Fcntl::FD_CLOEXEC, flags & Fcntl::FD_CLOEXEC + assert_nil client.close + assert_nil accepted.close + + client = TCPSocket.new(@host, @port) + accepted = @srv.kgio_accept(nil, Kgio::SOCK_CLOEXEC|Kgio::SOCK_NONBLOCK) + assert_instance_of Kgio::Socket, accepted + assert accepted.nonblock? + flags = accepted.fcntl(Fcntl::F_GETFD) + assert_equal Fcntl::FD_CLOEXEC, flags & Fcntl::FD_CLOEXEC + assert_nil client.close + assert_nil accepted.close + + client = TCPSocket.new(@host, @port) + accepted = @srv.kgio_accept(nil, Kgio::SOCK_CLOEXEC|Kgio::SOCK_NONBLOCK) + assert_instance_of Kgio::Socket, accepted + assert accepted.nonblock? + flags = accepted.fcntl(Fcntl::F_GETFD) + assert_equal Fcntl::FD_CLOEXEC, flags & Fcntl::FD_CLOEXEC + assert_nil client.close + assert_nil accepted.close + end +end |