summaryrefslogtreecommitdiff
path: root/jni/ruby/test/rubygems/test_gem_request_set.rb
diff options
context:
space:
mode:
Diffstat (limited to 'jni/ruby/test/rubygems/test_gem_request_set.rb')
-rw-r--r--jni/ruby/test/rubygems/test_gem_request_set.rb597
1 files changed, 597 insertions, 0 deletions
diff --git a/jni/ruby/test/rubygems/test_gem_request_set.rb b/jni/ruby/test/rubygems/test_gem_request_set.rb
new file mode 100644
index 0000000..3c1d5ac
--- /dev/null
+++ b/jni/ruby/test/rubygems/test_gem_request_set.rb
@@ -0,0 +1,597 @@
+require 'rubygems/test_case'
+require 'rubygems/request_set'
+
+class TestGemRequestSet < Gem::TestCase
+ def setup
+ super
+
+ Gem::RemoteFetcher.fetcher = @fetcher = Gem::FakeFetcher.new
+
+ @DR = Gem::Resolver
+ end
+
+ def test_gem
+ util_spec "a", "2"
+
+ rs = Gem::RequestSet.new
+ rs.gem "a", "= 2"
+
+ assert_equal [Gem::Dependency.new("a", "=2")], rs.dependencies
+ end
+
+ def test_gem_duplicate
+ rs = Gem::RequestSet.new
+
+ rs.gem 'a', '1'
+ rs.gem 'a', '2'
+
+ assert_equal [dep('a', '= 1', '= 2')], rs.dependencies
+ end
+
+ def test_import
+ rs = Gem::RequestSet.new
+ rs.gem 'a'
+
+ rs.import [dep('b')]
+
+ assert_equal [dep('a'), dep('b')], rs.dependencies
+ end
+
+ def test_install_from_gemdeps
+ spec_fetcher do |fetcher|
+ fetcher.gem 'a', 2
+ end
+
+ done_installing_ran = false
+
+ Gem.done_installing do |installer, specs|
+ done_installing_ran = true
+ end
+
+ rs = Gem::RequestSet.new
+ installed = []
+
+ open 'gem.deps.rb', 'w' do |io|
+ io.puts 'gem "a"'
+ io.flush
+
+ result = rs.install_from_gemdeps :gemdeps => io.path do |req, installer|
+ installed << req.full_name
+ end
+
+ assert_kind_of Array, result # what is supposed to be in here?
+ end
+
+ assert_includes installed, 'a-2'
+ assert_path_exists File.join @gemhome, 'gems', 'a-2'
+ assert_path_exists 'gem.deps.rb.lock'
+
+ assert rs.remote
+ refute done_installing_ran
+ end
+
+ def test_install_from_gemdeps_explain
+ spec_fetcher do |fetcher|
+ fetcher.gem 'a', 2
+ end
+
+ rs = Gem::RequestSet.new
+
+ open 'gem.deps.rb', 'w' do |io|
+ io.puts 'gem "a"'
+ io.flush
+
+ expected = <<-EXPECTED
+Gems to install:
+ a-2
+ EXPECTED
+
+ assert_output expected do
+ rs.install_from_gemdeps :gemdeps => io.path, :explain => true
+ end
+ end
+ end
+
+ def test_install_from_gemdeps_install_dir
+ spec_fetcher do |fetcher|
+ fetcher.gem 'a', 2
+ end
+
+ util_clear_gems
+ refute_path_exists File.join Gem.dir, 'gems', 'a-2'
+
+ rs = Gem::RequestSet.new
+ installed = []
+
+ open 'gem.deps.rb', 'w' do |io|
+ io.puts 'gem "a"'
+ end
+
+ options = {
+ :gemdeps => 'gem.deps.rb',
+ :install_dir => "#{@gemhome}2",
+ }
+
+ rs.install_from_gemdeps options do |req, installer|
+ installed << req.full_name
+ end
+
+ assert_includes installed, 'a-2'
+ refute_path_exists File.join Gem.dir, 'gems', 'a-2'
+ end
+
+ def test_install_from_gemdeps_local
+ spec_fetcher do |fetcher|
+ fetcher.gem 'a', 2
+ end
+
+ rs = Gem::RequestSet.new
+
+ open 'gem.deps.rb', 'w' do |io|
+ io.puts 'gem "a"'
+ io.flush
+
+ assert_raises Gem::UnsatisfiableDependencyError do
+ rs.install_from_gemdeps :gemdeps => io.path, :domain => :local
+ end
+ end
+
+ refute rs.remote
+ end
+
+ def test_install_from_gemdeps_lockfile
+ spec_fetcher do |fetcher|
+ fetcher.gem 'a', 1
+ fetcher.gem 'a', 2
+ fetcher.gem 'b', 1, 'a' => '>= 0'
+ fetcher.clear
+ end
+
+ rs = Gem::RequestSet.new
+ installed = []
+
+ open 'gem.deps.rb.lock', 'w' do |io|
+ io.puts <<-LOCKFILE
+GEM
+ remote: #{@gem_repo}
+ specs:
+ a (1)
+ b (1)
+ a (~> 1.0)
+
+PLATFORMS
+ #{Gem::Platform::RUBY}
+
+DEPENDENCIES
+ b
+ LOCKFILE
+ end
+
+ open 'gem.deps.rb', 'w' do |io|
+ io.puts 'gem "b"'
+ end
+
+ rs.install_from_gemdeps :gemdeps => 'gem.deps.rb' do |req, installer|
+ installed << req.full_name
+ end
+
+ assert_includes installed, 'b-1'
+ assert_includes installed, 'a-1'
+
+ assert_path_exists File.join @gemhome, 'specifications', 'a-1.gemspec'
+ assert_path_exists File.join @gemhome, 'specifications', 'b-1.gemspec'
+ end
+
+ def test_install_from_gemdeps_version_mismatch
+ spec_fetcher do |fetcher|
+ fetcher.gem 'a', 2
+ end
+
+ rs = Gem::RequestSet.new
+ installed = []
+
+ open 'gem.deps.rb', 'w' do |io|
+ io.puts <<-GEM_DEPS
+gem "a"
+ruby "0"
+ GEM_DEPS
+
+ io.flush
+
+ rs.install_from_gemdeps :gemdeps => io.path do |req, installer|
+ installed << req.full_name
+ end
+ end
+
+ assert_includes installed, 'a-2'
+ end
+
+ def test_load_gemdeps
+ rs = Gem::RequestSet.new
+
+ tf = Tempfile.open 'gem.deps.rb' do |io|
+ io.puts 'gem "a"'
+ io.flush
+
+ gem_deps = rs.load_gemdeps io.path
+
+ assert_kind_of Gem::RequestSet::GemDependencyAPI, gem_deps
+ io
+ end
+ tf.close! if tf.respond_to? :close!
+
+ assert_equal [dep('a')], rs.dependencies
+
+ assert rs.git_set
+ assert rs.vendor_set
+ end
+
+ def test_load_gemdeps_installing
+ rs = Gem::RequestSet.new
+
+ tf = Tempfile.open 'gem.deps.rb' do |io|
+ io.puts 'ruby "0"'
+ io.puts 'gem "a"'
+ io.flush
+
+ gem_deps = rs.load_gemdeps io.path, [], true
+
+ assert_kind_of Gem::RequestSet::GemDependencyAPI, gem_deps
+ io
+ end
+ tf.close! if tf.respond_to? :close!
+
+ assert_equal [dep('a')], rs.dependencies
+ end
+
+ def test_load_gemdeps_without_groups
+ rs = Gem::RequestSet.new
+
+ tf = Tempfile.open 'gem.deps.rb' do |io|
+ io.puts 'gem "a", :group => :test'
+ io.flush
+
+ rs.load_gemdeps io.path, [:test]
+ io
+ end
+ tf.close! if tf.respond_to? :close!
+
+ assert_empty rs.dependencies
+ end
+
+ def test_resolve
+ a = util_spec "a", "2", "b" => ">= 2"
+ b = util_spec "b", "2"
+
+ rs = Gem::RequestSet.new
+ rs.gem "a"
+
+ orig_errors = rs.errors
+
+ res = rs.resolve StaticSet.new([a, b])
+ assert_equal 2, res.size
+
+ names = res.map { |s| s.full_name }.sort
+
+ assert_equal ["a-2", "b-2"], names
+
+ refute_same orig_errors, rs.errors
+ end
+
+ def test_bug_bug_990
+ a = util_spec 'a', '1.b', 'b' => '~> 1.a'
+ b = util_spec 'b', '1.b', 'c' => '>= 1'
+ c = util_spec 'c', '1.1.b'
+
+ rs = Gem::RequestSet.new
+ rs.gem 'a'
+ rs.prerelease = true
+
+ res = rs.resolve StaticSet.new([a, b, c])
+ assert_equal 3, res.size
+
+ names = res.map { |s| s.full_name }.sort
+
+ assert_equal %w[a-1.b b-1.b c-1.1.b], names
+ end
+
+ def test_resolve_development
+ a = util_spec 'a', 1
+ spec = Gem::Resolver::SpecSpecification.new nil, a
+
+ rs = Gem::RequestSet.new
+ rs.gem 'a'
+ rs.development = true
+
+ res = rs.resolve StaticSet.new [spec]
+ assert_equal 1, res.size
+
+ assert rs.resolver.development
+ refute rs.resolver.development_shallow
+ end
+
+ def test_resolve_development_shallow
+ a = util_spec 'a', 1 do |s| s.add_development_dependency 'b' end
+ b = util_spec 'b', 1 do |s| s.add_development_dependency 'c' end
+ c = util_spec 'c', 1
+
+ a_spec = Gem::Resolver::SpecSpecification.new nil, a
+ b_spec = Gem::Resolver::SpecSpecification.new nil, b
+ c_spec = Gem::Resolver::SpecSpecification.new nil, c
+
+ rs = Gem::RequestSet.new
+ rs.gem 'a'
+ rs.development = true
+ rs.development_shallow = true
+
+ res = rs.resolve StaticSet.new [a_spec, b_spec, c_spec]
+ assert_equal 2, res.size
+
+ assert rs.resolver.development
+ assert rs.resolver.development_shallow
+ end
+
+ def test_resolve_git
+ name, _, repository, = git_gem
+
+ rs = Gem::RequestSet.new
+
+ tf = Tempfile.open 'gem.deps.rb' do |io|
+ io.puts <<-gems_deps_rb
+ gem "#{name}", :git => "#{repository}"
+ gems_deps_rb
+
+ io.flush
+
+ rs.load_gemdeps io.path
+ io
+ end
+ tf.close! if tf.respond_to? :close!
+
+ res = rs.resolve
+ assert_equal 1, res.size
+
+ names = res.map { |s| s.full_name }.sort
+
+ assert_equal %w[a-1], names
+
+ assert_equal [@DR::BestSet, @DR::GitSet, @DR::VendorSet],
+ rs.sets.map { |set| set.class }
+ end
+
+ def test_resolve_ignore_dependencies
+ a = util_spec "a", "2", "b" => ">= 2"
+ b = util_spec "b", "2"
+
+ rs = Gem::RequestSet.new
+ rs.gem "a"
+ rs.ignore_dependencies = true
+
+ res = rs.resolve StaticSet.new([a, b])
+ assert_equal 1, res.size
+
+ names = res.map { |s| s.full_name }.sort
+
+ assert_equal %w[a-2], names
+ end
+
+ def test_resolve_incompatible
+ a1 = util_spec 'a', 1
+ a2 = util_spec 'a', 2
+
+ rs = Gem::RequestSet.new
+ rs.gem 'a', '= 1'
+ rs.gem 'a', '= 2'
+
+ set = StaticSet.new [a1, a2]
+
+ assert_raises Gem::UnsatisfiableDependencyError do
+ rs.resolve set
+ end
+ end
+
+ def test_resolve_vendor
+ a_name, _, a_directory = vendor_gem 'a', 1 do |s|
+ s.add_dependency 'b', '~> 2.0'
+ end
+
+ b_name, _, b_directory = vendor_gem 'b', 2
+
+ rs = Gem::RequestSet.new
+
+ tf = Tempfile.open 'gem.deps.rb' do |io|
+ io.puts <<-gems_deps_rb
+ gem "#{a_name}", :path => "#{a_directory}"
+ gem "#{b_name}", :path => "#{b_directory}"
+ gems_deps_rb
+
+ io.flush
+
+ rs.load_gemdeps io.path
+ io
+ end
+ tf.close! if tf.respond_to? :close!
+
+ res = rs.resolve
+ assert_equal 2, res.size
+
+ names = res.map { |s| s.full_name }.sort
+
+ assert_equal ["a-1", "b-2"], names
+
+ assert_equal [@DR::BestSet, @DR::GitSet, @DR::VendorSet],
+ rs.sets.map { |set| set.class }
+ end
+
+ def test_sorted_requests
+ a = util_spec "a", "2", "b" => ">= 2"
+ b = util_spec "b", "2", "c" => ">= 2"
+ c = util_spec "c", "2"
+
+ rs = Gem::RequestSet.new
+ rs.gem "a"
+
+ rs.resolve StaticSet.new([a, b, c])
+
+ names = rs.sorted_requests.map { |s| s.full_name }
+ assert_equal %w!c-2 b-2 a-2!, names
+ end
+
+ def test_install
+ done_installing_ran = false
+
+ Gem.done_installing do
+ done_installing_ran = true
+ end
+
+ spec_fetcher do |fetcher|
+ fetcher.gem "a", "1", "b" => "= 1"
+ fetcher.gem "b", "1"
+
+ fetcher.clear
+ end
+
+ rs = Gem::RequestSet.new
+ rs.gem 'a'
+
+ rs.resolve
+
+ reqs = []
+ installers = []
+
+ installed = rs.install({}) do |req, installer|
+ reqs << req
+ installers << installer
+ end
+
+ assert_equal %w[b-1 a-1], reqs.map { |req| req.full_name }
+ assert_equal %w[b-1 a-1],
+ installers.map { |installer| installer.spec.full_name }
+
+ assert_path_exists File.join @gemhome, 'specifications', 'a-1.gemspec'
+ assert_path_exists File.join @gemhome, 'specifications', 'b-1.gemspec'
+
+ assert_equal %w[b-1 a-1], installed.map { |s| s.full_name }
+
+ assert done_installing_ran
+ end
+
+ def test_install_into
+ spec_fetcher do |fetcher|
+ fetcher.gem "a", "1", "b" => "= 1"
+ fetcher.gem "b", "1"
+ end
+
+ rs = Gem::RequestSet.new
+ rs.gem "a"
+
+ rs.resolve
+
+ installed = rs.install_into @tempdir do
+ assert_equal @tempdir, ENV['GEM_HOME']
+ end
+
+ assert_path_exists File.join @tempdir, 'specifications', 'a-1.gemspec'
+ assert_path_exists File.join @tempdir, 'specifications', 'b-1.gemspec'
+
+ assert_equal %w!b-1 a-1!, installed.map { |s| s.full_name }
+ end
+
+ def test_install_into_development_shallow
+ spec_fetcher do |fetcher|
+ fetcher.gem 'a', '1' do |s|
+ s.add_development_dependency 'b', '= 1'
+ end
+
+ fetcher.gem 'b', '1' do |s|
+ s.add_development_dependency 'c', '= 1'
+ end
+
+ fetcher.spec 'c', '1'
+ end
+
+ rs = Gem::RequestSet.new
+ rs.development = true
+ rs.development_shallow = true
+ rs.gem 'a'
+
+ rs.resolve
+
+ options = {
+ :development => true,
+ :development_shallow => true,
+ }
+
+ installed = rs.install_into @tempdir, true, options do
+ assert_equal @tempdir, ENV['GEM_HOME']
+ end
+
+ assert_equal %w[a-1 b-1], installed.map { |s| s.full_name }.sort
+ end
+
+ def test_sorted_requests_development_shallow
+ a = util_spec 'a', 1 do |s| s.add_development_dependency 'b' end
+ b = util_spec 'b', 1 do |s| s.add_development_dependency 'c' end
+ c = util_spec 'c', 1
+
+ rs = Gem::RequestSet.new
+ rs.gem 'a'
+ rs.development = true
+ rs.development_shallow = true
+
+ a_spec = Gem::Resolver::SpecSpecification.new nil, a
+ b_spec = Gem::Resolver::SpecSpecification.new nil, b
+ c_spec = Gem::Resolver::SpecSpecification.new nil, c
+
+ rs.resolve StaticSet.new [a_spec, b_spec, c_spec]
+
+ assert_equal %w[b-1 a-1], rs.sorted_requests.map { |req| req.full_name }
+ end
+
+ def test_tsort_each_child_development
+ a = util_spec 'a', 1 do |s| s.add_development_dependency 'b' end
+ b = util_spec 'b', 1 do |s| s.add_development_dependency 'c' end
+ c = util_spec 'c', 1
+
+ rs = Gem::RequestSet.new
+ rs.gem 'a'
+ rs.development = true
+ rs.development_shallow = true
+
+ a_spec = Gem::Resolver::SpecSpecification.new nil, a
+ b_spec = Gem::Resolver::SpecSpecification.new nil, b
+ c_spec = Gem::Resolver::SpecSpecification.new nil, c
+
+ rs.resolve StaticSet.new [a_spec, b_spec, c_spec]
+
+ a_req = Gem::Resolver::ActivationRequest.new a_spec, nil
+
+ deps = rs.enum_for(:tsort_each_child, a_req).to_a
+
+ assert_equal %w[b], deps.map { |dep| dep.name }
+ end
+
+ def test_tsort_each_child_development_shallow
+ a = util_spec 'a', 1 do |s| s.add_development_dependency 'b' end
+ b = util_spec 'b', 1 do |s| s.add_development_dependency 'c' end
+ c = util_spec 'c', 1
+
+ rs = Gem::RequestSet.new
+ rs.gem 'a'
+ rs.development = true
+ rs.development_shallow = true
+
+ a_spec = Gem::Resolver::SpecSpecification.new nil, a
+ b_spec = Gem::Resolver::SpecSpecification.new nil, b
+ c_spec = Gem::Resolver::SpecSpecification.new nil, c
+
+ rs.resolve StaticSet.new [a_spec, b_spec, c_spec]
+
+ b_req = Gem::Resolver::ActivationRequest.new b_spec, nil
+
+ deps = rs.enum_for(:tsort_each_child, b_req).to_a
+
+ assert_empty deps
+ end
+
+end