1 require File.join(File.expand_path(File.dirname(__FILE__)), 'gemutilities')
2 require 'rubygems/spec_fetcher'
4 class TestGemSpecFetcher < RubyGemTestCase
9 @uri = URI.parse @gem_repo
11 util_setup_fake_fetcher
13 @source_index.add_spec @pl1
15 @specs = @source_index.gems.sort.map do |name, spec|
16 [spec.name, spec.version, spec.original_platform]
19 @fetcher.data["#{@gem_repo}specs.#{Gem.marshal_version}.gz"] =
20 util_gzip(Marshal.dump(@specs))
22 @latest_specs = @source_index.latest_specs.sort.map do |spec|
23 [spec.name, spec.version, spec.original_platform]
26 @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}.gz"] =
27 util_gzip(Marshal.dump(@latest_specs))
29 @sf = Gem::SpecFetcher.new
33 @fetcher.data["#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}#{@a1.full_name}.gemspec.rz"] =
34 util_zip(Marshal.dump(@a1))
35 @fetcher.data["#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}#{@a2.full_name}.gemspec.rz"] =
36 util_zip(Marshal.dump(@a2))
38 dep = Gem::Dependency.new 'a', 1
39 specs_and_sources = @sf.fetch dep, true
41 spec_names = specs_and_sources.map do |spec, source_uri|
42 [spec.full_name, source_uri]
45 expected = [[@a1.full_name, @gem_repo], [@a2.full_name, @gem_repo]]
47 assert_equal expected, spec_names
49 assert_same specs_and_sources.first.last, specs_and_sources.last.last
53 @fetcher.data["#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}#{@a1.full_name}.gemspec.rz"] =
54 util_zip(Marshal.dump(@a1))
55 @fetcher.data["#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}#{@a2.full_name}.gemspec.rz"] =
56 util_zip(Marshal.dump(@a2))
58 dep = Gem::Dependency.new 'a', 1
59 specs_and_sources = @sf.fetch dep
61 spec_names = specs_and_sources.map do |spec, source_uri|
62 [spec.full_name, source_uri]
65 assert_equal [[@a2.full_name, @gem_repo]], spec_names
68 def test_fetch_legacy_repo
69 @fetcher.data.delete "#{@gem_repo}specs.#{Gem.marshal_version}.gz"
70 @fetcher.data["#{@gem_repo}yaml"] = ''
71 util_setup_source_info_cache @a1, @a2
73 dep = Gem::Dependency.new 'a', 1
77 specs = @sf.fetch dep, true
81 WARNING: RubyGems 1.2+ index not found for:
82 \thttp://gems.example.com/
84 RubyGems will revert to legacy indexes degrading performance.
87 assert_equal expected, @ui.error
89 specs = specs.map { |spec, source_uri| [spec.full_name, source_uri] }
92 [@a1.full_name, @gem_repo],
93 [@a2.full_name, @gem_repo],
96 assert_equal expected, specs
99 def test_fetch_platform
100 util_set_arch 'i386-linux'
102 @fetcher.data["#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}#{@pl1.original_name}.gemspec.rz"] =
103 util_zip(Marshal.dump(@pl1))
105 dep = Gem::Dependency.new 'pl', 1
106 specs_and_sources = @sf.fetch dep
108 spec_names = specs_and_sources.map do |spec, source_uri|
109 [spec.full_name, source_uri]
112 assert_equal [[@pl1.full_name, @gem_repo]], spec_names
116 spec_uri = "#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}#{@a1.full_name}.gemspec"
117 @fetcher.data["#{spec_uri}.rz"] = util_zip(Marshal.dump(@a1))
119 spec = @sf.fetch_spec ['a', Gem::Version.new(1), 'ruby'], @uri
120 assert_equal @a1.full_name, spec.full_name
122 cache_dir = @sf.cache_dir URI.parse(spec_uri)
124 cache_file = File.join cache_dir, "#{@a1.full_name}.gemspec"
126 assert File.exist?(cache_file)
129 def test_fetch_spec_cached
130 spec_uri = "#{@gem_repo}/#{Gem::MARSHAL_SPEC_DIR}#{@a1.full_name}.gemspec"
131 @fetcher.data["#{spec_uri}.rz"] = nil
133 cache_dir = @sf.cache_dir URI.parse(spec_uri)
134 FileUtils.mkdir_p cache_dir
136 cache_file = File.join cache_dir, "#{@a1.full_name}.gemspec"
138 open cache_file, 'wb' do |io|
142 spec = @sf.fetch_spec ['a', Gem::Version.new(1), 'ruby'], @uri
143 assert_equal @a1.full_name, spec.full_name
146 def test_fetch_spec_platform
147 @fetcher.data["#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}#{@pl1.original_name}.gemspec.rz"] =
148 util_zip(Marshal.dump(@pl1))
150 spec = @sf.fetch_spec ['pl', Gem::Version.new(1), 'i386-linux'], @uri
152 assert_equal @pl1.full_name, spec.full_name
155 def test_fetch_spec_platform_ruby
156 @fetcher.data["#{@gem_repo}#{Gem::MARSHAL_SPEC_DIR}#{@a1.full_name}.gemspec.rz"] =
157 util_zip(Marshal.dump(@a1))
159 spec = @sf.fetch_spec ['a', Gem::Version.new(1), nil], @uri
160 assert_equal @a1.full_name, spec.full_name
162 spec = @sf.fetch_spec ['a', Gem::Version.new(1), ''], @uri
163 assert_equal @a1.full_name, spec.full_name
166 def test_find_matching_all
167 dep = Gem::Dependency.new 'a', 1
168 specs = @sf.find_matching dep, true
171 [['a', Gem::Version.new(1), Gem::Platform::RUBY], @gem_repo],
172 [['a', Gem::Version.new(2), Gem::Platform::RUBY], @gem_repo],
175 assert_equal expected, specs
178 def test_find_matching_latest
179 dep = Gem::Dependency.new 'a', 1
180 specs = @sf.find_matching dep
183 [['a', Gem::Version.new(2), Gem::Platform::RUBY], @gem_repo],
186 assert_equal expected, specs
189 def test_find_matching_platform
190 util_set_arch 'i386-linux'
192 dep = Gem::Dependency.new 'pl', 1
193 specs = @sf.find_matching dep
196 [['pl', Gem::Version.new(1), 'i386-linux'], @gem_repo],
199 assert_equal expected, specs
201 util_set_arch 'i386-freebsd6'
203 dep = Gem::Dependency.new 'pl', 1
204 specs = @sf.find_matching dep
206 assert_equal [], specs
209 def test_find_all_platforms
210 util_set_arch 'i386-freebsd6'
212 dep = Gem::Dependency.new 'pl', 1
213 specs = @sf.find_matching dep, false, false
216 [['pl', Gem::Version.new(1), 'i386-linux'], @gem_repo],
219 assert_equal expected, specs
225 assert_equal [@uri], specs.keys
226 assert_equal @latest_specs, specs[@uri].sort
230 specs = @sf.list true
232 assert_equal [@uri], specs.keys
234 assert_equal @specs, specs[@uri].sort
240 assert !specs[@uri].empty?
242 @fetcher.data["#{@gem_repo}/latest_specs.#{Gem.marshal_version}.gz"] = nil
244 cached_specs = @sf.list
246 assert_equal specs, cached_specs
249 def test_list_cache_all
250 specs = @sf.list true
252 assert !specs[@uri].empty?
254 @fetcher.data["#{@gem_repo}/specs.#{Gem.marshal_version}.gz"] = nil
256 cached_specs = @sf.list true
258 assert_equal specs, cached_specs
261 def test_list_latest_all
262 specs = @sf.list false
264 assert_equal [@latest_specs], specs.values
266 specs = @sf.list true
268 assert_equal [@specs], specs.values, 'specs file not loaded'
272 specs = @sf.load_specs @uri, 'specs'
275 ['a', Gem::Version.new(1), Gem::Platform::RUBY],
276 ['a', Gem::Version.new(2), Gem::Platform::RUBY],
277 ['a_evil', Gem::Version.new(9), Gem::Platform::RUBY],
278 ['c', Gem::Version.new('1.2'), Gem::Platform::RUBY],
279 ['pl', Gem::Version.new(1), 'i386-linux'],
282 assert_equal expected, specs
284 cache_dir = File.join Gem.user_home, '.gem', 'specs', 'gems.example.com%80'
285 assert File.exist?(cache_dir), "#{cache_dir} does not exist"
287 cache_file = File.join cache_dir, "specs.#{Gem.marshal_version}"
288 assert File.exist?(cache_file)
291 def test_load_specs_cached
292 @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}.gz"] = nil
293 @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}"] =
294 ' ' * Marshal.dump(@latest_specs).length
296 cache_dir = File.join Gem.user_home, '.gem', 'specs', 'gems.example.com%80'
298 FileUtils.mkdir_p cache_dir
300 cache_file = File.join cache_dir, "latest_specs.#{Gem.marshal_version}"
302 open cache_file, 'wb' do |io|
303 Marshal.dump @latest_specs, io
306 latest_specs = @sf.load_specs @uri, 'latest_specs'
308 assert_equal @latest_specs, latest_specs