aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/test/integration_cmds_tests.rb
diff options
context:
space:
mode:
Diffstat (limited to 'Library/Homebrew/test/integration_cmds_tests.rb')
-rw-r--r--Library/Homebrew/test/integration_cmds_tests.rb194
1 files changed, 194 insertions, 0 deletions
diff --git a/Library/Homebrew/test/integration_cmds_tests.rb b/Library/Homebrew/test/integration_cmds_tests.rb
new file mode 100644
index 000000000..a63b343c0
--- /dev/null
+++ b/Library/Homebrew/test/integration_cmds_tests.rb
@@ -0,0 +1,194 @@
+require "bundler"
+require "testing_env"
+require "fileutils"
+require "pathname"
+require "formula"
+
+class IntegrationCommandTests < Homebrew::TestCase
+ def setup
+ @cmd_id_index = 0 # Assign unique IDs to invocations of `cmd_output`.
+ (HOMEBREW_PREFIX/"bin").mkpath
+ FileUtils.touch HOMEBREW_PREFIX/"bin/brew"
+ end
+
+ def teardown
+ coretap = CoreTap.new
+ paths_to_delete = [
+ HOMEBREW_LINKED_KEGS,
+ HOMEBREW_PINNED_KEGS,
+ HOMEBREW_CELLAR.children,
+ HOMEBREW_CACHE.children,
+ HOMEBREW_LOCK_DIR.children,
+ HOMEBREW_LOGS.children,
+ HOMEBREW_TEMP.children,
+ HOMEBREW_PREFIX/"bin",
+ HOMEBREW_PREFIX/"share",
+ HOMEBREW_PREFIX/"opt",
+ 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.path/".git",
+ coretap.alias_dir,
+ coretap.formula_dir.children,
+ coretap.path/"formula_renames.json",
+ ].flatten
+ FileUtils.rm_rf paths_to_delete
+ 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)
+ # 1.8-compatible way of writing def cmd_output(*args, **env)
+ env = args.last.is_a?(Hash) ? args.pop : {}
+ cmd_args = %W[
+ -W0
+ -I#{HOMEBREW_LIBRARY_PATH}/test/lib
+ -rconfig
+ ]
+ if ENV["HOMEBREW_TESTS_COVERAGE"]
+ # This is needed only because we currently use a patched version of
+ # simplecov, and gems installed through git are not available without
+ # requiring bundler/setup first. See also the comment in test/Gemfile.
+ # Remove this line when we'll switch back to a stable simplecov release.
+ cmd_args << "-rbundler/setup"
+ cmd_args << "-rsimplecov"
+ end
+ cmd_args << "-rintegration_mocks"
+ cmd_args << (HOMEBREW_LIBRARY_PATH/"brew.rb").resolved_path.to_s
+ cmd_args += args
+ Bundler.with_original_env do
+ ENV["HOMEBREW_BREW_FILE"] = HOMEBREW_PREFIX/"bin/brew"
+ ENV["HOMEBREW_INTEGRATION_TEST"] = cmd_id_from_args(args)
+ ENV["HOMEBREW_TEST_TMPDIR"] = TEST_TMPDIR
+ env.each_pair { |k, v| ENV[k] = v }
+
+ read, write = IO.pipe
+ begin
+ pid = fork do
+ read.close
+ $stdout.reopen(write)
+ $stderr.reopen(write)
+ write.close
+ exec RUBY_PATH, *cmd_args
+ end
+ write.close
+ read.read.chomp
+ ensure
+ Process.wait(pid)
+ read.close
+ end
+ end
+ end
+
+ def cmd(*args)
+ output = cmd_output(*args)
+ status = $?.exitstatus
+ puts "\n#{output}" if status.nonzero?
+ assert_equal 0, status
+ output
+ end
+
+ def cmd_fail(*args)
+ output = cmd_output(*args)
+ status = $?.exitstatus
+ $stderr.puts "\n#{output}" if status.zero?
+ refute_equal 0, status
+ 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://#{File.expand_path("..", __FILE__)}/tarballs/testball-0.1.tbz"
+ sha256 "#{TESTBALL_SHA256}"
+
+ option "with-foo", "Build with foo"
+ #{content}
+
+ 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
+
+ # 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 Utils::JSON.dump(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
+ "#{File.expand_path("..", __FILE__)}/testball.rb"
+ end
+end