diff options
| author | Mike McQuaid | 2016-09-19 15:22:24 +0100 |
|---|---|---|
| committer | GitHub | 2016-09-19 15:22:24 +0100 |
| commit | c45119de75e70f32e3b3fdcccb210a88282a2f26 (patch) | |
| tree | 9f3bd4abbc80df1ca391537da0c195281e9a94a7 /Library/Homebrew/test | |
| parent | 7ed7e3cd1a22a258ab8336b1f34b258ab8774e04 (diff) | |
| parent | d89a696d83cd325656e30a99cb4ba8342ffb39c9 (diff) | |
| download | brew-c45119de75e70f32e3b3fdcccb210a88282a2f26.tar.bz2 | |
Merge pull request #971 from penman/follow_alias
Make `brew upgrade` and `brew outdated` follow alias changes
Diffstat (limited to 'Library/Homebrew/test')
| -rw-r--r-- | Library/Homebrew/test/test_formula.rb | 428 | ||||
| -rw-r--r-- | Library/Homebrew/test/test_formulary.rb | 2 | ||||
| -rw-r--r-- | Library/Homebrew/test/testing_env.rb | 8 |
3 files changed, 388 insertions, 50 deletions
diff --git a/Library/Homebrew/test/test_formula.rb b/Library/Homebrew/test/test_formula.rb index 7c09e765f..1da60c214 100644 --- a/Library/Homebrew/test/test_formula.rb +++ b/Library/Homebrew/test/test_formula.rb @@ -8,15 +8,153 @@ class FormulaTests < Homebrew::TestCase name = "formula_name" path = Formulary.core_path(name) spec = :stable - alias_path = CoreTap.instance.alias_dir/"formula_alias" + + f = klass.new(name, path, spec) + assert_equal name, f.name + assert_equal name, f.specified_name + assert_equal name, f.full_name + assert_equal name, f.full_specified_name + assert_equal path, f.path + assert_nil f.alias_path + assert_nil f.alias_name + assert_nil f.full_alias_name + assert_raises(ArgumentError) { klass.new } + end + + def test_formula_instantiation_with_alias + klass = Class.new(Formula) { url "http://example.com/foo-1.0.tar.gz" } + name = "formula_name" + path = Formulary.core_path(name) + spec = :stable + alias_name = "baz@1" + alias_path = CoreTap.instance.alias_dir/alias_name + + f = klass.new(name, path, spec, alias_path: alias_path) + assert_equal name, f.name + assert_equal name, f.full_name + assert_equal path, f.path + assert_equal alias_path, f.alias_path + assert_equal alias_name, f.alias_name + assert_equal alias_name, f.specified_name + assert_equal alias_name, f.full_alias_name + assert_equal alias_name, f.full_specified_name + assert_raises(ArgumentError) { klass.new } + end + + def test_tap_formula_instantiation + tap = Tap.new("foo", "bar") + klass = Class.new(Formula) { url "baz-1.0" } + name = "baz" + full_name = "#{tap.user}/#{tap.repo}/#{name}" + path = tap.path/"Formula/#{name}.rb" + spec = :stable + + f = klass.new(name, path, spec) + assert_equal name, f.name + assert_equal name, f.specified_name + assert_equal full_name, f.full_name + assert_equal full_name, f.full_specified_name + assert_equal path, f.path + assert_nil f.alias_path + assert_nil f.alias_name + assert_nil f.full_alias_name + assert_raises(ArgumentError) { klass.new } + end + + def test_tap_formula_instantiation_with_alias + tap = Tap.new("foo", "bar") + klass = Class.new(Formula) { url "baz-1.0" } + name = "baz" + full_name = "#{tap.user}/#{tap.repo}/#{name}" + path = tap.path/"Formula/#{name}.rb" + spec = :stable + alias_name = "baz@1" + full_alias_name = "#{tap.user}/#{tap.repo}/#{alias_name}" + alias_path = CoreTap.instance.alias_dir/alias_name f = klass.new(name, path, spec, alias_path: alias_path) assert_equal name, f.name + assert_equal full_name, f.full_name assert_equal path, f.path assert_equal alias_path, f.alias_path + assert_equal alias_name, f.alias_name + assert_equal alias_name, f.specified_name + assert_equal full_alias_name, f.full_alias_name + assert_equal full_alias_name, f.full_specified_name assert_raises(ArgumentError) { klass.new } end + def test_follow_installed_alias + f = formula { url "foo-1.0" } + assert_predicate f, :follow_installed_alias? + + f.follow_installed_alias = true + assert_predicate f, :follow_installed_alias? + + f.follow_installed_alias = false + refute_predicate f, :follow_installed_alias? + end + + def test_installed_alias_with_core + f = formula { url "foo-1.0" } + + build_values_with_no_installed_alias = [ + nil, + BuildOptions.new({}, {}), + Tab.new(source: { "path" => f.path.to_s }), + ] + + build_values_with_no_installed_alias.each do |build| + f.build = build + assert_nil f.installed_alias_path + assert_nil f.installed_alias_name + assert_nil f.full_installed_alias_name + assert_equal f.name, f.installed_specified_name + assert_equal f.name, f.full_installed_specified_name + end + + alias_name = "bar" + alias_path = "#{CoreTap.instance.alias_dir}/#{alias_name}" + f.build = Tab.new(source: { "path" => alias_path }) + assert_equal alias_path, f.installed_alias_path + assert_equal alias_name, f.installed_alias_name + assert_equal alias_name, f.full_installed_alias_name + assert_equal alias_name, f.installed_specified_name + assert_equal alias_name, f.full_installed_specified_name + end + + def test_installed_alias_with_tap + tap = Tap.new("user", "repo") + name = "foo" + path = "#{tap.path}/Formula/#{name}.rb" + f = formula(name, path) { url "foo-1.0" } + + build_values_with_no_installed_alias = [ + nil, + BuildOptions.new({}, {}), + Tab.new(source: { "path" => f.path }), + ] + + build_values_with_no_installed_alias.each do |build| + f.build = build + assert_nil f.installed_alias_path + assert_nil f.installed_alias_name + assert_nil f.full_installed_alias_name + assert_equal f.name, f.installed_specified_name + assert_equal f.full_name, f.full_installed_specified_name + end + + alias_name = "bar" + full_alias_name = "#{tap.user}/#{tap.repo}/#{alias_name}" + alias_path = "#{tap.alias_dir}/#{alias_name}" + f.build = Tab.new(source: { "path" => alias_path }) + assert_equal alias_path, f.installed_alias_path + assert_equal alias_name, f.installed_alias_name + assert_equal full_alias_name, f.full_installed_alias_name + assert_equal alias_name, f.installed_specified_name + assert_equal full_alias_name, f.full_installed_specified_name + end + def test_prefix f = Testball.new assert_equal HOMEBREW_CELLAR/f.name/"0.1", f.prefix @@ -248,6 +386,62 @@ class FormulaTests < Homebrew::TestCase assert_nil Testball.new <=> Object.new end + def test_alias_paths_with_build_options + alias_path = CoreTap.instance.alias_dir/"another_name" + f = formula(:alias_path => alias_path) { url "foo-1.0" } + f.build = BuildOptions.new({}, {}) + assert_equal alias_path, f.alias_path + assert_nil f.installed_alias_path + end + + def test_alias_paths_with_tab_with_non_alias_source_path + alias_path = CoreTap.instance.alias_dir/"another_name" + source_path = CoreTap.instance.formula_dir/"another_other_name" + f = formula(:alias_path => alias_path) { url "foo-1.0" } + f.build = Tab.new(:source => { "path" => source_path.to_s }) + assert_equal alias_path, f.alias_path + assert_nil f.installed_alias_path + end + + def test_alias_paths_with_tab_with_alias_source_path + alias_path = CoreTap.instance.alias_dir/"another_name" + source_path = CoreTap.instance.alias_dir/"another_other_name" + f = formula(:alias_path => alias_path) { url "foo-1.0" } + f.build = Tab.new(:source => { "path" => source_path.to_s }) + assert_equal alias_path, f.alias_path + assert_equal source_path.to_s, f.installed_alias_path + end + + def test_installed_with_alias_path_with_nil + assert_predicate Formula.installed_with_alias_path(nil), :empty? + end + + def test_installed_with_alias_path_with_a_path + alias_path = "#{CoreTap.instance.alias_dir}/alias" + different_alias_path = "#{CoreTap.instance.alias_dir}/another_alias" + + formula_with_alias = formula("foo") { url "foo-1.0" } + formula_with_alias.build = Tab.empty + formula_with_alias.build.source["path"] = alias_path + + formula_without_alias = formula("bar") { url "bar-1.0" } + formula_without_alias.build = Tab.empty + formula_without_alias.build.source["path"] = formula_without_alias.path.to_s + + formula_with_different_alias = formula("baz") { url "baz-1.0" } + formula_with_different_alias.build = Tab.empty + formula_with_different_alias.build.source["path"] = different_alias_path + + formulae = [ + formula_with_alias, + formula_without_alias, + formula_with_different_alias, + ] + + Formula.stubs(:installed).returns(formulae) + assert_equal [formula_with_alias], Formula.installed_with_alias_path(alias_path) + end + def test_formula_spec_integration f = formula do homepage "http://example.com" @@ -581,29 +775,113 @@ class FormulaTests < Homebrew::TestCase end end +class AliasChangeTests < Homebrew::TestCase + attr_reader :f, :new_formula, :tab, :alias_path + + def make_formula(version) + f = formula(alias_path: alias_path) { url "foo-#{version}" } + f.build = tab + f + end + + def setup + alias_name = "bar" + @alias_path = "#{CoreTap.instance.alias_dir}/#{alias_name}" + + @tab = Tab.empty + + @f = make_formula("1.0") + @new_formula = make_formula("1.1") + + Formula.stubs(:installed).returns([f]) + end + + def test_alias_changes_when_not_installed_with_alias + tab.source["path"] = Formulary.core_path(f.name).to_s + + assert_nil f.current_installed_alias_target + assert_equal f, f.latest_formula + refute_predicate f, :installed_alias_target_changed? + refute_predicate f, :supersedes_an_installed_formula? + refute_predicate f, :alias_changed? + assert_predicate f.old_installed_formulae, :empty? + end + + def test_alias_changes_when_not_changed + tab.source["path"] = alias_path + stub_formula_loader(f, alias_path) + + assert_equal f, f.current_installed_alias_target + assert_equal f, f.latest_formula + refute_predicate f, :installed_alias_target_changed? + refute_predicate f, :supersedes_an_installed_formula? + refute_predicate f, :alias_changed? + assert_predicate f.old_installed_formulae, :empty? + end + + def test_alias_changes_when_new_alias_target + tab.source["path"] = alias_path + stub_formula_loader(new_formula, alias_path) + + assert_equal new_formula, f.current_installed_alias_target + assert_equal new_formula, f.latest_formula + assert_predicate f, :installed_alias_target_changed? + refute_predicate f, :supersedes_an_installed_formula? + assert_predicate f, :alias_changed? + assert_predicate f.old_installed_formulae, :empty? + end + + def test_alias_changes_when_old_formulae_installed + tab.source["path"] = alias_path + stub_formula_loader(new_formula, alias_path) + + assert_equal new_formula, new_formula.current_installed_alias_target + assert_equal new_formula, new_formula.latest_formula + refute_predicate new_formula, :installed_alias_target_changed? + assert_predicate new_formula, :supersedes_an_installed_formula? + assert_predicate new_formula, :alias_changed? + assert_equal [f], new_formula.old_installed_formulae + end +end + class OutdatedVersionsTests < Homebrew::TestCase - attr_reader :outdated_prefix, :same_prefix, :greater_prefix, :head_prefix - attr_reader :f + attr_reader :outdated_prefix, + :same_prefix, + :greater_prefix, + :head_prefix, + :old_alias_target_prefix + attr_reader :f, :old_formula, :new_formula def setup @f = formula do url "foo" version "1.20" end + + @old_formula = formula("foo@1") { url "foo-1.0" } + @new_formula = formula("foo@2") { url "foo-2.0" } + @outdated_prefix = HOMEBREW_CELLAR/"#{f.name}/1.11" @same_prefix = HOMEBREW_CELLAR/"#{f.name}/1.20" @greater_prefix = HOMEBREW_CELLAR/"#{f.name}/1.21" @head_prefix = HOMEBREW_CELLAR/"#{f.name}/HEAD" + @old_alias_target_prefix = HOMEBREW_CELLAR/"#{old_formula.name}/1.0" end def teardown - @f.rack.rmtree if @f.rack.exist? + formulae = [@f, @old_formula, @new_formula] + formulae.map(&:rack).select(&:exist?).each(&:rmtree) + end + + def alias_path + "#{@f.tap.alias_dir}/bar" end def setup_tab_for_prefix(prefix, options = {}) prefix.mkpath tab = Tab.empty tab.tabfile = prefix.join("INSTALL_RECEIPT.json") + tab.source["path"] = options[:path].to_s if options[:path] tab.source["tap"] = options[:tap] if options[:tap] tab.source["versions"] = options[:versions] if options[:versions] tab.source_modified_time = options[:source_modified_time].to_i @@ -611,96 +889,148 @@ class OutdatedVersionsTests < Homebrew::TestCase tab end - def reset_outdated_versions - f.instance_variable_set(:@outdated_versions, nil) + def reset_outdated_kegs + f.instance_variable_set(:@outdated_kegs, nil) end def test_greater_different_tap_installed setup_tab_for_prefix(greater_prefix, tap: "user/repo") - assert_predicate f.outdated_versions, :empty? + assert_predicate f.outdated_kegs, :empty? end def test_greater_same_tap_installed f.instance_variable_set(:@tap, CoreTap.instance) setup_tab_for_prefix(greater_prefix, tap: "homebrew/core") - assert_predicate f.outdated_versions, :empty? + assert_predicate f.outdated_kegs, :empty? end def test_outdated_different_tap_installed setup_tab_for_prefix(outdated_prefix, tap: "user/repo") - refute_predicate f.outdated_versions, :empty? + refute_predicate f.outdated_kegs, :empty? end def test_outdated_same_tap_installed f.instance_variable_set(:@tap, CoreTap.instance) setup_tab_for_prefix(outdated_prefix, tap: "homebrew/core") - refute_predicate f.outdated_versions, :empty? + refute_predicate f.outdated_kegs, :empty? + end + + def test_outdated_follow_alias_and_alias_unchanged + f.follow_installed_alias = true + f.build = setup_tab_for_prefix(same_prefix, path: alias_path) + stub_formula_loader(f, alias_path) + assert_predicate f.outdated_kegs, :empty? + end + + def test_outdated_follow_alias_and_alias_changed_and_new_target_not_installed + f.follow_installed_alias = true + f.build = setup_tab_for_prefix(same_prefix, path: alias_path) + stub_formula_loader(new_formula, alias_path) + refute_predicate f.outdated_kegs, :empty? + end + + def test_outdated_follow_alias_and_alias_changed_and_new_target_installed + f.follow_installed_alias = true + f.build = setup_tab_for_prefix(same_prefix, path: alias_path) + stub_formula_loader(new_formula, alias_path) + setup_tab_for_prefix(new_formula.prefix) # install new_formula + assert_predicate f.outdated_kegs, :empty? + end + + def test_outdated_no_follow_alias_and_alias_unchanged + f.follow_installed_alias = false + f.build = setup_tab_for_prefix(same_prefix, path: alias_path) + stub_formula_loader(f, alias_path) + assert_predicate f.outdated_kegs, :empty? + end + + def test_outdated_no_follow_alias_and_alias_changed + f.follow_installed_alias = false + f.build = setup_tab_for_prefix(same_prefix, path: alias_path) + stub_formula_loader(formula("foo@2") { url "foo-2.0" }, alias_path) + assert_predicate f.outdated_kegs, :empty? + end + + def test_outdated_old_alias_targets_installed + @f = formula(alias_path: alias_path) { url "foo-1.0" } + tab = setup_tab_for_prefix(old_alias_target_prefix, path: alias_path) + old_formula.build = tab + Formula.stubs(:installed).returns([old_formula]) + refute_predicate f.outdated_kegs, :empty? + end + + def test_outdated_old_alias_targets_not_installed + @f = formula(alias_path: alias_path) { url "foo-1.0" } + tab = setup_tab_for_prefix(old_alias_target_prefix, path: old_formula.path) + old_formula.build = tab + Formula.stubs(:installed).returns([old_formula]) + assert_predicate f.outdated_kegs, :empty? end - def test_same_head_installed + def test_outdated_same_head_installed f.instance_variable_set(:@tap, CoreTap.instance) setup_tab_for_prefix(head_prefix, tap: "homebrew/core") - assert_predicate f.outdated_versions, :empty? + assert_predicate f.outdated_kegs, :empty? end - def test_different_head_installed + def test_outdated_different_head_installed f.instance_variable_set(:@tap, CoreTap.instance) setup_tab_for_prefix(head_prefix, tap: "user/repo") - assert_predicate f.outdated_versions, :empty? + assert_predicate f.outdated_kegs, :empty? end - def test_mixed_taps_greater_version_installed + def test_outdated_mixed_taps_greater_version_installed f.instance_variable_set(:@tap, CoreTap.instance) setup_tab_for_prefix(outdated_prefix, tap: "homebrew/core") setup_tab_for_prefix(greater_prefix, tap: "user/repo") - assert_predicate f.outdated_versions, :empty? + assert_predicate f.outdated_kegs, :empty? setup_tab_for_prefix(greater_prefix, tap: "homebrew/core") - reset_outdated_versions + reset_outdated_kegs - assert_predicate f.outdated_versions, :empty? + assert_predicate f.outdated_kegs, :empty? end - def test_mixed_taps_outdated_version_installed + def test_outdated_mixed_taps_outdated_version_installed f.instance_variable_set(:@tap, CoreTap.instance) extra_outdated_prefix = HOMEBREW_CELLAR/"#{f.name}/1.0" setup_tab_for_prefix(outdated_prefix) setup_tab_for_prefix(extra_outdated_prefix, tap: "homebrew/core") - reset_outdated_versions + reset_outdated_kegs - refute_predicate f.outdated_versions, :empty? + refute_predicate f.outdated_kegs, :empty? setup_tab_for_prefix(outdated_prefix, tap: "user/repo") - reset_outdated_versions + reset_outdated_kegs - refute_predicate f.outdated_versions, :empty? + refute_predicate f.outdated_kegs, :empty? end - def test_same_version_tap_installed + def test_outdated_same_version_tap_installed f.instance_variable_set(:@tap, CoreTap.instance) setup_tab_for_prefix(same_prefix, tap: "homebrew/core") - assert_predicate f.outdated_versions, :empty? + assert_predicate f.outdated_kegs, :empty? setup_tab_for_prefix(same_prefix, tap: "user/repo") - reset_outdated_versions + reset_outdated_kegs - assert_predicate f.outdated_versions, :empty? + assert_predicate f.outdated_kegs, :empty? end def test_outdated_installed_head_less_than_stable tab = setup_tab_for_prefix(head_prefix, versions: { "stable" => "1.0" }) - refute_predicate f.outdated_versions, :empty? + refute_predicate f.outdated_kegs, :empty? # Tab.for_keg(head_prefix) will be fetched from CACHE but we write it anyway tab.source["versions"] = { "stable" => f.version.to_s } tab.write - reset_outdated_versions + reset_outdated_kegs - assert_predicate f.outdated_versions, :empty? + assert_predicate f.outdated_kegs, :empty? end def test_outdated_fetch_head @@ -738,20 +1068,20 @@ class OutdatedVersionsTests < Homebrew::TestCase end end - refute_predicate f.outdated_versions(fetch_head: true), :empty? + refute_predicate f.outdated_kegs(fetch_head: true), :empty? tab_a.source["versions"] = { "stable" => f.version.to_s } tab_a.write - reset_outdated_versions - refute_predicate f.outdated_versions(fetch_head: true), :empty? + reset_outdated_kegs + refute_predicate f.outdated_kegs(fetch_head: true), :empty? head_prefix_a.rmtree - reset_outdated_versions - refute_predicate f.outdated_versions(fetch_head: true), :empty? + reset_outdated_kegs + refute_predicate f.outdated_kegs(fetch_head: true), :empty? setup_tab_for_prefix(head_prefix_c, source_modified_time: 1) - reset_outdated_versions - assert_predicate f.outdated_versions(fetch_head: true), :empty? + reset_outdated_kegs + assert_predicate f.outdated_kegs(fetch_head: true), :empty? ensure ENV.replace(initial_env) testball_repo.rmtree if testball_repo.exist? @@ -762,7 +1092,7 @@ class OutdatedVersionsTests < Homebrew::TestCase FileUtils.rm_rf HOMEBREW_CELLAR/"testball" end - def test_outdated_versions_version_scheme_changed + def test_outdated_kegs_version_scheme_changed @f = formula("testball") do url "foo" version "20141010" @@ -772,12 +1102,12 @@ class OutdatedVersionsTests < Homebrew::TestCase prefix = HOMEBREW_CELLAR.join("testball/0.1") setup_tab_for_prefix(prefix, versions: { "stable" => "0.1" }) - refute_predicate f.outdated_versions, :empty? + refute_predicate f.outdated_kegs, :empty? ensure prefix.rmtree end - def test_outdated_versions_mixed_version_schemes + def test_outdated_kegs_mixed_version_schemes @f = formula("testball") do url "foo" version "20141010" @@ -790,23 +1120,23 @@ class OutdatedVersionsTests < Homebrew::TestCase prefix_b = HOMEBREW_CELLAR.join("testball/2.14") setup_tab_for_prefix(prefix_b, versions: { "stable" => "2.14", "version_scheme" => 2 }) - refute_predicate f.outdated_versions, :empty? - reset_outdated_versions + refute_predicate f.outdated_kegs, :empty? + reset_outdated_kegs prefix_c = HOMEBREW_CELLAR.join("testball/20141009") setup_tab_for_prefix(prefix_c, versions: { "stable" => "20141009", "version_scheme" => 3 }) - refute_predicate f.outdated_versions, :empty? - reset_outdated_versions + refute_predicate f.outdated_kegs, :empty? + reset_outdated_kegs prefix_d = HOMEBREW_CELLAR.join("testball/20141011") setup_tab_for_prefix(prefix_d, versions: { "stable" => "20141009", "version_scheme" => 3 }) - assert_predicate f.outdated_versions, :empty? + assert_predicate f.outdated_kegs, :empty? ensure f.rack.rmtree end - def test_outdated_versions_head_with_version_scheme + def test_outdated_kegs_head_with_version_scheme @f = formula("testball") do url "foo" version "1.0" @@ -816,13 +1146,13 @@ class OutdatedVersionsTests < Homebrew::TestCase head_prefix = HOMEBREW_CELLAR.join("testball/HEAD") setup_tab_for_prefix(head_prefix, versions: { "stable" => "1.0", "version_scheme" => 1 }) - refute_predicate f.outdated_versions, :empty? + refute_predicate f.outdated_kegs, :empty? - reset_outdated_versions + reset_outdated_kegs head_prefix.rmtree setup_tab_for_prefix(head_prefix, versions: { "stable" => "1.0", "version_scheme" => 2 }) - assert_predicate f.outdated_versions, :empty? + assert_predicate f.outdated_kegs, :empty? ensure head_prefix.rmtree end diff --git a/Library/Homebrew/test/test_formulary.rb b/Library/Homebrew/test/test_formulary.rb index 8b3417dad..c545ff84d 100644 --- a/Library/Homebrew/test/test_formulary.rb +++ b/Library/Homebrew/test/test_formulary.rb @@ -89,7 +89,7 @@ class FormularyFactoryTest < Homebrew::TestCase FileUtils.ln_s @path, alias_path result = Formulary.factory("foo") assert_kind_of Formula, result - assert_equal alias_path, result.alias_path + assert_equal alias_path.to_s, result.alias_path ensure alias_dir.rmtree end diff --git a/Library/Homebrew/test/testing_env.rb b/Library/Homebrew/test/testing_env.rb index cbbc5eff1..aa89ba2bd 100644 --- a/Library/Homebrew/test/testing_env.rb +++ b/Library/Homebrew/test/testing_env.rb @@ -121,5 +121,13 @@ module Homebrew ENV.replace old end end + + # Use a stubbed {Formulary::FormulaLoader} to make a given formula be found + # when loading from {Formulary} with `ref`. + def stub_formula_loader(formula, ref = formula.name) + loader = mock + loader.stubs(:get_formula).returns(formula) + Formulary.stubs(:loader_for).with(ref).returns(loader) + end end end |
