diff --git a/Library/Homebrew/test/formula_installer_spec.rb b/Library/Homebrew/test/formula_installer_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..600b4560f89418424c7a463efce687355c035b29 --- /dev/null +++ b/Library/Homebrew/test/formula_installer_spec.rb @@ -0,0 +1,137 @@ +require "formula" +require "formula_installer" +require "keg" +require "tab" +require "test/support/fixtures/testball" +require "test/support/fixtures/testball_bottle" + +RSpec::Matchers.define_negated_matcher :need_bottle, :be_bottle_unneeded +RSpec::Matchers.alias_matcher :have_disabled_bottle, :be_bottle_disabled + +describe FormulaInstaller do + matcher :be_poured_from_bottle do + match(&:poured_from_bottle) + end + + def temporary_install(formula) + expect(formula).not_to be_installed + + installer = described_class.new(formula) + + shutup do + installer.install + end + + keg = Keg.new(formula.prefix) + + expect(formula).to be_installed + + begin + Tab.clear_cache + expect(Tab.for_keg(keg)).not_to be_poured_from_bottle + + yield formula + ensure + Tab.clear_cache + keg.unlink + keg.uninstall + formula.clear_cache + # there will be log files when sandbox is enable. + formula.logs.rmtree if formula.logs.directory? + end + + expect(keg).not_to exist + expect(formula).not_to be_installed + end + + specify "basic installation" do + ARGV << "--with-invalid_flag" # added to ensure it doesn't fail install + + temporary_install(Testball.new) do |f| + # Test that things made it into the Keg + expect(f.prefix/"readme").to exist + + expect(f.bin).to be_a_directory + expect(f.bin.children.count).to eq(3) + + expect(f.libexec).to be_a_directory + expect(f.libexec.children.count).to eq(1) + + expect(f.prefix/"main.c").not_to exist + expect(f.prefix/"license").not_to exist + + # Test that things make it into the Cellar + keg = Keg.new f.prefix + keg.link + + bin = HOMEBREW_PREFIX/"bin" + expect(bin).to be_a_directory + expect(bin.children.count).to eq(3) + expect(f.prefix/".brew/testball.rb").to be_readable + end + end + + specify "Formula installation with unneeded bottle" do + allow(DevelopmentTools).to receive(:installed?).and_return(false) + + formula = Testball.new + allow(formula).to receive(:bottle_unneeded?).and_return(true) + allow(formula).to receive(:bottle_disabled?).and_return(true) + + expect(formula).not_to be_bottled + expect(formula).not_to need_bottle + expect(formula).to have_disabled_bottle + + temporary_install(formula) do |f| + expect(f).to be_installed + end + end + + specify "Formula is not poured from bottle when compiler specified" do + expect(ARGV.cc).to be nil + + cc_arg = "--cc=clang" + ARGV << cc_arg + + temporary_install(TestballBottle.new) do |f| + tab = Tab.for_formula(f) + expect(tab.compiler).to eq("clang") + end + end + + specify "check installation sanity pinned dependency" do + dep_name = "dependency" + dep_path = CoreTap.new.formula_dir/"#{dep_name}.rb" + dep_path.write <<-EOS.undent + class #{Formulary.class_s(dep_name)} < Formula + url "foo" + version "0.2" + end + EOS + + Formulary::FORMULAE.delete(dep_path) + dependency = Formulary.factory(dep_name) + + dependent = formula do + url "foo" + version "0.5" + depends_on dependency.name.to_s + end + + (dependency.prefix("0.1")/"bin"/"a").mkpath + HOMEBREW_PINNED_KEGS.mkpath + FileUtils.ln_s dependency.prefix("0.1"), HOMEBREW_PINNED_KEGS/dep_name + + dependency_keg = Keg.new(dependency.prefix("0.1")) + dependency_keg.link + + expect(dependency_keg).to be_linked + expect(dependency).to be_pinned + + fi = FormulaInstaller.new(dependent) + + expect { + fi.check_install_sanity + }.to raise_error(CannotInstallFormulaError) + end +end diff --git a/Library/Homebrew/test/formula_installer_test.rb b/Library/Homebrew/test/formula_installer_test.rb deleted file mode 100644 index c99b2de74caa60ed3313847ca4d24cb1166eccd9..0000000000000000000000000000000000000000 --- a/Library/Homebrew/test/formula_installer_test.rb +++ /dev/null @@ -1,131 +0,0 @@ -require "testing_env" -require "formula" -require "formula_installer" -require "keg" -require "tab" -require "test/support/fixtures/testball" -require "test/support/fixtures/testball_bottle" - -class InstallTests < Homebrew::TestCase - def temporary_install(formula) - refute_predicate formula, :installed? - - installer = FormulaInstaller.new(formula) - - shutup { installer.install } - - keg = Keg.new(formula.prefix) - - assert_predicate formula, :installed? - - begin - Tab.clear_cache - refute_predicate Tab.for_keg(keg), :poured_from_bottle - - yield formula - ensure - Tab.clear_cache - keg.unlink - keg.uninstall - formula.clear_cache - # there will be log files when sandbox is enable. - formula.logs.rmtree if formula.logs.directory? - end - - refute_predicate keg, :exist? - refute_predicate formula, :installed? - end - - def test_a_basic_install - ARGV << "--with-invalid_flag" # added to ensure it doesn't fail install - temporary_install(Testball.new) do |f| - # Test that things made it into the Keg - assert_predicate f.prefix+"readme", :exist? - - assert_predicate f.bin, :directory? - assert_equal 3, f.bin.children.length - - assert_predicate f.libexec, :directory? - assert_equal 1, f.libexec.children.length - - refute_predicate f.prefix+"main.c", :exist? - - refute_predicate f.prefix+"license", :exist? - - # Test that things make it into the Cellar - keg = Keg.new f.prefix - keg.link - - bin = HOMEBREW_PREFIX+"bin" - assert_predicate bin, :directory? - assert_equal 3, bin.children.length - assert_predicate f.prefix/".brew/testball.rb", :readable? - end - end - - def test_bottle_unneeded_formula_install - DevelopmentTools.stubs(:installed?).returns(false) - - formula = Testball.new - formula.stubs(:bottle_unneeded?).returns(true) - formula.stubs(:bottle_disabled?).returns(true) - - refute_predicate formula, :bottled? - assert_predicate formula, :bottle_unneeded? - assert_predicate formula, :bottle_disabled? - - temporary_install(formula) do |f| - assert_predicate f, :installed? - end - end - - def test_not_poured_from_bottle_when_compiler_specified - assert_nil ARGV.cc - - cc_arg = "--cc=clang" - ARGV << cc_arg - - temporary_install(TestballBottle.new) do |f| - tab = Tab.for_formula(f) - assert_equal "clang", tab.compiler - end - end -end - -class FormulaInstallerTests < Homebrew::TestCase - def test_check_install_sanity_pinned_dep - dep_name = "dependency" - dep_path = CoreTap.new.formula_dir/"#{dep_name}.rb" - dep_path.write <<-EOS.undent - class #{Formulary.class_s(dep_name)} < Formula - url "foo" - version "0.2" - end - EOS - - Formulary::FORMULAE.delete(dep_path) - dependency = Formulary.factory(dep_name) - - dependent = formula do - url "foo" - version "0.5" - depends_on dependency.name.to_s - end - - dependency.prefix("0.1").join("bin/a").mkpath - HOMEBREW_PINNED_KEGS.mkpath - FileUtils.ln_s dependency.prefix("0.1"), HOMEBREW_PINNED_KEGS/dep_name - - dependency_keg = Keg.new(dependency.prefix("0.1")) - dependency_keg.link - - assert_predicate dependency_keg, :linked? - assert_predicate dependency, :pinned? - - fi = FormulaInstaller.new(dependent) - assert_raises(CannotInstallFormulaError) { fi.check_install_sanity } - ensure - dependency_keg.unlink - Formulary::FORMULAE.delete(dep_path) - end -end