summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorsorah <sorah@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-05-23 00:10:49 +0000
committersorah <sorah@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-05-23 00:10:49 +0000
commit6dc0488148c33fe3839e898e011178fa006fa87d (patch)
tree99aff43b6f5f7287b393a101107b122a5ec437df /lib
parent1e13786700925d11ac6aad5fbff1e8bc4826054a (diff)
* lib/test/unit/parallel.rb: Never Ignore SIGINT. When received
Interrupt, immediately puts result and exit. [ruby-dev:43571] * lib/test/unit.rb: When received Interrupt, wait results from workers and correct them. [ruby-dev:43571] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31708 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib')
-rw-r--r--lib/test/unit.rb24
-rw-r--r--lib/test/unit/parallel.rb18
2 files changed, 36 insertions, 6 deletions
diff --git a/lib/test/unit.rb b/lib/test/unit.rb
index 0ab57f0fbd..6061e3b4bd 100644
--- a/lib/test/unit.rb
+++ b/lib/test/unit.rb
@@ -445,7 +445,7 @@ module Test
jobs_status
when /^done (.+?)$/
r = Marshal.load($1.unpack("m")[0])
- result << r[0..1]
+ result << r[0..1] unless r[0..1] == [nil,nil]
rep << {file: worker.real_file,
report: r[2], result: r[3], testcase: r[5]}
$:.push(*r[4]).uniq!
@@ -474,6 +474,24 @@ module Test
shutting_down = true
watchdog.kill if watchdog
+ if @interrupt
+ @ios.select!{|x| @workers_hash[x].status == :running }
+ while !@ios.empty? && (__io = IO.select(@ios,[],[],10))
+ _io = __io[0]
+ _io.each do |io|
+ worker = @workers_hash[io]
+ case worker.read
+ when /^done (.+?)$/
+ r = Marshal.load($1.unpack("m")[0])
+ result << r[0..1] unless r[0..1] == [nil,nil]
+ rep << {file: worker.real_file,
+ report: r[2], result: r[3], testcase: r[5]}
+ $:.push(*r[4]).uniq!
+ @ios.delete(io)
+ end
+ end
+ end
+ end
@workers.each do |worker|
begin
timeout(1) do
@@ -500,9 +518,9 @@ module Test
rep.each do |r|
report.push(*r[:report])
end
- @errors += rep.map{|x| x[:result][0] }.inject(:+)
+ @errors += rep.map{|x| x[:result][0] }.inject(:+)
@failures += rep.map{|x| x[:result][1] }.inject(:+)
- @skips += rep.map{|x| x[:result][2] }.inject(:+)
+ @skips += rep.map{|x| x[:result][2] }.inject(:+)
else
puts ""
puts "Retrying..."
diff --git a/lib/test/unit/parallel.rb b/lib/test/unit/parallel.rb
index e433779a2e..c5d07e673b 100644
--- a/lib/test/unit/parallel.rb
+++ b/lib/test/unit/parallel.rb
@@ -42,7 +42,12 @@ module Test
e, f, s = @errors, @failures, @skips
- result = orig_run_suite(suite, type)
+ begin
+ result = orig_run_suite(suite, type)
+ rescue Interrupt
+ @need_exit = true
+ result = [nil,nil]
+ end
MiniTest::Unit.output = orig_stdout
@@ -73,8 +78,8 @@ module Test
process_args args
@@stop_auto_run = true
@opts = @options.dup
+ @need_exit = false
- Signal.trap(:INT,"IGNORE")
@old_loadpath = []
begin
@stdout = increment_io(STDOUT)
@@ -101,7 +106,14 @@ module Test
end
_run_suites MiniTest::Unit::TestCase.test_suites-suites, $2.to_sym
- @stdout.puts "ready"
+ if @need_exit
+ begin
+ @stdout.puts "bye"
+ rescue Errno::EPIPE; end
+ exit
+ else
+ @stdout.puts "ready"
+ end
when /^quit$/
begin
@stdout.puts "bye"