summaryrefslogtreecommitdiff
path: root/test/rubygems/test_gem_dependency_installer.rb
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-03-07 08:44:45 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-03-07 08:44:45 +0000
commit1df42597d15416357a20bd68700ce1a2d245e8bb (patch)
treef588f28559958e27464866d7b137955bfff04a6f /test/rubygems/test_gem_dependency_installer.rb
parentfc634cc092f486adfc911f614b7b4aa2c48c698d (diff)
cancel subversion backfire. sorry
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31046 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/rubygems/test_gem_dependency_installer.rb')
-rw-r--r--test/rubygems/test_gem_dependency_installer.rb305
1 files changed, 213 insertions, 92 deletions
diff --git a/test/rubygems/test_gem_dependency_installer.rb b/test/rubygems/test_gem_dependency_installer.rb
index cdc0428e9f..5cf79d3c59 100644
--- a/test/rubygems/test_gem_dependency_installer.rb
+++ b/test/rubygems/test_gem_dependency_installer.rb
@@ -6,66 +6,28 @@
require 'rubygems/test_case'
require 'rubygems/dependency_installer'
+require 'rubygems/security'
class TestGemDependencyInstaller < Gem::TestCase
def setup
super
- @gems_dir = File.join @tempdir, 'gems'
- @cache_dir = File.join @gemhome, 'cache'
- FileUtils.mkdir @gems_dir
+ @gems_dir = File.join @tempdir, 'gems'
+ @cache_dir = Gem.cache_dir(@gemhome)
- write_file File.join('gems', 'a-1', 'bin', 'a_bin') do |fp|
- fp.puts "#!/usr/bin/ruby"
- end
+ FileUtils.mkdir @gems_dir
- @a1, @a1_gem = util_gem 'a', '1' do |s| s.executables << 'a_bin' end
- @aa1, @aa1_gem = util_gem 'aa', '1'
+ @a1, @a1_gem = util_gem 'a', '1' do |s| s.executables << 'a_bin' end
@a1_pre, @a1_pre_gem = util_gem 'a', '1.a'
-
- @b1, @b1_gem = util_gem 'b', '1' do |s|
- s.add_dependency 'a'
- s.add_development_dependency 'aa'
- end
-
- @b1_pre, @b1_pre_gem = util_gem 'b', '1.a' do |s|
+ @b1, @b1_gem = util_gem 'b', '1' do |s|
s.add_dependency 'a'
s.add_development_dependency 'aa'
end
- @c1_pre, @c1_pre_gem = util_gem 'c', '1.a' do |s|
- s.add_dependency 'a', '1.a'
- s.add_dependency 'b', '1'
- end
-
- @d1, @d1_gem = util_gem 'd', '1'
- @d2, @d2_gem = util_gem 'd', '2'
-
- @x1_m, @x1_m_gem = util_gem 'x', '1' do |s|
- s.platform = Gem::Platform.new %w[cpu my_platform 1]
- end
-
- @x1_o, @x1_o_gem = util_gem 'x', '1' do |s|
- s.platform = Gem::Platform.new %w[cpu other_platform 1]
- end
-
- @w1, @w1_gem = util_gem 'w', '1', 'x' => nil
-
- @y1, @y1_gem = util_gem 'y', '1'
- @y1_1_p, @y1_1_p_gem = util_gem 'y', '1.1' do |s|
- s.platform = Gem::Platform.new %w[cpu my_platform 1]
- end
-
- @z1, @z1_gem = util_gem 'z', '1', 'y' => nil
-
- @fetcher = Gem::FakeFetcher.new
- Gem::RemoteFetcher.fetcher = @fetcher
-
- util_setup_spec_fetcher(@a1, @a1_pre, @b1, @b1_pre, @c1_pre, @d1, @d2,
- @x1_m, @x1_o, @w1, @y1, @y1_1_p, @z1)
+ Gem::RemoteFetcher.fetcher = @fetcher = Gem::FakeFetcher.new
- util_clear_gems
+ util_reset_gems
end
def test_install
@@ -120,8 +82,8 @@ class TestGemDependencyInstaller < Gem::TestCase
assert_equal %w[a-1 b-1], inst.installed_gems.map { |s| s.full_name }
- assert File.exist?(File.join(@tempdir, 'cache', @a1.file_name))
- assert File.exist?(File.join(@tempdir, 'cache', @b1.file_name))
+ assert Gem.cache_gem(@a1.file_name, @gemhome)
+ assert Gem.cache_gem(@b1.file_name, @gemhome)
end
def test_install_dependencies_satisfied
@@ -168,6 +130,10 @@ class TestGemDependencyInstaller < Gem::TestCase
end
def test_install_dependency_development
+ @aa1, @aa1_gem = util_gem 'aa', '1'
+
+ util_reset_gems
+
FileUtils.mv @a1_gem, @tempdir
FileUtils.mv @aa1_gem, @tempdir
FileUtils.mv @b1_gem, @tempdir
@@ -321,7 +287,7 @@ class TestGemDependencyInstaller < Gem::TestCase
assert_equal %w[a-1], inst.installed_gems.map { |s| s.full_name }
assert File.exist?(File.join(gemhome2, 'specifications', @a1.spec_name))
- assert File.exist?(File.join(gemhome2, 'cache', @a1.file_name))
+ assert File.exist?(Gem.cache_gem(@a1.file_name, gemhome2))
end
def test_install_domain_both
@@ -376,12 +342,13 @@ class TestGemDependencyInstaller < Gem::TestCase
Gem.source_index.remove_spec @a1_pre.full_name
Dir.chdir @tempdir do
- e = assert_raises Gem::InstallError do
+ e = assert_raises Gem::DependencyError do
inst = Gem::DependencyInstaller.new :domain => :local
inst.install 'b'
end
- assert_equal 'b requires a (>= 0, runtime)', e.message
+ expected = "Unable to resolve dependencies: b requires a (>= 0)"
+ assert_equal expected, e.message
end
assert_equal [], inst.installed_gems.map { |s| s.full_name }
@@ -425,6 +392,22 @@ class TestGemDependencyInstaller < Gem::TestCase
assert_equal %w[b-1], inst.installed_gems.map { |s| s.full_name }
end
+ def test_install_reinstall
+ Gem::Installer.new(@a1_gem).install
+ FileUtils.mv @a1_gem, @tempdir
+ inst = nil
+
+ Dir.chdir @tempdir do
+ inst = Gem::DependencyInstaller.new
+ inst.install 'a'
+ end
+
+ assert_equal Gem::SourceIndex.new(@a1.full_name => @a1),
+ Gem::SourceIndex.from_installed_gems
+
+ assert_equal %w[a-1], inst.installed_gems.map { |s| s.full_name }
+ end
+
def test_install_remote
a1_data = nil
File.open @a1_gem, 'rb' do |fp|
@@ -460,7 +443,7 @@ class TestGemDependencyInstaller < Gem::TestCase
assert_equal %w[a-1], inst.installed_gems.map { |s| s.full_name }
end
- def test_install_domain_remote_platform_newer
+ def test_install_remote_platform_newer
a2_o, a2_o_gem = util_gem 'a', '2' do |s|
s.platform = Gem::Platform.new %w[cpu other_platform 1]
end
@@ -488,22 +471,6 @@ class TestGemDependencyInstaller < Gem::TestCase
assert_equal %w[a-1], inst.installed_gems.map { |s| s.full_name }
end
- def test_install_reinstall
- Gem::Installer.new(@a1_gem).install
- FileUtils.mv @a1_gem, @tempdir
- inst = nil
-
- Dir.chdir @tempdir do
- inst = Gem::DependencyInstaller.new
- inst.install 'a'
- end
-
- assert_equal Gem::SourceIndex.new(@a1.full_name => @a1),
- Gem::SourceIndex.from_installed_gems
-
- assert_equal %w[a-1], inst.installed_gems.map { |s| s.full_name }
- end
-
if defined? OpenSSL then
def test_install_security_policy
data = File.open(@a1_gem, 'rb') { |f| f.read }
@@ -539,6 +506,8 @@ class TestGemDependencyInstaller < Gem::TestCase
end
def test_install_version
+ util_setup_d
+
data = File.open(@d2_gem, 'rb') { |f| f.read }
@fetcher.data['http://gems.example.com/gems/d-2.gem'] = data
@@ -553,6 +522,8 @@ class TestGemDependencyInstaller < Gem::TestCase
end
def test_install_version_default
+ util_setup_d
+
data = File.open(@d2_gem, 'rb') { |f| f.read }
@fetcher.data['http://gems.example.com/gems/d-2.gem'] = data
@@ -619,7 +590,22 @@ class TestGemDependencyInstaller < Gem::TestCase
util_setup_spec_fetcher(*specs)
inst = Gem::DependencyInstaller.new
- inst.find_spec_by_name_and_version 'a'
+ inst.find_spec_by_name_and_version specs.first.name
+ inst.gather_dependencies
+
+ actual = inst.gems_to_install.map { |s| s.full_name }
+ assert_equal expected, actual
+ end
+
+ def assert_resolve_pre expected, *specs
+ util_clear_gems
+
+ util_setup_spec_fetcher(*specs)
+
+ spec = specs.first
+
+ inst = Gem::DependencyInstaller.new :prerelease => true
+ inst.find_spec_by_name_and_version spec.name, spec.version
inst.gather_dependencies
actual = inst.gems_to_install.map { |s| s.full_name }
@@ -634,47 +620,182 @@ class TestGemDependencyInstaller < Gem::TestCase
assert_equal %w[a-1 b-1], inst.gems_to_install.map { |s| s.full_name }
end
+ ##
+ # [A1] depends on
+ # [B] > 0 (satisfied by 2.0)
+ # [B1] depends on
+ # [C] > 0 (satisfied by 1.0)
+ # [B2] depends on nothing!
+ # [C1] depends on nothing
+
+ def test_gather_dependencies_dropped
+ a1, = util_spec 'a', '1', 'b' => nil
+ b1, = util_spec 'b', '1', 'c' => nil
+ b2, = util_spec 'b', '2'
+ c1, = util_spec 'c', '1'
+
+ assert_resolve %w[b-2 a-1], a1, b1, b2, c1
+ end
+
+ ##
+ # [A] depends on
+ # [B] >= 1.0 (satisfied by 1.1) depends on
+ # [Z]
+ # [C] >= 1.0 depends on
+ # [B] = 1.0
+ #
+ # and should backtrack to resolve using b-1.0, pruning Z from the
+ # resolve.
+
+ def test_gather_dependencies_raggi_the_edgecase_generator
+ a, _ = util_spec 'a', '1.0', 'b' => '>= 1.0', 'c' => '>= 1.0'
+ b1, _ = util_spec 'b', '1.0'
+ b2, _ = util_spec 'b', '1.1', 'z' => '>= 1.0'
+ c, _ = util_spec 'c', '1.0', 'b' => '= 1.0'
+
+ assert_resolve %w[b-1.0 c-1.0 a-1.0], a, b1, b2, c
+ end
+
+ ##
+ # [A] depends on
+ # [B] >= 1.0 (satisfied by 2.0)
+ # [C] = 1.0 depends on
+ # [B] ~> 1.0
+ #
+ # and should resolve using b-1.0
+
+ def test_gather_dependencies_over
+ a, _ = util_spec 'a', '1.0', 'b' => '>= 1.0', 'c' => '= 1.0'
+ b1, _ = util_spec 'b', '1.0'
+ b2, _ = util_spec 'b', '2.0'
+ c, _ = util_spec 'c', '1.0', 'b' => '~> 1.0'
+
+ assert_resolve %w[b-1.0 c-1.0 a-1.0], a, b1, b2, c
+ end
+
+ ##
+ # [A] depends on
+ # [B] ~> 1.0 (satisfied by 1.1)
+ # [C] = 1.0 depends on
+ # [B] = 1.0
+ #
+ # and should resolve using b-1.0
+ #
+ # TODO: this is not under, but over... under would require depth
+ # first resolve through a dependency that is later pruned.
+
+ def test_gather_dependencies_under
+ a, _ = util_spec 'a', '1.0', 'b' => '~> 1.0', 'c' => '= 1.0'
+ b10, _ = util_spec 'b', '1.0'
+ b11, _ = util_spec 'b', '1.1'
+ c, _ = util_spec 'c', '1.0', 'b' => '= 1.0'
+
+ assert_resolve %w[b-1.0 c-1.0 a-1.0], a, b10, b11, c
+ end
+
+ # under
+ #
+ # [A] depends on
+ # [B] ~> 1.0 (satisfied by 1.0)
+ # [C] = 1.0 depends on
+ # [B] = 2.0
+
+ def test_gather_dependencies_divergent
+ a, _ = util_spec 'a', '1.0', 'b' => '~> 1.0', 'c' => '= 1.0'
+ b1, _ = util_spec 'b', '1.0'
+ b2, _ = util_spec 'b', '2.0'
+ c, _ = util_spec 'c', '1.0', 'b' => '= 2.0'
+
+ assert_raises Gem::DependencyError do
+ assert_resolve :ignored, a, b1, b2, c
+ end
+ end
+
def test_gather_dependencies_platform_alternate
+ util_setup_wxyz
util_set_arch 'cpu-my_platform1'
- inst = Gem::DependencyInstaller.new
- inst.find_spec_by_name_and_version 'w'
- inst.gather_dependencies
-
- assert_equal %w[x-1-cpu-my_platform-1 w-1],
- inst.gems_to_install.map { |s| s.full_name }
+ assert_resolve %w[x-1-cpu-my_platform-1 w-1], @w1, @x1_m
end
def test_gather_dependencies_platform_bump
- inst = Gem::DependencyInstaller.new
- inst.find_spec_by_name_and_version 'z'
- inst.gather_dependencies
+ util_setup_wxyz
- assert_equal %w[y-1 z-1], inst.gems_to_install.map { |s| s.full_name }
+ assert_resolve %w[y-1 z-1], @z1, @y1
end
def test_gather_dependencies_prerelease
- inst = Gem::DependencyInstaller.new :prerelease => true
- inst.find_spec_by_name_and_version 'c', '1.a'
- inst.gather_dependencies
+ util_setup_c1_pre
- assert_equal %w[a-1.a b-1 c-1.a],
- inst.gems_to_install.map { |s| s.full_name }
+ assert_resolve_pre %w[a-1.a b-1 c-1.a], @c1_pre, @a1_pre, @b1
end
def test_gather_dependencies_old_required
- e1, = util_gem 'e', '1', 'd' => '= 1'
-
+ util_setup_d
+ e1, = util_spec 'e', '1', 'd' => '= 1'
util_clear_gems
- util_setup_spec_fetcher @d1, @d2, e1
+ assert_resolve %w[d-1 e-1], e1, @d1, @d2
+ end
- inst = Gem::DependencyInstaller.new
- inst.find_spec_by_name_and_version 'e'
- inst.gather_dependencies
+ def util_write_a1_bin
+ write_file File.join('gems', 'a-1', 'bin', 'a_bin') do |fp|
+ fp.puts "#!/usr/bin/ruby"
+ end
+ end
+
+ def util_setup_c1_pre
+ @c1_pre, @c1_pre_gem = util_spec 'c', '1.a' do |s|
+ s.add_dependency 'a', '1.a'
+ s.add_dependency 'b', '1'
+ end
- assert_equal %w[d-1 e-1], inst.gems_to_install.map { |s| s.full_name }
+ util_reset_gems
end
-end
+ def util_setup_d
+ @d1, @d1_gem = util_gem 'd', '1'
+ @d2, @d2_gem = util_gem 'd', '2'
+
+ util_reset_gems
+ end
+ def util_setup_wxyz
+ @x1_m, @x1_m_gem = util_spec 'x', '1' do |s|
+ s.platform = Gem::Platform.new %w[cpu my_platform 1]
+ end
+
+ @x1_o, @x1_o_gem = util_spec 'x', '1' do |s|
+ s.platform = Gem::Platform.new %w[cpu other_platform 1]
+ end
+
+ @w1, @w1_gem = util_spec 'w', '1', 'x' => nil
+
+ @y1, @y1_gem = util_spec 'y', '1'
+ @y1_1_p, @y1_1_p_gem = util_spec 'y', '1.1' do |s|
+ s.platform = Gem::Platform.new %w[cpu my_platform 1]
+ end
+
+ @z1, @z1_gem = util_spec 'z', '1', 'y' => nil
+
+ util_reset_gems
+ end
+
+ def util_reset_gems
+ @c1_pre ||= nil
+ @d1 ||= nil
+ @d2 ||= nil
+ @w1 ||= nil
+ @x1_m ||= nil
+ @x1_o ||= nil
+ @y1 ||= nil
+ @y1_1_p ||= nil
+ @z1 ||= nil
+
+ util_setup_spec_fetcher(*[@a1, @a1_pre, @b1, @c1_pre,
+ @d1, @d2, @x1_m, @x1_o, @w1, @y1,
+ @y1_1_p, @z1].compact)
+
+ util_clear_gems
+ end
+end