diff options
Diffstat (limited to 'jni/ruby/test/testunit/test_parallel.rb')
| -rw-r--r-- | jni/ruby/test/testunit/test_parallel.rb | 191 | 
1 files changed, 191 insertions, 0 deletions
| diff --git a/jni/ruby/test/testunit/test_parallel.rb b/jni/ruby/test/testunit/test_parallel.rb new file mode 100644 index 0000000..db3f47e --- /dev/null +++ b/jni/ruby/test/testunit/test_parallel.rb @@ -0,0 +1,191 @@ +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 +    ensure +      @worker_in.close +      @worker_out.close +    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 | 
