From a790bd0bd775927583ff5502b4ccd54e6cfb0706 Mon Sep 17 00:00:00 2001 From: sorah Date: Tue, 22 Feb 2011 03:36:38 +0000 Subject: * lib/test/unit.rb: Add new options; --jobs,-j,--ruby,--jobs-status, --no-retry. [Feature #4415] [ruby-dev:43226],[ruby-dev:43222],[ruby-core:35294] * lib/test/unit/parallel.rb: Used at test/unit --jobs(-j) option. * test/csv/test_serialization.rb: test/unit parallel running ready. * test/rake/test_file_task.rb: test/unit parallel running ready. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@30939 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/test/unit/parallel.rb | 139 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 lib/test/unit/parallel.rb (limited to 'lib/test/unit') diff --git a/lib/test/unit/parallel.rb b/lib/test/unit/parallel.rb new file mode 100644 index 0000000000..acfdc84bb4 --- /dev/null +++ b/lib/test/unit/parallel.rb @@ -0,0 +1,139 @@ +require 'test/unit' + +module Test + module Unit + class Worker < Runner + class << self + undef autorun + end + + alias orig_run_suite _run_suite + undef _run_suite + undef _run_suites + + def _run_suites suites, type + suites.map do |suite| + result = _run_suite(suite, type) + end + end + + def _run_suite(suite, type) + r = report.dup + orig_stdout = MiniTest::Unit.output + i,o = IO.pipe + MiniTest::Unit.output = o + + stdout = STDOUT.dup + + th = Thread.new(i.dup) do |io| + begin + while buf = (self.verbose ? io.gets : io.read(5)) + stdout.puts "p #{[buf].pack("m").gsub("\n","")}" + end + rescue IOError + rescue Errno::EPIPE + end + end + + e, f, s = @errors, @failures, @skips + + result = orig_run_suite(suite, type) + + MiniTest::Unit.output = orig_stdout + + o.close + i.close + + begin + th.join + rescue IOError + raise unless ["stream closed","closed stream"].include? $!.message + end + + result << (report - r) + result << [@errors-e,@failures-f,@skips-s] + result << ($: - @old_loadpath) + result << suite.name + + begin + STDOUT.puts "done #{[Marshal.dump(result)].pack("m").gsub("\n","")}" + rescue Errno::EPIPE; end + return result + ensure + MiniTest::Unit.output = orig_stdout + o.close if o && !o.closed? + i.close if i && !i.closed? + end + + def run(args = []) + process_args args + @@stop_auto_run = true + @opts = @options.dup + + STDOUT.sync = true + STDOUT.puts "ready" + Signal.trap(:INT,"IGNORE") + + + @old_loadpath = [] + begin + stdin = STDIN.dup + stdout = STDOUT.dup + while buf = stdin.gets + case buf.chomp + when /^loadpath (.+?)$/ + @old_loadpath = $:.dup + $:.push(*Marshal.load($1.unpack("m")[0].force_encoding("ASCII-8BIT"))).uniq! + when /^run (.+?) (.+?)$/ + STDOUT.puts "okay" + + th = Thread.new do + while puf = stdin.gets + if puf.chomp == "quit" + begin + stdout.puts "bye" + rescue Errno::EPIPE; end + exit + end + end + end + + @options = @opts.dup + suites = MiniTest::Unit::TestCase.test_suites + + begin + require $1 + rescue LoadError + th.kill + STDOUT.puts "after #{[Marshal.dump([$1, $!])].pack("m").gsub("\n","")}" + STDOUT.puts "ready" + next + end + _run_suites MiniTest::Unit::TestCase.test_suites-suites, $2.to_sym + + STDIN.reopen(stdin) + STDOUT.reopen(stdout) + + th.kill + STDOUT.puts "ready" + when /^quit$/ + begin + STDOUT.puts "bye" + rescue Errno::EPIPE; end + exit + end + end + rescue Exception => e + begin + STDOUT.puts "bye #{[Marshal.dump(e)].pack("m").gsub("\n","")}" + rescue Errno::EPIPE;end + exit + ensure + stdin.close + end + end + end + end +end + +Test::Unit::Worker.new.run(ARGV) -- cgit v1.2.3