From d3740ec34f1ad98311a3ac606643db972d5130e9 Mon Sep 17 00:00:00 2001
From: Alyssa Ross <hi@alyssa.is>
Date: Mon, 19 Sep 2016 23:00:58 +0100
Subject: [PATCH] tests: run in parallel

---
 Library/Homebrew/dev-cmd/tests.rb       | 14 +++++++-----
 Library/Homebrew/test/Gemfile           |  1 +
 Library/Homebrew/test/Gemfile.lock      |  6 ++++-
 Library/Homebrew/test/Rakefile          | 29 -------------------------
 Library/Homebrew/test/test_inreplace.rb | 13 ++++++-----
 Library/Homebrew/test/testing_env.rb    |  2 +-
 6 files changed, 24 insertions(+), 41 deletions(-)
 delete mode 100644 Library/Homebrew/test/Rakefile

diff --git a/Library/Homebrew/dev-cmd/tests.rb b/Library/Homebrew/dev-cmd/tests.rb
index aa2a3bff9b..aba2fa3b64 100644
--- a/Library/Homebrew/dev-cmd/tests.rb
+++ b/Library/Homebrew/dev-cmd/tests.rb
@@ -6,7 +6,7 @@ require "tap"
 
 module Homebrew
   def tests
-    (HOMEBREW_LIBRARY/"Homebrew/test").cd do
+    (HOMEBREW_LIBRARY/"Homebrew").cd do
       ENV["HOMEBREW_NO_ANALYTICS_THIS_RUN"] = "1"
       ENV["HOMEBREW_DEVELOPER"] = "1"
       ENV["TESTOPTS"] = "-v" if ARGV.verbose?
@@ -19,9 +19,11 @@ module Homebrew
 
       if ARGV.include? "--coverage"
         ENV["HOMEBREW_TESTS_COVERAGE"] = "1"
-        FileUtils.rm_f "coverage/.resultset.json"
+        FileUtils.rm_f "test/coverage/.resultset.json"
       end
 
+      ENV["BUNDLE_GEMFILE"] = "#{Dir.pwd}/test/Gemfile"
+
       # Override author/committer as global settings might be invalid and thus
       # will cause silent failure during the setup of dummy Git repositories.
       %w[AUTHOR COMMITTER].each do |role|
@@ -37,16 +39,18 @@ module Homebrew
       # Make it easier to reproduce test runs.
       ENV["SEED"] = ARGV.next if ARGV.include? "--seed"
 
+      files = Dir["test/test_*.rb"]
+      files -= Dir["test/test_os_mac_*.rb"] unless OS.mac?
       args = []
       args << "--trace" if ARGV.include? "--trace"
       if ARGV.value("only")
         ENV["HOMEBREW_TESTS_ONLY"] = "1"
         test_name, test_method = ARGV.value("only").split("/", 2)
-        args << "TEST=test_#{test_name}.rb"
-        args << "TESTOPTS=--name=test_#{test_method}" if test_method
+        files = ["test/test_#{test_name}.rb"]
+        args << "--name=test_#{test_method}" if test_method
       end
       args += ARGV.named.select { |v| v[/^TEST(OPTS)?=/] }
-      system "bundle", "exec", "rake", "test", *args
+      system "bundle", "exec", "parallel_test", "--", *args, "--", *files
 
       Homebrew.failed = !$?.success?
 
diff --git a/Library/Homebrew/test/Gemfile b/Library/Homebrew/test/Gemfile
index b7666e5516..193604dd79 100644
--- a/Library/Homebrew/test/Gemfile
+++ b/Library/Homebrew/test/Gemfile
@@ -3,6 +3,7 @@ source "https://rubygems.org"
 gem "mocha", "~> 1.1"
 gem "minitest", "~> 5.3"
 gem "rake", "~> 10.3"
+gem "parallel_tests", "~> 2.9"
 
 group :coverage do
   # This is SimpleCov v0.12.0 with one PR merged on top, that finally resolves
