diff options
Diffstat (limited to 'tool/test')
28 files changed, 778 insertions, 534 deletions
diff --git a/tool/test/init.rb b/tool/test/init.rb new file mode 100644 index 0000000000..3a1143d01d --- /dev/null +++ b/tool/test/init.rb @@ -0,0 +1,18 @@ +# This file includes the settings for "make test-all". +# Note that this file is loaded not only by test/runner.rb but also by tool/lib/test/unit/parallel.rb. + +ENV["GEM_SKIP"] = ENV["GEM_HOME"] = ENV["GEM_PATH"] = "".freeze +ENV.delete("RUBY_CODESIGN") + +Warning[:experimental] = false + +$LOAD_PATH.unshift File.expand_path("../lib", __dir__) + +require 'test/unit' + +require "profile_test_all" if ENV.key?('RUBY_TEST_ALL_PROFILE') +require "tracepointchecker" +require "zombie_hunter" +require "iseq_loader_checker" +require "gc_checker" +require_relative "../test-coverage.rb" if ENV.key?('COVERAGE') diff --git a/tool/test/runner.rb b/tool/test/runner.rb index 60d9af24b0..9001fc2d06 100644 --- a/tool/test/runner.rb +++ b/tool/test/runner.rb @@ -1,16 +1,7 @@ # frozen_string_literal: true require 'rbconfig' -$LOAD_PATH.unshift File.expand_path("../lib", __dir__) - -require 'test/unit' - -require "profile_test_all" if ENV.key?('RUBY_TEST_ALL_PROFILE') -require "tracepointchecker" -require "zombie_hunter" -require "iseq_loader_checker" -require "gc_compact_checker" -require_relative "../test-coverage.rb" if ENV.key?('COVERAGE') +require_relative "init" case $0 when __FILE__ @@ -18,6 +9,6 @@ when __FILE__ when "-e" # No default directory else - dir = File.expand_path("..", $0) + dir = File.realdirpath("..", $0) end exit Test::Unit::AutoRunner.run(true, dir) diff --git a/tool/test/test_sync_default_gems.rb b/tool/test/test_sync_default_gems.rb new file mode 100755 index 0000000000..e64c6c6fda --- /dev/null +++ b/tool/test/test_sync_default_gems.rb @@ -0,0 +1,297 @@ +#!/usr/bin/ruby +require 'test/unit' +require 'stringio' +require 'tmpdir' +require_relative '../sync_default_gems' + +module Test_SyncDefaultGems + class TestMessageFilter < Test::Unit::TestCase + def assert_message_filter(expected, trailers, input, repo = "ruby/test", sha = "0123456789") + subject, *expected = expected + expected = [ + "[#{repo}] #{subject}\n", + *expected.map {_1+"\n"}, + "\n", + "https://github.com/#{repo}/commit/#{sha[0, 10]}\n", + ] + if trailers + expected << "\n" + expected.concat(trailers.map {_1+"\n"}) + end + + out, err = capture_output do + SyncDefaultGems.message_filter(repo, sha, input: StringIO.new(input, "r")) + end + + all_assertions do |a| + a.for("error") {assert_empty err} + a.for("result") {assert_pattern_list(expected, out)} + end + end + + def test_subject_only + expected = [ + "initial commit", + ] + assert_message_filter(expected, nil, "initial commit") + end + + def test_link_in_parenthesis + expected = [ + "fix (https://github.com/ruby/test/pull/1)", + ] + assert_message_filter(expected, nil, "fix (#1)") + end + + def test_co_authored_by + expected = [ + "commit something", + ] + trailers = [ + "Co-Authored-By: git <git@ruby-lang.org>", + ] + assert_message_filter(expected, trailers, [expected, "", trailers, ""].join("\n")) + end + + def test_multiple_co_authored_by + expected = [ + "many commits", + ] + trailers = [ + "Co-authored-by: git <git@ruby-lang.org>", + "Co-authored-by: svn <svn@ruby-lang.org>", + ] + assert_message_filter(expected, trailers, [expected, "", trailers, ""].join("\n")) + end + + def test_co_authored_by_no_newline + expected = [ + "commit something", + ] + trailers = [ + "Co-Authored-By: git <git@ruby-lang.org>", + ] + assert_message_filter(expected, trailers, [expected, "", trailers].join("\n")) + end + + def test_dot_ending_subject + expected = [ + "subject with a dot.", + "", + "- next body line", + ] + assert_message_filter(expected, nil, [expected[0], expected[2], ""].join("\n")) + end + end + + class TestSyncWithCommits < Test::Unit::TestCase + def setup + super + @target = nil + pend "No git" unless system("git --version", out: IO::NULL) + @testdir = Dir.mktmpdir("sync") + @git_config = %W"HOME GIT_CONFIG_GLOBAL".each_with_object({}) {|k, c| c[k] = ENV[k]} + ENV["HOME"] = @testdir + ENV["GIT_CONFIG_GLOBAL"] = @testdir + "/gitconfig" + git(*%W"config --global user.email test@ruby-lang.org") + git(*%W"config --global user.name", "Ruby") + git(*%W"config --global init.defaultBranch default") + @target = "sync-test" + SyncDefaultGems::REPOSITORIES[@target] = ["ruby/#{@target}", "default"] + @sha = {} + @origdir = Dir.pwd + Dir.chdir(@testdir) + ["src", @target].each do |dir| + git(*%W"init -q #{dir}") + File.write("#{dir}/.gitignore", "*~\n") + Dir.mkdir("#{dir}/lib") + File.write("#{dir}/lib/common.rb", ":ok\n") + Dir.mkdir("#{dir}/.github") + Dir.mkdir("#{dir}/.github/workflows") + File.write("#{dir}/.github/workflows/default.yml", "default:\n") + git(*%W"add .gitignore lib/common.rb .github", chdir: dir) + git(*%W"commit -q -m", "Initialize", chdir: dir) + if dir == "src" + File.write("#{dir}/lib/fine.rb", "return\n") + Dir.mkdir("#{dir}/test") + File.write("#{dir}/test/test_fine.rb", "return\n") + git(*%W"add lib/fine.rb test/test_fine.rb", chdir: dir) + git(*%W"commit -q -m", "Looks fine", chdir: dir) + end + Dir.mkdir("#{dir}/tool") + File.write("#{dir}/tool/ok", "#!/bin/sh\n""echo ok\n") + git(*%W"add tool/ok", chdir: dir) + git(*%W"commit -q -m", "Add tool #{dir}", chdir: dir) + @sha[dir] = top_commit(dir) + end + git(*%W"remote add #{@target} ../#{@target}", chdir: "src") + end + + def teardown + if @target + Dir.chdir(@origdir) + SyncDefaultGems::REPOSITORIES.delete(@target) + ENV.update(@git_config) + FileUtils.rm_rf(@testdir) + end + super + end + + def capture_process_output_to(outputs) + return yield unless outputs&.empty? == false + IO.pipe do |r, w| + orig = outputs.map {|out| out.dup} + outputs.each {|out| out.reopen(w)} + w.close + reader = Thread.start {r.read} + yield + ensure + outputs.each {|out| o = orig.shift; out.reopen(o); o.close} + return reader.value + end + end + + def capture_process_outputs + out = err = nil + synchronize do + out = capture_process_output_to(STDOUT) do + err = capture_process_output_to(STDERR) do + yield + end + end + end + return out, err + end + + def git(*commands, **opts) + system("git", *commands, exception: true, **opts) + end + + def top_commit(dir, format: "%H") + IO.popen(%W[git log --format=#{format} -1], chdir: dir, &:read)&.chomp + end + + def assert_sync(commits = true, success: true, editor: nil) + result = nil + out = capture_process_output_to([STDOUT, STDERR]) do + Dir.chdir("src") do + orig_editor = ENV["GIT_EDITOR"] + ENV["GIT_EDITOR"] = editor || 'false' + edit = true if editor + + result = SyncDefaultGems.sync_default_gems_with_commits(@target, commits, edit: edit) + ensure + ENV["GIT_EDITOR"] = orig_editor + end + end + assert_equal(success, result, out) + out + end + + def test_sync + File.write("#@target/lib/common.rb", "# OK!\n") + git(*%W"commit -q -m", "OK", "lib/common.rb", chdir: @target) + out = assert_sync() + assert_not_equal(@sha["src"], top_commit("src"), out) + assert_equal("# OK!\n", File.read("src/lib/common.rb")) + log = top_commit("src", format: "%B").lines + assert_equal("[ruby/#@target] OK\n", log.first, out) + assert_match(%r[/ruby/#{@target}/commit/\h+$], log.last, out) + assert_operator(top_commit(@target), :start_with?, log.last[/\h+$/], out) + end + + def test_skip_tool + git(*%W"rm -q tool/ok", chdir: @target) + git(*%W"commit -q -m", "Remove tool", chdir: @target) + out = assert_sync() + assert_equal(@sha["src"], top_commit("src"), out) + end + + def test_skip_test_fixtures + Dir.mkdir("#@target/test") + Dir.mkdir("#@target/test/fixtures") + File.write("#@target/test/fixtures/fixme.rb", "") + git(*%W"add test/fixtures/fixme.rb", chdir: @target) + git(*%W"commit -q -m", "Add fixtures", chdir: @target) + out = assert_sync(["#{@sha[@target]}..#{@target}/default"]) + assert_equal(@sha["src"], top_commit("src"), out) + end + + def test_skip_toplevel + Dir.mkdir("#@target/docs") + File.write("#@target/docs/NEWS.md", "= NEWS!!!\n") + git(*%W"add --", "docs/NEWS.md", chdir: @target) + File.write("#@target/docs/hello.md", "Hello\n") + git(*%W"add --", "docs/hello.md", chdir: @target) + git(*%W"commit -q -m", "It's a news", chdir: @target) + out = assert_sync() + assert_equal(@sha["src"], top_commit("src"), out) + end + + def test_adding_toplevel + Dir.mkdir("#@target/docs") + File.write("#@target/docs/NEWS.md", "= New library\n") + File.write("#@target/lib/news.rb", "return\n") + git(*%W"add --", "docs/NEWS.md", "lib/news.rb", chdir: @target) + git(*%W"commit -q -m", "New lib", chdir: @target) + out = assert_sync() + assert_not_equal(@sha["src"], top_commit("src"), out) + assert_equal "return\n", File.read("src/lib/news.rb") + assert_include top_commit("src", format: "oneline"), "[ruby/#{@target}] New lib" + assert_not_operator File, :exist?, "src/docs" + end + + def test_gitignore + File.write("#@target/.gitignore", "*.bak\n", mode: "a") + File.write("#@target/lib/common.rb", "Should.be_merged\n", mode: "a") + File.write("#@target/.github/workflows/main.yml", "# Should not merge\n", mode: "a") + git(*%W"add .github", chdir: @target) + git(*%W"commit -q -m", "Should be common.rb only", + *%W".gitignore lib/common.rb .github", chdir: @target) + out = assert_sync() + assert_not_equal(@sha["src"], top_commit("src"), out) + assert_equal("*~\n", File.read("src/.gitignore"), out) + assert_equal("#!/bin/sh\n""echo ok\n", File.read("src/tool/ok"), out) + assert_equal(":ok\n""Should.be_merged\n", File.read("src/lib/common.rb"), out) + assert_not_operator(File, :exist?, "src/.github/workflows/main.yml", out) + end + + def test_gitignore_after_conflict + File.write("src/Gemfile", "# main\n") + git(*%W"add Gemfile", chdir: "src") + git(*%W"commit -q -m", "Add Gemfile", chdir: "src") + File.write("#@target/Gemfile", "# conflict\n", mode: "a") + File.write("#@target/lib/common.rb", "Should.be_merged\n", mode: "a") + File.write("#@target/.github/workflows/main.yml", "# Should not merge\n", mode: "a") + git(*%W"add Gemfile .github lib/common.rb", chdir: @target) + git(*%W"commit -q -m", "Should be common.rb only", chdir: @target) + out = assert_sync() + assert_not_equal(@sha["src"], top_commit("src"), out) + assert_equal("# main\n", File.read("src/Gemfile"), out) + assert_equal(":ok\n""Should.be_merged\n", File.read("src/lib/common.rb"), out) + assert_not_operator(File, :exist?, "src/.github/workflows/main.yml", out) + end + + def test_delete_after_conflict + File.write("#@target/lib/bad.rb", "raise\n") + git(*%W"add lib/bad.rb", chdir: @target) + git(*%W"commit -q -m", "Add bad.rb", chdir: @target) + out = assert_sync + assert_equal("raise\n", File.read("src/lib/bad.rb")) + + git(*%W"rm lib/bad.rb", chdir: "src", out: IO::NULL) + git(*%W"commit -q -m", "Remove bad.rb", chdir: "src") + + File.write("#@target/lib/bad.rb", "raise 'bar'\n") + File.write("#@target/lib/common.rb", "Should.be_merged\n", mode: "a") + git(*%W"add lib/bad.rb lib/common.rb", chdir: @target) + git(*%W"commit -q -m", "Add conflict", chdir: @target) + + head = top_commit("src") + out = assert_sync(editor: "git rm -f lib/bad.rb") + assert_not_equal(head, top_commit("src")) + assert_equal(":ok\n""Should.be_merged\n", File.read("src/lib/common.rb"), out) + assert_not_operator(File, :exist?, "src/lib/bad.rb", out) + end + end +end diff --git a/tool/test/minitest/metametameta.rb b/tool/test/testunit/metametameta.rb index dbc422f7e6..e494038939 100644 --- a/tool/test/minitest/metametameta.rb +++ b/tool/test/testunit/metametameta.rb @@ -4,13 +4,13 @@ require 'tempfile' require 'stringio' -class MiniTest::Unit::TestCase +class Test::Unit::TestCase def clean s s.gsub(/^ {6}/, '') end end -class MetaMetaMetaTestCase < MiniTest::Unit::TestCase +class MetaMetaMetaTestCase < Test::Unit::TestCase def assert_report expected, flags = %w[--seed 42] header = clean <<-EOM Run options: #{flags.map { |s| s =~ /\|/ ? s.inspect : s }.join " "} @@ -44,10 +44,10 @@ class MetaMetaMetaTestCase < MiniTest::Unit::TestCase def setup super srand 42 - MiniTest::Unit::TestCase.reset - @tu = MiniTest::Unit.new + Test::Unit::TestCase.reset + @tu = Test::Unit::Runner.new - MiniTest::Unit.runner = nil # protect the outer runner from the inner tests + Test::Unit::Runner.runner = nil # protect the outer runner from the inner tests end def teardown @@ -57,13 +57,13 @@ class MetaMetaMetaTestCase < MiniTest::Unit::TestCase def with_output synchronize do begin - save = MiniTest::Unit.output + save = Test::Unit::Runner.output @output = StringIO.new("") - MiniTest::Unit.output = @output + Test::Unit::Runner.output = @output yield ensure - MiniTest::Unit.output = save + Test::Unit::Runner.output = save end end end diff --git a/tool/test/testunit/test4test_hideskip.rb b/tool/test/testunit/test4test_hideskip.rb index 410bffc13c..14f79a5743 100644 --- a/tool/test/testunit/test4test_hideskip.rb +++ b/tool/test/testunit/test4test_hideskip.rb @@ -4,7 +4,11 @@ $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../../lib" require 'test/unit' class TestForTestHideSkip < Test::Unit::TestCase - def test_skip - skip "do nothing" + def test_omit + omit "do nothing" + end + + def test_pend + pend "do nothing" end end diff --git a/tool/test/testunit/test4test_load_failure.rb b/tool/test/testunit/test4test_load_failure.rb new file mode 100644 index 0000000000..e1570c2542 --- /dev/null +++ b/tool/test/testunit/test4test_load_failure.rb @@ -0,0 +1 @@ +raise LoadError, "no-such-library" diff --git a/tool/test/testunit/test4test_sorting.rb b/tool/test/testunit/test4test_sorting.rb index 698c875b79..f5a6866425 100644 --- a/tool/test/testunit/test4test_sorting.rb +++ b/tool/test/testunit/test4test_sorting.rb @@ -5,7 +5,7 @@ require 'test/unit' class TestForTestHideSkip < Test::Unit::TestCase def test_c - skip "do nothing" + omit "do nothing" end def test_b diff --git a/tool/test/testunit/test4test_timeout.rb b/tool/test/testunit/test4test_timeout.rb new file mode 100644 index 0000000000..3225f66398 --- /dev/null +++ b/tool/test/testunit/test4test_timeout.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true +$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../../lib" + +require 'test/unit' +require 'timeout' + +class TestForTestTimeout < Test::Unit::TestCase + 10.times do |i| + define_method("test_timeout_#{i}") do + Timeout.timeout(0.001) do + sleep + end + end + end +end diff --git a/tool/test/testunit/test_assertion.rb b/tool/test/testunit/test_assertion.rb index 0c7c4882b8..709b495572 100644 --- a/tool/test/testunit/test_assertion.rb +++ b/tool/test/testunit/test_assertion.rb @@ -22,8 +22,32 @@ class TestAssertion < Test::Unit::TestCase end def test_assert_raise - assert_raise(MiniTest::Assertion) do + assert_raise(Test::Unit::AssertionFailedError) do return_in_assert_raise end end + + def test_assert_pattern_list + assert_pattern_list([/foo?/], "foo") + assert_not_pattern_list([/foo?/], "afoo") + assert_not_pattern_list([/foo?/], "foo?") + assert_pattern_list([:*, /foo?/, :*], "foo") + assert_pattern_list([:*, /foo?/], "afoo") + assert_not_pattern_list([:*, /foo?/], "afoo?") + assert_pattern_list([/foo?/, :*], "foo?") + + assert_not_pattern_list(["foo?"], "foo") + assert_not_pattern_list(["foo?"], "afoo") + assert_pattern_list(["foo?"], "foo?") + assert_not_pattern_list([:*, "foo?", :*], "foo") + assert_not_pattern_list([:*, "foo?"], "afoo") + assert_pattern_list([:*, "foo?"], "afoo?") + assert_pattern_list(["foo?", :*], "foo?") + end + + def assert_not_pattern_list(pattern_list, actual, message=nil) + assert_raise(Test::Unit::AssertionFailedError) do + assert_pattern_list(pattern_list, actual, message) + end + end end diff --git a/tool/test/testunit/test_hideskip.rb b/tool/test/testunit/test_hideskip.rb index e90be5da32..0c4c9b40f2 100644 --- a/tool/test/testunit/test_hideskip.rb +++ b/tool/test/testunit/test_hideskip.rb @@ -4,16 +4,16 @@ require 'test/unit' class TestHideSkip < Test::Unit::TestCase def test_hideskip assert_not_match(/^ *1\) Skipped/, hideskip) - assert_match(/^ *1\) Skipped/, hideskip("--show-skip")) + assert_match(/^ *1\) Skipped.*^ *2\) Skipped/m, hideskip("--show-skip")) output = hideskip("--hide-skip") - output.gsub!(/Successful MJIT finish\n/, '') if defined?(RubyVM::JIT) && RubyVM::JIT.enabled? - assert_match(/assertions\/s.\n+1 tests, 0 assertions, 0 failures, 0 errors, 1 skips/, output) + output.gsub!(/Successful RJIT finish\n/, '') if defined?(RubyVM::RJIT) && RubyVM::RJIT.enabled? + assert_match(/assertions\/s.\n+2 tests, 0 assertions, 0 failures, 0 errors, 2 skips/, output) end private def hideskip(*args) - IO.popen([*@options[:ruby], "#{File.dirname(__FILE__)}/test4test_hideskip.rb", + IO.popen([*@__runner_options__[:ruby], "#{File.dirname(__FILE__)}/test4test_hideskip.rb", "--verbose", *args], err: [:child, :out]) {|f| f.read } diff --git a/tool/test/testunit/test_launchable.rb b/tool/test/testunit/test_launchable.rb new file mode 100644 index 0000000000..70c371e212 --- /dev/null +++ b/tool/test/testunit/test_launchable.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: false +require 'test/unit' +require 'tempfile' +require 'json' + +class TestLaunchable < Test::Unit::TestCase + def test_json_stream_writer + Tempfile.create(['launchable-test-', '.json']) do |f| + json_stream_writer = Test::Unit::LaunchableOption::JsonStreamWriter.new(f.path) + json_stream_writer.write_array('testCases') + json_stream_writer.write_object( + { + testPath: "file=test/test_a.rb#class=class1#testcase=testcase899", + duration: 42, + status: "TEST_FAILED", + stdout: nil, + stderr: nil, + createdAt: "2021-10-05T12:34:00", + data: { + lineNumber: 1 + } + } + ) + json_stream_writer.write_object( + { + testPath: "file=test/test_a.rb#class=class1#testcase=testcase899", + duration: 45, + status: "TEST_PASSED", + stdout: "This is stdout", + stderr: "This is stderr", + createdAt: "2021-10-05T12:36:00", + data: { + lineNumber: 10 + } + } + ) + json_stream_writer.close() + expected = <<JSON +{ + "testCases": [ + { + "testPath": "file=test/test_a.rb#class=class1#testcase=testcase899", + "duration": 42, + "status": "TEST_FAILED", + "stdout": null, + "stderr": null, + "createdAt": "2021-10-05T12:34:00", + "data": { + "lineNumber": 1 + } + }, + { + "testPath": "file=test/test_a.rb#class=class1#testcase=testcase899", + "duration": 45, + "status": "TEST_PASSED", + "stdout": "This is stdout", + "stderr": "This is stderr", + "createdAt": "2021-10-05T12:36:00", + "data": { + "lineNumber": 10 + } + } + ] +} +JSON + assert_equal(expected, f.read) + end + end +end diff --git a/tool/test/testunit/test_load_failure.rb b/tool/test/testunit/test_load_failure.rb new file mode 100644 index 0000000000..8defa9e39a --- /dev/null +++ b/tool/test/testunit/test_load_failure.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true +require 'test/unit' + +class TestLoadFailure < Test::Unit::TestCase + def test_load_failure + assert_not_predicate(load_failure, :success?) + end + + def test_load_failure_parallel + assert_not_predicate(load_failure("-j2"), :success?) + end + + private + + def load_failure(*args) + IO.popen([*@__runner_options__[:ruby], "#{__dir__}/../runner.rb", + "#{__dir__}/test4test_load_failure.rb", + "--verbose", *args], err: [:child, :out]) {|f| + assert_include(f.read, "test4test_load_failure.rb") + } + $? + end +end diff --git a/tool/test/minitest/test_minitest_unit.rb b/tool/test/testunit/test_minitest_unit.rb index 5476cf9795..84b6cf688c 100644 --- a/tool/test/minitest/test_minitest_unit.rb +++ b/tool/test/testunit/test_minitest_unit.rb @@ -10,7 +10,7 @@ class ImmutableString < String; def inspect; super.freeze; end; end class TestMiniTestUnit < MetaMetaMetaTestCase pwd = Pathname.new File.expand_path Dir.pwd - basedir = Pathname.new(File.expand_path "lib/minitest") + 'mini' + basedir = Pathname.new(File.expand_path "lib/test") basedir = basedir.relative_path_from(pwd).to_s MINITEST_BASE_DIR = basedir[/\A\./] ? basedir : "./#{basedir}" BT_MIDDLE = ["#{MINITEST_BASE_DIR}/test.rb:161:in `each'", @@ -19,7 +19,7 @@ class TestMiniTestUnit < MetaMetaMetaTestCase "#{MINITEST_BASE_DIR}/test.rb:106:in `run'"] def test_class_puke_with_assertion_failed - exception = MiniTest::Assertion.new "Oh no!" + exception = Test::Unit::AssertionFailedError.new "Oh no!" exception.set_backtrace ["unhappy"] assert_equal 'F', @tu.puke('SomeClass', 'method_name', exception) assert_equal 1, @tu.failures @@ -29,7 +29,7 @@ class TestMiniTestUnit < MetaMetaMetaTestCase def test_class_puke_with_assertion_failed_and_long_backtrace bt = (["test/test_some_class.rb:615:in `method_name'", - "#{MINITEST_BASE_DIR}/unit.rb:140:in `assert_raises'", + "#{MINITEST_BASE_DIR}/unit.rb:140:in `assert_raise'", "test/test_some_class.rb:615:in `each'", "test/test_some_class.rb:614:in `test_method_name'", "#{MINITEST_BASE_DIR}/test.rb:165:in `__send__'"] + @@ -39,7 +39,7 @@ class TestMiniTestUnit < MetaMetaMetaTestCase ex_location = util_expand_bt(["test/test_some_class.rb:615"]).first - exception = MiniTest::Assertion.new "Oh no!" + exception = Test::Unit::AssertionFailedError.new "Oh no!" exception.set_backtrace bt assert_equal 'F', @tu.puke('TestSomeClass', 'test_method_name', exception) assert_equal 1, @tu.failures @@ -49,7 +49,7 @@ class TestMiniTestUnit < MetaMetaMetaTestCase def test_class_puke_with_assertion_failed_and_user_defined_assertions bt = (["lib/test/my/util.rb:16:in `another_method_name'", - "#{MINITEST_BASE_DIR}/unit.rb:140:in `assert_raises'", + "#{MINITEST_BASE_DIR}/unit.rb:140:in `assert_raise'", "lib/test/my/util.rb:15:in `block in assert_something'", "lib/test/my/util.rb:14:in `each'", "lib/test/my/util.rb:14:in `assert_something'", @@ -62,7 +62,7 @@ class TestMiniTestUnit < MetaMetaMetaTestCase ex_location = util_expand_bt(["test/test_some_class.rb:615"]).first - exception = MiniTest::Assertion.new "Oh no!" + exception = Test::Unit::AssertionFailedError.new "Oh no!" exception.set_backtrace bt assert_equal 'F', @tu.puke('TestSomeClass', 'test_method_name', exception) assert_equal 1, @tu.failures @@ -72,8 +72,8 @@ class TestMiniTestUnit < MetaMetaMetaTestCase def test_class_puke_with_failure_and_flunk_in_backtrace exception = begin - MiniTest::Unit::TestCase.new('fake tc').flunk - rescue MiniTest::Assertion => failure + Test::Unit::TestCase.new('fake tc').flunk + rescue Test::Unit::AssertionFailedError => failure failure end assert_equal 'F', @tu.puke('SomeClass', 'method_name', exception) @@ -82,7 +82,7 @@ class TestMiniTestUnit < MetaMetaMetaTestCase def test_class_puke_with_flunk_and_user_defined_assertions bt = (["lib/test/my/util.rb:16:in `flunk'", - "#{MINITEST_BASE_DIR}/unit.rb:140:in `assert_raises'", + "#{MINITEST_BASE_DIR}/unit.rb:140:in `assert_raise'", "lib/test/my/util.rb:15:in `block in assert_something'", "lib/test/my/util.rb:14:in `each'", "lib/test/my/util.rb:14:in `assert_something'", @@ -95,7 +95,7 @@ class TestMiniTestUnit < MetaMetaMetaTestCase ex_location = util_expand_bt(["test/test_some_class.rb:615"]).first - exception = MiniTest::Assertion.new "Oh no!" + exception = Test::Unit::AssertionFailedError.new "Oh no!" exception.set_backtrace bt assert_equal 'F', @tu.puke('TestSomeClass', 'test_method_name', exception) assert_equal 1, @tu.failures @@ -125,7 +125,7 @@ class TestMiniTestUnit < MetaMetaMetaTestCase "test/test_autotest.rb:62:in `test_add_exception'"] ex = util_expand_bt ex - fu = MiniTest::filter_backtrace(bt) + fu = Test::filter_backtrace(bt) assert_equal ex, fu end @@ -135,7 +135,7 @@ class TestMiniTestUnit < MetaMetaMetaTestCase BT_MIDDLE + ["#{MINITEST_BASE_DIR}/test.rb:29"]) ex = bt.clone - fu = MiniTest::filter_backtrace(bt) + fu = Test::filter_backtrace(bt) assert_equal ex, fu end @@ -148,17 +148,17 @@ class TestMiniTestUnit < MetaMetaMetaTestCase bt = util_expand_bt bt ex = ["-e:1"] - fu = MiniTest::filter_backtrace bt + fu = Test::filter_backtrace bt assert_equal ex, fu end def test_default_runner_is_minitest_unit - assert_instance_of MiniTest::Unit, MiniTest::Unit.runner + assert_instance_of Test::Unit::Runner, Test::Unit::Runner.runner end def test_passed_eh_teardown_good - test_class = Class.new MiniTest::Unit::TestCase do + test_class = Class.new Test::Unit::TestCase do def teardown; assert true; end def test_omg; assert true; end end @@ -169,9 +169,9 @@ class TestMiniTestUnit < MetaMetaMetaTestCase end def test_passed_eh_teardown_skipped - test_class = Class.new MiniTest::Unit::TestCase do + test_class = Class.new Test::Unit::TestCase do def teardown; assert true; end - def test_omg; skip "bork"; end + def test_omg; omit "bork"; end end test = test_class.new :test_omg @@ -180,7 +180,7 @@ class TestMiniTestUnit < MetaMetaMetaTestCase end def test_passed_eh_teardown_flunked - test_class = Class.new MiniTest::Unit::TestCase do + test_class = Class.new Test::Unit::TestCase do def teardown; flunk; end def test_omg; assert true; end end @@ -223,7 +223,7 @@ class TestMiniTestUnitInherited < MetaMetaMetaTestCase def test_inherited_hook_plays_nice_with_others with_overridden_include do assert_throws :inherited_hook do - Class.new MiniTest::Unit::TestCase + Class.new Test::Unit::TestCase end end end @@ -235,151 +235,23 @@ class TestMiniTestRunner < MetaMetaMetaTestCase def test_class_test_suites @assertion_count = 0 - tc = Class.new(MiniTest::Unit::TestCase) + tc = Class.new(Test::Unit::TestCase) - assert_equal 1, MiniTest::Unit::TestCase.test_suites.size - assert_equal [tc], MiniTest::Unit::TestCase.test_suites - end - - def test_run_test - Class.new MiniTest::Unit::TestCase do - attr_reader :foo - - def run_test name - @foo = "hi mom!" - super - @foo = "okay" - end - - def test_something - assert_equal "hi mom!", foo - end - end - - expected = clean <<-EOM - . - - Finished tests in 0.00 - - 1 tests, 1 assertions, 0 failures, 0 errors, 0 skips - EOM - - assert_report expected - end - - def test_run_error - Class.new MiniTest::Unit::TestCase do - def test_something - assert true - end - - def test_error - raise "unhandled exception" - end - end - - expected = clean <<-EOM - E. - - Finished tests in 0.00 - - 1) Error: - #<Class:0xXXX>#test_error: - RuntimeError: unhandled exception - FILE:LINE:in \`test_error\' - - 2 tests, 1 assertions, 0 failures, 1 errors, 0 skips - EOM - - assert_report expected - end - - def test_run_error_teardown - Class.new MiniTest::Unit::TestCase do - def test_something - assert true - end - - def teardown - raise "unhandled exception" - end - end - - expected = clean <<-EOM - E - - Finished tests in 0.00 - - 1) Error: - #<Class:0xXXX>#test_something: - RuntimeError: unhandled exception - FILE:LINE:in \`teardown\' - - 1 tests, 1 assertions, 0 failures, 1 errors, 0 skips - EOM - - assert_report expected - end - - def test_run_failing - Class.new MiniTest::Unit::TestCase do - def test_something - assert true - end - - def test_failure - assert false - end - end - - expected = clean <<-EOM - F. - - Finished tests in 0.00 - - 1) Failure: - #<Class:0xXXX>#test_failure [FILE:LINE]: - Failed assertion, no message given. - - 2 tests, 2 assertions, 1 failures, 0 errors, 0 skips - EOM - - assert_report expected - end - - def test_run_failing_filtered - Class.new MiniTest::Unit::TestCase do - def test_something - assert true - end - - def test_failure - assert false - end - end - - expected = clean <<-EOM - . - - Finished tests in 0.00 - - 1 tests, 1 assertions, 0 failures, 0 errors, 0 skips - EOM - - assert_report expected, %w[--name /some|thing/ --seed 42] + assert_equal 2, Test::Unit::TestCase.test_suites.size + assert_equal [tc, Test::Unit::TestCase], Test::Unit::TestCase.test_suites.sort_by {|ts| ts.name.to_s} end def assert_filtering name, expected, a = false args = %W[--name #{name} --seed 42] - alpha = Class.new MiniTest::Unit::TestCase do + alpha = Class.new Test::Unit::TestCase do define_method :test_something do assert a end end Object.const_set(:Alpha, alpha) - beta = Class.new MiniTest::Unit::TestCase do + beta = Class.new Test::Unit::TestCase do define_method :test_something do assert true end @@ -392,123 +264,20 @@ class TestMiniTestRunner < MetaMetaMetaTestCase Object.send :remove_const, :Beta end - def test_run_filtered_including_suite_name - expected = clean <<-EOM - . - - Finished tests in 0.00 - - 1 tests, 1 assertions, 0 failures, 0 errors, 0 skips - EOM - - assert_filtering "/Beta#test_something/", expected - end - - def test_run_filtered_including_suite_name_string - expected = clean <<-EOM - . - - Finished tests in 0.00 - - 1 tests, 1 assertions, 0 failures, 0 errors, 0 skips - EOM - - assert_filtering "Beta#test_something", expected - end - - def test_run_filtered_string_method_only - expected = clean <<-EOM - .. - - Finished tests in 0.00 - - 2 tests, 2 assertions, 0 failures, 0 errors, 0 skips - EOM - - assert_filtering "test_something", expected, :pass - end - - def test_run_passing - Class.new MiniTest::Unit::TestCase do - def test_something - assert true - end - end - - expected = clean <<-EOM - . - - Finished tests in 0.00 - - 1 tests, 1 assertions, 0 failures, 0 errors, 0 skips - EOM - - assert_report expected - end - - def test_run_skip - Class.new MiniTest::Unit::TestCase do - def test_something - assert true - end - - def test_skip - skip "not yet" - end - end - - expected = clean <<-EOM - S. - - Finished tests in 0.00 - - 2 tests, 1 assertions, 0 failures, 0 errors, 1 skips - EOM - - assert_report expected - end - - def test_run_skip_verbose - Class.new MiniTest::Unit::TestCase do - def test_something - assert true - end - - def test_skip - skip "not yet" - end - end - - expected = clean <<-EOM - #<Class:0xXXX>#test_skip = 0.00 s = S - #<Class:0xXXX>#test_something = 0.00 s = . - - - Finished tests in 0.00 - - 1) Skipped: - #<Class:0xXXX>#test_skip [FILE:LINE]: - not yet - - 2 tests, 1 assertions, 0 failures, 0 errors, 1 skips - EOM - - assert_report expected, %w[--seed 42 --verbose] - end - def test_run_with_other_runner - MiniTest::Unit.runner = Class.new MiniTest::Unit do + pend "We don't imagine to replace the default runner with ruby/ruby test suite." + Test::Unit::Runner.runner = Class.new Test::Unit::Runner do def _run_suite suite, type suite.before_suite # Run once before each suite super suite, type end end.new - Class.new MiniTest::Unit::TestCase do + Class.new Test::Unit::TestCase do def self.name; "wacky!" end def self.before_suite - MiniTest::Unit.output.puts "Running #{self.name} tests" + Test::Unit::Runner.output.puts "Running #{self.name} tests" @@foo = 1 end @@ -559,8 +328,10 @@ class TestMiniTestUnitOrder < MetaMetaMetaTestCase # do not parallelize this suite... it just can't handle it. def test_before_setup + pend "Surpressing the raise message when running with tests" + call_order = [] - Class.new MiniTest::Unit::TestCase do + Class.new Test::Unit::TestCase do define_method :setup do super() call_order << :setup @@ -582,8 +353,10 @@ class TestMiniTestUnitOrder < MetaMetaMetaTestCase end def test_after_teardown + pend "Surpressing the result message of this tests" + call_order = [] - Class.new MiniTest::Unit::TestCase do + Class.new Test::Unit::TestCase do define_method :teardown do super() call_order << :teardown @@ -605,8 +378,10 @@ class TestMiniTestUnitOrder < MetaMetaMetaTestCase end def test_all_teardowns_are_guaranteed_to_run + pend "Surpressing the raise message when running with tests" + call_order = [] - Class.new MiniTest::Unit::TestCase do + Class.new Test::Unit::TestCase do define_method :after_teardown do super() call_order << :after_teardown @@ -637,9 +412,11 @@ class TestMiniTestUnitOrder < MetaMetaMetaTestCase end def test_setup_and_teardown_survive_inheritance + pend "Surpressing the result message of this tests" + call_order = [] - parent = Class.new MiniTest::Unit::TestCase do + parent = Class.new Test::Unit::TestCase do define_method :setup do call_order << :setup_method end @@ -666,19 +443,17 @@ class TestMiniTestUnitOrder < MetaMetaMetaTestCase end end -class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase +class TestMiniTestUnitTestCase < Test::Unit::TestCase # do not call parallelize_me! - teardown accesses @tc._assertions # which is not threadsafe. Nearly every method in here is an # assertion test so it isn't worth splitting it out further. - RUBY18 = ! defined? Encoding - def setup super - MiniTest::Unit::TestCase.reset + Test::Unit::TestCase.reset - @tc = MiniTest::Unit::TestCase.new 'fake tc' + @tc = Test::Unit::TestCase.new 'fake tc' @zomg = "zomg ponies!" @assertion_count = 1 end @@ -736,9 +511,8 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase def test_assert_equal_different_collection_array_hex_invisible object1 = Object.new object2 = Object.new - msg = "No visible difference in the Array#inspect output. - You should look at the implementation of #== on Array or its members. - [#<Object:0xXXXXXX>]".gsub(/^ +/, "") + msg = "<[#{object1.inspect}]> expected but was + <[#{object2.inspect}]>.".gsub(/^ +/, "") util_assert_triggered msg do @tc.assert_equal [object1], [object2] end @@ -748,9 +522,8 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase h1, h2 = {}, {} h1[1] = Object.new h2[1] = Object.new - msg = "No visible difference in the Hash#inspect output. - You should look at the implementation of #== on Hash or its members. - {1=>#<Object:0xXXXXXX>}".gsub(/^ +/, "") + msg = "<#{h1.inspect}> expected but was + <#{h2.inspect}>.".gsub(/^ +/, "") util_assert_triggered msg do @tc.assert_equal h1, h2 @@ -758,8 +531,6 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase end def test_assert_equal_different_diff_deactivated - skip "https://github.com/MagLev/maglev/issues/209" if maglev? - without_diff do util_assert_triggered util_msg("haha" * 10, "blah" * 10) do o1 = "haha" * 10 @@ -777,12 +548,8 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase o1 = c.new "a" o2 = c.new "b" - msg = "--- expected - +++ actual - @@ -1 +1 @@ - -#<#<Class:0xXXXXXX>:0xXXXXXX @name=\"a\"> - +#<#<Class:0xXXXXXX>:0xXXXXXX @name=\"b\"> - ".gsub(/^ +/, "") + msg = "<#{o1.inspect}> expected but was + <#{o2.inspect}>.".gsub(/^ +/, "") util_assert_triggered msg do @tc.assert_equal o1, o2 @@ -793,9 +560,8 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase o1 = Object.new o2 = Object.new - msg = "No visible difference in the Object#inspect output. - You should look at the implementation of #== on Object or its members. - #<Object:0xXXXXXX>".gsub(/^ +/, "") + msg = "<#{o1.inspect}> expected but was + <#{o2.inspect}>.".gsub(/^ +/, "") util_assert_triggered msg do @tc.assert_equal o1, o2 @@ -803,12 +569,8 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase end def test_assert_equal_different_long - msg = "--- expected - +++ actual - @@ -1 +1 @@ - -\"hahahahahahahahahahahahahahahahahahahaha\" - +\"blahblahblahblahblahblahblahblahblahblah\" - ".gsub(/^ +/, "") + msg = "<\"hahahahahahahahahahahahahahahahahahahaha\"> expected but was + <\"blahblahblahblahblahblahblahblahblahblah\">.".gsub(/^ +/, "") util_assert_triggered msg do o1 = "haha" * 10 @@ -819,9 +581,8 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase end def test_assert_equal_different_long_invisible - msg = "No visible difference in the String#inspect output. - You should look at the implementation of #== on String or its members. - \"blahblahblahblahblahblahblahblahblahblah\"".gsub(/^ +/, "") + msg = "<\"blahblahblahblahblahblahblahblahblahblah\"> (UTF-8) expected but was + <\"blahblahblahblahblahblahblahblahblahblah\"> (UTF-8).".gsub(/^ +/, "") util_assert_triggered msg do o1 = "blah" * 10 @@ -835,12 +596,8 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase def test_assert_equal_different_long_msg msg = "message. - --- expected - +++ actual - @@ -1 +1 @@ - -\"hahahahahahahahahahahahahahahahahahahaha\" - +\"blahblahblahblahblahblahblahblahblahblah\" - ".gsub(/^ +/, "") + <\"hahahahahahahahahahahahahahahahahahahaha\"> expected but was + <\"blahblahblahblahblahblahblahblahblahblah\">.".gsub(/^ +/, "") util_assert_triggered msg do o1 = "haha" * 10 @@ -862,14 +619,14 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase end def test_assert_equal_different_short_multiline - msg = "--- expected\n+++ actual\n@@ -1,2 +1,2 @@\n \"a\n-b\"\n+c\"\n" + msg = "<\"a\\n\" + \"b\"> expected but was\n<\"a\\n\" + \"c\">." util_assert_triggered msg do @tc.assert_equal "a\nb", "a\nc" end end def test_assert_equal_different_escaped_newline - msg = "--- expected\n+++ actual\n@@ -1,2 +1,2 @@\n \"xxx\n-a\\\\nb\"\n+a\\\\nc\"\n" + msg = "<\"xxx\\n\" + \"a\\\\nb\"> expected but was\n<\"xxx\\n\" + \"a\\\\nc\">." util_assert_triggered msg do @tc.assert_equal "xxx\na\\nb", "xxx\na\\nc" end @@ -888,7 +645,7 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase end def test_assert_in_delta_triggered - x = maglev? ? "9.999999xxxe-07" : "1.0e-06" + x = "1.0e-06" util_assert_triggered "Expected |0.0 - 0.001| (0.001) to be <= #{x}." do @tc.assert_in_delta 0.0, 1.0 / 1000, 0.000001 end @@ -927,8 +684,8 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase end def test_assert_in_epsilon_triggered_negative_case - x = (RUBY18 and not maglev?) ? "0.1" : "0.100000xxx" - y = maglev? ? "0.100000xxx" : "0.1" + x = "0.100000xxx" + y = "0.1" util_assert_triggered "Expected |-1.1 - -1| (#{x}) to be <= #{y}." do @tc.assert_in_epsilon(-1.1, -1, 0.1) end @@ -943,7 +700,7 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase def test_assert_includes_triggered @assertion_count = 3 - e = @tc.assert_raises MiniTest::Assertion do + e = @tc.assert_raise Test::Unit::AssertionFailedError do @tc.assert_includes [true], false end @@ -1113,14 +870,14 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase end end - def test_assert_raises - @tc.assert_raises RuntimeError do + def test_assert_raise + @tc.assert_raise RuntimeError do raise "blah" end end - def test_assert_raises_module - @tc.assert_raises MyModule do + def test_assert_raise_module + @tc.assert_raise MyModule do raise AnError end end @@ -1131,34 +888,29 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase # # https://github.com/ruby/ruby/commit/6bab4ea9917dc05cd2c94aead2e96eb7df7d4be1 - def test_assert_raises_skip + def test_assert_raise_skip @assertion_count = 0 - util_assert_triggered "skipped", MiniTest::Skip do - @tc.assert_raises ArgumentError do + util_assert_triggered "skipped", Test::Unit::PendedError do + @tc.assert_raise ArgumentError do begin raise "blah" rescue - skip "skipped" + omit "skipped" end end end end - def test_assert_raises_triggered_different - e = assert_raises MiniTest::Assertion do - @tc.assert_raises RuntimeError do + def test_assert_raise_triggered_different + e = assert_raise Test::Unit::AssertionFailedError do + @tc.assert_raise RuntimeError do raise SyntaxError, "icky" end end expected = clean <<-EOM.chomp - [RuntimeError] exception expected, not - Class: <SyntaxError> - Message: <\"icky\"> - ---Backtrace--- - FILE:LINE:in \`test_assert_raises_triggered_different\' - --------------- + [RuntimeError] exception expected, not #<SyntaxError: icky>. EOM actual = e.message.gsub(/^.+:\d+/, 'FILE:LINE') @@ -1167,21 +919,16 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase assert_equal expected, actual end - def test_assert_raises_triggered_different_msg - e = assert_raises MiniTest::Assertion do - @tc.assert_raises RuntimeError, "XXX" do + def test_assert_raise_triggered_different_msg + e = assert_raise Test::Unit::AssertionFailedError do + @tc.assert_raise RuntimeError, "XXX" do raise SyntaxError, "icky" end end expected = clean <<-EOM XXX. - [RuntimeError] exception expected, not - Class: <SyntaxError> - Message: <\"icky\"> - ---Backtrace--- - FILE:LINE:in \`test_assert_raises_triggered_different_msg\' - --------------- + [RuntimeError] exception expected, not #<SyntaxError: icky>. EOM actual = e.message.gsub(/^.+:\d+/, 'FILE:LINE') @@ -1190,44 +937,39 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase assert_equal expected.chomp, actual end - def test_assert_raises_triggered_none - e = assert_raises MiniTest::Assertion do - @tc.assert_raises MiniTest::Assertion do + def test_assert_raise_triggered_none + e = assert_raise Test::Unit::AssertionFailedError do + @tc.assert_raise Test::Unit::AssertionFailedError do # do nothing end end - expected = "MiniTest::Assertion expected but nothing was raised." + expected = "Test::Unit::AssertionFailedError expected but nothing was raised." assert_equal expected, e.message end - def test_assert_raises_triggered_none_msg - e = assert_raises MiniTest::Assertion do - @tc.assert_raises MiniTest::Assertion, "XXX" do + def test_assert_raise_triggered_none_msg + e = assert_raise Test::Unit::AssertionFailedError do + @tc.assert_raise Test::Unit::AssertionFailedError, "XXX" do # do nothing end end - expected = "XXX.\nMiniTest::Assertion expected but nothing was raised." + expected = "XXX.\nTest::Unit::AssertionFailedError expected but nothing was raised." assert_equal expected, e.message end - def test_assert_raises_triggered_subclass - e = assert_raises MiniTest::Assertion do - @tc.assert_raises StandardError do + def test_assert_raise_triggered_subclass + e = assert_raise Test::Unit::AssertionFailedError do + @tc.assert_raise StandardError do raise AnError end end expected = clean <<-EOM.chomp - [StandardError] exception expected, not - Class: <AnError> - Message: <\"AnError\"> - ---Backtrace--- - FILE:LINE:in \`test_assert_raises_triggered_subclass\' - --------------- + [StandardError] exception expected, not #<AnError: AnError>. EOM actual = e.message.gsub(/^.+:\d+/, 'FILE:LINE') @@ -1275,7 +1017,7 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase end def test_assert_send_bad - util_assert_triggered "Expected 1.>(*[2]) to return true." do + util_assert_triggered "Expected 1.>(2) to return true." do @tc.assert_send [1, :>, 2] end end @@ -1328,11 +1070,11 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase end end - def test_capture_io + def test_capture_output @assertion_count = 0 non_verbose do - out, err = capture_io do + out, err = capture_output do puts 'hi' $stderr.puts 'bye!' end @@ -1342,46 +1084,6 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase end end - def test_capture_subprocess_io - @assertion_count = 0 - - non_verbose do - out, err = capture_subprocess_io do - system("echo", "hi") - system("echo", "bye!", out: :err) - end - - assert_equal "hi\n", out - assert_equal "bye!\n", err - end - end - - def test_class_asserts_match_refutes - @assertion_count = 0 - - methods = MiniTest::Assertions.public_instance_methods - methods.map! { |m| m.to_s } if Symbol === methods.first - - # These don't have corresponding refutes _on purpose_. They're - # useless and will never be added, so don't bother. - ignores = %w[assert_output assert_raises assert_send - assert_silent assert_throws] - - # These are test/unit methods. I'm not actually sure why they're still here - ignores += %w[assert_no_match assert_not_equal assert_not_nil - assert_not_same assert_nothing_raised - assert_nothing_thrown assert_raise] - - # These are compatibility methods for Minitest 5 - ignores += %w[assertions assertions=] - - asserts = methods.grep(/^assert/).sort - ignores - refutes = methods.grep(/^refute/).sort - ignores - - assert_empty refutes.map { |n| n.sub(/^refute/, 'assert') } - asserts - assert_empty asserts.map { |n| n.sub(/^assert/, 'refute') } - refutes - end - def test_flunk util_assert_triggered 'Epic Fail!' do @tc.flunk @@ -1410,13 +1112,13 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase end def test_message_message - util_assert_triggered "whoops.\nExpected: 1\n Actual: 2" do + util_assert_triggered "whoops.\n<1> expected but was\n<2>." do @tc.assert_equal 1, 2, message { "whoops" } end end def test_message_lambda - util_assert_triggered "whoops.\nExpected: 1\n Actual: 2" do + util_assert_triggered "whoops.\n<1> expected but was\n<2>." do @tc.assert_equal 1, 2, lambda { "whoops" } end end @@ -1438,7 +1140,7 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase end def test_prints - printer = Class.new { extend MiniTest::Assertions } + printer = Class.new { extend Test::Unit::CoreAssertions } @tc.assert_equal '"test"', printer.mu_pp(ImmutableString.new 'test') end @@ -1477,7 +1179,7 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase end def test_refute_in_delta_triggered - x = maglev? ? "0.100000xxx" : "0.1" + x = "0.1" util_assert_triggered "Expected |0.0 - 0.001| (0.001) to not be <= #{x}." do @tc.refute_in_delta 0.0, 1.0 / 1000, 0.1 end @@ -1503,7 +1205,7 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase def test_refute_includes_triggered @assertion_count = 3 - e = @tc.assert_raises MiniTest::Assertion do + e = @tc.assert_raise Test::Unit::AssertionFailedError do @tc.refute_includes [true], true end @@ -1621,46 +1323,37 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase end end - def test_skip + def test_omit @assertion_count = 0 - util_assert_triggered "haha!", MiniTest::Skip do - @tc.skip "haha!" + util_assert_triggered "haha!", Test::Unit::PendedError do + @tc.omit "haha!" end end - def test_test_methods_random + def test_pend @assertion_count = 0 - sample_test_case = Class.new MiniTest::Unit::TestCase do - def self.test_order; :random; end - def test_test1; assert "does not matter" end - def test_test2; assert "does not matter" end - def test_test3; assert "does not matter" end - @test_order = [1, 0, 2] - def self.rand(n) @test_order.shift; end + util_assert_triggered "haha!", Test::Unit::PendedError do + @tc.pend "haha!" end - - expected = %w(test_test2 test_test1 test_test3) - assert_equal expected, sample_test_case.test_methods end - def test_test_methods_sorted + def test_test_methods @assertion_count = 0 - sample_test_case = Class.new MiniTest::Unit::TestCase do - def self.test_order; :sorted end - def test_test3; assert "does not matter" end - def test_test2; assert "does not matter" end + sample_test_case = Class.new Test::Unit::TestCase do def test_test1; assert "does not matter" end + def test_test2; assert "does not matter" end + def test_test3; assert "does not matter" end end - expected = %w(test_test1 test_test2 test_test3) - assert_equal expected, sample_test_case.test_methods + expected = %i(test_test1 test_test2 test_test3) + assert_equal expected, sample_test_case.test_methods.sort end - def assert_triggered expected, klass = MiniTest::Assertion - e = assert_raises klass do + def assert_triggered expected, klass = Test::Unit::AssertionFailedError + e = assert_raise klass do yield end @@ -1673,22 +1366,22 @@ class TestMiniTestUnitTestCase < MiniTest::Unit::TestCase alias util_assert_triggered assert_triggered def util_msg exp, act, msg = nil - s = "Expected: #{exp.inspect}\n Actual: #{act.inspect}" + s = "<#{exp.inspect}> expected but was\n<#{act.inspect}>." s = "#{msg}.\n#{s}" if msg s end def without_diff - old_diff = MiniTest::Assertions.diff - MiniTest::Assertions.diff = nil + old_diff = Test::Unit::Assertions.diff + Test::Unit::Assertions.diff = nil yield ensure - MiniTest::Assertions.diff = old_diff + Test::Unit::Assertions.diff = old_diff end end -class TestMiniTestGuard < MiniTest::Unit::TestCase +class TestMiniTestGuard < Test::Unit::TestCase def test_mri_eh assert self.class.mri? "ruby blah" assert self.mri? "ruby blah" @@ -1699,11 +1392,6 @@ class TestMiniTestGuard < MiniTest::Unit::TestCase assert self.jruby? "java" end - def test_rubinius_eh - assert self.class.rubinius? "rbx" - assert self.rubinius? "rbx" - end - def test_windows_eh assert self.class.windows? "mswin" assert self.windows? "mswin" @@ -1714,6 +1402,7 @@ class TestMiniTestUnitRecording < MetaMetaMetaTestCase # do not parallelize this suite... it just can't handle it. def assert_run_record(*expected, &block) + pend "Test::Unit::Runner#run was changed about recoding feature. We should fix it." def @tu.record suite, method, assertions, time, error recording[method] << error end @@ -1722,9 +1411,9 @@ class TestMiniTestUnitRecording < MetaMetaMetaTestCase @recording ||= Hash.new { |h,k| h[k] = [] } end - MiniTest::Unit.runner = @tu + Test::Unit::Runner.runner = @tu - Class.new MiniTest::Unit::TestCase, &block + Class.new Test::Unit::TestCase, &block with_output do @tu.run @@ -1744,7 +1433,7 @@ class TestMiniTestUnitRecording < MetaMetaMetaTestCase end def test_record_failing - assert_run_record MiniTest::Assertion do + assert_run_record Test::Unit::AssertionFailedError do def test_method assert false end @@ -1784,9 +1473,15 @@ class TestMiniTestUnitRecording < MetaMetaMetaTestCase end def test_record_skip - assert_run_record MiniTest::Skip do + assert_run_record Test::Unit::PendedError do + def test_method + omit "not yet" + end + end + + assert_run_record Test::Unit::PendedError do def test_method - skip "not yet" + pend "not yet" end end end diff --git a/tool/test/testunit/test_parallel.rb b/tool/test/testunit/test_parallel.rb index fa87ca53ab..6882fd6c5f 100644 --- a/tool/test/testunit/test_parallel.rb +++ b/tool/test/testunit/test_parallel.rb @@ -3,17 +3,17 @@ require 'test/unit' require 'timeout' module TestParallel - PARALLEL_RB = "#{File.dirname(__FILE__)}/../../lib/test/unit/parallel.rb" - TESTS = "#{File.dirname(__FILE__)}/tests_for_parallel" + PARALLEL_RB = "#{__dir__}/../../lib/test/unit/parallel.rb" + TESTS = "#{__dir__}/tests_for_parallel" # use large timeout for --jit-wait - TIMEOUT = EnvUtil.apply_timeout_scale(defined?(RubyVM::JIT) && RubyVM::JIT.enabled? ? 100 : 30) + TIMEOUT = EnvUtil.apply_timeout_scale(defined?(RubyVM::RJIT) && RubyVM::RJIT.enabled? ? 100 : 30) 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(" "), + @worker_pid = spawn(*@__runner_options__[:ruby], PARALLEL_RB, + "--ruby", @__runner_options__[:ruby].join(" "), "-j", "t1", "-v", out: o, in: i) [i,o].each(&:close) end @@ -49,6 +49,7 @@ module TestParallel assert_match(/^ready/,@worker_out.gets) @worker_in.puts "run #{TESTS}/ptest_first.rb test" assert_match(/^okay/,@worker_out.gets) + assert_match(/^start/,@worker_out.gets) assert_match(/^record/,@worker_out.gets) assert_match(/^p/,@worker_out.gets) assert_match(/^done/,@worker_out.gets) @@ -61,9 +62,11 @@ module TestParallel assert_match(/^ready/,@worker_out.gets) @worker_in.puts "run #{TESTS}/ptest_second.rb test" assert_match(/^okay/,@worker_out.gets) + assert_match(/^start/,@worker_out.gets) assert_match(/^record/,@worker_out.gets) assert_match(/^p/,@worker_out.gets) assert_match(/^done/,@worker_out.gets) + assert_match(/^start/,@worker_out.gets) assert_match(/^record/,@worker_out.gets) assert_match(/^p/,@worker_out.gets) assert_match(/^done/,@worker_out.gets) @@ -76,15 +79,18 @@ module TestParallel assert_match(/^ready/,@worker_out.gets) @worker_in.puts "run #{TESTS}/ptest_first.rb test" assert_match(/^okay/,@worker_out.gets) + assert_match(/^start/,@worker_out.gets) assert_match(/^record/,@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(/^start/,@worker_out.gets) assert_match(/^record/,@worker_out.gets) assert_match(/^p/,@worker_out.gets) assert_match(/^done/,@worker_out.gets) + assert_match(/^start/,@worker_out.gets) assert_match(/^record/,@worker_out.gets) assert_match(/^p/,@worker_out.gets) assert_match(/^done/,@worker_out.gets) @@ -99,7 +105,7 @@ module TestParallel break if /^p (.+?)$/ =~ buf end assert_not_nil($1, "'p' was not found") - assert_match(/TestA#test_nothing_test = \d+\.\d+ s = \.\n/, $1.chomp.unpack("m")[0]) + assert_match(/TestA#test_nothing_test = \d+\.\d+ s = \.\n/, $1.chomp.unpack1("m")) end end @@ -111,16 +117,18 @@ module TestParallel end assert_not_nil($1, "'done' was not found") - result = Marshal.load($1.chomp.unpack("m")[0]) + result = Marshal.load($1.chomp.unpack1("m")) assert_equal(5, result[0]) - assert_equal(17, result[1]) + pend "TODO: result[1] returns 17. We should investigate it" do # TODO: misusage of pend (pend doens't use given block) + assert_equal(12, result[1]) + end 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(Test::Unit::AssertionFailedError,result[2][0][2]) + assert_kind_of(Test::Unit::PendedError,result[2][1][2]) + assert_kind_of(Test::Unit::PendedError,result[2][2][2]) assert_kind_of(Exception, result[2][3][2]) assert_equal(result[5], "TestE") end @@ -135,11 +143,11 @@ module TestParallel end class TestParallel < Test::Unit::TestCase - def spawn_runner(*opt_args) + def spawn_runner(*opt_args, jobs: "t1") @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) + @test_pid = spawn(*@__runner_options__[:ruby], TESTS+"/runner.rb", + "--ruby", @__runner_options__[:ruby].join(" "), + "-j", jobs, *opt_args, out: o, err: o) o.close end @@ -158,11 +166,7 @@ module TestParallel 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 + spawn_runner(jobs: "0") Timeout.timeout(TIMEOUT) { assert_match(/Error: parameter of -j option should be greater than 0/,@test_out.read) } @@ -200,5 +204,19 @@ module TestParallel assert(buf.scan(/^\[\s*\d+\/\d+\]\s*(\d+?)=/).flatten.uniq.size > 1, message("retried tests should run in different processes") {buf}) end + + def test_hungup + spawn_runner "--worker-timeout=1", "test4test_hungup.rb" + buf = Timeout.timeout(TIMEOUT) {@test_out.read} + assert_match(/^Retrying hung up testcases\.+$/, buf) + assert_match(/^2 tests,.* 0 failures,/, buf) + end + + def test_retry_workers + spawn_runner "--worker-timeout=1", "test4test_slow_0.rb", "test4test_slow_1.rb", jobs: "2" + buf = Timeout.timeout(TIMEOUT) {@test_out.read} + assert_match(/^Retrying hung up testcases\.+$/, buf) + assert_match(/^2 tests,.* 0 failures,/, buf) + end end end diff --git a/tool/test/testunit/test_redefinition.rb b/tool/test/testunit/test_redefinition.rb index 9129e55489..b4f5cabd4f 100644 --- a/tool/test/testunit/test_redefinition.rb +++ b/tool/test/testunit/test_redefinition.rb @@ -3,14 +3,9 @@ require 'test/unit' class TestRedefinition < Test::Unit::TestCase def test_redefinition - assert_match(/^test\/unit warning: method TestForTestRedefinition#test_redefinition is redefined$/, - redefinition) - end - - def redefinition(*args) - IO.popen([*@options[:ruby], "#{File.dirname(__FILE__)}/test4test_redefinition.rb", *args], - err: [:child, :out]) {|f| - f.read - } + message = %r[test/unit: method TestForTestRedefinition#test_redefinition is redefined$] + assert_raise_with_message(Test::Unit::AssertionFailedError, message) do + require_relative("test4test_redefinition.rb") + end end end diff --git a/tool/test/testunit/test_sorting.rb b/tool/test/testunit/test_sorting.rb index f9de3ec154..3e5d7bfdcc 100644 --- a/tool/test/testunit/test_sorting.rb +++ b/tool/test/testunit/test_sorting.rb @@ -10,9 +10,66 @@ class TestTestUnitSorting < Test::Unit::TestCase end def sorting(*args) - IO.popen([*@options[:ruby], "#{File.dirname(__FILE__)}/test4test_sorting.rb", + IO.popen([*@__runner_options__[:ruby], "#{File.dirname(__FILE__)}/test4test_sorting.rb", "--verbose", *args], err: [:child, :out]) {|f| f.read } end + + Item = Struct.new(:name) + SEED = 0x50975eed + + def make_test_list + (1..16).map {"test_%.3x" % rand(0x1000)}.freeze + end + + def test_sort_alpha + sorter = Test::Unit::Order::Types[:alpha].new(SEED) + assert_kind_of(Test::Unit::Order::Types[:sorted], sorter) + + list = make_test_list + sorted = list.sort + 16.times do + assert_equal(sorted, sorter.sort_by_string(list)) + end + + list = list.map {|s| Item.new(s)}.freeze + sorted = list.sort_by(&:name) + 16.times do + assert_equal(sorted, sorter.sort_by_name(list)) + end + end + + def test_sort_nosort + sorter = Test::Unit::Order::Types[:nosort].new(SEED) + + list = make_test_list + 16.times do + assert_equal(list, sorter.sort_by_string(list)) + end + + list = list.map {|s| Item.new(s)}.freeze + 16.times do + assert_equal(list, sorter.sort_by_name(list)) + end + end + + def test_sort_random + type = Test::Unit::Order::Types[:random] + sorter = type.new(SEED) + + list = make_test_list + sorted = type.new(SEED).sort_by_string(list).freeze + 16.times do + assert_equal(sorted, sorter.sort_by_string(list)) + end + assert_not_equal(sorted, type.new(SEED+1).sort_by_string(list)) + + list = list.map {|s| Item.new(s)}.freeze + sorted = sorted.map {|s| Item.new(s)}.freeze + 16.times do + assert_equal(sorted, sorter.sort_by_name(list)) + end + assert_not_equal(sorted, type.new(SEED+1).sort_by_name(list)) + end end diff --git a/tool/test/testunit/test_timeout.rb b/tool/test/testunit/test_timeout.rb new file mode 100644 index 0000000000..452f5e1a7e --- /dev/null +++ b/tool/test/testunit/test_timeout.rb @@ -0,0 +1,10 @@ +# frozen_string_literal: false +require 'test/unit' + +class TestTiemout < Test::Unit::TestCase + def test_timeout + cmd = [*@__runner_options__[:ruby], "#{File.dirname(__FILE__)}/test4test_timeout.rb"] + result = IO.popen(cmd, err: [:child, :out], &:read) + assert_not_match(/^T{10}$/, result) + end +end diff --git a/tool/test/testunit/tests_for_parallel/slow_helper.rb b/tool/test/testunit/tests_for_parallel/slow_helper.rb new file mode 100644 index 0000000000..38067c1f47 --- /dev/null +++ b/tool/test/testunit/tests_for_parallel/slow_helper.rb @@ -0,0 +1,8 @@ +require 'test/unit' + +module TestSlowTimeout + def test_slow + sleep_for = EnvUtil.apply_timeout_scale((ENV['sec'] || 3).to_i) + sleep sleep_for if on_parallel_worker? + end +end diff --git a/tool/test/testunit/tests_for_parallel/test4test_hungup.rb b/tool/test/testunit/tests_for_parallel/test4test_hungup.rb new file mode 100644 index 0000000000..65a75f7c4d --- /dev/null +++ b/tool/test/testunit/tests_for_parallel/test4test_hungup.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true +require_relative '../../../lib/test/unit' + +class TestHung < Test::Unit::TestCase + def test_success_at_worker + assert true + end + + def test_hungup_at_worker + if on_parallel_worker? + sleep 10 + end + assert true + end +end diff --git a/tool/test/testunit/tests_for_parallel/test4test_slow_0.rb b/tool/test/testunit/tests_for_parallel/test4test_slow_0.rb new file mode 100644 index 0000000000..a749b0e1d3 --- /dev/null +++ b/tool/test/testunit/tests_for_parallel/test4test_slow_0.rb @@ -0,0 +1,5 @@ +require_relative 'slow_helper' + +class TestSlowV0 < Test::Unit::TestCase + include TestSlowTimeout +end diff --git a/tool/test/testunit/tests_for_parallel/test4test_slow_1.rb b/tool/test/testunit/tests_for_parallel/test4test_slow_1.rb new file mode 100644 index 0000000000..924a3b11fa --- /dev/null +++ b/tool/test/testunit/tests_for_parallel/test4test_slow_1.rb @@ -0,0 +1,5 @@ +require_relative 'slow_helper' + +class TestSlowV1 < Test::Unit::TestCase + include TestSlowTimeout +end diff --git a/tool/test/webrick/test_cgi.rb b/tool/test/webrick/test_cgi.rb index 7a75cf565e..a9be8f353d 100644 --- a/tool/test/webrick/test_cgi.rb +++ b/tool/test/webrick/test_cgi.rb @@ -12,30 +12,8 @@ class TestWEBrickCGI < Test::Unit::TestCase super end - def start_cgi_server(log_tester=TestWEBrick::DefaultLogTester, &block) - config = { - :CGIInterpreter => TestWEBrick::RubyBin, - :DocumentRoot => File.dirname(__FILE__), - :DirectoryIndex => ["webrick.cgi"], - :RequestCallback => Proc.new{|req, res| - def req.meta_vars - meta = super - meta["RUBYLIB"] = $:.join(File::PATH_SEPARATOR) - meta[RbConfig::CONFIG['LIBPATHENV']] = ENV[RbConfig::CONFIG['LIBPATHENV']] if RbConfig::CONFIG['LIBPATHENV'] - return meta - end - }, - } - if RUBY_PLATFORM =~ /mswin|mingw|cygwin|bccwin32/ - config[:CGIPathEnv] = ENV['PATH'] # runtime dll may not be in system dir. - end - TestWEBrick.start_httpserver(config, log_tester){|server, addr, port, log| - block.call(server, addr, port, log) - } - end - def test_cgi - start_cgi_server{|server, addr, port, log| + TestWEBrick.start_cgi_server{|server, addr, port, log| http = Net::HTTP.new(addr, port) req = Net::HTTP::Get.new("/webrick.cgi") http.request(req){|res| assert_equal("/webrick.cgi", res.body, log.call)} @@ -98,7 +76,7 @@ class TestWEBrickCGI < Test::Unit::TestCase log_tester = lambda {|log, access_log| assert_match(/BadRequest/, log.join) } - start_cgi_server(log_tester) {|server, addr, port, log| + TestWEBrick.start_cgi_server({}, log_tester) {|server, addr, port, log| sock = TCPSocket.new(addr, port) begin sock << "POST /webrick.cgi HTTP/1.0" << CRLF @@ -115,7 +93,7 @@ class TestWEBrickCGI < Test::Unit::TestCase end def test_cgi_env - start_cgi_server do |server, addr, port, log| + TestWEBrick.start_cgi_server do |server, addr, port, log| http = Net::HTTP.new(addr, port) req = Net::HTTP::Get.new("/webrick.cgi/dumpenv") req['proxy'] = 'http://example.com/' @@ -137,7 +115,7 @@ class TestWEBrickCGI < Test::Unit::TestCase assert_equal(1, log.length) assert_match(/ERROR bad URI/, log[0]) } - start_cgi_server(log_tester) {|server, addr, port, log| + TestWEBrick.start_cgi_server({}, log_tester) {|server, addr, port, log| res = TCPSocket.open(addr, port) {|sock| sock << "GET /#{CtrlSeq}#{CRLF}#{CRLF}" sock.close_write @@ -155,7 +133,7 @@ class TestWEBrickCGI < Test::Unit::TestCase assert_equal(1, log.length) assert_match(/ERROR bad header/, log[0]) } - start_cgi_server(log_tester) {|server, addr, port, log| + TestWEBrick.start_cgi_server({}, log_tester) {|server, addr, port, log| res = TCPSocket.open(addr, port) {|sock| sock << "GET / HTTP/1.0#{CRLF}#{CtrlSeq}#{CRLF}#{CRLF}" sock.close_write diff --git a/tool/test/webrick/test_filehandler.rb b/tool/test/webrick/test_filehandler.rb index 146d8ce792..452667d4f4 100644 --- a/tool/test/webrick/test_filehandler.rb +++ b/tool/test/webrick/test_filehandler.rb @@ -85,12 +85,12 @@ class WEBrick::TestFileHandler < Test::Unit::TestCase "Content-Type: text/plain\r\n" \ "Content-Range: bytes 0-0/#{filesize}\r\n" \ "\r\n" \ - "#{IO.read(__FILE__, 1)}\r\n" \ + "#{File.read(__FILE__, 1)}\r\n" \ "--#{boundary}\r\n" \ "Content-Type: text/plain\r\n" \ "Content-Range: bytes #{off}-#{last}/#{filesize}\r\n" \ "\r\n" \ - "#{IO.read(__FILE__, 2, off)}\r\n" \ + "#{File.read(__FILE__, 2, off)}\r\n" \ "--#{boundary}--\r\n" assert_equal exp, body end @@ -247,22 +247,16 @@ class WEBrick::TestFileHandler < Test::Unit::TestCase def test_short_filename return if File.executable?(__FILE__) # skip on strange file system - return if /mswin/ =~ RUBY_PLATFORM && ENV.key?('GITHUB_ACTIONS') # not working from the beginning - config = { - :CGIInterpreter => TestWEBrick::RubyBin, - :DocumentRoot => File.dirname(__FILE__), - :CGIPathEnv => ENV['PATH'], - } log_tester = lambda {|log, access_log| log = log.reject {|s| /ERROR `.*\' not found\./ =~ s } log = log.reject {|s| /WARN the request refers nondisclosure name/ =~ s } assert_equal([], log) } - TestWEBrick.start_httpserver(config, log_tester) do |server, addr, port, log| + TestWEBrick.start_cgi_server({}, log_tester) do |server, addr, port, log| http = Net::HTTP.new(addr, port) if windows? - root = config[:DocumentRoot].tr("/", "\\") + root = File.dirname(__FILE__).tr("/", "\\") fname = IO.popen(%W[dir /x #{root}\\webrick_long_filename.cgi], encoding: "binary", &:read) fname.sub!(/\A.*$^$.*$^$/m, '') if fname diff --git a/tool/test/webrick/test_httprequest.rb b/tool/test/webrick/test_httprequest.rb index 759ccbdada..3c0ea937d9 100644 --- a/tool/test/webrick/test_httprequest.rb +++ b/tool/test/webrick/test_httprequest.rb @@ -245,7 +245,7 @@ GET / _end_of_message_ msg.gsub!(/^ {6}/, "") - open(__FILE__){|io| + File.open(__FILE__){|io| while chunk = io.read(100) msg << chunk.size.to_s(16) << crlf msg << chunk << crlf diff --git a/tool/test/webrick/test_httpserver.rb b/tool/test/webrick/test_httpserver.rb index f905ff04e8..f6b53e142b 100644 --- a/tool/test/webrick/test_httpserver.rb +++ b/tool/test/webrick/test_httpserver.rb @@ -253,7 +253,7 @@ class TestWEBrickHTTPServer < Test::Unit::TestCase server.virtual_host(WEBrick::HTTPServer.new(vhost_config)) Thread.pass while server.status != :Running - sleep 1 if defined?(RubyVM::JIT) && RubyVM::JIT.enabled? # server.status behaves unexpectedly with --jit-wait + sleep 1 if defined?(RubyVM::RJIT) && RubyVM::RJIT.enabled? # server.status behaves unexpectedly with --jit-wait assert_equal(1, started, log.call) assert_equal(0, stopped, log.call) assert_equal(0, accepted, log.call) diff --git a/tool/test/webrick/test_server.rb b/tool/test/webrick/test_server.rb index 0fd3f3b63b..3bd8115c61 100644 --- a/tool/test/webrick/test_server.rb +++ b/tool/test/webrick/test_server.rb @@ -65,7 +65,7 @@ class TestWEBrickServer < Test::Unit::TestCase } TestWEBrick.start_server(Echo, config){|server, addr, port, log| true while server.status != :Running - sleep 1 if defined?(RubyVM::JIT) && RubyVM::JIT.enabled? # server.status behaves unexpectedly with --jit-wait + sleep 1 if defined?(RubyVM::RJIT) && RubyVM::RJIT.enabled? # server.status behaves unexpectedly with --jit-wait assert_equal(1, started, log.call) assert_equal(0, stopped, log.call) assert_equal(0, accepted, log.call) diff --git a/tool/test/webrick/utils.rb b/tool/test/webrick/utils.rb index 56d3a30ea4..c8e84c37f1 100644 --- a/tool/test/webrick/utils.rb +++ b/tool/test/webrick/utils.rb @@ -38,6 +38,8 @@ module TestWEBrick require "test/unit" unless defined?(Test::Unit) include Test::Unit::Assertions extend Test::Unit::Assertions + include Test::Unit::CoreAssertions + extend Test::Unit::CoreAssertions module_function @@ -79,4 +81,24 @@ module TestWEBrick def start_httpproxy(config={}, log_tester=DefaultLogTester, &block) start_server(WEBrick::HTTPProxyServer, config, log_tester, &block) end + + def start_cgi_server(config={}, log_tester=TestWEBrick::DefaultLogTester, &block) + config = { + :CGIInterpreter => TestWEBrick::RubyBin, + :DocumentRoot => File.dirname(__FILE__), + :DirectoryIndex => ["webrick.cgi"], + :RequestCallback => Proc.new{|req, res| + def req.meta_vars + meta = super + meta["RUBYLIB"] = $:.join(File::PATH_SEPARATOR) + meta[RbConfig::CONFIG['LIBPATHENV']] = ENV[RbConfig::CONFIG['LIBPATHENV']] if RbConfig::CONFIG['LIBPATHENV'] + return meta + end + }, + }.merge(config) + if RUBY_PLATFORM =~ /mswin|mingw|cygwin|bccwin32/ + config[:CGIPathEnv] = ENV['PATH'] # runtime dll may not be in system dir. + end + start_server(WEBrick::HTTPServer, config, log_tester, &block) + end end diff --git a/tool/test/webrick/webrick.cgi b/tool/test/webrick/webrick.cgi index a294fa72f9..45594b7a7b 100644..100755 --- a/tool/test/webrick/webrick.cgi +++ b/tool/test/webrick/webrick.cgi @@ -15,11 +15,11 @@ class TestApp < WEBrick::CGI }.join(", ") }.join(", ") elsif %r{/$} =~ req.request_uri.to_s - res.body = "" + res.body = +"" res.body << req.request_uri.to_s << "\n" res.body << req.script_name elsif !req.cookies.empty? - res.body = req.cookies.inject(""){|result, cookie| + res.body = req.cookies.inject(+""){|result, cookie| result << "%s=%s\n" % [cookie.name, cookie.value] } res.cookies << WEBrick::Cookie.new("Customer", "WILE_E_COYOTE") |