1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/test/testunit/test_parallel.rb
nagachika 3eb0620c2a merge revision(s) r45953,r45961: [Backport #9767]
* lib/test/unit/parallel.rb: fix test-all parallel failure if a test
	  is skipped after raise.
	  DL::TestFunc#test_sinf is skipped after raise on mingw ruby.
	  But it causes Mashal.load failure due to undefined class/module
	  DL::DLError when doing test-all parallel and test-all doesn't
	  complete. We create new MiniTest::Skip object to avoid Mashal.load
	  failure.
	  [ruby-core:62133] [Bug #9767]

	* test/testunit/test_parallel.rb (TestParallel): add a test.

	* test/testunit/tests_for_parallel/ptest_forth.rb: ditto.
	  But it causes Marshal.load failure due to undefined class/module
	  complete. We create new MiniTest::Skip object to avoid Marshal.load


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_1@46916 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2014-07-23 14:53:36 +00:00

189 lines
5.5 KiB
Ruby

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], PARALLEL_RB,
"--ruby", @options[:ruby].join(" "),
"-j", "t1", "-v", out: o, in: i)
[i,o].each(&:close)
end
def teardown
if @worker_pid && @worker_in
begin
begin
@worker_in.puts "quit"
rescue IOError, Errno::EPIPE
end
timeout(2) do
Process.waitpid(@worker_pid)
end
rescue Timeout::Error
begin
Process.kill(:KILL, @worker_pid)
rescue Errno::ESRCH
end
end
end
end
def test_run
timeout(10) do
assert_match(/^ready/,@worker_out.gets)
@worker_in.puts "run #{TESTS}/ptest_first.rb test"
assert_match(/^okay/,@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_run_multiple_testcase_in_one_file
timeout(10) do
assert_match(/^ready/,@worker_out.gets)
@worker_in.puts "run #{TESTS}/ptest_second.rb test"
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_accept_run_command_multiple_times
timeout(10) do
assert_match(/^ready/,@worker_out.gets)
@worker_in.puts "run #{TESTS}/ptest_first.rb test"
assert_match(/^okay/,@worker_out.gets)
assert_match(/^p/,@worker_out.gets)
assert_match(/^done/,@worker_out.gets)
assert_match(/^ready/,@worker_out.gets)
@worker_in.puts "run #{TESTS}/ptest_second.rb test"
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}/ptest_first.rb test"
while buf = @worker_out.gets
break if /^p (.+?)$/ =~ buf
end
assert_match(/TestA#test_nothing_test = \d+\.\d+ s = \.\n/, $1.chomp.unpack("m")[0])
end
end
def test_done
timeout(10) do
@worker_in.puts "run #{TESTS}/ptest_forth.rb test"
7.times { @worker_out.gets }
buf = @worker_out.gets
assert_match(/^done (.+?)$/, buf)
/^done (.+?)$/ =~ buf
result = Marshal.load($1.chomp.unpack("m")[0])
assert_equal(5, result[0])
assert_equal(2, result[1])
assert_kind_of(Array,result[2])
assert_kind_of(Array,result[3])
assert_kind_of(Array,result[4])
assert_kind_of(Array,result[2][1])
assert_kind_of(MiniTest::Assertion,result[2][0][2])
assert_kind_of(MiniTest::Skip,result[2][1][2])
assert_kind_of(MiniTest::Skip,result[2][2][2])
assert_kind_of(Exception, result[2][3][2])
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
end
class TestParallel < Test::Unit::TestCase
def spawn_runner(*opt_args)
@test_out, o = IO.pipe
@test_pid = spawn(*@options[:ruby], TESTS+"/runner.rb",
"--ruby", @options[:ruby].join(" "),
"-j","t1",*opt_args, out: o, err: 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_ignore_jzero
@test_out, o = IO.pipe
@test_pid = spawn(*@options[:ruby], TESTS+"/runner.rb",
"--ruby", @options[:ruby].join(" "),
"-j","0", out: File::NULL, err: o)
o.close
timeout(10) {
assert_match(/Error: parameter of -j option should be greater than 0/,@test_out.read)
}
end
def test_should_run_all_without_any_leaks
spawn_runner
buf = timeout(10){@test_out.read}
assert_match(/^[SFE\.]{9}$/,buf)
end
def test_should_retry_failed_on_workers
spawn_runner
buf = timeout(10){@test_out.read}
assert_match(/^Retrying\.+$/,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:\nTestD#test_fail_at_worker/,buf)
end
def test_jobs_status
spawn_runner "--jobs-status"
buf = timeout(10){@test_out.read}
assert_match(/\d+=ptest_(first|second|third|forth) */,buf)
end
def test_separate
# this test depends to --jobs-status
spawn_runner "--jobs-status", "--separate"
buf = timeout(10){@test_out.read}
assert(buf.scan(/(\d+?)[:=]/).flatten.uniq.size > 1)
end
end
end