diff options
author | shugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-11-12 04:01:21 +0000 |
---|---|---|
committer | shugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-11-12 04:01:21 +0000 |
commit | 64446f023cc7fa006d536f85b1a5c678a501c7c6 (patch) | |
tree | b0d3ec7a18b1ba84678c115a3a36cb7aff4911ce | |
parent | db38b277a5aca9c009e64a5ba24ab4bb215125ea (diff) |
* test/monitor/test_monitor.rb: added.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4943 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | MANIFEST | 1 | ||||
-rw-r--r-- | test/monitor/test_monitor.rb | 144 |
3 files changed, 149 insertions, 0 deletions
@@ -1,3 +1,7 @@ +Wed Nov 12 12:59:44 2003 Shugo Maeda <shugo@ruby-lang.org> + + * test/monitor/test_monitor.rb: added. + Wed Nov 12 10:14:28 2003 Shugo Maeda <shugo@ruby-lang.org> * lib/monitor.rb: refactored. Thanks, Gennady Bystritsky. @@ -642,6 +642,7 @@ test/fileutils/fileasserts.rb test/fileutils/test_fileutils.rb test/fileutils/test_nowrite.rb test/logger/test_logger.rb +test/monitor/test_monitor.rb test/optparse/test_noarg.rb test/optparse/test_optarg.rb test/optparse/test_optparse.rb diff --git a/test/monitor/test_monitor.rb b/test/monitor/test_monitor.rb new file mode 100644 index 0000000000..9a7598511f --- /dev/null +++ b/test/monitor/test_monitor.rb @@ -0,0 +1,144 @@ +require "monitor" +require "thread" + +require "test/unit" + +class TestMonitor < Test::Unit::TestCase + def setup + @monitor = Monitor.new + end + + def test_enter + ary = [] + th = Thread.start { + Thread.pass + @monitor.enter + for i in 6 .. 10 + ary.push(i) + Thread.pass + end + @monitor.exit + } + @monitor.enter + 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 = [] + th = Thread.start { + Thread.pass + @monitor.synchronize do + for i in 6 .. 10 + ary.push(i) + Thread.pass + end + end + } + @monitor.synchronize do + 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 + queue = Queue.new + th = Thread.start { + queue.deq + @monitor.enter + queue.deq + @monitor.exit + } + assert_equal(true, @monitor.try_enter) + @monitor.exit + queue.enq(Object.new) + assert_equal(false, @monitor.try_enter) + queue.enq(Object.new) + assert_equal(true, @monitor.try_enter) + end + + def test_cond + cond = @monitor.new_cond + + a = "foo" + Thread.start do + Thread.pass + @monitor.synchronize do + a = "bar" + cond.signal + end + end + @monitor.synchronize do + assert_equal("foo", a) + result1 = cond.wait + assert_equal(true, result1) + assert_equal("bar", a) + end + + b = "foo" + Thread.start do + Thread.pass + @monitor.synchronize do + b = "bar" + cond.signal + end + end + @monitor.synchronize do + assert_equal("foo", b) + result2 = cond.wait(0.1) + assert_equal(true, result2) + assert_equal("bar", b) + end + + c = "foo" + Thread.start do + sleep(0.2) + @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) + 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 + } + Thread.start do + Thread.pass + @monitor.synchronize do + d = "bar" + cond.signal + end + end + @monitor.synchronize do + 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 |