diff options
author | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-25 15:02:05 +0000 |
---|---|---|
committer | yugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-08-25 15:02:05 +0000 |
commit | 0dc342de848a642ecce8db697b8fecd83a63e117 (patch) | |
tree | 2b7ed4724aff1f86073e4740134bda9c4aac1a39 /trunk/test/monitor/test_monitor.rb | |
parent | ef70cf7138ab8034b5b806f466e4b484b24f0f88 (diff) |
added tag v1_9_0_4
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/tags/v1_9_0_4@18845 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'trunk/test/monitor/test_monitor.rb')
-rw-r--r-- | trunk/test/monitor/test_monitor.rb | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/trunk/test/monitor/test_monitor.rb b/trunk/test/monitor/test_monitor.rb new file mode 100644 index 0000000000..064471eecb --- /dev/null +++ b/trunk/test/monitor/test_monitor.rb @@ -0,0 +1,163 @@ +require "monitor" +require "thread" + +require "test/unit" + +class TestMonitor < Test::Unit::TestCase + def setup + @monitor = Monitor.new + end + + def test_enter + ary = [] + queue = Queue.new + th = Thread.start { + queue.pop + @monitor.enter + for i in 6 .. 10 + ary.push(i) + Thread.pass + end + @monitor.exit + } + @monitor.enter + queue.enq(nil) + for i in 1 .. 5 + ary.push(i) + Thread.pass + end + @monitor.exit + th.join + assert_equal((1..10).to_a, ary) + end + + def test_synchronize + ary = [] + queue = Queue.new + th = Thread.start { + queue.pop + @monitor.synchronize do + for i in 6 .. 10 + ary.push(i) + Thread.pass + end + end + } + @monitor.synchronize do + queue.enq(nil) + for i in 1 .. 5 + ary.push(i) + Thread.pass + end + end + th.join + assert_equal((1..10).to_a, ary) + end + + def test_try_enter + queue1 = Queue.new + queue2 = Queue.new + th = Thread.start { + queue1.deq + @monitor.enter + queue2.enq(nil) + queue1.deq + @monitor.exit + queue2.enq(nil) + } + assert_equal(true, @monitor.try_enter) + @monitor.exit + queue1.enq(nil) + queue2.deq + assert_equal(false, @monitor.try_enter) + queue1.enq(nil) + queue2.deq + assert_equal(true, @monitor.try_enter) + end + + def test_cond + cond = @monitor.new_cond + + a = "foo" + queue1 = Queue.new + Thread.start do + queue1.deq + @monitor.synchronize do + a = "bar" + cond.signal + end + end + @monitor.synchronize do + queue1.enq(nil) + assert_equal("foo", a) + result1 = cond.wait + assert_equal(true, result1) + assert_equal("bar", a) + end + end + + def _test_timedwait + b = "foo" + queue2 = Queue.new + Thread.start do + queue2.deq + @monitor.synchronize do + b = "bar" + cond.signal + end + end + @monitor.synchronize do + queue2.enq(nil) + assert_equal("foo", b) + result2 = cond.wait(0.1) + assert_equal(true, result2) + assert_equal("bar", b) + end + + c = "foo" + queue3 = Queue.new + Thread.start do + queue3.deq + @monitor.synchronize do + c = "bar" + cond.signal + end + end + @monitor.synchronize do + assert_equal("foo", c) + result3 = cond.wait(0.1) + assert_equal(false, result3) + assert_equal("foo", c) + queue3.enq(nil) + result4 = cond.wait + assert_equal(true, result4) + assert_equal("bar", c) + end + +# d = "foo" +# cumber_thread = Thread.start { +# loop do +# @monitor.synchronize do +# d = "foo" +# end +# end +# } +# queue3 = Queue.new +# Thread.start do +# queue3.pop +# @monitor.synchronize do +# d = "bar" +# cond.signal +# end +# end +# @monitor.synchronize do +# queue3.enq(nil) +# assert_equal("foo", d) +# result5 = cond.wait +# assert_equal(true, result5) +# # this thread has priority over cumber_thread +# assert_equal("bar", d) +# end +# cumber_thread.kill + end +end |