def run_test_suites(test_suites)
queue = Queue.new
test_suites.each do |suite_name, test_script_paths|
next unless @tester.target_test_suite?(suite_name)
test_script_paths.each do |test_script_path|
test_name = test_script_path.basename(".*").to_s
next unless @tester.target_test?(test_name)
queue << [suite_name, test_script_path, test_name]
@result.n_total_tests += 1
end
end
@tester.n_workers.times do
queue << nil
end
workers = []
@tester.n_workers.times do |i|
workers << Worker.new(i, @tester, @result, @reporter)
end
@result.workers = workers
@reporter.on_start(@result)
succeeded = true
worker_threads = []
@tester.n_workers.times do |i|
worker = workers[i]
worker_threads << Thread.new do
succeeded = false unless worker.run(queue)
end
end
begin
worker_threads.each(&:join)
rescue Interrupt
workers.each do |worker|
worker.interrupt
end
end
succeeded
end