diff options
Diffstat (limited to 'test/rubygems/test_gem_resolver.rb')
-rw-r--r-- | test/rubygems/test_gem_resolver.rb | 336 |
1 files changed, 199 insertions, 137 deletions
diff --git a/test/rubygems/test_gem_resolver.rb b/test/rubygems/test_gem_resolver.rb index fbf9438122..b7dadda708 100644 --- a/test/rubygems/test_gem_resolver.rb +++ b/test/rubygems/test_gem_resolver.rb @@ -1,19 +1,14 @@ # frozen_string_literal: true -require 'rubygems/test_case' -class TestGemResolver < Gem::TestCase - def setup - super - - @DR = Gem::Resolver - end +require_relative "helper" +class TestGemResolver < Gem::TestCase def make_dep(name, *req) Gem::Dependency.new(name, *req) end def set(*specs) - source = Gem::Source.new URI @gem_repo + source = Gem::Source.new Gem::URI @gem_repo specs = specs.map do |spec| Gem::Resolver::SpecSpecification.new nil, spec, source @@ -25,10 +20,10 @@ class TestGemResolver < Gem::TestCase def assert_resolves_to(expected, resolver) actual = resolver.resolve - exp = expected.sort_by {|s| s.full_name } - act = actual.map {|a| a.spec.spec }.sort_by {|s| s.full_name } + exp = expected.sort_by(&:full_name) + act = actual.map {|a| a.spec.spec }.sort_by(&:full_name) - msg = "Set of gems was not the same: #{exp.map {|x| x.full_name }.inspect} != #{act.map {|x| x.full_name }.inspect}" + msg = "Set of gems was not the same: #{exp.map(&:full_name).inspect} != #{act.map(&:full_name).inspect}" assert_equal exp, act, msg rescue Gem::DependencyResolutionError => e @@ -36,18 +31,18 @@ class TestGemResolver < Gem::TestCase end def test_self_compose_sets_best_set - best_set = @DR::BestSet.new + best_set = Gem::Resolver::BestSet.new - composed = @DR.compose_sets best_set + composed = Gem::Resolver.compose_sets best_set assert_equal best_set, composed end def test_self_compose_sets_multiple - index_set = @DR::IndexSet.new - vendor_set = @DR::VendorSet.new + index_set = Gem::Resolver::IndexSet.new + vendor_set = Gem::Resolver::VendorSet.new - composed = @DR.compose_sets index_set, vendor_set + composed = Gem::Resolver.compose_sets index_set, vendor_set assert_kind_of Gem::Resolver::ComposedSet, composed @@ -55,14 +50,14 @@ class TestGemResolver < Gem::TestCase end def test_self_compose_sets_nest - index_set = @DR::IndexSet.new - vendor_set = @DR::VendorSet.new + index_set = Gem::Resolver::IndexSet.new + vendor_set = Gem::Resolver::VendorSet.new - inner = @DR.compose_sets index_set, vendor_set + inner = Gem::Resolver.compose_sets index_set, vendor_set - current_set = @DR::CurrentSet.new + current_set = Gem::Resolver::CurrentSet.new - composed = @DR.compose_sets inner, current_set + composed = Gem::Resolver.compose_sets inner, current_set assert_kind_of Gem::Resolver::ComposedSet, composed @@ -70,31 +65,31 @@ class TestGemResolver < Gem::TestCase end def test_self_compose_sets_nil - index_set = @DR::IndexSet.new + index_set = Gem::Resolver::IndexSet.new - composed = @DR.compose_sets index_set, nil + composed = Gem::Resolver.compose_sets index_set, nil assert_same index_set, composed e = assert_raise ArgumentError do - @DR.compose_sets nil + Gem::Resolver.compose_sets nil end - assert_equal 'one set in the composition must be non-nil', e.message + 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 + index_set = Gem::Resolver::IndexSet.new - composed = @DR.compose_sets index_set + composed = Gem::Resolver.compose_sets index_set assert_same index_set, composed end def test_requests - a1 = util_spec 'a', 1, 'b' => 2 + a1 = util_spec "a", 1, "b" => 2 - r1 = Gem::Resolver::DependencyRequest.new dep('a', '= 1'), nil + r1 = Gem::Resolver::DependencyRequest.new dep("a", "= 1"), nil act = Gem::Resolver::ActivationRequest.new a1, r1 @@ -104,18 +99,18 @@ class TestGemResolver < Gem::TestCase res.requests a1, act, reqs - assert_equal ['b (= 2)'], reqs.map {|req| req.to_s } + assert_equal ["b (= 2)"], reqs.map(&:to_s) end def test_requests_development - a1 = util_spec 'a', 1, 'b' => 2 + a1 = util_spec "a", 1, "b" => 2 spec = Gem::Resolver::SpecSpecification.new nil, a1 def spec.fetch_development_dependencies @called = true end - r1 = Gem::Resolver::DependencyRequest.new dep('a', '= 1'), nil + r1 = Gem::Resolver::DependencyRequest.new dep("a", "= 1"), nil act = Gem::Resolver::ActivationRequest.new spec, r1 @@ -126,15 +121,15 @@ class TestGemResolver < Gem::TestCase res.requests spec, act, reqs - assert_equal ['b (= 2)'], reqs.map {|req| req.to_s } + assert_equal ["b (= 2)"], reqs.map(&:to_s) assert spec.instance_variable_defined? :@called end def test_requests_ignore_dependencies - a1 = util_spec 'a', 1, 'b' => 2 + a1 = util_spec "a", 1, "b" => 2 - r1 = Gem::Resolver::DependencyRequest.new dep('a', '= 1'), nil + r1 = Gem::Resolver::DependencyRequest.new dep("a", "= 1"), nil act = Gem::Resolver::ActivationRequest.new a1, r1 @@ -149,37 +144,37 @@ class TestGemResolver < Gem::TestCase end def test_resolve_conservative - a1_spec = util_spec 'a', 1 + a1_spec = util_spec "a", 1 - a2_spec = util_spec 'a', 2 do |s| - s.add_dependency 'b', 2 - s.add_dependency 'c' + a2_spec = util_spec "a", 2 do |s| + s.add_dependency "b", 2 + s.add_dependency "c" end - b1_spec = util_spec 'b', 1 - b2_spec = util_spec 'b', 2 + b1_spec = util_spec "b", 1 + b2_spec = util_spec "b", 2 - c1_spec = util_spec 'c', 1 do |s| - s.add_dependency 'd', 2 + c1_spec = util_spec "c", 1 do |s| + s.add_dependency "d", 2 end - c2_spec = util_spec 'c', 2 do |s| - s.add_dependency 'd', 2 + c2_spec = util_spec "c", 2 do |s| + s.add_dependency "d", 2 end - d1_spec = util_spec 'd', 1 do |s| - s.add_dependency 'e' + d1_spec = util_spec "d", 1 do |s| + s.add_dependency "e" end - d2_spec = util_spec 'd', 2 do |s| - s.add_dependency 'e' + d2_spec = util_spec "d", 2 do |s| + s.add_dependency "e" end - e1_spec = util_spec 'e', 1 - e2_spec = util_spec 'e', 2 + e1_spec = util_spec "e", 1 + e2_spec = util_spec "e", 2 - a_dep = make_dep 'a', '= 2' - e_dep = make_dep 'e' + a_dep = make_dep "a", "= 2" + e_dep = make_dep "e" # When requesting to install: # a-2, e @@ -191,7 +186,7 @@ class TestGemResolver < Gem::TestCase # With the following gems already installed: # a-1, b-1, c-1, e-1 - res.skip_gems = {'a' => [a1_spec], 'b' => [b1_spec], 'c' => [c1_spec], 'e' => [e1_spec]} + res.skip_gems = { "a" => [a1_spec], "b" => [b1_spec], "c" => [c1_spec], "e" => [e1_spec] } # Make sure the following gems end up getting used/installed/upgraded: # a-2 (upgraded) @@ -203,17 +198,17 @@ class TestGemResolver < Gem::TestCase end def test_resolve_development - a_spec = util_spec 'a', 1 do |s| - s.add_development_dependency 'b' + a_spec = util_spec "a", 1 do |s| + s.add_development_dependency "b" end - b_spec = util_spec 'b', 1 do - |s| s.add_development_dependency 'c' + b_spec = util_spec "b", 1 do |s| + s.add_development_dependency "c" end - c_spec = util_spec 'c', 1 + c_spec = util_spec "c", 1 - a_dep = make_dep 'a', '= 1' + a_dep = make_dep "a", "= 1" deps = [a_dep] @@ -227,24 +222,24 @@ class TestGemResolver < Gem::TestCase end def test_resolve_development_shallow - a_spec = util_spec 'a', 1 do |s| - s.add_development_dependency 'b' - s.add_runtime_dependency 'd' + a_spec = util_spec "a", 1 do |s| + s.add_development_dependency "b" + s.add_runtime_dependency "d" end - b_spec = util_spec 'b', 1 do |s| - s.add_development_dependency 'c' + b_spec = util_spec "b", 1 do |s| + s.add_development_dependency "c" end - c_spec = util_spec 'c', 1 + c_spec = util_spec "c", 1 - d_spec = util_spec 'd', 1 do |s| - s.add_development_dependency 'e' + d_spec = util_spec "d", 1 do |s| + s.add_development_dependency "e" end - e_spec = util_spec 'e', 1 + e_spec = util_spec "e", 1 - a_dep = make_dep 'a', '= 1' + a_dep = make_dep "a", "= 1" deps = [a_dep] @@ -262,19 +257,19 @@ class TestGemResolver < Gem::TestCase @fetcher = Gem::FakeFetcher.new Gem::RemoteFetcher.fetcher = @fetcher - a_dep = make_dep 'a', '= 1' + a_dep = make_dep "a", "= 1" res = Gem::Resolver.new [a_dep], Gem::Resolver::IndexSet.new - e = assert_raise Gem::UnsatisfiableDepedencyError do + e = assert_raise Gem::UnsatisfiableDependencyError do res.resolve end refute_empty e.errors end - def test_no_overlap_specificly - a = util_spec "a", '1' + def test_no_overlap_specifically + a = util_spec "a", "1" b = util_spec "b", "1" ad = make_dep "a", "= 1" @@ -290,7 +285,7 @@ class TestGemResolver < Gem::TestCase end def test_pulls_in_dependencies - a = util_spec "a", '1' + a = util_spec "a", "1" b = util_spec "b", "1", "c" => "= 1" c = util_spec "c", "1" @@ -307,8 +302,8 @@ class TestGemResolver < Gem::TestCase end def test_picks_highest_version - a1 = util_spec "a", '1' - a2 = util_spec "a", '2' + a1 = util_spec "a", "1" + a2 = util_spec "a", "2" s = set(a1, a2) @@ -321,17 +316,16 @@ class TestGemResolver < Gem::TestCase def test_picks_best_platform is = Gem::Resolver::IndexSpecification - unknown = Gem::Platform.new 'unknown' - a2_p1 = a3_p2 = nil + unknown = Gem::Platform.new "unknown" spec_fetcher do |fetcher| - fetcher.spec 'a', 2 + fetcher.spec "a", 2 - a2_p1 = fetcher.spec 'a', 2 do |s| + fetcher.spec "a", 2 do |s| s.platform = Gem::Platform.local end - a3_p2 = fetcher.spec 'a', 3 do |s| + fetcher.spec "a", 3 do |s| s.platform = unknown end end @@ -342,9 +336,9 @@ class TestGemResolver < Gem::TestCase s = set - a2 = is.new s, 'a', v2, source, Gem::Platform::RUBY - a2_p1 = is.new s, 'a', v2, source, Gem::Platform.local.to_s - a3_p2 = is.new s, 'a', v3, source, unknown + a2 = is.new s, "a", v2, source, Gem::Platform::RUBY + a2_p1 = is.new s, "a", v2, source, Gem::Platform.local.to_s + a3_p2 = is.new s, "a", v3, source, unknown s.add a3_p2 s.add a2_p1 @@ -357,6 +351,74 @@ class TestGemResolver < Gem::TestCase assert_resolves_to [a2_p1.spec], res end + def test_does_not_pick_musl_variants_on_non_musl_linux + util_set_arch "aarch64-linux" do + is = Gem::Resolver::IndexSpecification + + linux_musl = Gem::Platform.new("aarch64-linux-musl") + + spec_fetcher do |fetcher| + fetcher.spec "libv8-node", "15.14.0.1" do |s| + s.platform = Gem::Platform.local + end + + fetcher.spec "libv8-node", "15.14.0.1" do |s| + s.platform = linux_musl + end + end + + v15 = v("15.14.0.1") + source = Gem::Source.new @gem_repo + + s = set + + v15_linux = is.new s, "libv8-node", v15, source, Gem::Platform.local.to_s + v15_linux_musl = is.new s, "libv8-node", v15, source, linux_musl.to_s + + s.add v15_linux + s.add v15_linux_musl + + ad = make_dep "libv8-node", "= 15.14.0.1" + + res = Gem::Resolver.new([ad], s) + + assert_resolves_to [v15_linux.spec], res + end + end + + def test_pick_generic_linux_variants_on_musl_linux + util_set_arch "aarch64-linux-musl" do + is = Gem::Resolver::IndexSpecification + + linux = Gem::Platform.new("aarch64-linux") + + spec_fetcher do |fetcher| + fetcher.spec "libv8-node", "15.14.0.1" do |s| + s.platform = linux + end + + fetcher.spec "libv8-node", "15.14.0.1" + end + + v15 = v("15.14.0.1") + source = Gem::Source.new @gem_repo + + s = set + + v15_ruby = is.new s, "libv8-node", v15, source, Gem::Platform::RUBY + v15_linux = is.new s, "libv8-node", v15, source, linux.to_s + + s.add v15_linux + s.add v15_ruby + + ad = make_dep "libv8-node", "= 15.14.0.1" + + res = Gem::Resolver.new([ad], s) + + assert_resolves_to [v15_linux.spec], res + end + end + def test_only_returns_spec_once a1 = util_spec "a", "1", "c" => "= 1" b1 = util_spec "b", "1", "c" => "= 1" @@ -469,7 +531,7 @@ class TestGemResolver < Gem::TestCase r = Gem::Resolver.new([ad], set) - e = assert_raise Gem::UnsatisfiableDepedencyError do + e = assert_raise Gem::UnsatisfiableDependencyError do r.resolve end @@ -486,7 +548,7 @@ class TestGemResolver < Gem::TestCase r = Gem::Resolver.new([ad], set(a1)) - e = assert_raise Gem::UnsatisfiableDepedencyError do + e = assert_raise Gem::UnsatisfiableDependencyError do r.resolve end @@ -499,7 +561,7 @@ class TestGemResolver < Gem::TestCase r = Gem::Resolver.new([ad], set(a1)) - e = assert_raise Gem::UnsatisfiableDepedencyError do + e = assert_raise Gem::UnsatisfiableDependencyError do r.resolve end @@ -509,14 +571,14 @@ class TestGemResolver < Gem::TestCase def test_raises_and_reports_an_implicit_request_properly a1 = util_spec "a", "1" do |s| - s.add_runtime_dependency 'b', '= 2' + s.add_runtime_dependency "b", "= 2" end ad = make_dep "a", "= 1" r = Gem::Resolver.new([ad], set(a1)) - e = assert_raise Gem::UnsatisfiableDepedencyError do + e = assert_raise Gem::UnsatisfiableDependencyError do r.resolve end @@ -546,14 +608,14 @@ class TestGemResolver < Gem::TestCase dependency = e.conflict.dependency assert_includes %w[a b], dependency.name - assert_equal req('>= 0'), dependency.requirement + assert_equal req(">= 0"), dependency.requirement activated = e.conflict.activated - assert_equal 'c-1', activated.full_name + assert_equal "c-1", activated.full_name - assert_equal dep('c', '= 1'), activated.request.dependency + assert_equal dep("c", "= 1"), activated.request.dependency - assert_equal [dep('c', '>= 2'), dep('c', '= 1')], + assert_equal [dep("c", ">= 2"), dep("c", "= 1")], e.conflict.conflicting_dependencies end @@ -617,15 +679,15 @@ class TestGemResolver < Gem::TestCase end def test_resolve_conflict - a1 = util_spec 'a', 1 - a2 = util_spec 'a', 2 + a1 = util_spec "a", 1 + a2 = util_spec "a", 2 - b2 = util_spec 'b', 2, 'a' => '~> 2.0' + b2 = util_spec "b", 2, "a" => "~> 2.0" s = set a1, a2, b2 - a_dep = dep 'a', '~> 1.0' - b_dep = dep 'b' + a_dep = dep "a", "~> 1.0" + b_dep = dep "b" r = Gem::Resolver.new [a_dep, b_dep], s @@ -635,18 +697,18 @@ class TestGemResolver < Gem::TestCase end def test_resolve_bug_699 - a1 = util_spec 'a', '1', 'b' => '= 2', - 'c' => '~> 1.0.3' + a1 = util_spec "a", "1", "b" => "= 2", + "c" => "~> 1.0.3" - b1 = util_spec 'b', '2', 'c' => '~> 1.0' + 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' + 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' + a_dep = dep "a", "= 1" r = Gem::Resolver.new [a_dep], s @@ -654,16 +716,16 @@ class TestGemResolver < Gem::TestCase end def test_resolve_rollback - a1 = util_spec 'a', 1 - a2 = util_spec 'a', 2 + 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' + 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' + a_dep = dep "a", "~> 1.0" + b_dep = dep "b" r = Gem::Resolver.new [a_dep, b_dep], s @@ -711,42 +773,42 @@ class TestGemResolver < Gem::TestCase end def test_sorts_by_source_then_version - sourceA = Gem::Source.new 'http://example.com/a' - sourceB = Gem::Source.new 'http://example.com/b' - sourceC = Gem::Source.new 'http://example.com/c' + source_a = Gem::Source.new "http://example.com/a" + source_b = Gem::Source.new "http://example.com/b" + source_c = Gem::Source.new "http://example.com/c" - spec_A_1 = util_spec 'some-dep', '0.0.1' - spec_A_2 = util_spec 'some-dep', '1.0.0' - spec_B_1 = util_spec 'some-dep', '0.0.1' - spec_B_2 = util_spec 'some-dep', '0.0.2' - spec_C_1 = util_spec 'some-dep', '0.1.0' + spec_a_1 = util_spec "some-dep", "0.0.1" + spec_a_2 = util_spec "some-dep", "1.0.0" + spec_b_1 = util_spec "some-dep", "0.0.1" + spec_b_2 = util_spec "some-dep", "0.0.2" + spec_c_1 = util_spec "some-dep", "0.1.0" set = StaticSet.new [ - Gem::Resolver::SpecSpecification.new(nil, spec_B_1, sourceB), - Gem::Resolver::SpecSpecification.new(nil, spec_B_2, sourceB), - Gem::Resolver::SpecSpecification.new(nil, spec_C_1, sourceC), - Gem::Resolver::SpecSpecification.new(nil, spec_A_2, sourceA), - Gem::Resolver::SpecSpecification.new(nil, spec_A_1, sourceA), + Gem::Resolver::SpecSpecification.new(nil, spec_b_1, source_b), + Gem::Resolver::SpecSpecification.new(nil, spec_b_2, source_b), + Gem::Resolver::SpecSpecification.new(nil, spec_c_1, source_c), + Gem::Resolver::SpecSpecification.new(nil, spec_a_2, source_a), + Gem::Resolver::SpecSpecification.new(nil, spec_a_1, source_a), ] - dependency = make_dep 'some-dep', '> 0' + dependency = make_dep "some-dep", "> 0" resolver = Gem::Resolver.new [dependency], set - assert_resolves_to [spec_B_2], resolver + assert_resolves_to [spec_b_2], resolver end def test_select_local_platforms r = Gem::Resolver.new nil, nil - a1 = util_spec 'a', 1 + a1 = util_spec "a", 1 - a1_p1 = util_spec 'a', 1 do |s| + a1_p1 = util_spec "a", 1 do |s| s.platform = Gem::Platform.local end - a1_p2 = util_spec 'a', 1 do |s| - s.platform = 'unknown' + a1_p2 = util_spec "a", 1 do |s| + s.platform = "unknown" end selected = r.select_local_platforms [a1, a1_p1, a1_p2] @@ -755,18 +817,18 @@ class TestGemResolver < Gem::TestCase end def test_search_for_local_platform_partial_string_match - a1 = util_spec 'a', 1 + a1 = util_spec "a", 1 - a1_p1 = util_spec 'a', 1 do |s| + a1_p1 = util_spec "a", 1 do |s| s.platform = Gem::Platform.local.os end - a1_p2 = util_spec 'a', 1 do |s| - s.platform = 'unknown' + a1_p2 = util_spec "a", 1 do |s| + s.platform = "unknown" end s = set(a1_p1, a1_p2, a1) - d = [make_dep('a')] + d = [make_dep("a")] r = Gem::Resolver.new(d, s) assert_resolves_to [a1_p1], r @@ -781,7 +843,7 @@ class TestGemResolver < Gem::TestCase r = Gem::Resolver.new([ad], set(a1)) - e = assert_raise Gem::UnsatisfiableDepedencyError do + e = assert_raise Gem::UnsatisfiableDependencyError do r.resolve end |