Temporary tag for this failure. Updated CI spec coming.
[rbx.git] / test / rubygems / test_gem.rb
blobab147abe65407e5bc20864eeb0e93772fbfc98be
1 require File.join(File.expand_path(File.dirname(__FILE__)), 'gemutilities')
2 require 'rubygems'
3 require 'rubygems/gem_openssl'
4 require 'rubygems/installer'
5 require 'pathname'
7 class TestGem < RubyGemTestCase
9   def setup
10     super
12     @additional = %w[a b].map { |d| File.join @tempdir, d }
13     @default_dir_re = %r|/[Rr]uby/[Gg]ems/[0-9.]+|
14   end
16   def test_self_all_load_paths
17     util_make_gems
19     expected = [
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]),
26     ]
28     assert_equal expected, Gem.all_load_paths.sort
29   end
31   def test_self_bindir
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))
35   end
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))
42   end
44   def test_self_clear_paths
45     Gem.dir
46     Gem.path
47     searcher = Gem.searcher
48     source_index = Gem.source_index
50     Gem.clear_paths
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
56   end
58   def test_self_configuration
59     expected = Gem::ConfigFile.new []
60     Gem.configuration = nil
62     assert_equal expected, Gem.configuration
63   end
65   def test_self_datadir
66     foo = nil
68     Dir.chdir @tempdir do
69       FileUtils.mkdir_p 'data'
70       File.open File.join('data', 'foo.txt'), 'w' do |fp|
71         fp.puts 'blah'
72       end
74       foo = quick_gem 'foo' do |s| s.files = %w[data/foo.txt] end
75       install_gem foo
76     end
78     Gem.source_index = nil
80     gem 'foo'
82     expected = File.join @gemhome, 'gems', foo.full_name, 'data', 'foo'
84     assert_equal expected, Gem.datadir('foo')
85   end
87   def test_self_datadir_nonexistent_package
88     assert_nil Gem.datadir('xyzzy')
89   end
91   def test_self_default_dir
92     assert_match @default_dir_re, Gem.default_dir
93   end
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
102   ensure
103     Gem::ConfigMap[:BASERUBY] = orig_BASERUBY
104     Gem::ConfigMap[:RUBY_INSTALL_NAME] = orig_RUBY_INSTALL_NAME
105   end
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
114   ensure
115     Gem::ConfigMap[:BASERUBY] = orig_BASERUBY
116     Gem::ConfigMap[:RUBY_INSTALL_NAME] = orig_RUBY_INSTALL_NAME
117   end
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
126   ensure
127     Gem::ConfigMap[:BASERUBY] = orig_BASERUBY
128     Gem::ConfigMap[:RUBY_INSTALL_NAME] = orig_RUBY_INSTALL_NAME
129   end
131   def test_self_default_sources
132     assert_equal %w[http://gems.rubyforge.org], Gem.default_sources
133   end
135   def test_self_dir
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"
141     end
142   end
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"))
151   end
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"
158     Gem.use_paths gemdir
160     Gem.ensure_gem_subdirectories gemdir
162     assert File.directory?("#{gemdir}/cache")
163   end
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
172       Gem.use_paths gemdir
174       Gem.ensure_gem_subdirectories gemdir
176       assert !File.exist?("#{gemdir}/cache")
177     ensure
178       FileUtils.chmod 0600, gemdir
179     end
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")
194     ensure
195       FileUtils.chmod 0600, parent
196     end
197   end
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
208   ensure
209     Gem.ssl_available = orig_Gem_ssl_available
210   end
212   def test_self_latest_load_paths
213     util_make_gems
215     expected = [
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]),
221     ]
223     assert_equal expected, Gem.latest_load_paths.sort
224   end
226   def test_self_loaded_specs
227     foo = quick_gem 'foo'
228     install_gem foo
229     Gem.source_index = nil
231     Gem.activate 'foo'
233     assert_equal true, Gem.loaded_specs.keys.include?('foo')
234   end
236   def test_self_path
237     assert_equal [Gem.dir], Gem.path
238   end
240   unless win_platform?
241     def test_self_path_APPLE_GEM_HOME
242       Gem.clear_paths
243       Gem.const_set :APPLE_GEM_HOME, '/tmp/apple_gem_home'
244   
245       assert Gem.path.include?('/tmp/apple_gem_home')
246     ensure
247       Gem.send :remove_const, :APPLE_GEM_HOME
248     end
249   
250     def test_self_path_APPLE_GEM_HOME_GEM_PATH
251       Gem.clear_paths
252       ENV['GEM_PATH'] = @gemhome
253       Gem.const_set :APPLE_GEM_HOME, '/tmp/apple_gem_home'
254   
255       assert !Gem.path.include?('/tmp/apple_gem_home')
256     ensure
257       Gem.send :remove_const, :APPLE_GEM_HOME
258     end
259   end
261   def test_self_path_ENV_PATH
262     Gem.clear_paths
263     path_count = Gem.path.size
264     path_count -= 1 if defined? APPLE_GEM_HOME
265     Gem.clear_paths
266     util_ensure_gem_dirs
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
273   end
275   def test_self_path_duplicate
276     Gem.clear_paths
277     util_ensure_gem_dirs
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
285     paths = [Gem.dir]
286     assert_equal @additional + paths, Gem.path
287   end
289   def test_self_path_overlap
290     Gem.clear_paths
292     util_ensure_gem_dirs
293     ENV['GEM_HOME'] = @gemhome
294     ENV['GEM_PATH'] = @additional.join(File::PATH_SEPARATOR)
296     assert_equal @gemhome, Gem.dir
298     paths = [Gem.dir]
299     assert_equal @additional + paths, Gem.path
300   end
302   def test_self_platforms
303     assert_equal [Gem::Platform::RUBY, Gem::Platform.local], Gem.platforms
304   end
306   def test_self_prefix
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
313   end
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
324   ensure
325     Gem::ConfigMap[:libdir] = orig_libdir
326   end
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
337   ensure
338     Gem::ConfigMap[:sitelibdir] = orig_sitelibdir
339   end
341   def test_self_refresh
342     util_make_gems
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
352     Gem.refresh
354     assert Gem.source_index.gems.include?(@a1.full_name)
355     assert_equal nil, Gem.instance_variable_get(:@searcher)
356   end
358   def test_self_required_location
359     util_make_gems
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")
367   end
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
374   end
376   def test_self_searcher
377     assert_kind_of Gem::GemPathSearcher, Gem.searcher
378   end
380   def test_self_source_index
381     assert_kind_of Gem::SourceIndex, Gem.source_index
382   end
384   def test_self_sources
385     assert_equal %w[http://gems.example.com], Gem.sources
386   end
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?
396   ensure
397     Gem.ssl_available = orig_Gem_ssl_available
398   end
400   def test_self_use_paths
401     util_ensure_gem_dirs
403     Gem.use_paths @gemhome, @additional
405     assert_equal @gemhome, Gem.dir
406     assert_equal @additional + [Gem.dir], Gem.path
407   end
409   def test_self_user_home
410     if ENV['HOME'] then
411       assert_equal ENV['HOME'], Gem.user_home
412     else
413       assert true, 'count this test'
414     end
415   end
417   def util_ensure_gem_dirs
418     Gem.ensure_gem_subdirectories @gemhome
419     @additional.each do |dir|
420       Gem.ensure_gem_subdirectories @gemhome
421     end
422   end