summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--test/rinda/test_rinda.rb128
2 files changed, 126 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index b06aecdab4..1a919c5d9d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Tue Mar 1 00:47:43 2005 Masatoshi SEKI <m_seki@mva.biglobe.ne.jp>
+
+ * test/rinda/test_rinda.rb: backport from CVS_HEAD. use
+ MockClock.sleep instead of Kernel.sleep [ruby-dev:25387]
+
Tue Mar 1 00:34:24 2005 Masatoshi SEKI <m_seki@mva.biglobe.ne.jp>
* lib/rinda/tuplespace.rb (Rinda::TupleSpace): improved keeper thread.
diff --git a/test/rinda/test_rinda.rb b/test/rinda/test_rinda.rb
index c0cdffd78a..7ac6918819 100644
--- a/test/rinda/test_rinda.rb
+++ b/test/rinda/test_rinda.rb
@@ -4,11 +4,120 @@ require 'drb/drb'
require 'drb/eq'
require 'rinda/tuplespace'
+require 'singleton'
+
require 'weakref'
module Rinda
+class MockClock
+ include Singleton
+
+ class MyTS < Rinda::TupleSpace
+ def keeper
+ nil
+ end
+ end
+
+ def initialize
+ @now = 2
+ @reso = 0.1
+ @ts = MyTS.new
+ @ts.write([2, :now])
+ @inf = 2**31 - 1
+ end
+
+ def now
+ @now.to_f
+ end
+
+ def at(n)
+ n
+ end
+
+ def _forward(n=nil)
+ now ,= @ts.take([nil, :now])
+ @now = now + n
+ n = @reso if n.nil?
+ @ts.write([@now, :now])
+ end
+
+ def forward(n=nil)
+ while n > 0
+ _forward(@reso)
+ n -= @reso
+ end
+ end
+
+ def rewind
+ now ,= @ts.take([nil, :now])
+ @ts.write([@inf, :now])
+ @ts.take([nil, :now])
+ @now = 2
+ @ts.write([2, :now])
+ end
+
+ def sleep(n=nil)
+ while will_deadlock?
+ n -= @reso
+ forward
+ return 0 if n <= 0
+ end
+ now ,= @ts.read([nil, :now])
+ @ts.read([(now + n)..@inf, :now])
+ 0
+ end
+
+ def will_deadlock?
+ sz = Thread.current.group.list.find_all {|x| x.status != 'sleep'}.size
+ sz <= 1
+ end
+end
+
+module Time
+ def sleep(n)
+ @m.sleep(n)
+ end
+ module_function :sleep
+
+ def at(n)
+ n
+ end
+ module_function :at
+
+ def now
+ @m ? @m.now : 2
+ end
+ module_function :now
+
+ def rewind
+ @m.rewind
+ end
+ module_function :rewind
+
+ def forward(n)
+ @m.forward(n)
+ end
+ module_function :forward
+
+ @m = MockClock.instance
+end
+
+class TupleSpace
+ def sleep(n)
+ Time.sleep(n)
+ end
+end
+
module TupleSpaceTestModule
+ def sleep(n)
+ if Thread.current == Thread.main
+ Time.forward(n)
+ else
+ Time.sleep(n)
+ end
+ end
+
def test_00_tuple
tuple = Rinda::TupleEntry.new([1,2,3])
assert(!tuple.canceled?)
@@ -155,8 +264,9 @@ module TupleSpaceTestModule
@ts.write([:ans, s])
s
end
-
- tuple = @ts.take([:ans, nil], 20)
+
+ sleep(20)
+ tuple = @ts.take([:ans, nil])
assert_equal(10, tuple[1])
assert_equal(10, taker.value)
end
@@ -181,7 +291,8 @@ module TupleSpaceTestModule
@ts.write([:req, 2])
end
- tuple = @ts.take([:ans, nil], 20)
+ sleep(20)
+ tuple = @ts.take([:ans, nil])
assert_equal(10, tuple[1])
assert_equal(10, taker.value)
assert_equal([], @ts.read_all([nil, nil]))
@@ -259,7 +370,8 @@ module TupleSpaceTestModule
@ts.take({"message"=>"first", "name"=>"3"})
- tuple = @ts.take([:ans, nil], 20)
+ sleep(4)
+ tuple = @ts.take([:ans, nil])
assert_equal(10, tuple[1])
assert_equal(10, taker.value)
assert_equal([], @ts.read_all([nil, nil]))
@@ -301,7 +413,7 @@ module TupleSpaceTestModule
end
end
- sleep 1
+ sleep(1)
assert(template.canceled?)
@ts.write([:take, 1])
@@ -328,8 +440,8 @@ module TupleSpaceTestModule
end
end
end
-
- sleep 1
+
+ sleep(1)
assert(template.canceled?)
@ts.write([:take, 1])
@@ -386,6 +498,7 @@ class TupleSpaceTest < Test::Unit::TestCase
include TupleSpaceTestModule
def setup
+ ThreadGroup.new.add(Thread.current)
@ts = Rinda::TupleSpace.new(1)
end
@@ -402,6 +515,7 @@ class TupleSpaceProxyTest < Test::Unit::TestCase
include TupleSpaceTestModule
def setup
+ ThreadGroup.new.add(Thread.current)
@ts_base = Rinda::TupleSpace.new(1)
@ts = Rinda::TupleSpaceProxy.new(@ts_base)
end