summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorshugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-11-12 04:01:21 +0000
committershugo <shugo@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-11-12 04:01:21 +0000
commit64446f023cc7fa006d536f85b1a5c678a501c7c6 (patch)
treeb0d3ec7a18b1ba84678c115a3a36cb7aff4911ce /test
parentdb38b277a5aca9c009e64a5ba24ab4bb215125ea (diff)
* test/monitor/test_monitor.rb: added.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4943 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test')
-rw-r--r--test/monitor/test_monitor.rb144
1 files changed, 144 insertions, 0 deletions
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