ruby-changes:26054
From: kosaki <ko1@a...>
Date: Sat, 1 Dec 2012 17:29:21 +0900 (JST)
Subject: [ruby-changes:26054] kosaki:r38111 (trunk): * test/ruby/test_thread.rb: move ConditionVariable related test
kosaki 2012-12-01 17:29:09 +0900 (Sat, 01 Dec 2012) New Revision: 38111 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=38111 Log: * test/ruby/test_thread.rb: move ConditionVariable related test into test/thread/test_cv.rb. * test/thread/test_cv.rb: new file. * test/thread/test_cv.rb (test_condvar_empty_signal): new tests. * test/thread/test_cv.rb (test_condvar_empty_broadcast): ditto. Added files: trunk/test/thread/test_cv.rb Modified files: trunk/ChangeLog trunk/test/ruby/test_thread.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 38110) +++ ChangeLog (revision 38111) @@ -1,3 +1,11 @@ +Sat Dec 1 16:40:22 2012 KOSAKI Motohiro <kosaki.motohiro@g...> + + * test/ruby/test_thread.rb: move ConditionVariable related test + into test/thread/test_cv.rb. + * test/thread/test_cv.rb: new file. + * test/thread/test_cv.rb (test_condvar_empty_signal): new tests. + * test/thread/test_cv.rb (test_condvar_empty_broadcast): ditto. + Sat Dec 1 15:14:25 2012 KOSAKI Motohiro <kosaki.motohiro@g...> * test/ruby/test_thread.rb (test_cv_wait_deadlock): enable Index: test/ruby/test_thread.rb =================================================================== --- test/ruby/test_thread.rb (revision 38110) +++ test/ruby/test_thread.rb (revision 38111) @@ -120,174 +120,6 @@ assert_equal(max * max * max, r) end - def test_condvar - mutex = Mutex.new - condvar = ConditionVariable.new - result = [] - mutex.synchronize do - t = Thread.new do - mutex.synchronize do - result << 1 - condvar.signal - end - end - - result << 0 - condvar.wait(mutex) - result << 2 - t.join - end - assert_equal([0, 1, 2], result) - end - - def test_condvar_wait_exception_handling - # Calling wait in the only thread running should raise a ThreadError of - # 'stopping only thread' - mutex = Mutex.new - condvar = ConditionVariable.new - - locked = false - thread = Thread.new do - Thread.current.abort_on_exception = false - mutex.synchronize do - begin - condvar.wait(mutex) - rescue Exception - locked = mutex.locked? - raise - end - end - end - - until thread.stop? - sleep(0.1) - end - - thread.raise Interrupt, "interrupt a dead condition variable" - assert_raise(Interrupt) { thread.value } - assert(locked) - end - - def test_condvar_wait_and_broadcast - nr_threads = 3 - threads = Array.new - mutex = Mutex.new - condvar = ConditionVariable.new - result = [] - - nr_threads.times do |i| - threads[i] = Thread.new do - mutex.synchronize do - result << "C1" - condvar.wait mutex - result << "C2" - end - end - end - sleep 0.1 - mutex.synchronize do - result << "P1" - condvar.broadcast - result << "P2" - end - nr_threads.times do |i| - threads[i].join - end - - assert_equal ["C1", "C1", "C1", "P1", "P2", "C2", "C2", "C2"], result - end - - def test_condvar_wait_deadlock - assert_in_out_err([], <<-INPUT, ["No live threads left. Deadlock?"], []) - require "thread" - - mutex = Mutex.new - cv = ConditionVariable.new - - mesg = nil - begin - mutex.lock - cv.wait mutex - mutex.unlock - rescue Exception => e - mesg = e.message - end - print mesg -INPUT - end - - def test_condvar_wait_deadlock_2 - nr_threads = 3 - threads = Array.new - mutex = Mutex.new - condvar = ConditionVariable.new - - nr_threads.times do |i| - if (i != 0) - mutex.unlock - end - threads[i] = Thread.new do - mutex.synchronize do - condvar.wait mutex - end - end - mutex.lock - end - - assert_raise(Timeout::Error) do - Timeout.timeout(0.1) { condvar.wait mutex } - end - mutex.unlock - threads.each(&:kill) - threads.each(&:join) - end - - def test_condvar_timed_wait - mutex = Mutex.new - condvar = ConditionVariable.new - timeout = 0.3 - locked = false - - t0 = Time.now - mutex.synchronize do - begin - condvar.wait(mutex, timeout) - ensure - locked = mutex.locked? - end - end - t1 = Time.now - t = t1-t0 - - assert_operator(timeout*0.9, :<, t) - assert(locked) - end - - def test_condvar_nolock - mutex = Mutex.new - condvar = ConditionVariable.new - - assert_raise(ThreadError) {condvar.wait(mutex)} - end - - def test_condvar_nolock_2 - mutex = Mutex.new - condvar = ConditionVariable.new - - Thread.new do - assert_raise(ThreadError) {condvar.wait(mutex)} - end.join - end - - def test_condvar_nolock_3 - mutex = Mutex.new - condvar = ConditionVariable.new - - Thread.new do - assert_raise(ThreadError) {condvar.wait(mutex, 0.1)} - end.join - end - def test_local_barrier dir = File.dirname(__FILE__) lbtest = File.join(dir, "lbtest.rb") Index: test/thread/test_cv.rb =================================================================== --- test/thread/test_cv.rb (revision 0) +++ test/thread/test_cv.rb (revision 38111) @@ -0,0 +1,188 @@ +require 'test/unit' +require 'thread' +require 'tmpdir' +require_relative '../ruby/envutil' + +class TestConditionVariable < Test::Unit::TestCase + def test_condvar_signal_and_wait + mutex = Mutex.new + condvar = ConditionVariable.new + result = [] + mutex.synchronize do + t = Thread.new do + mutex.synchronize do + result << 1 + condvar.signal + end + end + + result << 0 + condvar.wait(mutex) + result << 2 + t.join + end + assert_equal([0, 1, 2], result) + end + + def test_condvar_wait_exception_handling + # Calling wait in the only thread running should raise a ThreadError of + # 'stopping only thread' + mutex = Mutex.new + condvar = ConditionVariable.new + + locked = false + thread = Thread.new do + Thread.current.abort_on_exception = false + mutex.synchronize do + begin + condvar.wait(mutex) + rescue Exception + locked = mutex.locked? + raise + end + end + end + + until thread.stop? + sleep(0.1) + end + + thread.raise Interrupt, "interrupt a dead condition variable" + assert_raise(Interrupt) { thread.value } + assert(locked) + end + + def test_condvar_wait_and_broadcast + nr_threads = 3 + threads = Array.new + mutex = Mutex.new + condvar = ConditionVariable.new + result = [] + + nr_threads.times do |i| + threads[i] = Thread.new do + mutex.synchronize do + result << "C1" + condvar.wait mutex + result << "C2" + end + end + end + sleep 0.1 + mutex.synchronize do + result << "P1" + condvar.broadcast + result << "P2" + end + nr_threads.times do |i| + threads[i].join + end + + assert_equal ["C1", "C1", "C1", "P1", "P2", "C2", "C2", "C2"], result + end + + def test_condvar_wait_deadlock + assert_in_out_err([], <<-INPUT, ["No live threads left. Deadlock?"], []) + require "thread" + + mutex = Mutex.new + cv = ConditionVariable.new + + mesg = nil + begin + mutex.lock + cv.wait mutex + mutex.unlock + rescue Exception => e + mesg = e.message + end + print mesg +INPUT + end + + def test_condvar_wait_deadlock_2 + nr_threads = 3 + threads = Array.new + mutex = Mutex.new + condvar = ConditionVariable.new + + nr_threads.times do |i| + if (i != 0) + mutex.unlock + end + threads[i] = Thread.new do + mutex.synchronize do + condvar.wait mutex + end + end + mutex.lock + end + + assert_raise(Timeout::Error) do + Timeout.timeout(0.1) { condvar.wait mutex } + end + mutex.unlock + threads.each(&:kill) + threads.each(&:join) + end + + def test_condvar_timed_wait + mutex = Mutex.new + condvar = ConditionVariable.new + timeout = 0.3 + locked = false + + t0 = Time.now + mutex.synchronize do + begin + condvar.wait(mutex, timeout) + ensure + locked = mutex.locked? + end + end + t1 = Time.now + t = t1-t0 + + assert_operator(timeout*0.9, :<, t) + assert(locked) + end + + def test_condvar_nolock + mutex = Mutex.new + condvar = ConditionVariable.new + + assert_raise(ThreadError) {condvar.wait(mutex)} + end + + def test_condvar_nolock_2 + mutex = Mutex.new + condvar = ConditionVariable.new + + Thread.new do + assert_raise(ThreadError) {condvar.wait(mutex)} + end.join + end + + def test_condvar_nolock_3 + mutex = Mutex.new + condvar = ConditionVariable.new + + Thread.new do + assert_raise(ThreadError) {condvar.wait(mutex, 0.1)} + end.join + end + + def test_condvar_empty_signal + mutex = Mutex.new + condvar = ConditionVariable.new + + assert_nothing_raised(Exception) { mutex.synchronize {condvar.signal} } + end + + def test_condvar_empty_broadcast + mutex = Mutex.new + condvar = ConditionVariable.new + + assert_nothing_raised(Exception) { mutex.synchronize {condvar.broadcast} } + end +end -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/