Update to RDoc 2.1.0 r112
[rbx.git] / test / rubygems / test_gem_installer.rb
blobedd8b472cd70a2c24d6e977f8f91ffccc16e3965
1 #--
2 # Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others.
3 # All rights reserved.
4 # See LICENSE.txt for permissions.
5 #++
7 require File.join(File.expand_path(File.dirname(__FILE__)),
8                   'gem_installer_test_case')
10 class TestGemInstaller < GemInstallerTestCase
12   def test_app_script_text
13     util_make_exec '2', ''
15     expected = <<-EOF
16 #!#{Gem.ruby}
18 # This file was generated by RubyGems.
20 # The application 'a' is installed as part of a gem, and
21 # this file is here to facilitate running it.
24 require 'rubygems'
26 version = \">= 0\"
28 if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then
29   version = $1
30   ARGV.shift
31 end
33 gem 'a', version
34 load 'my_exec'
35     EOF
37     wrapper = @installer.app_script_text 'my_exec'
38     assert_equal expected, wrapper
39   end
41   def test_build_extensions_none
42     use_ui @ui do
43       @installer.build_extensions
44     end
46     assert_equal '', @ui.output
47     assert_equal '', @ui.error
49     assert !File.exist?('gem_make.out')
50   end
52   def test_build_extensions_extconf_bad
53     @spec.extensions << 'extconf.rb'
55     e = assert_raise Gem::Installer::ExtensionBuildError do
56       use_ui @ui do
57         @installer.build_extensions
58       end
59     end
61     assert_match(/\AERROR: Failed to build gem native extension.$/, e.message)
63     assert_equal "Building native extensions.  This could take a while...\n",
64                  @ui.output
65     assert_equal '', @ui.error
67     gem_make_out = File.join @gemhome, 'gems', @spec.full_name, 'gem_make.out'
68     expected = <<-EOF
69 #{Gem.ruby} extconf.rb
70 #{Gem.ruby}: No such file or directory -- extconf.rb (LoadError)
71     EOF
73     assert_equal expected, File.read(gem_make_out)
74   end
76   def test_build_extensions_unsupported
77     @spec.extensions << nil
79     e = assert_raise Gem::Installer::ExtensionBuildError do
80       use_ui @ui do
81         @installer.build_extensions
82       end
83     end
85     assert_match(/^No builder for extension ''$/, e.message)
87     assert_equal "Building native extensions.  This could take a while...\n",
88                  @ui.output
89     assert_equal '', @ui.error
91     assert_equal "No builder for extension ''\n", File.read('gem_make.out')
92   ensure
93     FileUtils.rm_f 'gem_make.out'
94   end
96   def test_ensure_dependency
97     dep = Gem::Dependency.new 'a', '>= 2'
98     assert @installer.ensure_dependency(@spec, dep)
100     dep = Gem::Dependency.new 'b', '> 2'
101     e = assert_raise Gem::InstallError do
102       @installer.ensure_dependency @spec, dep
103     end
105     assert_equal 'a requires b (> 2, runtime)', e.message
106   end
108   def test_expand_and_validate_gem_dir
109     @installer.gem_dir = '/nonexistent'
110     expanded_gem_dir = @installer.send(:expand_and_validate_gem_dir)
111     if win_platform?
112       expected = File.expand_path('/nonexistent').downcase
113       expanded_gem_dir = expanded_gem_dir.downcase
114     else
115       expected = '/nonexistent'
116     end
118     assert_equal expected, expanded_gem_dir
119   end
121   def test_extract_files
122     format = Object.new
123     def format.file_entries
124       [[{'size' => 7, 'mode' => 0400, 'path' => 'thefile'}, 'thefile']]
125     end
127     @installer.format = format
129     @installer.extract_files
131     thefile_path = File.join(util_gem_dir, 'thefile')
132     assert_equal 'thefile', File.read(thefile_path)
134     unless Gem.win_platform? then
135       assert_equal 0400, File.stat(thefile_path).mode & 0777
136     end
137   end
139   def test_extract_files_bad_dest
140     @installer.gem_dir = 'somedir'
141     @installer.format = nil
142     e = assert_raise ArgumentError do
143       @installer.extract_files
144     end
146     assert_equal 'format required to extract from', e.message
147   end
149   def test_extract_files_relative
150     format = Object.new
151     def format.file_entries
152       [[{'size' => 10, 'mode' => 0644, 'path' => '../thefile'}, '../thefile']]
153     end
155     @installer.format = format
157     e = assert_raise Gem::InstallError do
158       @installer.extract_files
159     end
161     assert_equal "attempt to install file into \"../thefile\" under #{util_gem_dir.inspect}",
162                  e.message
163     assert_equal false, File.file?(File.join(@tempdir, '../thefile')),
164                  "You may need to remove this file if you broke the test once"
165   end
167   def test_extract_files_absolute
168     format = Object.new
169     def format.file_entries
170       [[{'size' => 8, 'mode' => 0644, 'path' => '/thefile'}, '/thefile']]
171     end
173     @installer.format = format
175     e = assert_raise Gem::InstallError do
176       @installer.extract_files
177     end
179     assert_equal 'attempt to install file into "/thefile"', e.message
180     assert_equal false, File.file?(File.join('/thefile')),
181                  "You may need to remove this file if you broke the test once"
182   end
184   def test_generate_bin_bindir
185     @installer.wrappers = true
187     @spec.executables = ["my_exec"]
188     @spec.bindir = '.'
190     exec_file = @installer.formatted_program_filename "my_exec"
191     exec_path = File.join util_gem_dir(@spec.version), exec_file
192     File.open exec_path, 'w' do |f|
193       f.puts '#!/usr/bin/ruby'
194     end
196     @installer.gem_dir = util_gem_dir
198     @installer.generate_bin
200     assert_equal true, File.directory?(util_inst_bindir)
201     installed_exec = File.join(util_inst_bindir, "my_exec")
202     assert_equal true, File.exist?(installed_exec)
203     assert_equal(0100755, File.stat(installed_exec).mode) unless win_platform?
205     wrapper = File.read installed_exec
206     assert_match %r|generated by RubyGems|, wrapper
207   end
209   def test_generate_bin_script
210     @installer.wrappers = true
211     util_make_exec
212     @installer.gem_dir = util_gem_dir
214     @installer.generate_bin
215     assert_equal true, File.directory?(util_inst_bindir)
216     installed_exec = File.join(util_inst_bindir, "my_exec")
217     assert_equal true, File.exist?(installed_exec)
218     assert_equal(0100755, File.stat(installed_exec).mode) unless win_platform?
220     wrapper = File.read installed_exec
221     assert_match %r|generated by RubyGems|, wrapper
222   end
224   def test_generate_bin_script_format
225     @installer.format_executable = true
226     @installer.wrappers = true
227     util_make_exec
228     @installer.gem_dir = util_gem_dir
230     Gem::Installer.exec_format = 'foo-%s-bar'
231     @installer.generate_bin
232     assert_equal true, File.directory?(util_inst_bindir)
233     installed_exec = File.join util_inst_bindir, 'foo-my_exec-bar'
234     assert_equal true, File.exist?(installed_exec)
235   ensure
236     Gem::Installer.exec_format = nil
237   end
239   def test_generate_bin_script_format_disabled
240     @installer.wrappers = true
241     util_make_exec
242     @installer.gem_dir = util_gem_dir
244     Gem::Installer.exec_format = 'foo-%s-bar'
245     @installer.generate_bin
246     assert_equal true, File.directory?(util_inst_bindir)
247     installed_exec = File.join util_inst_bindir, 'my_exec'
248     assert_equal true, File.exist?(installed_exec)
249   ensure
250     Gem::Installer.exec_format = nil
251   end
253   def test_generate_bin_script_install_dir
254     @installer.wrappers = true
255     @spec.executables = ["my_exec"]
257     gem_dir = File.join "#{@gemhome}2", 'gems', @spec.full_name
258     gem_bindir = File.join gem_dir, 'bin'
259     FileUtils.mkdir_p gem_bindir
260     File.open File.join(gem_bindir, "my_exec"), 'w' do |f|
261       f.puts "#!/bin/ruby"
262     end
264     @installer.gem_home = "#{@gemhome}2"
265     @installer.gem_dir = gem_dir
267     @installer.generate_bin
269     installed_exec = File.join("#{@gemhome}2", 'bin', 'my_exec')
270     assert_equal true, File.exist?(installed_exec)
271     assert_equal(0100755, File.stat(installed_exec).mode) unless win_platform?
273     wrapper = File.read installed_exec
274     assert_match %r|generated by RubyGems|, wrapper
275   end
277   def test_generate_bin_script_no_execs
278     @installer.wrappers = true
279     @installer.generate_bin
280     assert_equal false, File.exist?(util_inst_bindir)
281   end
283   def test_generate_bin_script_no_perms
284     @installer.wrappers = true
285     util_make_exec
287     Dir.mkdir util_inst_bindir
288     File.chmod 0000, util_inst_bindir
290     assert_raises Gem::FilePermissionError do
291       @installer.generate_bin
292     end
294   ensure
295     File.chmod 0700, util_inst_bindir unless $DEBUG
296   end
298   def test_generate_bin_script_no_shebang
299     @installer.wrappers = true
300     @spec.executables = ["my_exec"]
302     gem_dir = File.join @gemhome, 'gems', @spec.full_name
303     gem_bindir = File.join gem_dir, 'bin'
304     FileUtils.mkdir_p gem_bindir
305     File.open File.join(gem_bindir, "my_exec"), 'w' do |f|
306       f.puts "blah blah blah"
307     end
309     @installer.generate_bin
311     installed_exec = File.join @gemhome, 'bin', 'my_exec'
312     assert_equal true, File.exist?(installed_exec)
313     assert_equal 0100755, File.stat(installed_exec).mode unless win_platform?
315     wrapper = File.read installed_exec
316     assert_match %r|generated by RubyGems|, wrapper
317     # HACK some gems don't have #! in their executables, restore 2008/06
318     #assert_no_match %r|generated by RubyGems|, wrapper
319   end
321   def test_generate_bin_script_wrappers
322     @installer.wrappers = true
323     util_make_exec
324     @installer.gem_dir = util_gem_dir
325     installed_exec = File.join(util_inst_bindir, "my_exec")
327     real_exec = File.join util_gem_dir, 'bin', 'my_exec'
329     # fake --no-wrappers for previous install
330     FileUtils.mkdir_p File.dirname(installed_exec)
331     FileUtils.ln_s real_exec, installed_exec
333     @installer.generate_bin
334     assert_equal true, File.directory?(util_inst_bindir)
335     assert_equal true, File.exist?(installed_exec)
336     assert_equal(0100755, File.stat(installed_exec).mode) unless win_platform?
338     assert_match %r|generated by RubyGems|, File.read(installed_exec)
340     assert_no_match %r|generated by RubyGems|, File.read(real_exec),
341                     'real executable overwritten'
342   end
344   def test_generate_bin_symlink
345     return if win_platform? #Windows FS do not support symlinks
347     @installer.wrappers = false
348     util_make_exec
349     @installer.gem_dir = util_gem_dir
351     @installer.generate_bin
352     assert_equal true, File.directory?(util_inst_bindir)
353     installed_exec = File.join(util_inst_bindir, "my_exec")
354     assert_equal true, File.symlink?(installed_exec)
355     assert_equal(File.join(util_gem_dir, "bin", "my_exec"),
356                  File.readlink(installed_exec))
357   end
359   def test_generate_bin_symlink_no_execs
360     @installer.wrappers = false
361     @installer.generate_bin
362     assert_equal false, File.exist?(util_inst_bindir)
363   end
365   def test_generate_bin_symlink_no_perms
366     @installer.wrappers = false
367     util_make_exec
368     @installer.gem_dir = util_gem_dir
370     Dir.mkdir util_inst_bindir
371     File.chmod 0000, util_inst_bindir
373     assert_raises Gem::FilePermissionError do
374       @installer.generate_bin
375     end
377   ensure
378     File.chmod 0700, util_inst_bindir unless $DEBUG
379   end
381   def test_generate_bin_symlink_update_newer
382     return if win_platform? #Windows FS do not support symlinks
384     @installer.wrappers = false
385     util_make_exec
386     @installer.gem_dir = util_gem_dir
388     @installer.generate_bin
389     installed_exec = File.join(util_inst_bindir, "my_exec")
390     assert_equal(File.join(util_gem_dir, "bin", "my_exec"),
391                  File.readlink(installed_exec))
393     @spec = Gem::Specification.new do |s|
394       s.files = ['lib/code.rb']
395       s.name = "a"
396       s.version = "3"
397       s.summary = "summary"
398       s.description = "desc"
399       s.require_path = 'lib'
400     end
402     util_make_exec '3'
403     @installer.gem_dir = File.join util_gem_dir('3')
404     @installer.generate_bin
405     installed_exec = File.join(util_inst_bindir, "my_exec")
406     assert_equal(File.join(util_gem_bindir('3'), "my_exec"),
407                  File.readlink(installed_exec),
408                  "Ensure symlink moved to latest version")
409   end
411   def test_generate_bin_symlink_update_older
412     return if win_platform? #Windows FS do not support symlinks
414     @installer.wrappers = false
415     util_make_exec
416     @installer.gem_dir = util_gem_dir
418     @installer.generate_bin
419     installed_exec = File.join(util_inst_bindir, "my_exec")
420     assert_equal(File.join(util_gem_dir, "bin", "my_exec"),
421                  File.readlink(installed_exec))
423     spec = Gem::Specification.new do |s|
424       s.files = ['lib/code.rb']
425       s.name = "a"
426       s.version = "1"
427       s.summary = "summary"
428       s.description = "desc"
429       s.require_path = 'lib'
430     end
432     util_make_exec '1'
433     @installer.gem_dir = util_gem_dir('1')
434     @installer.spec = spec
436     @installer.generate_bin
438     installed_exec = File.join(util_inst_bindir, "my_exec")
439     assert_equal(File.join(util_gem_dir('2'), "bin", "my_exec"),
440                  File.readlink(installed_exec),
441                  "Ensure symlink not moved")
442   end
444   def test_generate_bin_symlink_update_remove_wrapper
445     return if win_platform? #Windows FS do not support symlinks
447     @installer.wrappers = true
448     util_make_exec
449     @installer.gem_dir = util_gem_dir
451     @installer.generate_bin
452     installed_exec = File.join(util_inst_bindir, "my_exec")
453     assert_equal true, File.exist?(installed_exec)
455     @spec = Gem::Specification.new do |s|
456       s.files = ['lib/code.rb']
457       s.name = "a"
458       s.version = "3"
459       s.summary = "summary"
460       s.description = "desc"
461       s.require_path = 'lib'
462     end
464     @installer.wrappers = false
465     util_make_exec '3'
466     @installer.gem_dir = util_gem_dir '3'
467     @installer.generate_bin
468     installed_exec = File.join(util_inst_bindir, "my_exec")
469     assert_equal(File.join(util_gem_dir('3'), "bin", "my_exec"),
470                  File.readlink(installed_exec),
471                  "Ensure symlink moved to latest version")
472   end
474   def test_generate_bin_symlink_win32
475     old_win_platform = Gem.win_platform?
476     Gem.win_platform = true
477     @installer.wrappers = false
478     util_make_exec
479     @installer.gem_dir = util_gem_dir
481     use_ui @ui do
482       @installer.generate_bin
483     end
485     assert_equal true, File.directory?(util_inst_bindir)
486     installed_exec = File.join(util_inst_bindir, "my_exec")
487     assert_equal true, File.exist?(installed_exec)
489     assert_match(/Unable to use symlinks on Windows, installing wrapper/i,
490                  @ui.error)
492     wrapper = File.read installed_exec
493     assert_match(/generated by RubyGems/, wrapper)
494   ensure
495     Gem.win_platform = old_win_platform
496   end
498   def test_generate_bin_uses_default_shebang
499     return if win_platform? #Windows FS do not support symlinks
501     @installer.wrappers = true
502     util_make_exec
504     @installer.generate_bin
506     default_shebang = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name'])
507     shebang_line = open("#{@gemhome}/bin/my_exec") { |f| f.readlines.first }
508     assert_match(/\A#!/, shebang_line)
509     assert_match(/#{default_shebang}/, shebang_line)
510   end
512   def test_initialize
513     spec = quick_gem 'a' do |s| s.platform = Gem::Platform.new 'mswin32' end
514     gem = File.join @tempdir, "#{spec.full_name}.gem"
516     util_build_gem spec
517     FileUtils.mv File.join(@gemhome, 'cache', "#{spec.full_name}.gem"),
518                  @tempdir
520     installer = Gem::Installer.new gem
522     assert_equal File.join(@gemhome, 'gems', spec.full_name), installer.gem_dir
523   end
525   def test_install
526     util_setup_gem
528     use_ui @ui do
529       assert_equal @spec, @installer.install
530     end
532     gemdir = File.join @gemhome, 'gems', @spec.full_name
533     assert File.exist?(gemdir)
535     exe = File.join(gemdir, 'bin', 'executable')
536     assert File.exist?(exe)
537     exe_mode = File.stat(exe).mode & 0111
538     assert_equal 0111, exe_mode, "0%o" % exe_mode unless win_platform?
540     assert File.exist?(File.join(gemdir, 'lib', 'code.rb'))
542     assert File.exist?(File.join(gemdir, 'ext', 'a', 'Rakefile'))
544     spec_file = File.join(@gemhome, 'specifications',
545                           "#{@spec.full_name}.gemspec")
547     assert_equal spec_file, @spec.loaded_from
548     assert File.exist?(spec_file)
549   end
551   def test_install_bad_gem
552     gem = nil
554     use_ui @ui do
555       Dir.chdir @tempdir do Gem::Builder.new(@spec).build end
556       gem = File.join @tempdir, "#{@spec.full_name}.gem"
557     end
559     gem_data = File.open gem, 'rb' do |fp| fp.read 1024 end
560     File.open gem, 'wb' do |fp| fp.write gem_data end
562     e = assert_raise Gem::InstallError do
563       use_ui @ui do
564         @installer = Gem::Installer.new gem
565         @installer.install
566       end
567     end
569     assert_equal "invalid gem format for #{gem}", e.message
570   end
572   def test_install_check_dependencies
573     @spec.add_dependency 'b', '> 5'
574     util_setup_gem
576     use_ui @ui do
577       assert_raise Gem::InstallError do
578         @installer.install
579       end
580     end
581   end
583   def test_install_force
584     use_ui @ui do
585       installer = Gem::Installer.new old_ruby_required, :force => true
586       installer.install
587     end
589     gem_dir = File.join(@gemhome, 'gems', 'old_ruby_required-1')
590     assert File.exist?(gem_dir)
591   end
593   def test_install_ignore_dependencies
594     @spec.add_dependency 'b', '> 5'
595     util_setup_gem
596     @installer.ignore_dependencies = true
598     use_ui @ui do
599       assert_equal @spec, @installer.install
600     end
602     gemdir = File.join @gemhome, 'gems', @spec.full_name
603     assert File.exist?(gemdir)
605     exe = File.join(gemdir, 'bin', 'executable')
606     assert File.exist?(exe)
607     exe_mode = File.stat(exe).mode & 0111
608     assert_equal 0111, exe_mode, "0%o" % exe_mode unless win_platform?
609     assert File.exist?(File.join(gemdir, 'lib', 'code.rb'))
611     assert File.exist?(File.join(@gemhome, 'specifications',
612                                  "#{@spec.full_name}.gemspec"))
613   end
615   def test_install_missing_dirs
616     FileUtils.rm_f File.join(Gem.dir, 'cache')
617     FileUtils.rm_f File.join(Gem.dir, 'docs')
618     FileUtils.rm_f File.join(Gem.dir, 'specifications')
620     use_ui @ui do
621       Dir.chdir @tempdir do Gem::Builder.new(@spec).build end
622       gem = File.join @tempdir, "#{@spec.full_name}.gem"
624       @installer.install
625     end
627     File.directory? File.join(Gem.dir, 'cache')
628     File.directory? File.join(Gem.dir, 'docs')
629     File.directory? File.join(Gem.dir, 'specifications')
631     assert File.exist?(File.join(@gemhome, 'cache', "#{@spec.full_name}.gem"))
632     assert File.exist?(File.join(@gemhome, 'specifications',
633                                  "#{@spec.full_name}.gemspec"))
634   end
636   def test_install_with_message
637     @spec.post_install_message = 'I am a shiny gem!'
639     use_ui @ui do
640       Dir.chdir @tempdir do Gem::Builder.new(@spec).build end
642       @installer.install
643     end
645     assert_match %r|I am a shiny gem!|, @ui.output
646   end
648   def test_install_writable
649     util_setup_gem
651     orig_mode = File.stat(Gem.dir).mode
652     File.chmod 0000, Gem.dir
654     e = assert_raise Gem::FilePermissionError do
655       @installer.install
656     end
658     assert_equal "You don't have write permissions into the #{@gemhome} directory.",
659                  e.message
660   ensure
661     File.chmod orig_mode, Gem.dir
662   end
664   def test_install_wrong_ruby_version
665     use_ui @ui do
666       installer = Gem::Installer.new old_ruby_required
667       e = assert_raise Gem::InstallError do
668         installer.install
669       end
670       assert_equal 'old_ruby_required requires Ruby version = 1.4.6',
671                    e.message
672     end
673   end
675   def test_install_wrong_rubygems_version
676     spec = quick_gem 'old_rubygems_required', '1' do |s|
677       s.required_rubygems_version = '< 0'
678     end
680     util_build_gem spec
682     gem = File.join @gemhome, 'cache', "#{spec.full_name}.gem"
684     use_ui @ui do
685       @installer = Gem::Installer.new gem
686       e = assert_raise Gem::InstallError do
687         @installer.install
688       end
689       assert_equal 'old_rubygems_required requires RubyGems version < 0',
690                    e.message
691     end
692   end
694   def test_installation_satisfies_dependency_eh
695     dep = Gem::Dependency.new 'a', '>= 2'
696     assert @installer.installation_satisfies_dependency?(dep)
698     dep = Gem::Dependency.new 'a', '> 2'
699     assert ! @installer.installation_satisfies_dependency?(dep)
700   end
702   def test_shebang
703     util_make_exec '2', "#!/usr/bin/ruby"
705     shebang = @installer.shebang 'my_exec'
707     assert_equal "#!#{Gem.ruby}", shebang
708   end
710   def test_shebang_arguments
711     util_make_exec '2', "#!/usr/bin/ruby -ws"
713     shebang = @installer.shebang 'my_exec'
715     assert_equal "#!#{Gem.ruby} -ws", shebang
716   end
718   def test_shebang_empty
719     util_make_exec '2', ''
721     shebang = @installer.shebang 'my_exec'
722     assert_equal "#!#{Gem.ruby}", shebang
723   end
725   def test_shebang_env
726     util_make_exec '2', "#!/usr/bin/env ruby"
728     shebang = @installer.shebang 'my_exec'
730     assert_equal "#!#{Gem.ruby}", shebang
731   end
733   def test_shebang_env_arguments
734     util_make_exec '2', "#!/usr/bin/env ruby -ws"
736     shebang = @installer.shebang 'my_exec'
738     assert_equal "#!#{Gem.ruby} -ws", shebang
739   end
741   def test_shebang_env_shebang
742     util_make_exec '2', ''
743     @installer.env_shebang = true
745     shebang = @installer.shebang 'my_exec'
746     assert_equal "#!/usr/bin/env #{Gem::ConfigMap[:RUBY_INSTALL_NAME]}", shebang
747   end
749   def test_shebang_nested
750     util_make_exec '2', "#!/opt/local/ruby/bin/ruby"
752     shebang = @installer.shebang 'my_exec'
754     assert_equal "#!#{Gem.ruby}", shebang
755   end
757   def test_shebang_nested_arguments
758     util_make_exec '2', "#!/opt/local/ruby/bin/ruby -ws"
760     shebang = @installer.shebang 'my_exec'
762     assert_equal "#!#{Gem.ruby} -ws", shebang
763   end
765   def test_shebang_version
766     util_make_exec '2', "#!/usr/bin/ruby18"
768     shebang = @installer.shebang 'my_exec'
770     assert_equal "#!#{Gem.ruby}", shebang
771   end
773   def test_shebang_version_arguments
774     util_make_exec '2', "#!/usr/bin/ruby18 -ws"
776     shebang = @installer.shebang 'my_exec'
778     assert_equal "#!#{Gem.ruby} -ws", shebang
779   end
781   def test_shebang_version_env
782     util_make_exec '2', "#!/usr/bin/env ruby18"
784     shebang = @installer.shebang 'my_exec'
786     assert_equal "#!#{Gem.ruby}", shebang
787   end
789   def test_shebang_version_env_arguments
790     util_make_exec '2', "#!/usr/bin/env ruby18 -ws"
792     shebang = @installer.shebang 'my_exec'
794     assert_equal "#!#{Gem.ruby} -ws", shebang
795   end
797   def test_unpack
798     util_setup_gem
800     dest = File.join @gemhome, 'gems', @spec.full_name
802     @installer.unpack dest
804     assert File.exist?(File.join(dest, 'lib', 'code.rb'))
805     assert File.exist?(File.join(dest, 'bin', 'executable'))
806   end
808   def test_write_spec
809     spec_dir = File.join @gemhome, 'specifications'
810     spec_file = File.join spec_dir, "#{@spec.full_name}.gemspec"
811     FileUtils.rm spec_file
812     assert !File.exist?(spec_file)
814     @installer.spec = @spec
815     @installer.gem_home = @gemhome
817     @installer.write_spec
819     assert File.exist?(spec_file)
820     assert_equal @spec, eval(File.read(spec_file))
821   end
823   def old_ruby_required
824     spec = quick_gem 'old_ruby_required', '1' do |s|
825       s.required_ruby_version = '= 1.4.6'
826     end
828     util_build_gem spec
830     File.join @gemhome, 'cache', "#{spec.full_name}.gem"
831   end