diff --git a/Library/Homebrew/cask/Gemfile b/Library/Homebrew/cask/Gemfile index 5572387ccd23a62c2977135d04dab2526a98bdb1..bc9bccfbcac53964cdf8d645ee64ba1f53a087c4 100644 --- a/Library/Homebrew/cask/Gemfile +++ b/Library/Homebrew/cask/Gemfile @@ -1,13 +1,11 @@ source "https://rubygems.org" -group :test do +gem "parallel_tests" +gem "rspec" +gem "rspec-its", require: false +gem "rspec-wait", require: false + +group :coverage do gem "simplecov", require: false gem "codecov", require: false - gem "minitest" - gem "minitest-reporters" - gem "mocha", require: false - gem "parallel_tests" - gem "rspec" - gem "rspec-its", require: false - gem "rspec-wait", require: false end diff --git a/Library/Homebrew/cask/Gemfile.lock b/Library/Homebrew/cask/Gemfile.lock index 700f093d1edaa1fa32febac053957a4cf4c32a73..64561be715488ce9c5851372f05585b4b8653408 100644 --- a/Library/Homebrew/cask/Gemfile.lock +++ b/Library/Homebrew/cask/Gemfile.lock @@ -1,8 +1,6 @@ GEM remote: https://rubygems.org/ specs: - ansi (1.5.0) - builder (3.2.3) codecov (0.1.9) json simplecov @@ -10,15 +8,6 @@ GEM diff-lcs (1.3) docile (1.1.5) json (2.0.3) - metaclass (0.0.4) - minitest (5.10.1) - minitest-reporters (1.1.14) - ansi - builder - minitest (>= 5.0) - ruby-progressbar - mocha (1.2.1) - metaclass (~> 0.0.1) parallel (1.10.0) parallel_tests (2.13.0) parallel @@ -40,7 +29,6 @@ GEM rspec-support (3.5.0) rspec-wait (0.0.9) rspec (>= 3, < 4) - ruby-progressbar (1.8.1) simplecov (0.13.0) docile (~> 1.1.0) json (>= 1.8, < 3) @@ -53,9 +41,6 @@ PLATFORMS DEPENDENCIES codecov - minitest - minitest-reporters - mocha parallel_tests rspec rspec-its @@ -63,4 +48,4 @@ DEPENDENCIES simplecov BUNDLED WITH - 1.13.7 + 1.14.5 diff --git a/Library/Homebrew/dev-cmd/tests.rb b/Library/Homebrew/dev-cmd/tests.rb index 50d0c59096c95934631522e4d1f5c08a0d44cc9d..7d6ec51c9f1533e5b287612dfa732d6745bdd69e 100644 --- a/Library/Homebrew/dev-cmd/tests.rb +++ b/Library/Homebrew/dev-cmd/tests.rb @@ -1,4 +1,4 @@ -#: * `tests` [`-v`] [`--coverage`] [`--generic`] [`--no-compat`] [`--only=`<test_script>`:`<test_method>] [`--seed` <seed>] [`--trace`] [`--online`] [`--official-cmd-taps`]: +#: * `tests` [`-v`] [`--coverage`] [`--generic`] [`--no-compat`] [`--only=`<test_script>`:`<line_number>] [`--seed` <seed>] [`--online`] [`--official-cmd-taps`]: #: Run Homebrew's unit and integration tests. require "fileutils" @@ -7,27 +7,17 @@ require "tap" module Homebrew module_function - def run_tests(executable, files, args = []) - opts = [] - opts << "--serialize-stdout" if ENV["CI"] - - system "bundle", "exec", executable, *opts, "--", *args, "--", *files - - return if $?.success? - Homebrew.failed = true - end - def tests HOMEBREW_LIBRARY_PATH.cd do - ENV.delete "HOMEBREW_VERBOSE" - ENV.delete "VERBOSE" + ENV.delete("HOMEBREW_VERBOSE") + ENV.delete("VERBOSE") ENV.delete("HOMEBREW_CASK_OPTS") ENV["HOMEBREW_NO_ANALYTICS_THIS_RUN"] = "1" ENV["HOMEBREW_DEVELOPER"] = "1" - ENV["TESTOPTS"] = "-v" if ARGV.verbose? ENV["HOMEBREW_NO_COMPAT"] = "1" if ARGV.include? "--no-compat" ENV["HOMEBREW_TEST_GENERIC_OS"] = "1" if ARGV.include? "--generic" ENV["HOMEBREW_NO_GITHUB_API"] = "1" unless ARGV.include? "--online" + if ARGV.include? "--official-cmd-taps" ENV["HOMEBREW_TEST_OFFICIAL_CMD_TAPS"] = "1" end @@ -53,29 +43,29 @@ module Homebrew system "bundle", "install" end - # Make it easier to reproduce test runs. - ENV["SEED"] = ARGV.next if ARGV.include? "--seed" - - files = Dir.glob("test/**/*_{spec,test}.rb") - .reject { |p| p =~ %r{^test/vendor/bundle} } - .reject { |p| !OS.mac? && p =~ %r{^test/(os/mac|cask)(/.*|_(test|spec)\.rb)$} } + parallel = true - test_args = [] - test_args << "--trace" if ARGV.include? "--trace" + files = if ARGV.value("only") + test_name, line = ARGV.value("only").split(":", 2) - if ARGV.value("only") - test_name, test_method = ARGV.value("only").split(":", 2) - files = Dir.glob("test/{#{test_name},#{test_name}/**/*}_{spec,test}.rb") - test_args << "--name=test_#{test_method}" if test_method + if line.nil? + Dir.glob("test/{#{test_name},#{test_name}/**/*}_spec.rb") + else + parallel = false + ["test/#{test_name}_spec.rb:#{line}"] + end + else + Dir.glob("test/**/*_spec.rb").reject { |p| p =~ %r{^test/vendor/bundle/} } end - test_files = files.select { |p| p.end_with?("_test.rb") } - spec_files = files.select { |p| p.end_with?("_spec.rb") } + opts = [] - test_args += ARGV.named.select { |v| v[/^TEST(OPTS)?=/] } - run_tests "parallel_test", test_files, test_args + if ENV["CI"] + opts << "--combine-stderr" + opts << "--serialize-stdout" + end - spec_args = [ + args = [ "--color", "-I", HOMEBREW_LIBRARY_PATH/"test", "--require", "spec_helper", @@ -83,18 +73,22 @@ module Homebrew "--format", "ParallelTests::RSpec::RuntimeLogger", "--out", "tmp/parallel_runtime_rspec.log" ] - spec_args << "--tag" << "~needs_macos" unless OS.mac? - run_tests "parallel_rspec", spec_files, spec_args + args << "--seed" << ARGV.next if ARGV.include? "--seed" - if (fs_leak_log = HOMEBREW_LIBRARY_PATH/"tmp/fs_leak.log").file? - fs_leak_log_content = fs_leak_log.read - unless fs_leak_log_content.empty? - opoo "File leak is detected" - puts fs_leak_log_content - Homebrew.failed = true - end + unless OS.mac? + args << "--tag" << "~needs_macos" + files = files.reject { |p| p =~ %r{^test/(os/mac|cask)(/.*|_spec\.rb)$} } end + + if parallel + system "bundle", "exec", "parallel_rspec", *opts, "--", *args, "--", *files + else + system "bundle", "exec", "rspec", *args, "--", *files + end + + return if $?.success? + Homebrew.failed = true end end end diff --git a/Library/Homebrew/test/Gemfile b/Library/Homebrew/test/Gemfile index 25c8ce7ecb2c6118f800776aa5debdbbb346db1e..bc9bccfbcac53964cdf8d645ee64ba1f53a087c4 100644 --- a/Library/Homebrew/test/Gemfile +++ b/Library/Homebrew/test/Gemfile @@ -1,8 +1,5 @@ source "https://rubygems.org" -gem "mocha" -gem "minitest" -gem "minitest-reporters" gem "parallel_tests" gem "rspec" gem "rspec-its", require: false diff --git a/Library/Homebrew/test/Gemfile.lock b/Library/Homebrew/test/Gemfile.lock index fba45d77b32bfc6bf51969da1e6160d171714c47..64561be715488ce9c5851372f05585b4b8653408 100644 --- a/Library/Homebrew/test/Gemfile.lock +++ b/Library/Homebrew/test/Gemfile.lock @@ -1,8 +1,6 @@ GEM remote: https://rubygems.org/ specs: - ansi (1.5.0) - builder (3.2.3) codecov (0.1.9) json simplecov @@ -10,15 +8,6 @@ GEM diff-lcs (1.3) docile (1.1.5) json (2.0.3) - metaclass (0.0.4) - minitest (5.10.1) - minitest-reporters (1.1.14) - ansi - builder - minitest (>= 5.0) - ruby-progressbar - mocha (1.2.1) - metaclass (~> 0.0.1) parallel (1.10.0) parallel_tests (2.13.0) parallel @@ -40,7 +29,6 @@ GEM rspec-support (3.5.0) rspec-wait (0.0.9) rspec (>= 3, < 4) - ruby-progressbar (1.8.1) simplecov (0.13.0) docile (~> 1.1.0) json (>= 1.8, < 3) @@ -53,9 +41,6 @@ PLATFORMS DEPENDENCIES codecov - minitest - minitest-reporters - mocha parallel_tests rspec rspec-its @@ -63,4 +48,4 @@ DEPENDENCIES simplecov BUNDLED WITH - 1.14.3 + 1.14.5 diff --git a/Library/Homebrew/test/support/helper/fs_leak_logger.rb b/Library/Homebrew/test/support/helper/fs_leak_logger.rb deleted file mode 100644 index 3fbb148fa69f1a3e3f1ca7ef817101251e36ad39..0000000000000000000000000000000000000000 --- a/Library/Homebrew/test/support/helper/fs_leak_logger.rb +++ /dev/null @@ -1,27 +0,0 @@ -module Test - module Helper - module FSLeakLogger - def self.included(klass) - require "find" - logdir = HOMEBREW_LIBRARY_PATH.join("tmp") - logdir.mkpath - @@log = File.open(logdir.join("fs_leak.log"), "w") - klass.make_my_diffs_pretty! - end - - def setup - @__files_before_test = [] - Find.find(TEST_TMPDIR) { |f| @__files_before_test << f.sub(TEST_TMPDIR, "") } - super - end - - def teardown - super - files_after_test = [] - Find.find(TEST_TMPDIR) { |f| files_after_test << f.sub(TEST_TMPDIR, "") } - return if @__files_before_test == files_after_test - @@log.puts location, diff(@__files_before_test, files_after_test) - end - end - end -end diff --git a/Library/Homebrew/test/support/helper/integration_command_test_case.rb b/Library/Homebrew/test/support/helper/integration_command_test_case.rb deleted file mode 100644 index 7ba094645f82c3d6b937b9466ad54d9c666cd1c4..0000000000000000000000000000000000000000 --- a/Library/Homebrew/test/support/helper/integration_command_test_case.rb +++ /dev/null @@ -1,155 +0,0 @@ -require "bundler" -require "fileutils" -require "pathname" -require "formula" -require "test/support/helper/test_case" -require "open3" - -class IntegrationCommandTestCase < Homebrew::TestCase - def setup - super - @cmd_id_index = 0 # Assign unique IDs to invocations of `cmd_output`. - (HOMEBREW_PREFIX/"bin").mkpath - FileUtils.touch HOMEBREW_PREFIX/"bin/brew" - end - - def needs_test_cmd_taps - return if ENV["HOMEBREW_TEST_OFFICIAL_CMD_TAPS"] - skip "HOMEBREW_TEST_OFFICIAL_CMD_TAPS is not set" - end - - def needs_macos - skip "Not on MacOS" unless OS.mac? - end - - def cmd_id_from_args(args) - args_pretty = args.join(" ").gsub(TEST_TMPDIR, "@TMPDIR@") - test_pretty = "#{self.class.name}\##{name}.#{@cmd_id_index += 1}" - "[#{test_pretty}] brew #{args_pretty}" - end - - def cmd_output(*args) - env = args.last.is_a?(Hash) ? args.pop : {} - - env.merge!( - "HOMEBREW_BREW_FILE" => HOMEBREW_PREFIX/"bin/brew", - "HOMEBREW_INTEGRATION_TEST" => cmd_id_from_args(args), - "HOMEBREW_TEST_TMPDIR" => TEST_TMPDIR, - "HOMEBREW_DEVELOPER" => ENV["HOMEBREW_DEVELOPER"], - ) - - ruby_args = [ - "-W0", - "-I", "#{HOMEBREW_LIBRARY_PATH}/test/support/lib", - "-I", HOMEBREW_LIBRARY_PATH.to_s, - "-rconfig" - ] - ruby_args << "-rsimplecov" if ENV["HOMEBREW_TESTS_COVERAGE"] - ruby_args << "-rtest/support/helper/integration_mocks" - ruby_args << (HOMEBREW_LIBRARY_PATH/"brew.rb").resolved_path.to_s - - Bundler.with_original_env do - output, status = Open3.capture2e(env, RUBY_PATH, *ruby_args, *args) - [output.chomp, status] - end - end - - def cmd(*args) - output, status = cmd_output(*args) - assert status.success?, <<-EOS.undent - `brew #{args.join " "}` exited with non-zero status! - #{output} - EOS - output - end - - def cmd_fail(*args) - output, status = cmd_output(*args) - refute status.success?, <<-EOS.undent - `brew #{args.join " "}` exited with zero status! - #{output} - EOS - output - end - - def setup_test_formula(name, content = nil) - formula_path = CoreTap.new.formula_dir/"#{name}.rb" - - case name - when /^testball/ - content = <<-EOS.undent - desc "Some test" - homepage "https://example.com/#{name}" - url "file://#{TEST_FIXTURE_DIR}/tarballs/testball-0.1.tbz" - sha256 "#{TESTBALL_SHA256}" - - option "with-foo", "Build with foo" - - def install - (prefix/"foo"/"test").write("test") if build.with? "foo" - prefix.install Dir["*"] - (buildpath/"test.c").write \ - "#include <stdio.h>\\nint main(){return printf(\\"test\\");}" - bin.mkpath - system ENV.cc, "test.c", "-o", bin/"test" - end - - #{content} - - # something here - EOS - when "foo" - content = <<-EOS.undent - url "https://example.com/#{name}-1.0" - EOS - when "bar" - content = <<-EOS.undent - url "https://example.com/#{name}-1.0" - depends_on "foo" - EOS - end - - formula_path.write <<-EOS.undent - class #{Formulary.class_s(name)} < Formula - #{content} - end - EOS - - formula_path - end - - def setup_remote_tap(name) - tap = Tap.fetch name - tap.install(full_clone: false, quiet: true) unless tap.installed? - tap - end - - def install_and_rename_coretap_formula(old_name, new_name) - core_tap = CoreTap.new - core_tap.path.cd do - shutup do - system "git", "init" - system "git", "add", "--all" - system "git", "commit", "-m", - "#{old_name.capitalize} has not yet been renamed" - end - end - - cmd("install", old_name) - (core_tap.path/"Formula/#{old_name}.rb").unlink - formula_renames = core_tap.path/"formula_renames.json" - formula_renames.write JSON.generate(old_name => new_name) - - core_tap.path.cd do - shutup do - system "git", "add", "--all" - system "git", "commit", "-m", - "#{old_name.capitalize} has been renamed to #{new_name.capitalize}" - end - end - end - - def testball - "#{TEST_FIXTURE_DIR}/testball.rb" - end -end diff --git a/Library/Homebrew/test/support/helper/lifecycle_enforcer.rb b/Library/Homebrew/test/support/helper/lifecycle_enforcer.rb deleted file mode 100644 index 413f8b11e7a384cd5363585e9ba4ad2ff0ee87f6..0000000000000000000000000000000000000000 --- a/Library/Homebrew/test/support/helper/lifecycle_enforcer.rb +++ /dev/null @@ -1,22 +0,0 @@ -module Test - module Helper - module LifecycleEnforcer - def setup - @__setup_called = true - super - end - - def teardown - @__teardown_called = true - super - end - - def after_teardown - assert @__setup_called, "Expected setup to call `super` but didn't" - assert @__teardown_called, "Expected teardown to call `super` but didn't" - - super - end - end - end -end diff --git a/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb b/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb index 671ffe73ce3cb8841a413241a5e947569ed35ae4..a82098a0e1c056df447bee09a7b3cee32542df6c 100644 --- a/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb +++ b/Library/Homebrew/test/support/helper/spec/shared_context/integration_test.rb @@ -1,4 +1,3 @@ -require "rspec" require "open3" RSpec::Matchers.define_negated_matcher :not_to_output, :output diff --git a/Library/Homebrew/test/support/helper/test_case.rb b/Library/Homebrew/test/support/helper/test_case.rb deleted file mode 100644 index 5e72bb04852b773fcb5d8031015087d88a7247bd..0000000000000000000000000000000000000000 --- a/Library/Homebrew/test/support/helper/test_case.rb +++ /dev/null @@ -1,112 +0,0 @@ -require "formulary" -require "tap" - -module Homebrew - class TestCase < ::Minitest::Test - require "test/support/helper/fs_leak_logger" - require "test/support/helper/lifecycle_enforcer" - require "test/support/helper/shutup" - include Test::Helper::FSLeakLogger - include Test::Helper::LifecycleEnforcer - include Test::Helper::Shutup - - TEST_DIRECTORIES = [ - CoreTap.instance.path/"Formula", - HOMEBREW_CACHE, - HOMEBREW_CACHE_FORMULA, - HOMEBREW_CELLAR, - HOMEBREW_LOCK_DIR, - HOMEBREW_LOGS, - HOMEBREW_TEMP, - ].freeze - - def setup - # These directories need to be created before - # `FSLeakLogger` is called with `super`. - TEST_DIRECTORIES.each(&:mkpath) - - super - - @__argv = ARGV.dup - @__env = ENV.to_hash # dup doesn't work on ENV - end - - def teardown - ARGV.replace(@__argv) - ENV.replace(@__env) - - Tab.clear_cache - - FileUtils.rm_rf [ - TEST_DIRECTORIES.map(&:children), - HOMEBREW_LINKED_KEGS, - HOMEBREW_PINNED_KEGS, - HOMEBREW_PREFIX/".git", - HOMEBREW_PREFIX/"bin", - HOMEBREW_PREFIX/"share", - HOMEBREW_PREFIX/"opt", - HOMEBREW_PREFIX/"Caskroom", - HOMEBREW_LIBRARY/"Taps/caskroom", - HOMEBREW_LIBRARY/"Taps/homebrew/homebrew-bundle", - HOMEBREW_LIBRARY/"Taps/homebrew/homebrew-foo", - HOMEBREW_LIBRARY/"Taps/homebrew/homebrew-services", - HOMEBREW_LIBRARY/"Taps/homebrew/homebrew-shallow", - HOMEBREW_REPOSITORY/".git", - CoreTap.instance.path/".git", - CoreTap.instance.alias_dir, - CoreTap.instance.path/"formula_renames.json", - ] - - super - end - - def formula(name = "formula_name", path = Formulary.core_path(name), spec = :stable, alias_path: nil, &block) - @_f = Class.new(Formula, &block).new(name, path, spec, alias_path: alias_path) - end - - def mktmpdir(prefix_suffix = nil, &block) - Dir.mktmpdir(prefix_suffix, HOMEBREW_TEMP, &block) - end - - def needs_compat - skip "Requires compat/ code" if ENV["HOMEBREW_NO_COMPAT"] - end - - def needs_python - skip "Requires Python" unless which("python") - end - - def assert_nothing_raised - yield - end - - def assert_eql(exp, act, msg = nil) - msg = message(msg, "") { diff exp, act } - assert exp.eql?(act), msg - end - - def refute_eql(exp, act, msg = nil) - msg = message(msg) do - "Expected #{mu_pp(act)} to not be eql to #{mu_pp(exp)}" - end - refute exp.eql?(act), msg - end - - def dylib_path(name) - Pathname.new("#{TEST_FIXTURE_DIR}/mach/#{name}.dylib") - end - - def bundle_path(name) - Pathname.new("#{TEST_FIXTURE_DIR}/mach/#{name}.bundle") - end - - # Use a stubbed {Formulary::FormulaLoader} to make a given formula be found - # when loading from {Formulary} with `ref`. - def stub_formula_loader(formula, ref = formula.full_name) - loader = mock - loader.stubs(:get_formula).returns(formula) - Formulary.stubs(:loader_for).with(ref, from: :keg).returns(loader) - Formulary.stubs(:loader_for).with(ref, from: nil).returns(loader) - end - end -end diff --git a/Library/Homebrew/test/testing_env.rb b/Library/Homebrew/test/testing_env.rb deleted file mode 100644 index 999fa1013961efa9929520a71d46a66973faf8d7..0000000000000000000000000000000000000000 --- a/Library/Homebrew/test/testing_env.rb +++ /dev/null @@ -1,18 +0,0 @@ -begin - require "minitest/autorun" - require "minitest/reporters" - Minitest::Reporters.use! Minitest::Reporters::DefaultReporter.new(color: true) - require "mocha/setup" - require "parallel_tests/test/runtime_logger" - require "simplecov" if ENV["HOMEBREW_TESTS_COVERAGE"] -rescue LoadError - abort "Run `bundle install` before running the tests." -end - -$LOAD_PATH.unshift(File.expand_path("#{ENV["HOMEBREW_LIBRARY"]}/Homebrew")) -$LOAD_PATH.unshift(File.expand_path("#{ENV["HOMEBREW_LIBRARY"]}/Homebrew/test/support/lib")) - -require "global" - -require "test/support/helper/test_case" -require "test/support/helper/integration_command_test_case" diff --git a/docs/brew.1.html b/docs/brew.1.html index ff2d6105cf691847ecbe3fb6420c7e70aa1e7850..94c4d7822df0f33fa9937d244eba4ccd0dbda82b 100644 --- a/docs/brew.1.html +++ b/docs/brew.1.html @@ -612,7 +612,7 @@ launched with access to IRB or a shell inside the temporary test directory.</p> not deleted.</p> <p>Example: <code>brew install jruby && brew test jruby</code></p></dd> -<dt><code>tests</code> [<code>-v</code>] [<code>--coverage</code>] [<code>--generic</code>] [<code>--no-compat</code>] [<code>--only=</code><var>test_script</var><code>:</code><var>test_method</var>] [<code>--seed</code> <var>seed</var>] [<code>--trace</code>] [<code>--online</code>] [<code>--official-cmd-taps</code>]</dt><dd><p>Run Homebrew's unit and integration tests.</p></dd> +<dt><code>tests</code> [<code>-v</code>] [<code>--coverage</code>] [<code>--generic</code>] [<code>--no-compat</code>] [<code>--only=</code><var>test_script</var><code>:</code><var>line_number</var>] [<code>--seed</code> <var>seed</var>] [<code>--online</code>] [<code>--official-cmd-taps</code>]</dt><dd><p>Run Homebrew's unit and integration tests.</p></dd> <dt><code>update-test</code> [<code>--commit=</code><var>commit</var>] [<code>--before=</code><var>date</var>] [<code>--keep-tmp</code>]</dt><dd><p>Runs a test of <code>brew update</code> with a new repository clone.</p> <p>If no arguments are passed, use <code>origin/master</code> as the start commit.</p> diff --git a/manpages/brew.1 b/manpages/brew.1 index 0899007b58f2ccda090ede26151c320d5025d8e3..15d6edf644d80eaac625f8336cbcf759dd33cd8d 100644 --- a/manpages/brew.1 +++ b/manpages/brew.1 @@ -816,7 +816,7 @@ If \fB\-\-keep\-tmp\fR is passed, the temporary files created for the test are n Example: \fBbrew install jruby && brew test jruby\fR . .TP -\fBtests\fR [\fB\-v\fR] [\fB\-\-coverage\fR] [\fB\-\-generic\fR] [\fB\-\-no\-compat\fR] [\fB\-\-only=\fR\fItest_script\fR\fB:\fR\fItest_method\fR] [\fB\-\-seed\fR \fIseed\fR] [\fB\-\-trace\fR] [\fB\-\-online\fR] [\fB\-\-official\-cmd\-taps\fR] +\fBtests\fR [\fB\-v\fR] [\fB\-\-coverage\fR] [\fB\-\-generic\fR] [\fB\-\-no\-compat\fR] [\fB\-\-only=\fR\fItest_script\fR\fB:\fR\fIline_number\fR] [\fB\-\-seed\fR \fIseed\fR] [\fB\-\-online\fR] [\fB\-\-official\-cmd\-taps\fR] Run Homebrew\'s unit and integration tests\. . .TP