summaryrefslogtreecommitdiff
path: root/lib/test/unit
diff options
context:
space:
mode:
authorsorah <sorah@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-02-22 03:36:38 +0000
committersorah <sorah@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-02-22 03:36:38 +0000
commita790bd0bd775927583ff5502b4ccd54e6cfb0706 (patch)
tree6bf05fd433defc490279b1a724609053a5924800 /lib/test/unit
parenta6fcf3e5e266836b983e50242dc18ef438320e90 (diff)
* 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
Diffstat (limited to 'lib/test/unit')
-rw-r--r--lib/test/unit/parallel.rb139
1 files changed, 139 insertions, 0 deletions
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)