1
require_relative 'gem_installer_test_case'
3
class TestGemInstaller < GemInstallerTestCase
1
require 'rubygems/installer_test_case'
3
class TestGemInstaller < Gem::InstallerTestCase
8
if __name__ !~ /^test_install(_|$)/ then
9
@gemhome = @installer_tmp
10
Gem.use_paths @installer_tmp
12
@spec = Gem::Specification.find_by_name 'a'
13
@user_spec = Gem::Specification.find_by_name 'b'
15
@installer.spec = @spec
16
@installer.gem_home = @installer_tmp
17
@installer.gem_dir = @spec.gem_dir
18
@user_installer.spec = @user_spec
19
@user_installer.gem_home = @installer_tmp
5
24
def test_app_script_text
26
util_make_exec @spec, ''
81
assert_match(/^No builder for extension ''$/, e.message)
98
assert_match(/^\s*No builder for extension ''$/, e.message)
83
100
assert_equal "Building native extensions. This could take a while...\n",
85
102
assert_equal '', @ui.error
87
assert_equal "No builder for extension ''\n", File.read('gem_make.out')
104
assert_equal "No builder for extension ''\n", File.read(gem_make_out)
89
FileUtils.rm_f 'gem_make.out'
106
FileUtils.rm_f gem_make_out
92
109
def test_ensure_dependency
181
199
@installer.generate_bin
183
201
assert_equal true, File.directory?(util_inst_bindir)
184
installed_exec = File.join(util_inst_bindir, "my_exec")
202
installed_exec = File.join(util_inst_bindir, 'executable')
185
203
assert_equal true, File.exist?(installed_exec)
186
assert_equal(0100755, File.stat(installed_exec).mode) unless win_platform?
204
assert_equal mask, File.stat(installed_exec).mode unless win_platform?
188
206
wrapper = File.read installed_exec
189
207
assert_match %r|generated by RubyGems|, wrapper
210
def test_generate_bin_bindir_with_user_install_warning
211
bin_dir = Gem.win_platform? ? File.expand_path(ENV["WINDIR"]) : "/usr/bin"
215
:install_dir => "/non/existant"
218
inst = Gem::Installer.new nil, options
220
Gem::Installer.path_warning = false
223
inst.check_that_user_bin_dir_is_in_path
226
assert_equal "", @ui.error
192
229
def test_generate_bin_script
193
230
@installer.wrappers = true
236
273
def test_generate_bin_script_install_dir
237
274
@installer.wrappers = true
238
@spec.executables = ["my_exec"]
275
@spec.executables = %w[executable]
240
gem_dir = File.join "#{@gemhome}2", 'gems', @spec.full_name
277
gem_dir = File.join("#{@gemhome}2", "gems", @spec.full_name)
241
278
gem_bindir = File.join gem_dir, 'bin'
242
279
FileUtils.mkdir_p gem_bindir
243
File.open File.join(gem_bindir, "my_exec"), 'w' do |f|
280
File.open File.join(gem_bindir, 'executable'), 'w' do |f|
244
281
f.puts "#!/bin/ruby"
250
287
@installer.generate_bin
252
installed_exec = File.join("#{@gemhome}2", 'bin', 'my_exec')
289
installed_exec = File.join("#{@gemhome}2", "bin", 'executable')
253
290
assert_equal true, File.exist?(installed_exec)
254
assert_equal(0100755, File.stat(installed_exec).mode) unless win_platform?
291
assert_equal mask, File.stat(installed_exec).mode unless win_platform?
256
293
wrapper = File.read installed_exec
257
294
assert_match %r|generated by RubyGems|, wrapper
260
297
def test_generate_bin_script_no_execs
261
300
@installer.wrappers = true
262
301
@installer.generate_bin
263
assert_equal false, File.exist?(util_inst_bindir)
303
refute File.exist?(util_inst_bindir), 'bin dir was created when not needed'
266
306
def test_generate_bin_script_no_perms
273
313
skip('test_generate_bin_script_no_perms skipped on MS Windows')
275
File.chmod 0000, util_inst_bindir
315
FileUtils.chmod 0000, util_inst_bindir
277
317
assert_raises Gem::FilePermissionError do
278
318
@installer.generate_bin
282
File.chmod 0700, util_inst_bindir unless $DEBUG
322
FileUtils.chmod 0755, util_inst_bindir unless ($DEBUG or win_platform?)
285
325
def test_generate_bin_script_no_shebang
286
326
@installer.wrappers = true
287
@spec.executables = ["my_exec"]
327
@spec.executables = %w[executable]
289
329
gem_dir = File.join @gemhome, 'gems', @spec.full_name
290
330
gem_bindir = File.join gem_dir, 'bin'
291
331
FileUtils.mkdir_p gem_bindir
292
File.open File.join(gem_bindir, "my_exec"), 'w' do |f|
332
File.open File.join(gem_bindir, 'executable'), 'w' do |f|
293
333
f.puts "blah blah blah"
296
336
@installer.generate_bin
298
installed_exec = File.join @gemhome, 'bin', 'my_exec'
338
installed_exec = File.join @gemhome, 'bin', 'executable'
299
339
assert_equal true, File.exist?(installed_exec)
300
assert_equal 0100755, File.stat(installed_exec).mode unless win_platform?
340
assert_equal mask, File.stat(installed_exec).mode unless win_platform?
302
342
wrapper = File.read installed_exec
303
343
assert_match %r|generated by RubyGems|, wrapper
340
380
@installer.generate_bin
341
381
assert_equal true, File.directory?(util_inst_bindir)
342
installed_exec = File.join(util_inst_bindir, "my_exec")
382
installed_exec = File.join util_inst_bindir, 'executable'
343
383
assert_equal true, File.symlink?(installed_exec)
344
assert_equal(File.join(util_gem_dir, "bin", "my_exec"),
384
assert_equal(File.join(util_gem_dir, 'bin', 'executable'),
345
385
File.readlink(installed_exec))
348
388
def test_generate_bin_symlink_no_execs
349
391
@installer.wrappers = false
350
392
@installer.generate_bin
351
assert_equal false, File.exist?(util_inst_bindir)
394
refute File.exist?(util_inst_bindir)
354
397
def test_generate_bin_symlink_no_perms
457
504
@installer.wrappers = false
459
@installer.gem_dir = util_gem_dir '3'
507
@installer.gem_dir = util_gem_dir
460
508
@installer.generate_bin
461
installed_exec = File.join(util_inst_bindir, "my_exec")
462
assert_equal(File.join(util_gem_dir('3'), "bin", "my_exec"),
509
installed_exec = File.join(util_inst_bindir, 'executable')
510
assert_equal(File.join(util_gem_dir, 'bin', 'executable'),
463
511
File.readlink(installed_exec),
464
512
"Ensure symlink moved to latest version")
497
545
@installer.generate_bin
499
547
default_shebang = Gem.ruby
500
shebang_line = open("#{@gemhome}/bin/my_exec") { |f| f.readlines.first }
548
shebang_line = open("#{@gemhome}/bin/executable") { |f| f.readlines.first }
501
549
assert_match(/\A#!/, shebang_line)
502
550
assert_match(/#{default_shebang}/, shebang_line)
505
553
def test_initialize
506
spec = quick_gem 'a' do |s| s.platform = Gem::Platform.new 'mswin32' end
554
spec = quick_spec 'a' do |s| s.platform = Gem::Platform.new 'mswin32' end
507
555
gem = File.join @tempdir, spec.file_name
509
557
Dir.mkdir util_inst_bindir
510
558
util_build_gem spec
511
FileUtils.mv File.join(@gemhome, 'cache', spec.file_name),
559
FileUtils.mv spec.cache_file, @tempdir
514
561
installer = Gem::Installer.new gem
520
567
Dir.mkdir util_inst_bindir
571
gemdir = File.join @gemhome, 'gems', @spec.full_name
523
572
cache_file = File.join @gemhome, 'cache', @spec.file_name
573
stub_exe = File.join @gemhome, 'bin', 'executable'
574
rakefile = File.join gemdir, 'ext', 'a', 'Rakefile'
525
576
Gem.pre_install do |installer|
526
refute File.exist?(cache_file), 'cache file should not exist yet'
577
refute File.exist?(cache_file), 'cache file must not exist yet'
581
Gem.post_build do |installer|
582
assert File.exist?(gemdir), 'gem install dir must exist'
583
assert File.exist?(rakefile), 'gem executable must exist'
584
refute File.exist?(stub_exe), 'gem executable must not exist'
529
588
Gem.post_install do |installer|
530
assert File.exist?(cache_file), 'cache file should exist'
589
assert File.exist?(cache_file), 'cache file must exist'
535
assert_equal @spec, @installer.install
595
@newspec = @installer.install
539
gemdir = File.join @gemhome, 'gems', @spec.full_name
540
assert File.exist?(gemdir)
542
exe = File.join(gemdir, 'bin', 'executable')
543
assert File.exist?(exe)
599
assert_equal @spec, @newspec
600
assert File.exist? gemdir
601
assert File.exist?(stub_exe), 'gem executable must exist'
603
exe = File.join gemdir, 'bin', 'executable'
604
assert File.exist? exe
544
606
exe_mode = File.stat(exe).mode & 0111
545
607
assert_equal 0111, exe_mode, "0%o" % exe_mode unless win_platform?
547
609
assert File.exist?(File.join(gemdir, 'lib', 'code.rb'))
549
assert File.exist?(File.join(gemdir, 'ext', 'a', 'Rakefile'))
611
assert File.exist? rakefile
551
613
spec_file = File.join(@gemhome, 'specifications', @spec.spec_name)
553
assert_equal spec_file, @spec.loaded_from
615
assert_equal spec_file, @newspec.loaded_from
554
616
assert File.exist?(spec_file)
618
assert_same @installer, @post_build_hook_arg
619
assert_same @installer, @post_install_hook_arg
556
620
assert_same @installer, @pre_install_hook_arg
557
assert_same @installer, @post_install_hook_arg
623
def test_install_with_no_prior_files
624
Dir.mkdir util_inst_bindir
630
assert_equal @spec, @installer.install
634
gemdir = File.join(@gemhome, 'gems', @spec.full_name)
635
assert File.exist?(File.join(gemdir, 'lib', 'code.rb'))
638
# Morph spec to have lib/other.rb instead of code.rb and recreate
639
@spec.files = File.join('lib', 'other.rb')
640
Dir.chdir @tempdir do
641
File.open File.join('lib', 'other.rb'), 'w' do |f| f.puts '1' end
644
Gem::Builder.new(@spec).build
647
@installer = Gem::Installer.new @gem
650
assert_equal @spec, @installer.install
654
assert File.exist?(File.join(gemdir, 'lib', 'other.rb'))
655
refute(File.exist?(File.join(gemdir, 'lib', 'code.rb')),
656
"code.rb from prior install of same gem shouldn't remain here")
560
659
def test_install_bad_gem
668
767
assert File.exist?(File.join(@gemhome, 'specifications', @spec.spec_name))
770
def test_install_post_build_false
778
e = assert_raises Gem::InstallError do
782
location = "#{__FILE__}:#{__LINE__ - 9}"
784
assert_equal "post-build hook at #{location} failed for a-2", e.message
787
spec_file = File.join @gemhome, 'specifications', @spec.spec_name
788
refute File.exist? spec_file
790
gem_dir = File.join @gemhome, 'gems', @spec.full_name
791
refute File.exist? gem_dir
794
def test_install_post_build_nil
805
spec_file = File.join @gemhome, 'specifications', @spec.spec_name
806
assert File.exist? spec_file
808
gem_dir = File.join @gemhome, 'gems', @spec.full_name
809
assert File.exist? gem_dir
812
def test_install_pre_install_false
820
e = assert_raises Gem::InstallError do
824
location = "#{__FILE__}:#{__LINE__ - 9}"
826
assert_equal "pre-install hook at #{location} failed for a-2", e.message
829
spec_file = File.join @gemhome, 'specifications', @spec.spec_name
830
refute File.exist? spec_file
833
def test_install_pre_install_nil
844
spec_file = File.join @gemhome, 'specifications', @spec.spec_name
845
assert File.exist? spec_file
671
848
def test_install_with_message
672
849
@spec.post_install_message = 'I am a shiny gem!'
675
Dir.chdir @tempdir do Gem::Builder.new(@spec).build end
852
path = Gem::Builder.new(@spec).build
854
@installer = Gem::Installer.new path
677
855
@installer.install
722
util_make_exec '2', "#!/usr/bin/ruby"
900
util_make_exec @spec, "#!/usr/bin/ruby"
724
shebang = @installer.shebang 'my_exec'
902
shebang = @installer.shebang 'executable'
726
904
assert_equal "#!#{Gem.ruby}", shebang
729
907
def test_shebang_arguments
730
util_make_exec '2', "#!/usr/bin/ruby -ws"
908
util_make_exec @spec, "#!/usr/bin/ruby -ws"
732
shebang = @installer.shebang 'my_exec'
910
shebang = @installer.shebang 'executable'
734
912
assert_equal "#!#{Gem.ruby} -ws", shebang
737
915
def test_shebang_empty
738
util_make_exec '2', ''
916
util_make_exec @spec, ''
740
shebang = @installer.shebang 'my_exec'
918
shebang = @installer.shebang 'executable'
741
919
assert_equal "#!#{Gem.ruby}", shebang
744
922
def test_shebang_env
745
util_make_exec '2', "#!/usr/bin/env ruby"
923
util_make_exec @spec, "#!/usr/bin/env ruby"
747
shebang = @installer.shebang 'my_exec'
925
shebang = @installer.shebang 'executable'
749
927
assert_equal "#!#{Gem.ruby}", shebang
752
930
def test_shebang_env_arguments
753
util_make_exec '2', "#!/usr/bin/env ruby -ws"
931
util_make_exec @spec, "#!/usr/bin/env ruby -ws"
755
shebang = @installer.shebang 'my_exec'
933
shebang = @installer.shebang 'executable'
757
935
assert_equal "#!#{Gem.ruby} -ws", shebang
760
938
def test_shebang_env_shebang
761
util_make_exec '2', ''
939
util_make_exec @spec, ''
762
940
@installer.env_shebang = true
764
shebang = @installer.shebang 'my_exec'
942
shebang = @installer.shebang 'executable'
766
944
env_shebang = "/usr/bin/env" unless Gem.win_platform?
772
950
def test_shebang_nested
773
util_make_exec '2', "#!/opt/local/ruby/bin/ruby"
951
util_make_exec @spec, "#!/opt/local/ruby/bin/ruby"
775
shebang = @installer.shebang 'my_exec'
953
shebang = @installer.shebang 'executable'
777
955
assert_equal "#!#{Gem.ruby}", shebang
780
958
def test_shebang_nested_arguments
781
util_make_exec '2', "#!/opt/local/ruby/bin/ruby -ws"
959
util_make_exec @spec, "#!/opt/local/ruby/bin/ruby -ws"
783
shebang = @installer.shebang 'my_exec'
961
shebang = @installer.shebang 'executable'
785
963
assert_equal "#!#{Gem.ruby} -ws", shebang
788
966
def test_shebang_version
789
util_make_exec '2', "#!/usr/bin/ruby18"
967
util_make_exec @spec, "#!/usr/bin/ruby18"
791
shebang = @installer.shebang 'my_exec'
969
shebang = @installer.shebang 'executable'
793
971
assert_equal "#!#{Gem.ruby}", shebang
796
974
def test_shebang_version_arguments
797
util_make_exec '2', "#!/usr/bin/ruby18 -ws"
975
util_make_exec @spec, "#!/usr/bin/ruby18 -ws"
799
shebang = @installer.shebang 'my_exec'
977
shebang = @installer.shebang 'executable'
801
979
assert_equal "#!#{Gem.ruby} -ws", shebang
804
982
def test_shebang_version_env
805
util_make_exec '2', "#!/usr/bin/env ruby18"
983
util_make_exec @spec, "#!/usr/bin/env ruby18"
807
shebang = @installer.shebang 'my_exec'
985
shebang = @installer.shebang 'executable'
809
987
assert_equal "#!#{Gem.ruby}", shebang
812
990
def test_shebang_version_env_arguments
813
util_make_exec '2', "#!/usr/bin/env ruby18 -ws"
991
util_make_exec @spec, "#!/usr/bin/env ruby18 -ws"
815
shebang = @installer.shebang 'my_exec'
993
shebang = @installer.shebang 'executable'
817
995
assert_equal "#!#{Gem.ruby} -ws", shebang
843
1021
assert_equal @spec, eval(File.read(spec_file))
1024
def test_write_spec_writes_cached_spec
1025
spec_dir = File.join @gemhome, 'specifications'
1026
spec_file = File.join spec_dir, @spec.spec_name
1027
FileUtils.rm spec_file
1028
refute File.exist?(spec_file)
1030
@spec.files = %w[a.rb b.rb c.rb]
1032
@installer.spec = @spec
1033
@installer.gem_home = @gemhome
1035
@installer.write_spec
1037
# cached specs have no file manifest:
1040
assert_equal @spec, eval(File.read(spec_file))
1044
assert_match @installer.dir, %r!/installer/gems/a-2$!
846
1047
def old_ruby_required
847
spec = quick_gem 'old_ruby_required', '1' do |s|
1048
spec = quick_spec 'old_ruby_required', '1' do |s|
848
1049
s.required_ruby_version = '= 1.4.6'
851
1052
util_build_gem spec
853
File.join @gemhome, 'cache', spec.file_name
1058
@spec = quick_spec 'z'
1059
util_build_gem @spec
1061
@installer = util_installer @spec, @gemhome
1065
0100755 & (~File.umask)