summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--test/ruby/test_io.rb21
-rw-r--r--test/ruby/test_io_m17n.rb27
3 files changed, 48 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index 0f8df08445..94c136c39f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Wed Oct 27 13:51:25 2010 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/ruby/test_io.rb (TestIO#pipe): need to propagate exceptions
+ in read/write thread. fix r29541.
+
+ * test/ruby/test_io_m17n.rb (TestIO_M17N#pipe): ditto.
+
Wed Oct 27 12:05:40 2010 NAKAMURA Usaku <usa@ruby-lang.org>
* class.c (clone_const): need to return value. fix r29602.
diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb
index 34ac67db6b..b692c91c7b 100644
--- a/test/ruby/test_io.rb
+++ b/test/ruby/test_io.rb
@@ -23,15 +23,32 @@ class TestIO < Test::Unit::TestCase
end
def pipe(wp, rp)
+ re, we = nil, nil
r, w = IO.pipe
- rt = Thread.new { rp.call(r) }
- wt = Thread.new { wp.call(w) }
+ rt = Thread.new do
+ begin
+ rp.call(r)
+ rescue Exception
+ r.close
+ re = $!
+ end
+ end
+ wt = Thread.new do
+ begin
+ wp.call(w)
+ rescue Exception
+ w.close
+ we = $!
+ end
+ end
flunk("timeout") unless rt.join(10) && wt.join(10)
ensure
r.close unless !r || r.closed?
w.close unless !w || w.closed?
(rt.kill; rt.join) if rt
(wt.kill; wt.join) if wt
+ raise re if re
+ raise we if we
end
def with_pipe
diff --git a/test/ruby/test_io_m17n.rb b/test/ruby/test_io_m17n.rb
index 16195699e3..2ab36cb172 100644
--- a/test/ruby/test_io_m17n.rb
+++ b/test/ruby/test_io_m17n.rb
@@ -19,16 +19,33 @@ class TestIO_M17N < Test::Unit::TestCase
}
end
- def pipe(*args, wp, rp)
- r, w = IO.pipe(*args)
- rt = Thread.new { rp.call(r) }
- wt = Thread.new { wp.call(w) }
+ def pipe(wp, rp)
+ re, we = nil, nil
+ r, w = IO.pipe
+ rt = Thread.new do
+ begin
+ rp.call(r)
+ rescue Exception
+ r.close
+ re = $!
+ end
+ end
+ wt = Thread.new do
+ begin
+ wp.call(w)
+ rescue Exception
+ w.close
+ we = $!
+ end
+ end
flunk("timeout") unless rt.join(10) && wt.join(10)
ensure
r.close unless !r || r.closed?
- w.close unless !w || r.closed?
+ w.close unless !w || w.closed?
(rt.kill; rt.join) if rt
(wt.kill; wt.join) if wt
+ raise re if re
+ raise we if we
end
def with_pipe(*args)