1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/lib/test/unit/parallel.rb
sorah a790bd0bd7 * 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
2011-02-22 03:36:38 +00:00

139 lines
3.4 KiB
Ruby

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)