In Files

  • test/unit/parallel.rb

Test::Unit::Worker

Public Instance Methods

_run_suite(suite, type) click to toggle source
 
               # File test/unit/parallel.rb, line 27
def _run_suite(suite, type)
  r = report.dup
  orig_testout = MiniTest::Unit.output
  i,o = IO.pipe

  MiniTest::Unit.output = o
  orig_stdin, orig_stdout = $stdin, $stdout

  th = Thread.new do
    begin
      while buf = (self.verbose ? i.gets : i.read(5))
        @stdout.puts "p #{[buf].pack("m").gsub("\n","")}"
      end
    rescue IOError
    rescue Errno::EPIPE
    end
  end

  e, f, s = @errors, @failures, @skips

  begin
    result = orig_run_suite(suite, type)
  rescue Interrupt
    @need_exit = true
    result = [nil,nil]
  end

  MiniTest::Unit.output = orig_testout
  $stdin = orig_stdin
  $stdout = orig_stdout

  o.close
  begin
    th.join
  rescue IOError
    raise unless ["stream closed","closed stream"].include? $!.message
  end
  i.close

  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
  $stdin = orig_stdin
  $stdout = orig_stdout
  o.close if o && !o.closed?
  i.close if i && !i.closed?
end
            
Also aliased as: orig_run_suite
_run_suites(suites, type) click to toggle source
 
               # File test/unit/parallel.rb, line 21
def _run_suites(suites, type)
  suites.map do |suite|
    _run_suite(suite, type)
  end
end
            
increment_io(orig) click to toggle source
 
               # File test/unit/parallel.rb, line 15
def increment_io(orig)
  *rest, io = 32.times.inject([orig.dup]){|ios, | ios << ios.last.dup }
  rest.each(&:close)
  io
end
            
orig_run_suite(suite, type) click to toggle source
Alias for: _run_suite
run(args = []) click to toggle source
 
               # File test/unit/parallel.rb, line 83
def run(args = [])
  process_args args
  @@stop_auto_run = true
  @opts = @options.dup
  @need_exit = false

  @old_loadpath = []
  begin
    @stdout = increment_io(STDOUT)
    @stdin = increment_io(STDIN)
    @stdout.sync = true
    @stdout.puts "ready"
    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"

        @options = @opts.dup
        suites = MiniTest::Unit::TestCase.test_suites

        begin
          require $1
        rescue LoadError
          @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

        if @need_exit
          begin
            @stdout.puts "bye"
          rescue Errno::EPIPE; end
          exit
        else
          @stdout.puts "ready"
        end
      when /^quit$/
        begin
          @stdout.puts "bye"
        rescue Errno::EPIPE; end
        exit
      end
    end
  rescue Errno::EPIPE
  rescue Exception => e
    begin
      @stdout.puts "bye #{[Marshal.dump(e)].pack("m").gsub("\n","")}"
    rescue Errno::EPIPE;end
    exit
  ensure
    @stdin.close
    @stdout.close
  end
end
            

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.

blog comments powered by Disqus