Use Open3 for integration tests instead of manually forking.

This commit is contained in:
Markus Reiter 2017-02-09 17:15:36 +01:00
parent 9aa4888d2b
commit 956daf37a0
4 changed files with 31 additions and 50 deletions

View File

@ -217,6 +217,10 @@ class Keg
true
end
def require_relocation?
# no-op
end
def linked?
linked_keg_record.symlink? &&
linked_keg_record.directory? &&

View File

@ -14,7 +14,7 @@ class IntegrationCommandTestBottle < IntegrationCommandTestCase
FileUtils.ln_s "not-exist", "symlink"
end
assert_match(/testball-0\.1.*\.bottle\.tar\.gz/,
cmd_output("bottle", "--no-rebuild", "testball"))
cmd("bottle", "--no-rebuild", "testball"))
ensure
FileUtils.rm_f Dir["testball-0.1*.bottle.tar.gz"]
end

View File

@ -9,7 +9,7 @@ class IntegrationCommandTestOptions < IntegrationCommandTestCase
EOS
assert_equal "--with-foo\n\tBuild with foo\n--without-bar\n\tBuild without bar support",
cmd_output("options", "testball").chomp
cmd("options", "testball").chomp
end
end

View File

@ -3,6 +3,7 @@ require "fileutils"
require "pathname"
require "formula"
require "test/support/helper/test_case"
require "open3"
class IntegrationCommandTestCase < Homebrew::TestCase
def setup
@ -28,57 +29,34 @@ class IntegrationCommandTestCase < Homebrew::TestCase
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/support/lib
-I#{HOMEBREW_LIBRARY_PATH}
-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 << "-rtest/support/helper/integration_mocks"
cmd_args << (HOMEBREW_LIBRARY_PATH/"brew.rb").resolved_path.to_s
cmd_args += args
developer = ENV["HOMEBREW_DEVELOPER"]
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["HOMEBREW_DEVELOPER"] = developer
env.each_pair do |k, v|
ENV[k] = v
end
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
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 = cmd_output(*args)
status = $?.exitstatus
assert_equal 0, status, <<-EOS.undent
output, status = cmd_output(*args)
assert status.success?, <<-EOS.undent
`brew #{args.join " "}` exited with non-zero status!
#{output}
EOS
@ -86,9 +64,8 @@ class IntegrationCommandTestCase < Homebrew::TestCase
end
def cmd_fail(*args)
output = cmd_output(*args)
status = $?.exitstatus
refute_equal 0, status, <<-EOS.undent
output, status = cmd_output(*args)
refute status.success?, <<-EOS.undent
`brew #{args.join " "}` exited with zero status!
#{output}
EOS