From: "U.Nakamura" Date: 2006-06-07T15:12:25+09:00 Subject: [ruby-dev:28694] test/socket for Windows こんにちは、なかむら(う)です。 最近のsocket周りのテストを実行していて、Windowsでいろいろ問題 があるということに気付きました。 最大の問題は read_nonblock と write_nonblock で固まっちゃうと いうものなのですが、これはこっちの問題なのでとりあえず置いて おきます(置いておいていい話でもないんですが...)。 さて、test/socket/test_nonblock.rbの中では、 assert_raise(Errno::EAGAIN) { ... } というチェックが多用されているのですが、これは assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { ... } にすべきではないかと思うのですが、正しいでしょうか? また、Windowsでは、bindされていないsocketに対するrecvfrom()は EINVALを返すのですが、これは、 (1) 非常識だ、お前がなんとかしろ (2) そういう環境だというならそれはそれでありかな (3) その他 のいずれだと考えるべきでしょうか? また、UNIX Socketが存在しない環境に対する配慮も欠けているよう に思われます。 以上3点に関して、1点目に付いては「正しい」、2点目に付いては(2)、 だと仮定してのパッチです。 Index: test/socket/test_nonblock.rb =================================================================== RCS file: /home/cvs/ruby/test/socket/test_nonblock.rb,v retrieving revision 1.2 diff -u -1 -p -r1.2 test_nonblock.rb --- test/socket/test_nonblock.rb 4 Jun 2006 12:14:54 -0000 1.2 +++ test/socket/test_nonblock.rb 7 Jun 2006 06:01:43 -0000 @@ -13,3 +13,3 @@ class TestNonblockSocket < Test::Unit::T serv.listen(5) - assert_raise(Errno::EAGAIN) { serv.accept_nonblock } + assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { serv.accept_nonblock } c = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0) @@ -53,4 +53,4 @@ class TestNonblockSocket < Test::Unit::T u1.bind("127.0.0.1", 0) - assert_raise(Errno::EAGAIN) { u1.recvfrom_nonblock(100) } - assert_raise(Errno::EAGAIN) { u2.recvfrom_nonblock(100) } + assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { u1.recvfrom_nonblock(100) } + assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK, Errno::EINVAL) { u2.recvfrom_nonblock(100) } u2.send("aaa", 0, u1.getsockname) @@ -63,3 +63,3 @@ class TestNonblockSocket < Test::Unit::T assert_equal(u2_port, port) - assert_raise(Errno::EAGAIN) { u1.recvfrom_nonblock(100) } + assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { u1.recvfrom_nonblock(100) } u2.send("", 0, u1.getsockname) @@ -84,4 +84,4 @@ class TestNonblockSocket < Test::Unit::T s = serv.accept - assert_raise(Errno::EAGAIN) { s.recvfrom_nonblock(100) } - assert_raise(Errno::EAGAIN) { c.recvfrom_nonblock(100) } + assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { s.recvfrom_nonblock(100) } + assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { c.recvfrom_nonblock(100) } s.write "aaa" @@ -104,3 +104,3 @@ class TestNonblockSocket < Test::Unit::T s.close if s && !s.closed? - end + end if defined?(UNIXSocket) @@ -110,4 +110,4 @@ class TestNonblockSocket < Test::Unit::T s2 = Socket.new(Socket::AF_INET, Socket::SOCK_DGRAM, 0) - assert_raise(Errno::EAGAIN) { s1.recvfrom_nonblock(100) } - assert_raise(Errno::EAGAIN) { s2.recvfrom_nonblock(100) } + assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { s1.recvfrom_nonblock(100) } + assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK, Errno::EINVAL) { s2.recvfrom_nonblock(100) } s2.send("aaa", 0, s1.getsockname) @@ -136,4 +136,4 @@ class TestNonblockSocket < Test::Unit::T c, s = tcp_pair - assert_raise(Errno::EAGAIN) { c.read_nonblock(100) } - assert_raise(Errno::EAGAIN) { s.read_nonblock(100) } + assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { c.read_nonblock(100) } + assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { s.read_nonblock(100) } c.write("abc") @@ -142,3 +142,3 @@ class TestNonblockSocket < Test::Unit::T assert_equal("bc", s.read_nonblock(100)) - assert_raise(Errno::EAGAIN) { s.read_nonblock(100) } + assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { s.read_nonblock(100) } ensure @@ -156,3 +156,3 @@ class TestNonblockSocket < Test::Unit::T loop { - assert_raise(Errno::EAGAIN) { + assert_raise(Errno::EAGAIN, Errno::EWOULDBLOCK) { loop { Index: test/socket/test_socket.rb =================================================================== RCS file: /home/cvs/ruby/test/socket/test_socket.rb,v retrieving revision 1.8 diff -u -1 -p -r1.8 test_socket.rb --- test/socket/test_socket.rb 5 Jun 2006 09:15:46 -0000 1.8 +++ test/socket/test_socket.rb 7 Jun 2006 06:01:43 -0000 @@ -82,2 +82,2 @@ class TestSocket < Test::Unit::TestCase end -end +end if defined?(Socket) && Socket.respond_to?(:sockaddr_un) それでは。 -- U.Nakamura