From: nobu.nakada@... Date: 2002-09-22T01:54:21+09:00 Subject: [ruby-dev:18339] Re: rubicon on EWS4800 なかだです。 At Sun, 22 Sep 2002 00:50:26 +0900, Yukihiro Matsumoto wrote: > |んで、テスト自体は失敗することがあるようなんですがこれはどうなんでしょう? > |あ、失敗するんじゃなくて、メッセージが出てしまうだけか。 > > TestThreadはなんかタイミングに依存する部分があるようでときど > き失敗します。これはそういうものだと解釈してます。つまり、一 > 流のソフトウェアコンサルタント(Dave Thomas)にもバグなしには > かけないほどThreadは難しいと。 メッセージが出てしまうのは、Threadとは別の問題のようです。タイ ミングに依存してるのはThread.passの順序に頼ってるところではない かと。 Index: TestThread.rb =================================================================== RCS file: /cvs/ruby/src/rubicon/builtin/TestThread.rb,v retrieving revision 1.19 diff -u -2 -p -Fdef -r1.19 TestThread.rb --- rubicon/builtin/TestThread.rb 10 Nov 2001 04:53:16 -0000 1.19 +++ rubicon/builtin/TestThread.rb 21 Sep 2002 16:44:37 -0000 @@ -90,6 +90,4 @@ # Test default def test_abort_on_exception=() - skipping("Can't find a test for all platforms") - return save_stderr = nil begin @@ -103,19 +101,22 @@ def test_abort_on_exception=() assert_fail("Thread exception propogated to main thread") end - + + msg = nil begin - Thread.new do + t = Thread.new do Thread.current.abort_on_exception = true - save_stderr = $stderr - $stderr = nil + save_stderr = $stderr.dup + $stderr.reopen(open("xyzzy.dat", "w")) raise MyException, "boom" end - Thread.pass + Thread.pass while t.alive? assert_fail("Exception should have interrupted main thread") - rescue TestThread::MyException - assert(true) + rescue SystemExit + msg = open("xyzzy.dat") {|f| f.gets} ensure - $stderr = save_stderr + $stderr.reopen(save_stderr) + File.unlink("xyzzy.dat") end + assert_match(msg, /\(TestThread::MyException\)$/) rescue Exception assert_fail($!.to_s) @@ -299,7 +300,7 @@ def test_safe_level Thread.pass end + t.join rescue nil assert_equals(0, Thread.current.safe_level) assert_equals(4, t.safe_level) - t.kill end @@ -377,4 +378,5 @@ def test_s_abort_on_exception= raise "boom" end + Thread.pass assert(true) rescue Exception @@ -382,18 +384,22 @@ def test_s_abort_on_exception= end + msg = nil begin Thread.abort_on_exception = true - Thread.new do - save_stderr = $stderr - $stderr = nil - raise "boom" + t = Thread.new do + save_stderr = $stderr.dup + $stderr.reopen(open("xyzzy.dat", "w")) + raise MyException, "boom" end + Thread.pass while t.alive? fail("Exception should have interrupted main thread") - rescue Exception - assert(true) + rescue SystemExit + msg = open("xyzzy.dat") {|f| f.gets} ensure Thread.abort_on_exception = false - $stderr = save_stderr + $stderr.reopen(save_stderr) + File.unlink("xyzzy.dat") end + assert_match(msg, /\(TestThread::MyException\)$/) end -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