From: arton Date: 2010-12-01T03:11:32+09:00 Subject: [ruby-dev:42661] (mswin32) fix port used in test/socket artonです。 ruby 1.9.3dev (2010-11-30) [i386-mswin32_100] で、nmake test-all を実行 すると、「常に」 51) Error: test_listen(TestSocketAddrinfo): Errno::EACCES: Permission denied - bind(2) C:/Users/arton/Documents/ruby/src/trunkbuild/.ext/common/socket.rb:136:in `bind' C:/Users/arton/Documents/ruby/src/trunkbuild/.ext/common/socket.rb:136:in `listen' C:/Users/arton/Documents/ruby/src/rubytrunk/test/socket/test_addrinfo.rb:412:in `test_listen' となります。 しかし、nmake test-all TESTS=socket や nmake test-all TESTS=socket/test_addrinfo.rb では、再現しません。 で、nmake test-all では、test_addrinfo.rbを実行すると3回試した3回とも 49152 + rand(65535-49152+1) で求めているポートが 65438 (test_bind) 58130 (test_connect_from) 62240 (test_connect_to) 49154 (test_listen) …… このポートをWin32では起動直後にScheduleサービス が利用しているのでバッティングする の順にアサインされます。どうも、socketテストの前のいずれかのテストで乱数 のシードに固定値を入れているのが原因で、必ず同じポート番号がアサインされ て、たまたまその中に使用中のポートがあるのが原因と思えます。 つまり、エラーとなる原因は2つあって、1つはランダムにポートがアサインされ ないことと、49152〜49157(Windows7の場合)のような比較的若い番号は既に利 用されていることです。 というわけで、 ・TestCaseの開始時に無引数のsrandを呼ぶ等して、以前のテ ストによって影響を受 けないようにする ・test_addrinfo#random_port を 49152 + rand(65535-49152+1)ではなく 50000 + rand(65535-50000+1) のように、もっと上位のポートを使うようにする のいずれかの対応をして欲しいです。 よろしくお願いします。 --- unit.rb~ Fri Nov 19 21:57:15 2010 +++ unit.rb Wed Dec 01 03:03:07 2010 @@ -707,6 +707,7 @@ module MiniTest # Runs the tests reporting the status to +runner+ def run runner + srand trap 'INFO' do warn '%s#%s %.2fs' % [self.class, self.__name__, (Time.now - runner.start_time)] -- arton -------------------------------------- What is the No.1 drama, music and car of 2010 ? - Yahoo! JAPAN Net BANZUKE 2010 - http://pr.mail.yahoo.co.jp/banzuke/