diff options
Diffstat (limited to 'trunk/test/rubygems/test_gem_installer.rb')
-rw-r--r-- | trunk/test/rubygems/test_gem_installer.rb | 868 |
1 files changed, 0 insertions, 868 deletions
diff --git a/trunk/test/rubygems/test_gem_installer.rb b/trunk/test/rubygems/test_gem_installer.rb deleted file mode 100644 index eb9743dd42..0000000000 --- a/trunk/test/rubygems/test_gem_installer.rb +++ /dev/null @@ -1,868 +0,0 @@ -#-- -# Copyright 2006 by Chad Fowler, Rich Kilmer, Jim Weirich and others. -# All rights reserved. -# See LICENSE.txt for permissions. -#++ - -require File.join(File.expand_path(File.dirname(__FILE__)), - 'gem_installer_test_case') - -class TestGemInstaller < GemInstallerTestCase - - def test_app_script_text - util_make_exec '2', '' - - expected = <<-EOF -#!#{Gem.ruby} -# -# This file was generated by RubyGems. -# -# The application 'a' is installed as part of a gem, and -# this file is here to facilitate running it. -# - -require 'rubygems' - -version = \">= 0\" - -if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then - version = $1 - ARGV.shift -end - -gem 'a', version -load 'my_exec' - EOF - - wrapper = @installer.app_script_text 'my_exec' - assert_equal expected, wrapper - end - - def test_build_extensions_none - use_ui @ui do - @installer.build_extensions - end - - assert_equal '', @ui.output - assert_equal '', @ui.error - - assert !File.exist?('gem_make.out') - end - - def test_build_extensions_extconf_bad - @spec.extensions << 'extconf.rb' - - e = assert_raise Gem::Installer::ExtensionBuildError do - use_ui @ui do - @installer.build_extensions - end - end - - assert_match(/\AERROR: Failed to build gem native extension.$/, e.message) - - assert_equal "Building native extensions. This could take a while...\n", - @ui.output - assert_equal '', @ui.error - - gem_make_out = File.join @gemhome, 'gems', @spec.full_name, 'gem_make.out' - expected = <<-EOF -#{Gem.ruby} extconf.rb -#{Gem.ruby}: No such file or directory -- extconf.rb (LoadError) - EOF - - assert_equal expected, File.read(gem_make_out) - end - - def test_build_extensions_unsupported - @spec.extensions << nil - - e = assert_raise Gem::Installer::ExtensionBuildError do - use_ui @ui do - @installer.build_extensions - end - end - - assert_match(/^No builder for extension ''$/, e.message) - - assert_equal "Building native extensions. This could take a while...\n", - @ui.output - assert_equal '', @ui.error - - assert_equal "No builder for extension ''\n", File.read('gem_make.out') - ensure - FileUtils.rm_f 'gem_make.out' - end - - def test_ensure_dependency - dep = Gem::Dependency.new 'a', '>= 2' - assert @installer.ensure_dependency(@spec, dep) - - dep = Gem::Dependency.new 'b', '> 2' - e = assert_raise Gem::InstallError do - @installer.ensure_dependency @spec, dep - end - - assert_equal 'a requires b (> 2, runtime)', e.message - end - - def test_expand_and_validate_gem_dir - @installer.gem_dir = '/nonexistent' - expanded_gem_dir = @installer.send(:expand_and_validate_gem_dir) - if win_platform? - expected = File.expand_path('/nonexistent').downcase - expanded_gem_dir = expanded_gem_dir.downcase - else - expected = '/nonexistent' - end - - assert_equal expected, expanded_gem_dir - end - - def test_extract_files - format = Object.new - def format.file_entries - [[{'size' => 7, 'mode' => 0400, 'path' => 'thefile'}, 'thefile']] - end - - @installer.format = format - - @installer.extract_files - - thefile_path = File.join(util_gem_dir, 'thefile') - assert_equal 'thefile', File.read(thefile_path) - - unless Gem.win_platform? then - assert_equal 0400, File.stat(thefile_path).mode & 0777 - end - end - - def test_extract_files_bad_dest - @installer.gem_dir = 'somedir' - @installer.format = nil - e = assert_raise ArgumentError do - @installer.extract_files - end - - assert_equal 'format required to extract from', e.message - end - - def test_extract_files_relative - format = Object.new - def format.file_entries - [[{'size' => 10, 'mode' => 0644, 'path' => '../thefile'}, '../thefile']] - end - - @installer.format = format - - e = assert_raise Gem::InstallError do - @installer.extract_files - end - - assert_equal "attempt to install file into \"../thefile\" under #{util_gem_dir.inspect}", - e.message - assert_equal false, File.file?(File.join(@tempdir, '../thefile')), - "You may need to remove this file if you broke the test once" - end - - def test_extract_files_absolute - format = Object.new - def format.file_entries - [[{'size' => 8, 'mode' => 0644, 'path' => '/thefile'}, '/thefile']] - end - - @installer.format = format - - e = assert_raise Gem::InstallError do - @installer.extract_files - end - - assert_equal 'attempt to install file into "/thefile"', e.message - assert_equal false, File.file?(File.join('/thefile')), - "You may need to remove this file if you broke the test once" - end - - def test_generate_bin_bindir - @installer.wrappers = true - - @spec.executables = ["my_exec"] - @spec.bindir = '.' - - exec_file = @installer.formatted_program_filename "my_exec" - exec_path = File.join util_gem_dir(@spec.version), exec_file - File.open exec_path, 'w' do |f| - f.puts '#!/usr/bin/ruby' - end - - @installer.gem_dir = util_gem_dir - - @installer.generate_bin - - assert_equal true, File.directory?(util_inst_bindir) - installed_exec = File.join(util_inst_bindir, "my_exec") - assert_equal true, File.exist?(installed_exec) - assert_equal(0100755, File.stat(installed_exec).mode) unless win_platform? - - wrapper = File.read installed_exec - assert_match %r|generated by RubyGems|, wrapper - end - - def test_generate_bin_script - @installer.wrappers = true - util_make_exec - @installer.gem_dir = util_gem_dir - - @installer.generate_bin - assert_equal true, File.directory?(util_inst_bindir) - installed_exec = File.join(util_inst_bindir, "my_exec") - assert_equal true, File.exist?(installed_exec) - assert_equal(0100755, File.stat(installed_exec).mode) unless win_platform? - - wrapper = File.read installed_exec - assert_match %r|generated by RubyGems|, wrapper - end - - def test_generate_bin_script_format - @installer.format_executable = true - @installer.wrappers = true - util_make_exec - @installer.gem_dir = util_gem_dir - - Gem::Installer.exec_format = 'foo-%s-bar' - @installer.generate_bin - assert_equal true, File.directory?(util_inst_bindir) - installed_exec = File.join util_inst_bindir, 'foo-my_exec-bar' - assert_equal true, File.exist?(installed_exec) - ensure - Gem::Installer.exec_format = nil - end - - def test_generate_bin_script_format_disabled - @installer.wrappers = true - util_make_exec - @installer.gem_dir = util_gem_dir - - Gem::Installer.exec_format = 'foo-%s-bar' - @installer.generate_bin - assert_equal true, File.directory?(util_inst_bindir) - installed_exec = File.join util_inst_bindir, 'my_exec' - assert_equal true, File.exist?(installed_exec) - ensure - Gem::Installer.exec_format = nil - end - - def test_generate_bin_script_install_dir - @installer.wrappers = true - @spec.executables = ["my_exec"] - - gem_dir = File.join "#{@gemhome}2", 'gems', @spec.full_name - gem_bindir = File.join gem_dir, 'bin' - FileUtils.mkdir_p gem_bindir - File.open File.join(gem_bindir, "my_exec"), 'w' do |f| - f.puts "#!/bin/ruby" - end - - @installer.gem_home = "#{@gemhome}2" - @installer.gem_dir = gem_dir - - @installer.generate_bin - - installed_exec = File.join("#{@gemhome}2", 'bin', 'my_exec') - assert_equal true, File.exist?(installed_exec) - assert_equal(0100755, File.stat(installed_exec).mode) unless win_platform? - - wrapper = File.read installed_exec - assert_match %r|generated by RubyGems|, wrapper - end - - def test_generate_bin_script_no_execs - @installer.wrappers = true - @installer.generate_bin - assert_equal false, File.exist?(util_inst_bindir) - end - - def test_generate_bin_script_no_perms - @installer.wrappers = true - util_make_exec - - Dir.mkdir util_inst_bindir - File.chmod 0000, util_inst_bindir - - assert_raises Gem::FilePermissionError do - @installer.generate_bin - end - - ensure - File.chmod 0700, util_inst_bindir unless $DEBUG - end - - def test_generate_bin_script_no_shebang - @installer.wrappers = true - @spec.executables = ["my_exec"] - - gem_dir = File.join @gemhome, 'gems', @spec.full_name - gem_bindir = File.join gem_dir, 'bin' - FileUtils.mkdir_p gem_bindir - File.open File.join(gem_bindir, "my_exec"), 'w' do |f| - f.puts "blah blah blah" - end - - @installer.generate_bin - - installed_exec = File.join @gemhome, 'bin', 'my_exec' - assert_equal true, File.exist?(installed_exec) - assert_equal 0100755, File.stat(installed_exec).mode unless win_platform? - - wrapper = File.read installed_exec - assert_match %r|generated by RubyGems|, wrapper - # HACK some gems don't have #! in their executables, restore 2008/06 - #assert_no_match %r|generated by RubyGems|, wrapper - end - - def test_generate_bin_script_wrappers - @installer.wrappers = true - util_make_exec - @installer.gem_dir = util_gem_dir - installed_exec = File.join(util_inst_bindir, "my_exec") - - real_exec = File.join util_gem_dir, 'bin', 'my_exec' - - # fake --no-wrappers for previous install - unless Gem.win_platform? then - FileUtils.mkdir_p File.dirname(installed_exec) - FileUtils.ln_s real_exec, installed_exec - end - - @installer.generate_bin - assert_equal true, File.directory?(util_inst_bindir) - assert_equal true, File.exist?(installed_exec) - assert_equal(0100755, File.stat(installed_exec).mode) unless win_platform? - - assert_match %r|generated by RubyGems|, File.read(installed_exec) - - assert_no_match %r|generated by RubyGems|, File.read(real_exec), - 'real executable overwritten' - end - - def test_generate_bin_symlink - return if win_platform? #Windows FS do not support symlinks - - @installer.wrappers = false - util_make_exec - @installer.gem_dir = util_gem_dir - - @installer.generate_bin - assert_equal true, File.directory?(util_inst_bindir) - installed_exec = File.join(util_inst_bindir, "my_exec") - assert_equal true, File.symlink?(installed_exec) - assert_equal(File.join(util_gem_dir, "bin", "my_exec"), - File.readlink(installed_exec)) - end - - def test_generate_bin_symlink_no_execs - @installer.wrappers = false - @installer.generate_bin - assert_equal false, File.exist?(util_inst_bindir) - end - - def test_generate_bin_symlink_no_perms - @installer.wrappers = false - util_make_exec - @installer.gem_dir = util_gem_dir - - Dir.mkdir util_inst_bindir - File.chmod 0000, util_inst_bindir - - assert_raises Gem::FilePermissionError do - @installer.generate_bin - end - - ensure - File.chmod 0700, util_inst_bindir unless $DEBUG - end - - def test_generate_bin_symlink_update_newer - return if win_platform? #Windows FS do not support symlinks - - @installer.wrappers = false - util_make_exec - @installer.gem_dir = util_gem_dir - - @installer.generate_bin - installed_exec = File.join(util_inst_bindir, "my_exec") - assert_equal(File.join(util_gem_dir, "bin", "my_exec"), - File.readlink(installed_exec)) - - @spec = Gem::Specification.new do |s| - s.files = ['lib/code.rb'] - s.name = "a" - s.version = "3" - s.summary = "summary" - s.description = "desc" - s.require_path = 'lib' - end - - util_make_exec '3' - @installer.gem_dir = File.join util_gem_dir('3') - @installer.generate_bin - installed_exec = File.join(util_inst_bindir, "my_exec") - assert_equal(File.join(util_gem_bindir('3'), "my_exec"), - File.readlink(installed_exec), - "Ensure symlink moved to latest version") - end - - def test_generate_bin_symlink_update_older - return if win_platform? #Windows FS do not support symlinks - - @installer.wrappers = false - util_make_exec - @installer.gem_dir = util_gem_dir - - @installer.generate_bin - installed_exec = File.join(util_inst_bindir, "my_exec") - assert_equal(File.join(util_gem_dir, "bin", "my_exec"), - File.readlink(installed_exec)) - - spec = Gem::Specification.new do |s| - s.files = ['lib/code.rb'] - s.name = "a" - s.version = "1" - s.summary = "summary" - s.description = "desc" - s.require_path = 'lib' - end - - util_make_exec '1' - @installer.gem_dir = util_gem_dir('1') - @installer.spec = spec - - @installer.generate_bin - - installed_exec = File.join(util_inst_bindir, "my_exec") - assert_equal(File.join(util_gem_dir('2'), "bin", "my_exec"), - File.readlink(installed_exec), - "Ensure symlink not moved") - end - - def test_generate_bin_symlink_update_remove_wrapper - return if win_platform? #Windows FS do not support symlinks - - @installer.wrappers = true - util_make_exec - @installer.gem_dir = util_gem_dir - - @installer.generate_bin - installed_exec = File.join(util_inst_bindir, "my_exec") - assert_equal true, File.exist?(installed_exec) - - @spec = Gem::Specification.new do |s| - s.files = ['lib/code.rb'] - s.name = "a" - s.version = "3" - s.summary = "summary" - s.description = "desc" - s.require_path = 'lib' - end - - @installer.wrappers = false - util_make_exec '3' - @installer.gem_dir = util_gem_dir '3' - @installer.generate_bin - installed_exec = File.join(util_inst_bindir, "my_exec") - assert_equal(File.join(util_gem_dir('3'), "bin", "my_exec"), - File.readlink(installed_exec), - "Ensure symlink moved to latest version") - end - - def test_generate_bin_symlink_win32 - old_win_platform = Gem.win_platform? - Gem.win_platform = true - @installer.wrappers = false - util_make_exec - @installer.gem_dir = util_gem_dir - - use_ui @ui do - @installer.generate_bin - end - - assert_equal true, File.directory?(util_inst_bindir) - installed_exec = File.join(util_inst_bindir, "my_exec") - assert_equal true, File.exist?(installed_exec) - - assert_match(/Unable to use symlinks on Windows, installing wrapper/i, - @ui.error) - - wrapper = File.read installed_exec - assert_match(/generated by RubyGems/, wrapper) - ensure - Gem.win_platform = old_win_platform - end - - def test_generate_bin_uses_default_shebang - return if win_platform? #Windows FS do not support symlinks - - @installer.wrappers = true - util_make_exec - - @installer.generate_bin - - default_shebang = File.join(Config::CONFIG['bindir'], Config::CONFIG['ruby_install_name']) - shebang_line = open("#{@gemhome}/bin/my_exec") { |f| f.readlines.first } - assert_match(/\A#!/, shebang_line) - assert_match(/#{default_shebang}/, shebang_line) - end - - def test_initialize - spec = quick_gem 'a' do |s| s.platform = Gem::Platform.new 'mswin32' end - gem = File.join @tempdir, "#{spec.full_name}.gem" - - Dir.mkdir util_inst_bindir - util_build_gem spec - FileUtils.mv File.join(@gemhome, 'cache', "#{spec.full_name}.gem"), - @tempdir - - installer = Gem::Installer.new gem - - assert_equal File.join(@gemhome, 'gems', spec.full_name), installer.gem_dir - end - - def test_install - Dir.mkdir util_inst_bindir - util_setup_gem - - build_rake_in do - use_ui @ui do - assert_equal @spec, @installer.install - end - end - - gemdir = File.join @gemhome, 'gems', @spec.full_name - assert File.exist?(gemdir) - - exe = File.join(gemdir, 'bin', 'executable') - assert File.exist?(exe) - exe_mode = File.stat(exe).mode & 0111 - assert_equal 0111, exe_mode, "0%o" % exe_mode unless win_platform? - - assert File.exist?(File.join(gemdir, 'lib', 'code.rb')) - - assert File.exist?(File.join(gemdir, 'ext', 'a', 'Rakefile')) - - spec_file = File.join(@gemhome, 'specifications', - "#{@spec.full_name}.gemspec") - - assert_equal spec_file, @spec.loaded_from - assert File.exist?(spec_file) - end - - def test_install_bad_gem - gem = nil - - use_ui @ui do - Dir.chdir @tempdir do Gem::Builder.new(@spec).build end - gem = File.join @tempdir, "#{@spec.full_name}.gem" - end - - gem_data = File.open gem, 'rb' do |fp| fp.read 1024 end - File.open gem, 'wb' do |fp| fp.write gem_data end - - e = assert_raise Gem::InstallError do - use_ui @ui do - @installer = Gem::Installer.new gem - @installer.install - end - end - - assert_equal "invalid gem format for #{gem}", e.message - end - - def test_install_check_dependencies - @spec.add_dependency 'b', '> 5' - util_setup_gem - - use_ui @ui do - assert_raise Gem::InstallError do - @installer.install - end - end - end - - def test_install_force - use_ui @ui do - installer = Gem::Installer.new old_ruby_required, :force => true - installer.install - end - - gem_dir = File.join(@gemhome, 'gems', 'old_ruby_required-1') - assert File.exist?(gem_dir) - end - - def test_install_ignore_dependencies - Dir.mkdir util_inst_bindir - @spec.add_dependency 'b', '> 5' - util_setup_gem - @installer.ignore_dependencies = true - - build_rake_in do - use_ui @ui do - assert_equal @spec, @installer.install - end - end - - gemdir = File.join @gemhome, 'gems', @spec.full_name - assert File.exist?(gemdir) - - exe = File.join(gemdir, 'bin', 'executable') - assert File.exist?(exe) - exe_mode = File.stat(exe).mode & 0111 - assert_equal 0111, exe_mode, "0%o" % exe_mode unless win_platform? - assert File.exist?(File.join(gemdir, 'lib', 'code.rb')) - - assert File.exist?(File.join(@gemhome, 'specifications', - "#{@spec.full_name}.gemspec")) - end - - def test_install_missing_dirs - FileUtils.rm_f File.join(Gem.dir, 'cache') - FileUtils.rm_f File.join(Gem.dir, 'docs') - FileUtils.rm_f File.join(Gem.dir, 'specifications') - - use_ui @ui do - Dir.chdir @tempdir do Gem::Builder.new(@spec).build end - gem = File.join @tempdir, "#{@spec.full_name}.gem" - - @installer.install - end - - File.directory? File.join(Gem.dir, 'cache') - File.directory? File.join(Gem.dir, 'docs') - File.directory? File.join(Gem.dir, 'specifications') - - assert File.exist?(File.join(@gemhome, 'cache', "#{@spec.full_name}.gem")) - assert File.exist?(File.join(@gemhome, 'specifications', - "#{@spec.full_name}.gemspec")) - end - unless win_platform? # File.chmod doesn't work - def test_install_user_local_fallback - Dir.mkdir util_inst_bindir - File.chmod 0755, @userhome - File.chmod 0000, util_inst_bindir - File.chmod 0000, Gem.dir - install_dir = File.join @userhome, '.gem', 'gems', @spec.full_name - @spec.executables = ["executable"] - - build_rake_in do - use_ui @ui do - util_setup_gem - @installer.install - end - end - - assert File.exist?(File.join(install_dir, 'lib', 'code.rb')) - assert File.exist?(File.join(@userhome, '.gem', 'bin', 'executable')) - ensure - File.chmod 0755, Gem.dir - File.chmod 0755, util_inst_bindir - end - - def test_install_bindir_read_only - Dir.mkdir util_inst_bindir - File.chmod 0755, @userhome - File.chmod 0000, util_inst_bindir - - build_rake_in do - use_ui @ui do - setup - util_setup_gem - @installer.install - end - end - - assert File.exist?(File.join(@userhome, '.gem', 'bin', 'executable')) - ensure - File.chmod 0755, util_inst_bindir - end - end - - def test_install_with_message - @spec.post_install_message = 'I am a shiny gem!' - - use_ui @ui do - Dir.chdir @tempdir do Gem::Builder.new(@spec).build end - - @installer.install - end - - assert_match %r|I am a shiny gem!|, @ui.output - end - - def test_install_wrong_ruby_version - use_ui @ui do - installer = Gem::Installer.new old_ruby_required - e = assert_raise Gem::InstallError do - installer.install - end - assert_equal 'old_ruby_required requires Ruby version = 1.4.6', - e.message - end - end - - def test_install_wrong_rubygems_version - spec = quick_gem 'old_rubygems_required', '1' do |s| - s.required_rubygems_version = '< 0' - end - - util_build_gem spec - - gem = File.join @gemhome, 'cache', "#{spec.full_name}.gem" - - use_ui @ui do - @installer = Gem::Installer.new gem - e = assert_raise Gem::InstallError do - @installer.install - end - assert_equal 'old_rubygems_required requires RubyGems version < 0', - e.message - end - end - - def test_installation_satisfies_dependency_eh - dep = Gem::Dependency.new 'a', '>= 2' - assert @installer.installation_satisfies_dependency?(dep) - - dep = Gem::Dependency.new 'a', '> 2' - assert ! @installer.installation_satisfies_dependency?(dep) - end - - def test_shebang - util_make_exec '2', "#!/usr/bin/ruby" - - shebang = @installer.shebang 'my_exec' - - assert_equal "#!#{Gem.ruby}", shebang - end - - def test_shebang_arguments - util_make_exec '2', "#!/usr/bin/ruby -ws" - - shebang = @installer.shebang 'my_exec' - - assert_equal "#!#{Gem.ruby} -ws", shebang - end - - def test_shebang_empty - util_make_exec '2', '' - - shebang = @installer.shebang 'my_exec' - assert_equal "#!#{Gem.ruby}", shebang - end - - def test_shebang_env - util_make_exec '2', "#!/usr/bin/env ruby" - - shebang = @installer.shebang 'my_exec' - - assert_equal "#!#{Gem.ruby}", shebang - end - - def test_shebang_env_arguments - util_make_exec '2', "#!/usr/bin/env ruby -ws" - - shebang = @installer.shebang 'my_exec' - - assert_equal "#!#{Gem.ruby} -ws", shebang - end - - def test_shebang_env_shebang - util_make_exec '2', '' - @installer.env_shebang = true - - shebang = @installer.shebang 'my_exec' - assert_equal "#!/usr/bin/env #{Gem::ConfigMap[:RUBY_INSTALL_NAME]}", shebang - end - - def test_shebang_nested - util_make_exec '2', "#!/opt/local/ruby/bin/ruby" - - shebang = @installer.shebang 'my_exec' - - assert_equal "#!#{Gem.ruby}", shebang - end - - def test_shebang_nested_arguments - util_make_exec '2', "#!/opt/local/ruby/bin/ruby -ws" - - shebang = @installer.shebang 'my_exec' - - assert_equal "#!#{Gem.ruby} -ws", shebang - end - - def test_shebang_version - util_make_exec '2', "#!/usr/bin/ruby18" - - shebang = @installer.shebang 'my_exec' - - assert_equal "#!#{Gem.ruby}", shebang - end - - def test_shebang_version_arguments - util_make_exec '2', "#!/usr/bin/ruby18 -ws" - - shebang = @installer.shebang 'my_exec' - - assert_equal "#!#{Gem.ruby} -ws", shebang - end - - def test_shebang_version_env - util_make_exec '2', "#!/usr/bin/env ruby18" - - shebang = @installer.shebang 'my_exec' - - assert_equal "#!#{Gem.ruby}", shebang - end - - def test_shebang_version_env_arguments - util_make_exec '2', "#!/usr/bin/env ruby18 -ws" - - shebang = @installer.shebang 'my_exec' - - assert_equal "#!#{Gem.ruby} -ws", shebang - end - - def test_unpack - util_setup_gem - - dest = File.join @gemhome, 'gems', @spec.full_name - - @installer.unpack dest - - assert File.exist?(File.join(dest, 'lib', 'code.rb')) - assert File.exist?(File.join(dest, 'bin', 'executable')) - end - - def test_write_spec - spec_dir = File.join @gemhome, 'specifications' - spec_file = File.join spec_dir, "#{@spec.full_name}.gemspec" - FileUtils.rm spec_file - assert !File.exist?(spec_file) - - @installer.spec = @spec - @installer.gem_home = @gemhome - - @installer.write_spec - - assert File.exist?(spec_file) - assert_equal @spec, eval(File.read(spec_file)) - end - - def old_ruby_required - spec = quick_gem 'old_ruby_required', '1' do |s| - s.required_ruby_version = '= 1.4.6' - end - - util_build_gem spec - - File.join @gemhome, 'cache', "#{spec.full_name}.gem" - end - -end - |