summaryrefslogtreecommitdiff
path: root/test/rinda/test_rinda.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/rinda/test_rinda.rb')
-rw-r--r--test/rinda/test_rinda.rb83
1 files changed, 49 insertions, 34 deletions
diff --git a/test/rinda/test_rinda.rb b/test/rinda/test_rinda.rb
index 04a8727ff6..f5472d28ac 100644
--- a/test/rinda/test_rinda.rb
+++ b/test/rinda/test_rinda.rb
@@ -559,17 +559,10 @@ class TestRingServer < Test::Unit::TestCase
end
def test_do_reply
- aoe = Thread.abort_on_exception
- Thread.abort_on_exception = true
- tl0 = Thread.list
- tl = nil
- th = Thread.new(Thread.current) do |mth|
- sleep 1
- (tl = Thread.list - tl0).each {|t|t.raise(Timeout::Error)}
- mth.raise(Timeout::Error)
- end
- tl0 << th
+ with_timeout(10) {_test_do_reply}
+ end
+ def _test_do_reply
called = nil
callback = proc { |ts|
@@ -582,34 +575,16 @@ class TestRingServer < Test::Unit::TestCase
@rs.do_reply
- t = 10 + Process.clock_gettime(Process::CLOCK_MONOTONIC, :second)
- until called
- if t < Process.clock_gettime(Process::CLOCK_MONOTONIC, :second)
- flunk "timeout during waiting call"
- end
- sleep 0.1
- end
+ wait_for(10) {called}
assert_same @ts, called
- rescue Timeout::Error => e
- if tl
- bt = e.backtrace
- tl.each do |t|
- begin
- t.value
- rescue Timeout::Error => e
- bt.unshift("")
- bt[0, 0] = e.backtrace
- end
- end
- end
- raise Timeout::Error, "timeout", bt
- ensure
- th.kill if th
- Thread.abort_on_exception = aoe
end
def test_do_reply_local
+ with_timeout(10) {_test_do_reply_local}
+ end
+
+ def _test_do_reply_local
called = nil
callback = proc { |ts|
@@ -620,7 +595,7 @@ class TestRingServer < Test::Unit::TestCase
@rs.do_reply
- Thread.pass until called
+ wait_for(10) {called}
assert_same @ts, called
end
@@ -707,6 +682,46 @@ class TestRingServer < Test::Unit::TestCase
assert_nil(@rs.do_reply, 'otherwise should hang forever')
end
+ private
+
+ def with_timeout(n)
+ aoe = Thread.abort_on_exception
+ Thread.abort_on_exception = true
+ tl0 = Thread.list
+ tl = nil
+ th = Thread.new(Thread.current) do |mth|
+ sleep n
+ (tl = Thread.list - tl0).each {|t|t.raise(Timeout::Error)}
+ mth.raise(Timeout::Error)
+ end
+ tl0 << th
+ rescue Timeout::Error => e
+ if tl
+ bt = e.backtrace
+ tl.each do |t|
+ begin
+ t.value
+ rescue Timeout::Error => e
+ bt.unshift("")
+ bt[0, 0] = e.backtrace
+ end
+ end
+ end
+ raise Timeout::Error, "timeout", bt
+ ensure
+ th.kill if th
+ Thread.abort_on_exception = aoe
+ end
+
+ def wait_for(n)
+ t = n + Process.clock_gettime(Process::CLOCK_MONOTONIC, :second)
+ until yield
+ if t < Process.clock_gettime(Process::CLOCK_MONOTONIC, :second)
+ flunk "timeout during waiting call"
+ end
+ sleep 0.1
+ end
+ end
end
class TestRingFinger < Test::Unit::TestCase