123456789_123456789_123456789_123456789_123456789_

Class: Test::Unit::TestSuiteThreadRunner

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
Instance Chain:
Inherits: Test::Unit::TestSuiteRunner
Defined in: lib/test/unit/test-suite-thread-runner.rb

Class Attribute Summary

Class Method Summary

Instance Method Summary

Constructor Details

This class inherits a constructor from Test::Unit::TestSuiteRunner

Class Method Details

.run_all_tests {|TestThreadRunContext.new(self, queue, shutdowns)| ... }

Yields:

[ GitHub ]

  
# File 'lib/test/unit/test-suite-thread-runner.rb', line 15

def run_all_tests
  n_workers = TestSuiteRunner.n_workers

  queue = Thread::Queue.new
  shutdowns = []
  yield(TestThreadRunContext.new(self, queue, shutdowns))
  n_workers.times do
    queue << nil
  end

  workers = []
  sub_exceptions = []
  n_workers.times do |i|
    workers << Thread.new(i) do |worker_id|
      begin
        loop do
          task = queue.pop
          break if task.nil?
          catch do |stop_tag|
            task.call(stop_tag)
          end
        end
      rescue Exception => exception
        sub_exceptions << exception
      end
    end
  end
  workers.each(&:join)

  shutdowns.each(&:call)
  sub_exceptions.each do |exception|
    raise exception
  end
end

Instance Method Details

#run(result, run_context: nil, &progress_block)

[ GitHub ]

  
# File 'lib/test/unit/test-suite-thread-runner.rb', line 51

def run(result, run_context: nil, &progress_block)
  yield(TestSuite::STARTED, @test_suite.name)
  yield(TestSuite::STARTED_OBJECT, @test_suite)
  run_startup(result)
  run_tests(result, run_context: run_context, &progress_block)
ensure
  run_context.shutdowns << lambda do
    begin
      run_shutdown(result)
    ensure
      yield(TestSuite::FINISHED, @test_suite.name)
      yield(TestSuite::FINISHED_OBJECT, @test_suite)
    end
  end
end

#run_tests(result, run_context: nil, &progress_block) (private)

[ GitHub ]

  
# File 'lib/test/unit/test-suite-thread-runner.rb', line 68

def run_tests(result, run_context: nil, &progress_block)
  @test_suite.tests.each do |test|
    if test.is_a?(TestSuite) or not @test_suite.parallel_safe?
      run_test(test, result, run_context: run_context, &progress_block)
    else
      task = lambda do |stop_tag|
        sub_result = SubTestResult.new(result)
        sub_result.stop_tag = stop_tag
        run_test(test, sub_result, run_context: run_context, &progress_block)
      end
      run_context.queue << task
    end
  end
end