diff options
author | drbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-11-29 06:52:18 +0000 |
---|---|---|
committer | drbrain <drbrain@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2012-11-29 06:52:18 +0000 |
commit | 9694bb8cac12969300692dac5a1cf7aa4e3a46cd (patch) | |
tree | c3cb423d701f7049ba9382de052e2a937cd1302d /test/rubygems/test_gem_spec_fetcher.rb | |
parent | 3f606b7063fc7a8b191556365ad343a314719a8d (diff) | |
download | ruby-9694bb8cac12969300692dac5a1cf7aa4e3a46cd.tar.gz |
* lib/rubygems*: Updated to RubyGems 2.0
* test/rubygems*: ditto.
* common.mk (prelude): Updated for RubyGems 2.0 source rearrangement.
* tool/change_maker.rb: Allow invalid UTF-8 characters in source
files.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37976 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test/rubygems/test_gem_spec_fetcher.rb')
-rw-r--r-- | test/rubygems/test_gem_spec_fetcher.rb | 346 |
1 files changed, 84 insertions, 262 deletions
diff --git a/test/rubygems/test_gem_spec_fetcher.rb b/test/rubygems/test_gem_spec_fetcher.rb index 015d2eec7d..a64a2c60cd 100644 --- a/test/rubygems/test_gem_spec_fetcher.rb +++ b/test/rubygems/test_gem_spec_fetcher.rb @@ -3,10 +3,15 @@ require 'rubygems/spec_fetcher' class TestGemSpecFetcher < Gem::TestCase + def tuple(*args) + Gem::NameTuple.new(*args) + end + def setup super @uri = URI.parse @gem_repo + @source = Gem::Source.new(@uri) util_setup_fake_fetcher @@ -16,108 +21,114 @@ class TestGemSpecFetcher < Gem::TestCase Gem::Specification.remove_spec @b2 - @specs = Gem::Specification.map { |spec| - [spec.name, spec.version, spec.original_platform] + all = Gem::Specification.map { |spec| + Gem::NameTuple.new(spec.name, spec.version, spec.original_platform) }.sort + @prerelease_specs, @specs = all.partition { |g| g.prerelease? } + # TODO: couldn't all of this come from the fake spec fetcher? @latest_specs = Gem::Specification.latest_specs.sort.map { |spec| - [spec.name, spec.version, spec.original_platform] + Gem::NameTuple.new(spec.name, spec.version, spec.original_platform) } - prerelease = Gem::Specification.find_all { |s| s.version.prerelease? } - @prerelease_specs = prerelease.map { |spec| - [spec.name, spec.version, spec.original_platform] - }.sort - v = Gem.marshal_version - s_zip = util_gzip(Marshal.dump(@specs)) - l_zip = util_gzip(Marshal.dump(@latest_specs)) - p_zip = util_gzip(Marshal.dump(@prerelease_specs)) + s_zip = util_gzip(Marshal.dump(Gem::NameTuple.to_basic(@specs))) + l_zip = util_gzip(Marshal.dump(Gem::NameTuple.to_basic(@latest_specs))) + p_zip = util_gzip(Marshal.dump(Gem::NameTuple.to_basic(@prerelease_specs))) @fetcher.data["#{@gem_repo}specs.#{v}.gz"] = s_zip @fetcher.data["#{@gem_repo}latest_specs.#{v}.gz"] = l_zip @fetcher.data["#{@gem_repo}prerelease_specs.#{v}.gz"] = p_zip @sf = Gem::SpecFetcher.new + + @released = Gem::NameTuple.from_list \ + [["a", Gem::Version.new("1"), "ruby"], + ["a", Gem::Version.new("2"), "ruby"], + ["a_evil", Gem::Version.new("9"), "ruby"], + ["c", Gem::Version.new("1.2"), "ruby"], + ['dep_x', Gem::Version.new(1), 'ruby'], + ["pl", Gem::Version.new("1"), "i386-linux"], + ['x', Gem::Version.new(1), 'ruby']] end - def test_fetch_all + def test_spec_for_dependency_all d = "#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}" @fetcher.data["#{d}#{@a1.spec_name}.rz"] = util_zip(Marshal.dump(@a1)) @fetcher.data["#{d}#{@a2.spec_name}.rz"] = util_zip(Marshal.dump(@a2)) @fetcher.data["#{d}#{@a_pre.spec_name}.rz"] = util_zip(Marshal.dump(@a_pre)) @fetcher.data["#{d}#{@a3a.spec_name}.rz"] = util_zip(Marshal.dump(@a3a)) - dep = Gem::Dependency.new 'a', 1 + dep = Gem::Dependency.new 'a', ">= 1" - specs_and_sources = @sf.fetch dep, true + specs_and_sources, _ = @sf.spec_for_dependency dep spec_names = specs_and_sources.map do |spec, source_uri| [spec.full_name, source_uri] end - expected = [[@a1.full_name, @gem_repo], [@a2.full_name, @gem_repo]] + expected = [[@a1.full_name, @source], [@a2.full_name, @source]] assert_equal expected, spec_names assert_same specs_and_sources.first.last, specs_and_sources.last.last end - def test_fetch_latest + def test_spec_for_dependency_latest d = "#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}" @fetcher.data["#{d}#{@a1.spec_name}.rz"] = util_zip(Marshal.dump(@a1)) @fetcher.data["#{d}#{@a2.spec_name}.rz"] = util_zip(Marshal.dump(@a2)) @fetcher.data["#{d}#{@a_pre.spec_name}.rz"] = util_zip(Marshal.dump(@a_pre)) - dep = Gem::Dependency.new 'a', 1 - specs_and_sources = @sf.fetch dep + dep = Gem::Dependency.new 'a' + specs_and_sources, _ = @sf.spec_for_dependency dep spec_names = specs_and_sources.map do |spec, source_uri| [spec.full_name, source_uri] end - assert_equal [[@a2.full_name, @gem_repo]], spec_names + assert_equal [[@a2.full_name, Gem::Source.new(@gem_repo)]], spec_names end - def test_fetch_prerelease + def test_spec_for_dependency_prerelease d = "#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}" @fetcher.data["#{d}#{@a1.spec_name}.rz"] = util_zip(Marshal.dump(@a1)) @fetcher.data["#{d}#{@a2.spec_name}.rz"] = util_zip(Marshal.dump(@a2)) @fetcher.data["#{d}#{@a_pre.spec_name}.rz"] = util_zip(Marshal.dump(@a_pre)) - specs_and_sources = @sf.fetch dep('a', '1.a'), false, true, true + specs_and_sources, _ = @sf.spec_for_dependency dep('a', '1.a') spec_names = specs_and_sources.map do |spec, source_uri| [spec.full_name, source_uri] end - assert_equal [[@a_pre.full_name, @gem_repo]], spec_names + assert_equal [[@a_pre.full_name, Gem::Source.new(@gem_repo)]], spec_names end - def test_fetch_platform + def test_spec_for_dependency_platform util_set_arch 'i386-linux' @fetcher.data["#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}#{@pl1.original_name}.gemspec.rz"] = util_zip(Marshal.dump(@pl1)) dep = Gem::Dependency.new 'pl', 1 - specs_and_sources = @sf.fetch dep + specs_and_sources, _ = @sf.spec_for_dependency dep spec_names = specs_and_sources.map do |spec, source_uri| [spec.full_name, source_uri] end - assert_equal [[@pl1.full_name, @gem_repo]], spec_names + assert_equal [[@pl1.full_name, Gem::Source.new(@gem_repo)]], spec_names end - def test_fetch_with_errors_mismatched_platform + def test_spec_for_dependency_mismatched_platform util_set_arch 'hrpa-989' @fetcher.data["#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}#{@pl1.original_name}.gemspec.rz"] = util_zip(Marshal.dump(@pl1)) dep = Gem::Dependency.new 'pl', 1 - specs_and_sources, errors = @sf.fetch_with_errors dep + specs_and_sources, errors = @sf.spec_for_dependency dep assert_equal 0, specs_and_sources.size assert_equal 1, errors.size @@ -125,284 +136,95 @@ class TestGemSpecFetcher < Gem::TestCase assert_equal "i386-linux", errors[0].platforms.first end - def test_fetch_spec - spec_uri = "#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}#{@a1.spec_name}" - @fetcher.data["#{spec_uri}.rz"] = util_zip(Marshal.dump(@a1)) - - spec = @sf.fetch_spec ['a', Gem::Version.new(1), 'ruby'], @uri - assert_equal @a1.full_name, spec.full_name - - cache_dir = @sf.cache_dir URI.parse(spec_uri) - - cache_file = File.join cache_dir, @a1.spec_name - - assert File.exist?(cache_file) - end - - def test_fetch_spec_cached - spec_uri = "#{@gem_repo}/#{Gem::MARSHAL_SPEC_DIR}#{@a1.spec_name}" - @fetcher.data["#{spec_uri}.rz"] = nil - - cache_dir = @sf.cache_dir URI.parse(spec_uri) - FileUtils.mkdir_p cache_dir - - cache_file = File.join cache_dir, @a1.spec_name - - open cache_file, 'wb' do |io| - Marshal.dump @a1, io + def test_spec_for_dependency_bad_fetch_spec + src = Gem::Source.new(@gem_repo) + def src.fetch_spec(name) + raise Gem::RemoteFetcher::FetchError.new("bad news from the internet", @uri) end - spec = @sf.fetch_spec ['a', Gem::Version.new(1), 'ruby'], @uri - assert_equal @a1.full_name, spec.full_name - end - - def test_fetch_spec_platform - @fetcher.data["#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}#{@pl1.original_name}.gemspec.rz"] = - util_zip(Marshal.dump(@pl1)) - - spec = @sf.fetch_spec ['pl', Gem::Version.new(1), 'i386-linux'], @uri - - assert_equal @pl1.full_name, spec.full_name - end + Gem.sources.replace [src] - def test_fetch_spec_platform_ruby - @fetcher.data["#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}#{@a1.spec_name}.rz"] = - util_zip(Marshal.dump(@a1)) - - spec = @sf.fetch_spec ['a', Gem::Version.new(1), nil], @uri - assert_equal @a1.full_name, spec.full_name - - spec = @sf.fetch_spec ['a', Gem::Version.new(1), ''], @uri - assert_equal @a1.full_name, spec.full_name - end - - def test_find_matching_all - dep = Gem::Dependency.new 'a', 1 - specs = @sf.find_matching dep, true - - expected = [ - [['a', Gem::Version.new(1), Gem::Platform::RUBY], @gem_repo], - [['a', Gem::Version.new(2), Gem::Platform::RUBY], @gem_repo], - ] - - assert_equal expected, specs - end - - def test_find_matching_latest - dep = Gem::Dependency.new 'a', 1 - specs = @sf.find_matching dep - - expected = [ - [['a', Gem::Version.new(2), Gem::Platform::RUBY], @gem_repo], - ] - - assert_equal expected, specs - end - - def test_find_matching_prerelease - dep = Gem::Dependency.new 'a', '1.a' - specs = @sf.find_matching dep, false, true, true - - expected = [ - [['a', Gem::Version.new('1.a'), Gem::Platform::RUBY], @gem_repo], - ] - - assert_equal expected, specs - end - - def test_find_matching_platform - util_set_arch 'i386-linux' - - dep = Gem::Dependency.new 'pl', 1 - specs = @sf.find_matching dep - - expected = [ - [['pl', Gem::Version.new(1), 'i386-linux'], @gem_repo], - ] - - assert_equal expected, specs - - util_set_arch 'i386-freebsd6' - - dep = Gem::Dependency.new 'pl', 1 - specs = @sf.find_matching dep - - assert_equal [], specs - end + d = "#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}" + @fetcher.data["#{d}#{@a1.spec_name}.rz"] = util_zip(Marshal.dump(@a1)) + @fetcher.data["#{d}#{@a2.spec_name}.rz"] = util_zip(Marshal.dump(@a2)) + @fetcher.data["#{d}#{@a_pre.spec_name}.rz"] = util_zip(Marshal.dump(@a_pre)) + @fetcher.data["#{d}#{@a3a.spec_name}.rz"] = util_zip(Marshal.dump(@a3a)) - def test_find_matching_with_errors_matched_platform - util_set_arch 'i386-linux' + dep = Gem::Dependency.new 'a', ">= 1" - dep = Gem::Dependency.new 'pl', 1 - specs, errors = @sf.find_matching_with_errors dep + specs_and_sources, errors = @sf.spec_for_dependency dep - expected = [ - [['pl', Gem::Version.new(1), 'i386-linux'], @gem_repo], - ] + assert_equal [], specs_and_sources + sfp = errors.first - assert_equal expected, specs - assert_equal 0, errors.size + assert_kind_of Gem::SourceFetchProblem, sfp + assert_equal src, sfp.source + assert_equal "bad news from the internet (#{@gem_repo})", sfp.error.message end - def test_find_matching_with_errors_invalid_platform - util_set_arch 'hrpa-899' - - dep = Gem::Dependency.new 'pl', 1 - specs, errors = @sf.find_matching_with_errors dep - - assert_equal 0, specs.size + def test_available_specs_latest + specs, _ = @sf.available_specs(:latest) - assert_equal 1, errors.size - - assert_equal "i386-linux", errors[0].platforms.first + assert_equal [@source], specs.keys + assert_equal @latest_specs, specs[@source].sort end - def test_find_all_platforms - util_set_arch 'i386-freebsd6' + def test_available_specs_released + specs, _ = @sf.available_specs(:released) - dep = Gem::Dependency.new 'pl', 1 - specs = @sf.find_matching dep, false, false - - expected = [ - [['pl', Gem::Version.new(1), 'i386-linux'], @gem_repo], - ] + assert_equal [@source], specs.keys - assert_equal expected, specs + assert_equal @released, specs[@source].sort end - def test_list - specs = @sf.list - - assert_equal [@uri], specs.keys - assert_equal @latest_specs, specs[@uri].sort - end + def test_available_specs_complete + specs, _ = @sf.available_specs(:complete) - def test_list_all - specs = @sf.list true + assert_equal [@source], specs.keys - assert_equal [@uri], specs.keys + comp = @prerelease_specs + @released - assert_equal([["a", Gem::Version.new("1"), "ruby"], - ["a", Gem::Version.new("2"), "ruby"], - ["a_evil", Gem::Version.new("9"), "ruby"], - ["c", Gem::Version.new("1.2"), "ruby"], - ["pl", Gem::Version.new("1"), "i386-linux"]], - specs[@uri].sort) + assert_equal comp.sort, specs[@source].sort end - def test_list_cache - specs = @sf.list + def test_available_specs_cache + specs, _ = @sf.available_specs(:latest) - refute specs[@uri].empty? + refute specs[@source].empty? @fetcher.data["#{@gem_repo}/latest_specs.#{Gem.marshal_version}.gz"] = nil - cached_specs = @sf.list + cached_specs, _ = @sf.available_specs(:latest) assert_equal specs, cached_specs end - def test_list_cache_all - specs = @sf.list true + def test_available_specs_cache_released + specs, _ = @sf.available_specs(:released) - refute specs[@uri].empty? + refute specs[@source].empty? @fetcher.data["#{@gem_repo}/specs.#{Gem.marshal_version}.gz"] = nil - cached_specs = @sf.list true + cached_specs, _ = @sf.available_specs(:released) assert_equal specs, cached_specs end - def test_list_latest_all - specs = @sf.list false - - assert_equal [@latest_specs], specs.values - - specs = @sf.list true - - assert_equal([[["a", Gem::Version.new("1"), "ruby"], - ["a", Gem::Version.new("2"), "ruby"], - ["a_evil", Gem::Version.new("9"), "ruby"], - ["c", Gem::Version.new("1.2"), "ruby"], - ["pl", Gem::Version.new("1"), "i386-linux"]]], - specs.values, 'specs file not loaded') - end - - def test_list_prerelease - specs = @sf.list false, true - - assert_equal @prerelease_specs, specs[@uri].sort - end - - def test_load_specs - expected = [ - ['a', Gem::Version.new('1.a'), Gem::Platform::RUBY], - ['a', Gem::Version.new(1), Gem::Platform::RUBY], - ['a', Gem::Version.new(2), Gem::Platform::RUBY], - ['a', Gem::Version.new('3.a'), Gem::Platform::RUBY], - ['a_evil', Gem::Version.new(9), Gem::Platform::RUBY], - ['c', Gem::Version.new('1.2'), Gem::Platform::RUBY], - ['pl', Gem::Version.new(1), 'i386-linux'], - ] - - assert_equal expected, @sf.load_specs(@uri, 'specs') - - cache_dir = File.join Gem.user_home, '.gem', 'specs', 'gems.example.com%80' - assert File.exist?(cache_dir), "#{cache_dir} does not exist" - - cache_file = File.join cache_dir, "specs.#{Gem.marshal_version}" - assert File.exist?(cache_file) - end - - def test_load_specs_cached - @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}.gz"] = nil - @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}"] = - ' ' * Marshal.dump(@latest_specs).length - - cache_dir = File.join Gem.user_home, '.gem', 'specs', 'gems.example.com%80' + def test_available_specs_prerelease + specs, _ = @sf.available_specs(:prerelease) - FileUtils.mkdir_p cache_dir - - cache_file = File.join cache_dir, "latest_specs.#{Gem.marshal_version}" - - open cache_file, 'wb' do |io| - Marshal.dump @latest_specs, io - end - - latest_specs = @sf.load_specs @uri, 'latest_specs' - - assert_equal @latest_specs, latest_specs + assert_equal @prerelease_specs, specs[@source].sort end - def test_load_specs_cached_empty - @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}.gz"] = - proc do - @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}.gz"] = - util_gzip(Marshal.dump(@latest_specs)) - - nil - end + def test_available_specs_with_bad_source + Gem.sources.replace ["http://not-there.nothing"] - cache_dir = File.join Gem.user_home, '.gem', 'specs', 'gems.example.com%80' + specs, errors = @sf.available_specs(:latest) - FileUtils.mkdir_p cache_dir - - cache_file = File.join cache_dir, "latest_specs.#{Gem.marshal_version}" - - open cache_file, 'wb' do |io| - io.write Marshal.dump(@latest_specs)[0, 10] - end - - latest_specs = @sf.load_specs @uri, 'latest_specs' - - assert_equal @latest_specs, latest_specs + assert_equal({}, specs) + assert_kind_of Gem::SourceFetchProblem, errors.first end - def test_cache_dir_escapes_windows_paths - uri = URI.parse("file:///C:/WINDOWS/Temp/gem_repo") - cache_dir = @sf.cache_dir(uri).gsub(@sf.dir, '') - assert cache_dir !~ /:/, "#{cache_dir} should not contain a :" - end end |