diff --git a/Library/Homebrew/test/Gemfile.lock b/Library/Homebrew/test/Gemfile.lock
index ceb11128dc..841ff0b5cc 100644
--- a/Library/Homebrew/test/Gemfile.lock
+++ b/Library/Homebrew/test/Gemfile.lock
@@ -21,6 +21,9 @@ GEM
     minitest (5.9.0)
     mocha (1.1.0)
       metaclass (~> 0.0.1)
+    parallel (1.9.0)
+    parallel_tests (2.9.0)
+      parallel
     rake (10.5.0)
     simplecov-html (0.10.0)
     url (0.3.2)
@@ -32,8 +35,9 @@ DEPENDENCIES
   codecov
   minitest (~> 5.3)
   mocha (~> 1.1)
+  parallel_tests (~> 2.9)
   rake (~> 10.3)
   simplecov (= 0.12.0)!
 
 BUNDLED WITH
-   1.12.5
+   1.13.1
diff --git a/Library/Homebrew/test/Rakefile b/Library/Homebrew/test/Rakefile
deleted file mode 100644
index a2db861f20..0000000000
--- a/Library/Homebrew/test/Rakefile
+++ /dev/null
@@ -1,29 +0,0 @@
-require "rake"
-require "rake/testtask"
-
-def mac?
-  return false if ENV["HOMEBREW_TEST_GENERIC_OS"]
-  RUBY_PLATFORM.to_s.downcase.include? "darwin"
-end
-
-TEST_DIRECTORY = File.dirname(File.expand_path(__FILE__))
-TEST_FILES = Dir["#{TEST_DIRECTORY}/test_*.rb"].reject do |f|
-  f.include?("/test_os_mac_") && !mac?
-end
-
-task default: :test
-
-Rake::TestTask.new(:test) do |t|
-  t.libs << TEST_DIRECTORY
-  t.test_files = TEST_FILES
-end
-
-namespace :test do
-  TEST_FILES.each do |file|
-    name = file[/test_(.+)\.rb/, 1]
-    Rake::TestTask.new(name) do |t|
-      t.libs << TEST_DIRECTORY
-      t.test_files = [file]
-    end
-  end
-end
diff --git a/Library/Homebrew/test/test_inreplace.rb b/Library/Homebrew/test/test_inreplace.rb
index 91d57f942f..0e62f9d3f9 100644
--- a/Library/Homebrew/test/test_inreplace.rb
+++ b/Library/Homebrew/test/test_inreplace.rb
@@ -91,26 +91,29 @@ class InreplaceTest < Homebrew::TestCase
   end
 
   def test_inreplace_errors
+    require "tempfile"
     extend(Utils::Inreplace)
 
-    open("test", "w") { |f| f.write "a\nb\nc\n" }
+    file = Tempfile.new("test")
+
+    file.write "a\nb\nc\n"
 
     assert_raises(Utils::InreplaceError) do
-      inreplace "test", "d", "f"
+      inreplace file.path, "d", "f"
     end
 
     assert_raises(Utils::InreplaceError) do
       # Under current context, we are testing `String#gsub!`, so let's disable rubocop temporarily.
-      inreplace("test") { |s| s.gsub!("d", "f") } # rubocop:disable Performance/StringReplacement
+      inreplace(file.path) { |s| s.gsub!("d", "f") } # rubocop:disable Performance/StringReplacement
     end
 
     assert_raises(Utils::InreplaceError) do
-      inreplace("test") do |s|
+      inreplace(file.path) do |s|
         s.change_make_var! "VAR", "value"
         s.remove_make_var! "VAR2"
       end
     end
   ensure
-    File.unlink("test")
+    file.unlink
   end
 end
diff --git a/Library/Homebrew/test/testing_env.rb b/Library/Homebrew/test/testing_env.rb
index aa89ba2bd4..396d92e13f 100644
--- a/Library/Homebrew/test/testing_env.rb
+++ b/Library/Homebrew/test/testing_env.rb
@@ -42,7 +42,7 @@ module Homebrew
   module FSLeakLogger
     def self.included(klass)
       require "find"
-      @@log = File.open("fs_leak_log", "w")
+      @@log = File.open("#{__dir__}/fs_leak_log", "w")
       klass.make_my_diffs_pretty!
     end
 
-- 
GitLab