1 require File.join(File.expand_path(File.dirname(__FILE__)), 'gemutilities')
3 require 'rubygems/gem_openssl'
4 require 'rubygems/installer'
7 class TestGem < RubyGemTestCase
12 @additional = %w[a b].map { |d| File.join @tempdir, d }
13 @default_dir_re = %r|/[Rr]uby/[Gg]ems/[0-9.]+|
16 def test_self_all_load_paths
20 File.join(@gemhome, *%W[gems #{@a1.full_name} lib]),
21 File.join(@gemhome, *%W[gems #{@a2.full_name} lib]),
22 File.join(@gemhome, *%W[gems #{@a_evil9.full_name} lib]),
23 File.join(@gemhome, *%W[gems #{@b2.full_name} lib]),
24 File.join(@gemhome, *%W[gems #{@c1_2.full_name} lib]),
25 File.join(@gemhome, *%W[gems #{@pl1.full_name} lib]),
28 assert_equal expected, Gem.all_load_paths.sort
32 assert_equal File.join(@gemhome, 'bin'), Gem.bindir
33 assert_equal File.join(@gemhome, 'bin'), Gem.bindir(Gem.dir)
34 assert_equal File.join(@gemhome, 'bin'), Gem.bindir(Pathname.new(Gem.dir))
37 def test_self_bindir_default_dir
38 default = Gem.default_dir
39 bindir = (defined? RUBY_FRAMEWORK_VERSION) ? '/usr/bin' : Config::CONFIG['bindir']
40 assert_equal bindir, Gem.bindir(default)
41 assert_equal bindir, Gem.bindir(Pathname.new(default))
44 def test_self_clear_paths
47 searcher = Gem.searcher
48 source_index = Gem.source_index
52 assert_equal nil, Gem.instance_variable_get(:@gem_home)
53 assert_equal nil, Gem.instance_variable_get(:@gem_path)
54 assert_not_equal searcher, Gem.searcher
55 assert_not_equal source_index.object_id, Gem.source_index.object_id
58 def test_self_configuration
59 expected = Gem::ConfigFile.new []
60 Gem.configuration = nil
62 assert_equal expected, Gem.configuration
69 FileUtils.mkdir_p 'data'
70 File.open File.join('data', 'foo.txt'), 'w' do |fp|
74 foo = quick_gem 'foo' do |s| s.files = %w[data/foo.txt] end
78 Gem.source_index = nil
82 expected = File.join @gemhome, 'gems', foo.full_name, 'data', 'foo'
84 assert_equal expected, Gem.datadir('foo')
87 def test_self_datadir_nonexistent_package
88 assert_nil Gem.datadir('xyzzy')
91 def test_self_default_dir
92 assert_match @default_dir_re, Gem.default_dir
95 def test_self_default_exec_format
96 orig_BASERUBY = Gem::ConfigMap[:BASERUBY]
97 orig_RUBY_INSTALL_NAME = Gem::ConfigMap[:RUBY_INSTALL_NAME]
98 Gem::ConfigMap[:BASERUBY] = 'ruby'
99 Gem::ConfigMap[:RUBY_INSTALL_NAME] = 'ruby'
101 assert_equal '%s', Gem.default_exec_format
103 Gem::ConfigMap[:BASERUBY] = orig_BASERUBY
104 Gem::ConfigMap[:RUBY_INSTALL_NAME] = orig_RUBY_INSTALL_NAME
107 def test_self_default_exec_format_18
108 orig_BASERUBY = Gem::ConfigMap[:BASERUBY]
109 orig_RUBY_INSTALL_NAME = Gem::ConfigMap[:RUBY_INSTALL_NAME]
110 Gem::ConfigMap[:BASERUBY] = 'ruby'
111 Gem::ConfigMap[:RUBY_INSTALL_NAME] = 'ruby18'
113 assert_equal '%s18', Gem.default_exec_format
115 Gem::ConfigMap[:BASERUBY] = orig_BASERUBY
116 Gem::ConfigMap[:RUBY_INSTALL_NAME] = orig_RUBY_INSTALL_NAME
119 def test_self_default_exec_format_jruby
120 orig_BASERUBY = Gem::ConfigMap[:BASERUBY]
121 orig_RUBY_INSTALL_NAME = Gem::ConfigMap[:RUBY_INSTALL_NAME]
122 Gem::ConfigMap[:BASERUBY] = 'ruby'
123 Gem::ConfigMap[:RUBY_INSTALL_NAME] = 'jruby'
125 assert_equal 'j%s', Gem.default_exec_format
127 Gem::ConfigMap[:BASERUBY] = orig_BASERUBY
128 Gem::ConfigMap[:RUBY_INSTALL_NAME] = orig_RUBY_INSTALL_NAME
131 def test_self_default_sources
132 assert_equal %w[http://gems.rubyforge.org], Gem.default_sources
136 assert_equal @gemhome, Gem.dir
138 Gem::DIRECTORIES.each do |filename|
139 assert File.directory?(File.join(Gem.dir, filename)),
140 "expected #{filename} to exist"
144 def test_self_ensure_gem_directories
145 FileUtils.rm_r @gemhome
146 Gem.use_paths @gemhome
148 Gem.ensure_gem_subdirectories @gemhome
150 assert File.directory?(File.join(@gemhome, "cache"))
153 def test_self_ensure_gem_directories_missing_parents
154 gemdir = File.join @tempdir, 'a/b/c/gemdir'
155 FileUtils.rm_rf File.join(@tempdir, 'a') rescue nil
156 assert !File.exist?(File.join(@tempdir, 'a')),
157 "manually remove #{File.join @tempdir, 'a'}, tests are broken"
160 Gem.ensure_gem_subdirectories gemdir
162 assert File.directory?("#{gemdir}/cache")
165 unless win_platform? then # only for FS that support write protection
166 def test_self_ensure_gem_directories_write_protected
167 gemdir = File.join @tempdir, "egd"
168 FileUtils.rm_r gemdir rescue nil
169 assert !File.exist?(gemdir), "manually remove #{gemdir}, tests are broken"
170 FileUtils.mkdir_p gemdir
171 FileUtils.chmod 0400, gemdir
174 Gem.ensure_gem_subdirectories gemdir
176 assert !File.exist?("#{gemdir}/cache")
178 FileUtils.chmod 0600, gemdir
181 def test_self_ensure_gem_directories_write_protected_parents
182 parent = File.join(@tempdir, "egd")
183 gemdir = "#{parent}/a/b/c"
185 FileUtils.rm_r parent rescue nil
186 assert !File.exist?(parent), "manually remove #{parent}, tests are broken"
187 FileUtils.mkdir_p parent
188 FileUtils.chmod 0400, parent
189 Gem.use_paths(gemdir)
191 Gem.ensure_gem_subdirectories gemdir
193 assert !File.exist?("#{gemdir}/cache")
195 FileUtils.chmod 0600, parent
199 def test_ensure_ssl_available
200 orig_Gem_ssl_available = Gem.ssl_available?
202 Gem.ssl_available = true
203 assert_nothing_raised do Gem.ensure_ssl_available end
205 Gem.ssl_available = false
206 e = assert_raise Gem::Exception do Gem.ensure_ssl_available end
207 assert_equal 'SSL is not installed on this system', e.message
209 Gem.ssl_available = orig_Gem_ssl_available
212 def test_self_latest_load_paths
216 File.join(@gemhome, *%W[gems #{@a2.full_name} lib]),
217 File.join(@gemhome, *%W[gems #{@a_evil9.full_name} lib]),
218 File.join(@gemhome, *%W[gems #{@b2.full_name} lib]),
219 File.join(@gemhome, *%W[gems #{@c1_2.full_name} lib]),
220 File.join(@gemhome, *%W[gems #{@pl1.full_name} lib]),
223 assert_equal expected, Gem.latest_load_paths.sort
226 def test_self_loaded_specs
227 foo = quick_gem 'foo'
229 Gem.source_index = nil
233 assert_equal true, Gem.loaded_specs.keys.include?('foo')
237 assert_equal [Gem.dir], Gem.path
241 def test_self_path_APPLE_GEM_HOME
243 Gem.const_set :APPLE_GEM_HOME, '/tmp/apple_gem_home'
245 assert Gem.path.include?('/tmp/apple_gem_home')
247 Gem.send :remove_const, :APPLE_GEM_HOME
250 def test_self_path_APPLE_GEM_HOME_GEM_PATH
252 ENV['GEM_PATH'] = @gemhome
253 Gem.const_set :APPLE_GEM_HOME, '/tmp/apple_gem_home'
255 assert !Gem.path.include?('/tmp/apple_gem_home')
257 Gem.send :remove_const, :APPLE_GEM_HOME
261 def test_self_path_ENV_PATH
263 path_count = Gem.path.size
264 path_count -= 1 if defined? APPLE_GEM_HOME
268 ENV['GEM_PATH'] = @additional.join(File::PATH_SEPARATOR)
270 assert_equal @additional, Gem.path[0,2]
271 assert_equal path_count + @additional.size, Gem.path.size
272 assert_match Gem.dir, Gem.path.last
275 def test_self_path_duplicate
278 dirs = @additional + [@gemhome] + [File.join(@tempdir, 'a')]
280 ENV['GEM_HOME'] = @gemhome
281 ENV['GEM_PATH'] = dirs.join File::PATH_SEPARATOR
283 assert_equal @gemhome, Gem.dir
286 assert_equal @additional + paths, Gem.path
289 def test_self_path_overlap
293 ENV['GEM_HOME'] = @gemhome
294 ENV['GEM_PATH'] = @additional.join(File::PATH_SEPARATOR)
296 assert_equal @gemhome, Gem.dir
299 assert_equal @additional + paths, Gem.path
302 def test_self_platforms
303 assert_equal [Gem::Platform::RUBY, Gem::Platform.local], Gem.platforms
307 file_name = File.expand_path __FILE__
309 prefix = File.dirname File.dirname(file_name)
310 prefix = File.dirname prefix if File.basename(prefix) == 'test'
312 assert_equal prefix, Gem.prefix
315 def test_self_prefix_libdir
316 orig_libdir = Gem::ConfigMap[:libdir]
318 file_name = File.expand_path __FILE__
319 prefix = File.dirname File.dirname(file_name)
321 Gem::ConfigMap[:libdir] = prefix
323 assert_nil Gem.prefix
325 Gem::ConfigMap[:libdir] = orig_libdir
328 def test_self_prefix_sitelibdir
329 orig_sitelibdir = Gem::ConfigMap[:sitelibdir]
331 file_name = File.expand_path __FILE__
332 prefix = File.dirname File.dirname(file_name)
334 Gem::ConfigMap[:sitelibdir] = prefix
336 assert_nil Gem.prefix
338 Gem::ConfigMap[:sitelibdir] = orig_sitelibdir
341 def test_self_refresh
344 a1_spec = File.join @gemhome, "specifications", "#{@a1.full_name}.gemspec"
346 FileUtils.mv a1_spec, @tempdir
348 assert !Gem.source_index.gems.include?(@a1.full_name)
350 FileUtils.mv File.join(@tempdir, "#{@a1.full_name}.gemspec"), a1_spec
354 assert Gem.source_index.gems.include?(@a1.full_name)
355 assert_equal nil, Gem.instance_variable_get(:@searcher)
358 def test_self_required_location
361 assert_equal File.join(@tempdir, *%w[gemhome gems c-1.2 lib code.rb]),
362 Gem.required_location("c", "code.rb")
363 assert_equal File.join(@tempdir, *%w[gemhome gems a-1 lib code.rb]),
364 Gem.required_location("a", "code.rb", "< 2")
365 assert_equal File.join(@tempdir, *%w[gemhome gems a-2 lib code.rb]),
366 Gem.required_location("a", "code.rb", "= 2")
369 def test_self_ruby_version
370 version = RUBY_VERSION.dup
371 version << ".#{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL
373 assert_equal Gem::Version.new(version), Gem.ruby_version
376 def test_self_searcher
377 assert_kind_of Gem::GemPathSearcher, Gem.searcher
380 def test_self_source_index
381 assert_kind_of Gem::SourceIndex, Gem.source_index
384 def test_self_sources
385 assert_equal %w[http://gems.example.com], Gem.sources
388 def test_ssl_available_eh
389 orig_Gem_ssl_available = Gem.ssl_available?
391 Gem.ssl_available = true
392 assert_equal true, Gem.ssl_available?
394 Gem.ssl_available = false
395 assert_equal false, Gem.ssl_available?
397 Gem.ssl_available = orig_Gem_ssl_available
400 def test_self_use_paths
403 Gem.use_paths @gemhome, @additional
405 assert_equal @gemhome, Gem.dir
406 assert_equal @additional + [Gem.dir], Gem.path
409 def test_self_user_home
411 assert_equal ENV['HOME'], Gem.user_home
413 assert true, 'count this test'
417 def util_ensure_gem_dirs
418 Gem.ensure_gem_subdirectories @gemhome
419 @additional.each do |dir|
420 Gem.ensure_gem_subdirectories @gemhome