Method: Test::Unit::Worker#_run_suite

Defined in:
lib/test/unit/parallel.rb

#_run_suite(suite, type) ⇒ Object

:nodoc:



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/test/unit/parallel.rb', line 27

def _run_suite(suite, type) # :nodoc:
  @partial_report = []
  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))
        _report "p", buf
      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 << @partial_report
  @partial_report = nil
  result << [@errors-e,@failures-f,@skips-s]
  result << ($: - @old_loadpath)
  result << suite.name

  begin
    _report "done", Marshal.dump(result)
  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