blob: 93f23b18ff599e068532b52b0a6c79d90218d230 (
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
132
133
134
135
 | require "formula"
require "formula_installer"
require "keg"
require "tab"
require "test/support/fixtures/testball"
require "test/support/fixtures/testball_bottle"
describe FormulaInstaller do
  define_negated_matcher :need_bottle, :be_bottle_unneeded
  alias_matcher :have_disabled_bottle, :be_bottle_disabled
  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)
    installer.install
    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
      class #{Formulary.class_s(dep_name)} < Formula
        url "foo"
        version "0.2"
      end
    EOS
    Formulary.cache.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
 |