mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* test/testunit/test_parallel.rb, test/testunit/parallel/*:
Test for r30939. * lib/test/unit.rb: For test. * lib/test/parallel.rb: For test. * lib/test/unit/testcase.rb: For test. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@30947 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
92729ad473
commit
48fa6ed529
10 changed files with 283 additions and 3 deletions
|
@ -1,3 +1,12 @@
|
||||||
|
Wed Feb 23 23:07:38 2011 Shota Fukumori (sora_h) <sorah@tubusu.net>
|
||||||
|
|
||||||
|
* test/testunit/test_parallel.rb, test/testunit/parallel/*:
|
||||||
|
Test for r30939.
|
||||||
|
* lib/test/unit.rb: For test.
|
||||||
|
* lib/test/parallel.rb: For test.
|
||||||
|
* lib/test/unit/testcase.rb: For test.
|
||||||
|
|
||||||
|
|
||||||
Wed Feb 23 22:05:13 2011 Tanaka Akira <akr@fsij.org>
|
Wed Feb 23 22:05:13 2011 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
* ext/openssl/ossl_engine.c: parenthesize macro arguments.
|
* ext/openssl/ossl_engine.c: parenthesize macro arguments.
|
||||||
|
|
|
@ -87,7 +87,12 @@ module Test
|
||||||
end
|
end
|
||||||
|
|
||||||
opts.on '-j N', '--jobs N', "Allow run tests with N jobs at once" do |a|
|
opts.on '-j N', '--jobs N', "Allow run tests with N jobs at once" do |a|
|
||||||
options[:parallel] = a.to_i
|
if /^t/ =~ a
|
||||||
|
options[:testing] = true # For testing
|
||||||
|
options[:parallel] = a[1..-1].to_i
|
||||||
|
else
|
||||||
|
options[:parallel] = a.to_i
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
opts.on '--no-retry', "Don't retry running testcase when --jobs specified" do
|
opts.on '--no-retry', "Don't retry running testcase when --jobs specified" do
|
||||||
|
|
|
@ -10,6 +10,7 @@ module Test
|
||||||
alias orig_run_suite _run_suite
|
alias orig_run_suite _run_suite
|
||||||
undef _run_suite
|
undef _run_suite
|
||||||
undef _run_suites
|
undef _run_suites
|
||||||
|
undef run
|
||||||
|
|
||||||
def _run_suites suites, type
|
def _run_suites suites, type
|
||||||
suites.map do |suite|
|
suites.map do |suite|
|
||||||
|
@ -42,13 +43,12 @@ module Test
|
||||||
MiniTest::Unit.output = orig_stdout
|
MiniTest::Unit.output = orig_stdout
|
||||||
|
|
||||||
o.close
|
o.close
|
||||||
i.close
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
th.join
|
th.join
|
||||||
rescue IOError
|
rescue IOError
|
||||||
raise unless ["stream closed","closed stream"].include? $!.message
|
raise unless ["stream closed","closed stream"].include? $!.message
|
||||||
end
|
end
|
||||||
|
i.close
|
||||||
|
|
||||||
result << (report - r)
|
result << (report - r)
|
||||||
result << [@errors-e,@failures-f,@skips-s]
|
result << [@errors-e,@failures-f,@skips-s]
|
||||||
|
|
177
test/testunit/test_parallel.rb
Normal file
177
test/testunit/test_parallel.rb
Normal file
|
@ -0,0 +1,177 @@
|
||||||
|
require 'test/unit'
|
||||||
|
require 'timeout'
|
||||||
|
|
||||||
|
module TestParallel
|
||||||
|
PARALLEL_RB = "#{File.dirname(__FILE__)}/../../lib/test/unit/parallel.rb"
|
||||||
|
TESTS = "#{File.dirname(__FILE__)}/tests_for_parallel"
|
||||||
|
|
||||||
|
|
||||||
|
class TestParallelWorker < Test::Unit::TestCase
|
||||||
|
def setup
|
||||||
|
i, @worker_in = IO.pipe
|
||||||
|
@worker_out, o = IO.pipe
|
||||||
|
@worker_pid = spawn(*@options[:ruby].split(/ /), PARALLEL_RB,
|
||||||
|
"-j", "t1", "-v", out: o, in: i)
|
||||||
|
[i,o].each(&:close)
|
||||||
|
end
|
||||||
|
|
||||||
|
def teardown
|
||||||
|
begin
|
||||||
|
@worker_in.puts "quit"
|
||||||
|
timeout(2) do
|
||||||
|
Process.waitpid(@worker_pid)
|
||||||
|
end
|
||||||
|
rescue IOError, Errno::EPIPE, Timeout::Error
|
||||||
|
Process.kill(:KILL, @worker_pid)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_run
|
||||||
|
timeout(10) do
|
||||||
|
assert_match(/^ready/,@worker_out.gets)
|
||||||
|
@worker_in.puts "run #{TESTS}/test_first.rb ptest"
|
||||||
|
assert_match(/^okay/,@worker_out.gets)
|
||||||
|
assert_match(/^p/,@worker_out.gets)
|
||||||
|
assert_match(/^done/,@worker_out.gets)
|
||||||
|
assert_match(/^done/,@worker_out.gets)
|
||||||
|
assert_match(/^ready/,@worker_out.gets)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_run_multiple_testcase_in_one_file
|
||||||
|
timeout(10) do
|
||||||
|
assert_match(/^ready/,@worker_out.gets)
|
||||||
|
@worker_in.puts "run #{TESTS}/test_second.rb ptest"
|
||||||
|
assert_match(/^okay/,@worker_out.gets)
|
||||||
|
assert_match(/^p/,@worker_out.gets)
|
||||||
|
assert_match(/^done/,@worker_out.gets)
|
||||||
|
assert_match(/^p/,@worker_out.gets)
|
||||||
|
assert_match(/^done/,@worker_out.gets)
|
||||||
|
assert_match(/^done/,@worker_out.gets)
|
||||||
|
assert_match(/^ready/,@worker_out.gets)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_accept_run_command_multiple_times
|
||||||
|
timeout(10) do
|
||||||
|
assert_match(/^ready/,@worker_out.gets)
|
||||||
|
@worker_in.puts "run #{TESTS}/test_first.rb ptest"
|
||||||
|
assert_match(/^okay/,@worker_out.gets)
|
||||||
|
assert_match(/^p/,@worker_out.gets)
|
||||||
|
assert_match(/^done/,@worker_out.gets)
|
||||||
|
assert_match(/^done/,@worker_out.gets)
|
||||||
|
assert_match(/^ready/,@worker_out.gets)
|
||||||
|
@worker_in.puts "run #{TESTS}/test_second.rb ptest"
|
||||||
|
assert_match(/^okay/,@worker_out.gets)
|
||||||
|
assert_match(/^p/,@worker_out.gets)
|
||||||
|
assert_match(/^done/,@worker_out.gets)
|
||||||
|
assert_match(/^p/,@worker_out.gets)
|
||||||
|
assert_match(/^done/,@worker_out.gets)
|
||||||
|
assert_match(/^ready/,@worker_out.gets)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_p
|
||||||
|
timeout(10) do
|
||||||
|
@worker_in.puts "run #{TESTS}/test_first.rb ptest"
|
||||||
|
while buf = @worker_out.gets
|
||||||
|
break if /^p (.+?)$/ =~ buf
|
||||||
|
end
|
||||||
|
assert_match(/TestA#ptest_nothing_test = \d+\.\d+ s = \.\n/, $1.chomp.unpack("m")[0])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_done
|
||||||
|
timeout(10) do
|
||||||
|
@worker_in.puts "run #{TESTS}/test_forth.rb ptest"
|
||||||
|
i = 0
|
||||||
|
while buf = @worker_out.gets
|
||||||
|
if /^done (.+?)$/ =~ buf
|
||||||
|
i += 1
|
||||||
|
break if i == 2 # Break at 2nd "done"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
result = Marshal.load($1.chomp.unpack("m")[0])
|
||||||
|
|
||||||
|
assert_equal(result[0],3)
|
||||||
|
assert_equal(result[1],2)
|
||||||
|
assert_kind_of(Array,result[2])
|
||||||
|
assert_kind_of(Array,result[3])
|
||||||
|
assert_kind_of(Array,result[4])
|
||||||
|
assert_match(/Skipped:$/,result[2][0])
|
||||||
|
assert_match(/Failure:$/,result[2][1])
|
||||||
|
assert_equal(result[5], "TestE")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_quit
|
||||||
|
timeout(10) do
|
||||||
|
@worker_in.puts "quit"
|
||||||
|
assert_match(/^bye$/m,@worker_out.read)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_quit_in_test
|
||||||
|
timeout(10) do
|
||||||
|
@worker_in.puts "run #{TESTS}/test_third.rb ptest"
|
||||||
|
@worker_in.puts "quit"
|
||||||
|
assert_match(/^ready\nokay\nbye/m,@worker_out.read)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TestParallel < Test::Unit::TestCase
|
||||||
|
def spawn_runner(*opt_args)
|
||||||
|
@test_out, o = IO.pipe
|
||||||
|
@test_pid = spawn(*@options[:ruby].split(/ /), TESTS+"/runner.rb",
|
||||||
|
"-j","t2","-x","sleeping",*opt_args, out: o)
|
||||||
|
o.close
|
||||||
|
end
|
||||||
|
|
||||||
|
def teardown
|
||||||
|
begin
|
||||||
|
if @test_pid
|
||||||
|
timeout(2) do
|
||||||
|
Process.waitpid(@test_pid)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
rescue Timeout::Error
|
||||||
|
Process.kill(:KILL, @test_pid) if @test_pid
|
||||||
|
ensure
|
||||||
|
@test_out.close if @test_out
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
#def test_childs
|
||||||
|
#end
|
||||||
|
|
||||||
|
def test_should_run_all_without_any_leaks
|
||||||
|
spawn_runner
|
||||||
|
buf = timeout(10){@test_out.read}
|
||||||
|
assert_match(/^\.+SF\.+F\.*$/,buf)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_should_retry_failed_on_workers
|
||||||
|
spawn_runner
|
||||||
|
buf = timeout(10){@test_out.read}
|
||||||
|
assert_match(/^Retrying\.+$/,buf)
|
||||||
|
assert_match(/^\.*SF\.*$/,buf)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_no_retry_option
|
||||||
|
spawn_runner "--no-retry"
|
||||||
|
buf = timeout(10){@test_out.read}
|
||||||
|
refute_match(/^Retrying\.+$/,buf)
|
||||||
|
assert_match(/^ +\d+\) Failure:\nptest_fail_at_worker\(TestD\)/,buf)
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_jobs_status
|
||||||
|
spawn_runner "--jobs-status"
|
||||||
|
buf = timeout(10){@test_out.read}
|
||||||
|
assert_match(/\d+:(ready|prepare|running) */,buf)
|
||||||
|
assert_match(/test_(first|second|third|forth) */,buf)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
31
test/testunit/tests_for_parallel/misc.rb
Normal file
31
test/testunit/tests_for_parallel/misc.rb
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
module Test
|
||||||
|
module Unit
|
||||||
|
class Worker
|
||||||
|
def run_tests
|
||||||
|
_run_anything :ptest
|
||||||
|
end
|
||||||
|
end
|
||||||
|
class Runner
|
||||||
|
def run_tests
|
||||||
|
_run_anything :ptest
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
module MiniTest
|
||||||
|
class Unit
|
||||||
|
class << TestCase
|
||||||
|
alias ptest_suites test_suites
|
||||||
|
def ptest_methods;[];end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TestCaseForParallelTest < Test::Unit::TestCase
|
||||||
|
class << self
|
||||||
|
undef ptest_methods
|
||||||
|
def ptest_methods
|
||||||
|
public_instance_methods(true).grep(/^ptest/).map { |m| m.to_s }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
7
test/testunit/tests_for_parallel/runner.rb
Normal file
7
test/testunit/tests_for_parallel/runner.rb
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
require 'rbconfig'
|
||||||
|
require 'test/unit'
|
||||||
|
require_relative 'misc'
|
||||||
|
|
||||||
|
src_testdir = File.dirname(File.expand_path(__FILE__))
|
||||||
|
|
||||||
|
exit Test::Unit::AutoRunner.run(true, src_testdir)
|
8
test/testunit/tests_for_parallel/test_first.rb
Normal file
8
test/testunit/tests_for_parallel/test_first.rb
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
require 'test/unit'
|
||||||
|
require_relative "misc.rb"
|
||||||
|
|
||||||
|
class TestA < TestCaseForParallelTest
|
||||||
|
def ptest_nothing_test
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
17
test/testunit/tests_for_parallel/test_forth.rb
Normal file
17
test/testunit/tests_for_parallel/test_forth.rb
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
require 'test/unit'
|
||||||
|
require_relative "misc.rb"
|
||||||
|
|
||||||
|
class TestE < TestCaseForParallelTest
|
||||||
|
def ptest_not_fail
|
||||||
|
assert_equal(1,1)
|
||||||
|
end
|
||||||
|
|
||||||
|
def ptest_always_skip
|
||||||
|
skip
|
||||||
|
end
|
||||||
|
|
||||||
|
def ptest_always_fail
|
||||||
|
assert_equal(0,1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
12
test/testunit/tests_for_parallel/test_second.rb
Normal file
12
test/testunit/tests_for_parallel/test_second.rb
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
require 'test/unit'
|
||||||
|
require_relative "misc.rb"
|
||||||
|
|
||||||
|
class TestB < TestCaseForParallelTest
|
||||||
|
def ptest_nothing
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class TestC < TestCaseForParallelTest
|
||||||
|
def ptest_nothing
|
||||||
|
end
|
||||||
|
end
|
14
test/testunit/tests_for_parallel/test_third.rb
Normal file
14
test/testunit/tests_for_parallel/test_third.rb
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
require 'test/unit'
|
||||||
|
require_relative "misc.rb"
|
||||||
|
|
||||||
|
class TestD < TestCaseForParallelTest
|
||||||
|
def ptest_sleeping
|
||||||
|
sleep 2
|
||||||
|
end
|
||||||
|
|
||||||
|
def ptest_fail_at_worker
|
||||||
|
if MiniTest::Unit.output != STDOUT
|
||||||
|
assert_equal(0,1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
Loading…
Reference in a new issue