From: "H.Yamamoto" Date: 2005-08-18T14:36:29+09:00 Subject: [ruby-dev:26817] test/socket/test_tcp.rb freeze on windows 山本です。 test/socket/test_tcp.rb の test_recvfrom が固まってしまう問題を調べてみました。 まず、固まるのは sock = TCPSocket.open(addr[2], addr[1]) で例外が出て ensure 節にうつってしまうためで、そうすると th.join でブロックして しまいます。(スレッドは accept で待っているため) Index: test_tcp.rb =================================================================== RCS file: /src/ruby/test/socket/test_tcp.rb,v retrieving revision 1.6 diff -u -w -b -p -r1.6 test_tcp.rb --- test_tcp.rb 9 Dec 2004 01:19:30 -0000 1.6 +++ test_tcp.rb 18 Aug 2005 05:22:19 -0000 @@ -21,7 +21,6 @@ class TestTCPSocket < Test::Unit::TestCa assert_raise(RuntimeError, SocketError) { sock.recvfrom(0x10000) } - ensure th.join end end if defined?(TCPSocket) こうすると、状況が変化します。 E:\ruby-cvs\bcc32>testrb socket "..\\ruby\\" Loaded suite socket Started ...E.. Finished in 1.021 seconds. 1) Error: test_recvfrom(TestTCPSocket): Errno::ECONNREFUSED: 対象のコンピュータによって拒否されたため、接続できませんで した。 - connect(2) E:/ruby-cvs/ruby/test/socket/test_tcp.rb:20:in `initialize' E:/ruby-cvs/ruby/test/socket/test_tcp.rb:20:in `test_recvfrom' 6 tests, 13 assertions, 0 failures, 1 errors E:\ruby-cvs\win32>testrb socket "..\\ruby" Loaded suite socket Started ...E.. Finished in 1.051 seconds. 1) Error: test_recvfrom(TestTCPSocket): Errno::EBADF: Bad file descriptor - connect(2) E:/ruby-cvs/ruby/test/socket/test_tcp.rb:20:in `initialize' E:/ruby-cvs/ruby/test/socket/test_tcp.rb:20:in `test_recvfrom' 6 tests, 13 assertions, 0 failures, 1 errors さらに調べたところ、このようにするとテストがパスすることがわかりました。 Index: test_tcp.rb =================================================================== RCS file: /src/ruby/test/socket/test_tcp.rb,v retrieving revision 1.6 diff -u -w -b -p -r1.6 test_tcp.rb --- test_tcp.rb 9 Dec 2004 01:19:30 -0000 1.6 +++ test_tcp.rb 18 Aug 2005 05:33:14 -0000 @@ -17,11 +17,10 @@ class TestTCPSocket < Test::Unit::TestCa c.print("x"*0x1000) } addr = svr.addr - sock = TCPSocket.open(addr[2], addr[1]) + sock = TCPSocket.open(addr[3], addr[1]) assert_raise(RuntimeError, SocketError) { sock.recvfrom(0x10000) } - ensure th.join end end if defined?(TCPSocket) http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=TCPSocket には hostはホスト名、またはoctet decimal によるインターネットアドレスを示す文字列 とあるのですが、どうもホスト名だと動いていない感じです。 http://www.rubyist.net/~akr/chkbuild/debian-sarge/ruby-trunk/last を見る限りでは linux では動いているようなので、windows 固有の問題だと思います。 また何かわかったら報告します。