aboutsummaryrefslogtreecommitdiffstats
path: root/test/rubygems/test_gem_dependency_resolver.rb
diff options
context:
space:
mode:
authordrbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-11-10 17:51:40 +0000
committerdrbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-11-10 17:51:40 +0000
commit4f6779bac7b4e294bc473782d60cbd071f0d0f8d (patch)
treed37b54da20f8c0adf2d98e810aacc8259b0602ff /test/rubygems/test_gem_dependency_resolver.rb
parent31d355aaa9436e2b24efd5e6501cabd876267c46 (diff)
downloadruby-4f6779bac7b4e294bc473782d60cbd071f0d0f8d.tar.gz
* lib/rubygems: Update to RubyGems master 4bdc4f2. Important changes
in this commit: RubyGems now chooses the test server port reliably. Patch by akr. Partial implementation of bundler's Gemfile format. Refactorings to improve the new resolver. Fixes bugs in the resolver. * test/rubygems: Tests for the above. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@43643 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/rubygems/test_gem_dependency_resolver.rb')
-rw-r--r--test/rubygems/test_gem_dependency_resolver.rb178
1 files changed, 163 insertions, 15 deletions
diff --git a/test/rubygems/test_gem_dependency_resolver.rb b/test/rubygems/test_gem_dependency_resolver.rb
index bd349996c1..7d968494b8 100644
--- a/test/rubygems/test_gem_dependency_resolver.rb
+++ b/test/rubygems/test_gem_dependency_resolver.rb
@@ -3,6 +3,12 @@ require 'rubygems/dependency_resolver'
class TestGemDependencyResolver < Gem::TestCase
+ def setup
+ super
+
+ @DR = Gem::DependencyResolver
+ end
+
def make_dep(name, *req)
Gem::Dependency.new(name, *req)
end
@@ -21,7 +27,58 @@ class TestGemDependencyResolver < Gem::TestCase
assert_equal exp, act, msg
rescue Gem::DependencyResolutionError => e
- flunk "#{e.message}\n#{e.conflict.explanation}"
+ flunk e.message
+ end
+
+ def test_self_compose_sets_multiple
+ index_set = @DR::IndexSet.new
+ vendor_set = @DR::VendorSet.new
+
+ composed = @DR.compose_sets index_set, vendor_set
+
+ assert_kind_of Gem::DependencyResolver::ComposedSet, composed
+
+ assert_equal [index_set, vendor_set], composed.sets
+ end
+
+ def test_self_compose_sets_nil
+ index_set = @DR::IndexSet.new
+
+ composed = @DR.compose_sets index_set, nil
+
+ assert_same index_set, composed
+
+ e = assert_raises ArgumentError do
+ @DR.compose_sets nil
+ end
+
+ assert_equal 'one set in the composition must be non-nil', e.message
+ end
+
+ def test_self_compose_sets_single
+ index_set = @DR::IndexSet.new
+
+ composed = @DR.compose_sets index_set
+
+ assert_same index_set, composed
+ end
+
+ def test_handle_conflict
+ a1 = util_spec 'a', 1
+
+ r1 = Gem::DependencyResolver::DependencyRequest.new dep('a', '= 1'), nil
+ r2 = Gem::DependencyResolver::DependencyRequest.new dep('a', '= 2'), nil
+ r3 = Gem::DependencyResolver::DependencyRequest.new dep('a', '= 3'), nil
+
+ existing = Gem::DependencyResolver::ActivationRequest.new a1, r1, false
+
+ res = Gem::DependencyResolver.new [a1]
+
+ res.handle_conflict r2, existing
+ res.handle_conflict r2, existing
+ res.handle_conflict r3, existing
+
+ assert_equal 2, res.conflicts.length
end
def test_no_overlap_specificly
@@ -71,10 +128,15 @@ class TestGemDependencyResolver < Gem::TestCase
end
def test_picks_best_platform
- is = Gem::DependencyResolver::IndexSpecification
+ is = Gem::DependencyResolver::IndexSpecification
unknown = Gem::Platform.new 'unknown'
- a2_p1 = quick_spec 'a', 2 do |s| s.platform = Gem::Platform.local end
- a3_p2 = quick_spec 'a', 3 do |s| s.platform = unknown end
+ a2_p1 = a3_p2 = nil
+
+ spec_fetcher do |fetcher|
+ a2_p1 = fetcher.spec 'a', 2 do |s| s.platform = Gem::Platform.local end
+ a3_p2 = fetcher.spec 'a', 3 do |s| s.platform = unknown end
+ end
+
v2 = v(2)
v3 = v(3)
source = Gem::Source.new @gem_repo
@@ -183,8 +245,6 @@ class TestGemDependencyResolver < Gem::TestCase
r.resolve
end
- assert_equal "unable to resolve conflicting dependencies 'c (= 2)' and 'c (= 1)'", e.message
-
deps = [make_dep("c", "= 2"), make_dep("c", "= 1")]
assert_equal deps, e.conflicting_dependencies
@@ -209,7 +269,7 @@ class TestGemDependencyResolver < Gem::TestCase
r.resolve
end
- assert_equal "Unable to resolve dependency: (unknown) requires a (>= 0)",
+ assert_equal "Unable to resolve dependency: user requested 'a (>= 0)'",
e.message
assert_equal "a (>= 0)", e.dependency.to_s
@@ -229,6 +289,37 @@ class TestGemDependencyResolver < Gem::TestCase
assert_equal "a (= 3)", e.dependency.to_s
end
+ def test_raises_and_reports_a_toplevel_request_properly
+ a1 = util_spec "a", "1"
+ ad = make_dep "a", "= 3"
+
+ r = Gem::DependencyResolver.new([ad], set(a1))
+
+ e = assert_raises Gem::UnsatisfiableDepedencyError do
+ r.resolve
+ end
+
+ assert_equal "Unable to resolve dependency: user requested 'a (= 3)'",
+ e.message
+ end
+
+ def test_raises_and_reports_an_implicit_request_properly
+ a1 = util_spec "a", "1" do |s|
+ s.add_runtime_dependency 'b', '= 2'
+ end
+
+ ad = make_dep "a", "= 1"
+
+ r = Gem::DependencyResolver.new([ad], set(a1))
+
+ e = assert_raises Gem::UnsatisfiableDepedencyError do
+ r.resolve
+ end
+
+ assert_equal "Unable to resolve dependency: 'a (= 1)' requires 'b (= 2)'",
+ e.message
+ end
+
def test_raises_when_possibles_are_exhausted
a1 = util_spec "a", "1", "c" => ">= 2"
b1 = util_spec "b", "1", "c" => "= 1"
@@ -244,18 +335,22 @@ class TestGemDependencyResolver < Gem::TestCase
r = Gem::DependencyResolver.new([ad, bd], s)
- e = assert_raises Gem::ImpossibleDependenciesError do
+ e = assert_raises Gem::DependencyResolutionError do
r.resolve
end
- assert_match "a-1 requires c (>= 2) but it conflicted", e.message
+ dependency = e.conflict.dependency
- assert_equal "c (>= 2)", e.dependency.to_s
+ assert_equal 'a', dependency.name
+ assert_equal req('>= 0'), dependency.requirement
- s, con = e.conflicts[0]
- assert_equal "c-3", s.full_name
- assert_equal "c (= 1)", con.dependency.to_s
- assert_equal "b-1", con.requester.full_name
+ activated = e.conflict.activated
+ assert_equal 'c-2', activated.full_name
+
+ assert_equal dep('c', '>= 2'), activated.request.dependency
+
+ assert_equal [dep('c', '= 1'), dep('c', '>= 2')],
+ e.conflict.conflicting_dependencies
end
def test_keeps_resolving_after_seeing_satisfied_dep
@@ -312,7 +407,7 @@ class TestGemDependencyResolver < Gem::TestCase
r = Gem::DependencyResolver.new([d1, d2, d3], s)
- assert_raises Gem::ImpossibleDependenciesError do
+ assert_raises Gem::DependencyResolutionError do
r.resolve
end
end
@@ -335,6 +430,42 @@ class TestGemDependencyResolver < Gem::TestCase
end
end
+ def test_resolve_bug_699
+ a1 = util_spec 'a', '1', 'b' => '= 2',
+ 'c' => '~> 1.0.3'
+
+ b1 = util_spec 'b', '2', 'c' => '~> 1.0'
+
+ c1 = util_spec 'c', '1.0.9'
+ c2 = util_spec 'c', '1.1.0'
+ c3 = util_spec 'c', '1.2.0'
+
+ s = set a1, b1, c1, c2, c3
+
+ a_dep = dep 'a', '= 1'
+
+ r = Gem::DependencyResolver.new [a_dep], s
+
+ assert_resolves_to [a1, b1, c1], r
+ end
+
+ def test_resolve_rollback
+ a1 = util_spec 'a', 1
+ a2 = util_spec 'a', 2
+
+ b1 = util_spec 'b', 1, 'a' => '~> 1.0'
+ b2 = util_spec 'b', 2, 'a' => '~> 2.0'
+
+ s = set a1, a2, b1, b2
+
+ a_dep = dep 'a', '~> 1.0'
+ b_dep = dep 'b'
+
+ r = Gem::DependencyResolver.new [a_dep, b_dep], s
+
+ assert_resolves_to [a1, b1], r
+ end
+
# actionmailer 2.3.4
# activemerchant 1.5.0
# activesupport 2.3.5, 2.3.4
@@ -388,5 +519,22 @@ class TestGemDependencyResolver < Gem::TestCase
assert_equal [a1, a1_p1], selected
end
+ def test_raises_and_explains_when_platform_prevents_install
+ a1 = util_spec "a", "1" do |s|
+ s.platform = Gem::Platform.new %w[c p 1]
+ end
+
+ ad = make_dep "a", "= 1"
+
+ r = Gem::DependencyResolver.new([ad], set(a1))
+
+ e = assert_raises Gem::UnsatisfiableDepedencyError do
+ r.resolve
+ end
+
+ assert_match "No match for 'a (= 1)' on this platform. Found: c-p-1",
+ e.message
+ end
+
end