diff --git a/Library/Homebrew/test/spec_helper.rb b/Library/Homebrew/test/spec_helper.rb
new file mode 100644
index 0000000000000000000000000000000000000000..7762b385c886c4aaae7449874fc2d73f1384c9e0
--- /dev/null
+++ b/Library/Homebrew/test/spec_helper.rb
@@ -0,0 +1,77 @@
+require "find"
+require "pathname"
+require "rspec/its"
+require "rspec/wait"
+require "set"
+
+if ENV["HOMEBREW_TESTS_COVERAGE"]
+  require "simplecov"
+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 "tap"
+
+require "test/support/helper/shutup"
+
+TEST_DIRECTORIES = [
+  CoreTap.instance.path/"Formula",
+  HOMEBREW_CACHE,
+  HOMEBREW_CACHE_FORMULA,
+  HOMEBREW_CELLAR,
+  HOMEBREW_LOCK_DIR,
+  HOMEBREW_LOGS,
+  HOMEBREW_TEMP,
+].freeze
+
+RSpec.configure do |config|
+  config.order = :random
+  config.include(Test::Helper::Shutup)
+  config.around(:each) do |example|
+    begin
+      TEST_DIRECTORIES.each(&:mkpath)
+
+      @__files_before_test = Find.find(TEST_TMPDIR).map { |f| f.sub(TEST_TMPDIR, "") }
+
+      @__argv = ARGV.dup
+      @__env = ENV.to_hash # dup doesn't work on ENV
+
+      example.run
+    ensure
+      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",
+      ]
+
+      files_after_test = Find.find(TEST_TMPDIR).map { |f| f.sub(TEST_TMPDIR, "") }
+
+      diff = Set.new(@__files_before_test).difference(Set.new(files_after_test))
+      expect(diff).to be_empty, <<-EOS.undent
+        file leak detected:
+        #{diff.map { |f| "  #{f}" }.join("\n")}
+      EOS
+    end
+  end
+end
diff --git a/Library/Homebrew/test/support/helper/test_case.rb b/Library/Homebrew/test/support/helper/test_case.rb
index daa66349436beb05df960ae15b8ea451d4cfd489..568beb947bb45a59cf10f657dba23df99151dc68 100644
--- a/Library/Homebrew/test/support/helper/test_case.rb
+++ b/Library/Homebrew/test/support/helper/test_case.rb
@@ -12,9 +12,6 @@ module Homebrew
     include Test::Helper::Shutup
     include Test::Helper::VersionAssertions
 
-    TEST_SHA1   = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef".freeze
-    TEST_SHA256 = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef".freeze
-
     TEST_DIRECTORIES = [
       CoreTap.instance.path/"Formula",
       HOMEBREW_CACHE,
diff --git a/Library/Homebrew/test/support/lib/config.rb b/Library/Homebrew/test/support/lib/config.rb
index f6fdb4ecbfb34d3276a5f859216a7f0dd86c0419..fb5c210fee843bdf59107692ad0696645cc2aa66 100644
--- a/Library/Homebrew/test/support/lib/config.rb
+++ b/Library/Homebrew/test/support/lib/config.rb
@@ -38,3 +38,6 @@ TESTBALL_SHA256 = "91e3f7930c98d7ccfb288e115ed52d06b0e5bc16fec7dce8bdda865300270
 TESTBALL_PATCHES_SHA256 = "799c2d551ac5c3a5759bea7796631a7906a6a24435b52261a317133a0bfb34d9".freeze
 PATCH_A_SHA256 = "83404f4936d3257e65f176c4ffb5a5b8d6edd644a21c8d8dcc73e22a6d28fcfa".freeze
 PATCH_B_SHA256 = "57958271bb802a59452d0816e0670d16c8b70bdf6530bcf6f78726489ad89b90".freeze
+
+TEST_SHA1   = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef".freeze
+TEST_SHA256 = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef".freeze