diff options
Diffstat (limited to 'test/thread')
| -rw-r--r-- | test/thread/test_cv.rb | 191 | ||||
| -rw-r--r-- | test/thread/test_queue.rb | 178 | ||||
| -rw-r--r-- | test/thread/test_sync.rb | 57 |
3 files changed, 0 insertions, 426 deletions
diff --git a/test/thread/test_cv.rb b/test/thread/test_cv.rb deleted file mode 100644 index 9a9b407a5b..0000000000 --- a/test/thread/test_cv.rb +++ /dev/null @@ -1,191 +0,0 @@ -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, ["fatal", "No live threads left. Deadlock?"], []) - require "thread" - - mutex = Mutex.new - cv = ConditionVariable.new - - klass = nil - mesg = nil - begin - mutex.lock - cv.wait mutex - mutex.unlock - rescue Exception => e - klass = e.class - mesg = e.message - end - puts klass - 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 diff --git a/test/thread/test_queue.rb b/test/thread/test_queue.rb deleted file mode 100644 index 6b4f10c4d2..0000000000 --- a/test/thread/test_queue.rb +++ /dev/null @@ -1,178 +0,0 @@ -require 'test/unit' -require 'thread' -require 'tmpdir' -require_relative '../ruby/envutil' - -class TestQueue < Test::Unit::TestCase - def test_queue - grind(5, 1000, 15, Queue) - end - - def test_sized_queue - grind(5, 1000, 15, SizedQueue, 1000) - end - - def grind(num_threads, num_objects, num_iterations, klass, *args) - from_workers = klass.new(*args) - to_workers = klass.new(*args) - - workers = (1..num_threads).map { - Thread.new { - while object = to_workers.pop - from_workers.push object - end - } - } - - Thread.new { - num_iterations.times { - num_objects.times { to_workers.push 99 } - num_objects.times { from_workers.pop } - } - }.join - - num_threads.times { to_workers.push nil } - workers.each { |t| t.join } - - assert_equal 0, from_workers.size - assert_equal 0, to_workers.size - end - - def test_sized_queue_initialize - q = SizedQueue.new(1) - assert_equal 1, q.max - assert_raise(ArgumentError) { SizedQueue.new(0) } - assert_raise(ArgumentError) { SizedQueue.new(-1) } - end - - def test_sized_queue_assign_max - q = SizedQueue.new(2) - assert_equal(2, q.max) - q.max = 1 - assert_equal(1, q.max) - assert_raise(ArgumentError) { q.max = 0 } - assert_equal(1, q.max) - assert_raise(ArgumentError) { q.max = -1 } - assert_equal(1, q.max) - end - - def test_queue_pop_interrupt - q = Queue.new - t1 = Thread.new { q.pop } - sleep 0.01 until t1.stop? - t1.kill.join - assert_equal(0, q.num_waiting) - end - - def test_sized_queue_pop_interrupt - q = SizedQueue.new(1) - t1 = Thread.new { q.pop } - sleep 0.01 until t1.stop? - t1.kill.join - assert_equal(0, q.num_waiting) - end - - def test_sized_queue_push_interrupt - q = SizedQueue.new(1) - q.push(1) - t1 = Thread.new { q.push(2) } - sleep 0.01 until t1.stop? - t1.kill.join - assert_equal(0, q.num_waiting) - end - - def test_thr_kill - bug5343 = '[ruby-core:39634]' - Dir.mktmpdir {|d| - timeout = 30 - total_count = 250 - begin - assert_normal_exit(<<-"_eom", bug5343, {:timeout => timeout, :chdir=>d}) - require "thread" - #{total_count}.times do |i| - open("test_thr_kill_count", "w") {|f| f.puts i } - queue = Queue.new - r, w = IO.pipe - th = Thread.start { - queue.push(nil) - r.read 1 - } - queue.pop - th.kill - th.join - end - _eom - rescue Timeout::Error - count = File.read("#{d}/test_thr_kill_count").to_i - flunk "only #{count}/#{total_count} done in #{timeout} seconds." - end - } - end - - def test_sized_queue_clear - # Fill queue, then test that SizedQueue#clear wakes up all waiting threads - sq = SizedQueue.new(2) - 2.times { sq << 1 } - - t1 = Thread.new do - sq << 1 - end - - t2 = Thread.new do - sq << 1 - end - - t3 = Thread.new do - Thread.pass - sq.clear - end - - [t3, t2, t1].each(&:join) - assert_equal sq.length, 2 - end - - def test_sized_queue_throttle - q = SizedQueue.new(1) - i = 0 - consumer = Thread.new do - while q.pop - i += 1 - Thread.pass - end - end - nprod = 4 - npush = 100 - - producer = nprod.times.map do - Thread.new do - npush.times { q.push(true) } - end - end - producer.each(&:join) - q.push(nil) - consumer.join - assert_equal(nprod * npush, i) - end - - def test_queue_thread_raise - q = Queue.new - th1 = Thread.new do - begin - q.pop - rescue RuntimeError - sleep - end - end - th2 = Thread.new do - sleep 0.1 - q.pop - end - sleep 0.1 - th1.raise - sleep 0.1 - q << :s - assert_nothing_raised(TimeoutError) do - timeout(1) { th2.join } - end - end -end diff --git a/test/thread/test_sync.rb b/test/thread/test_sync.rb deleted file mode 100644 index 870a8e2d39..0000000000 --- a/test/thread/test_sync.rb +++ /dev/null @@ -1,57 +0,0 @@ -require 'test/unit' -require 'sync' -require 'timeout' - -class SyncTest < Test::Unit::TestCase - class Tester - include Sync_m - end - - def test_sync_lock_and_wakeup - tester = Tester.new - - tester.sync_lock(:EX) - - t = Thread.new { tester.sync_lock(:EX) } - - sleep 0.1 until t.stop? - t.wakeup - sleep 0.1 until t.stop? - - assert_equal(tester.sync_waiting.uniq, tester.sync_waiting) - end - - def test_sync_upgrade_and_wakeup - tester = Tester.new - tester.sync_lock(:SH) - - t = Thread.new do - tester.sync_lock(:SH) - tester.sync_lock(:EX) - end - - sleep 0.1 until t.stop? - t.wakeup - sleep 0.1 until t.stop? - - tester.sync_upgrade_waiting.each { |ary| - assert(!tester.sync_waiting.include?(ary[0])) - } - assert_equal(tester.sync_waiting.uniq, tester.sync_waiting) - assert_equal(tester.sync_waiting, []) - end - - def test_sync_lock_and_raise - tester= Tester.new - tester.sync_lock(:EX) - - t = Thread.new { tester.sync_lock(:EX) } - - sleep 0.1 until t.stop? - t.raise - sleep 0.1 while t.alive? - - assert_equal(tester.sync_waiting.uniq, tester.sync_waiting) - assert_equal(tester.sync_waiting, []) - end -end |
