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_source.rb | |
parent | 3f606b7063fc7a8b191556365ad343a314719a8d (diff) |
* 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_source.rb')
-rw-r--r-- | test/rubygems/test_gem_source.rb | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/test/rubygems/test_gem_source.rb b/test/rubygems/test_gem_source.rb new file mode 100644 index 0000000000..2629f180a9 --- /dev/null +++ b/test/rubygems/test_gem_source.rb @@ -0,0 +1,188 @@ +require 'rubygems/test_case' +require 'rubygems/source' + +class TestGemSource < Gem::TestCase + + def tuple(*args) + Gem::NameTuple.new(*args) + end + + def setup + super + + util_setup_fake_fetcher + + @a_pre = new_spec 'a', '1.a' + + install_specs @a_pre + + @source = Gem::Source.new(@gem_repo) + + Gem::Specification.remove_spec @b2 + + 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| + Gem::NameTuple.new(spec.name, spec.version, spec.original_platform) + } + + v = Gem.marshal_version + 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 + + @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_api_uri + assert_equal @source.api_uri, @source.uri + end + + def test_api_uri_resolved_from_remote_fetcher + uri = URI.parse "http://gem.example/foo" + @fetcher.api_endpoints[uri] = URI.parse "http://api.blah" + + src = Gem::Source.new uri + assert_equal URI.parse("http://api.blah"), src.api_uri + end + + def test_cache_dir_escapes_windows_paths + uri = URI.parse("file:///C:/WINDOWS/Temp/gem_repo") + root = File.join Gem.user_home, '.gem', 'specs' + cache_dir = @source.cache_dir(uri).gsub(root, '') + assert cache_dir !~ /:/, "#{cache_dir} should not contain a :" + 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 = @source.fetch_spec tuple('a', Gem::Version.new(1), 'ruby') + assert_equal @a1.full_name, spec.full_name + + cache_dir = @source.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 = @source.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 + end + + spec = @source.fetch_spec tuple('a', Gem::Version.new(1), 'ruby') + 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 = @source.fetch_spec tuple('pl', Gem::Version.new(1), 'i386-linux') + + assert_equal @pl1.full_name, spec.full_name + end + + def test_fetch_spec_platform_ruby + @fetcher.data["#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}#{@a1.spec_name}.rz"] = + util_zip(Marshal.dump(@a1)) + + spec = @source.fetch_spec tuple('a', Gem::Version.new(1), nil) + assert_equal @a1.full_name, spec.full_name + + spec = @source.fetch_spec tuple('a', Gem::Version.new(1), '') + assert_equal @a1.full_name, spec.full_name + end + + def test_load_specs + expected = @released + assert_equal expected, @source.load_specs(:released) + + 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 + # Make sure the cached version is actually different: + @latest_specs << Gem::NameTuple.new('cached', Gem::Version.new('1.0.0'), 'ruby') + + @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' + + 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 = @source.load_specs :latest + + assert_equal @latest_specs, latest_specs + end + + def test_load_specs_cached_empty + # Make sure the cached version is actually different: + @latest_specs << Gem::NameTuple.new('fixed', Gem::Version.new('1.0.0'), 'ruby') + # Setup valid data on the 'remote' + @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}.gz"] = + util_gzip(Marshal.dump(@latest_specs)) + + cache_dir = File.join Gem.user_home, '.gem', 'specs', 'gems.example.com%80' + + FileUtils.mkdir_p cache_dir + + cache_file = File.join cache_dir, "latest_specs.#{Gem.marshal_version}" + + open cache_file, 'wb' do |io| + # Setup invalid data in the cache: + io.write Marshal.dump(@latest_specs)[0, 10] + end + + latest_specs = @source.load_specs :latest + + assert_equal @latest_specs, latest_specs + end + + def test_load_specs_from_unavailable_uri + src = Gem::Source.new("http://not-there.nothing") + + assert_raises Gem::RemoteFetcher::FetchError do + src.load_specs :latest + end + end + +end + |