aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/test/formula_installer_test.rb
blob: c99b2de74caa60ed3313847ca4d24cb1166eccd9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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