diff options
author | David RodrÃguez <deivid.rodriguez@riseup.net> | 2021-05-12 11:35:19 +0200 |
---|---|---|
committer | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2021-05-28 11:52:57 +0900 |
commit | 59c682097197fee4052b47e4b4ab86562f3eaa9b (patch) | |
tree | 3adb987bd13ea9cf0c9db8c1c8be0451bbc6bd34 /test/rubygems/installer_test_case.rb | |
parent | f7d661e783e02f87e1e0d0d67b1ca2ed306a1904 (diff) |
[rubygems/rubygems] Copy files specific to testing rubygems to `test`
https://github.com/rubygems/rubygems/commit/aa390a3500
Diffstat (limited to 'test/rubygems/installer_test_case.rb')
-rw-r--r-- | test/rubygems/installer_test_case.rb | 247 |
1 files changed, 247 insertions, 0 deletions
diff --git a/test/rubygems/installer_test_case.rb b/test/rubygems/installer_test_case.rb new file mode 100644 index 0000000000..416dac7be6 --- /dev/null +++ b/test/rubygems/installer_test_case.rb @@ -0,0 +1,247 @@ +# frozen_string_literal: true +require 'rubygems/test_case' +require 'rubygems/installer' + +class Gem::Installer + ## + # Available through requiring rubygems/installer_test_case + + attr_writer :bin_dir + + ## + # Available through requiring rubygems/installer_test_case + + attr_writer :build_args + + ## + # Available through requiring rubygems/installer_test_case + + attr_writer :gem_dir + + ## + # Available through requiring rubygems/installer_test_case + + attr_writer :force + + ## + # Available through requiring rubygems/installer_test_case + + attr_writer :format + + ## + # Available through requiring rubygems/installer_test_case + + attr_writer :gem_home + + ## + # Available through requiring rubygems/installer_test_case + + attr_writer :env_shebang + + ## + # Available through requiring rubygems/installer_test_case + + attr_writer :ignore_dependencies + + ## + # Available through requiring rubygems/installer_test_case + + attr_writer :format_executable + + ## + # Available through requiring rubygems/installer_test_case + + attr_writer :security_policy + + ## + # Available through requiring rubygems/installer_test_case + + attr_writer :wrappers +end + +## +# A test case for Gem::Installer. + +class Gem::InstallerTestCase < Gem::TestCase + def setup + super + + Gem::Installer.path_warning = false + end + + ## + # The path where installed executables live + + def util_inst_bindir + File.join @gemhome, "bin" + end + + ## + # Adds an executable named "executable" to +spec+ with the given +shebang+. + # + # The executable is also written to the bin dir in @tmpdir and the installed + # gem directory for +spec+. + + def util_make_exec(spec = @spec, shebang = "#!/usr/bin/ruby", bindir = "bin") + spec.executables = %w[executable] + spec.bindir = bindir + + exec_path = spec.bin_file "executable" + write_file exec_path do |io| + io.puts shebang + end + + bin_path = File.join @tempdir, "bin", "executable" + write_file bin_path do |io| + io.puts shebang + end + end + + ## + # Creates the following instance variables: + # + # @spec:: + # a spec named 'a', intended for regular installs + # + # @gem:: + # the path to a built gem from @spec + # + # And returns a Gem::Installer for the @spec that installs into @gemhome + + def setup_base_installer(force = true) + @gem = setup_base_gem + util_installer @spec, @gemhome, false, force + end + + ## + # Creates the following instance variables: + # + # @spec:: + # a spec named 'a', intended for regular installs + # + # And returns a gem built for the @spec + + def setup_base_gem + @spec = setup_base_spec + util_build_gem @spec + @spec.cache_file + end + + ## + # Sets up a generic specification for testing the rubygems installer + # + # And returns it + + def setup_base_spec + quick_gem 'a' do |spec| + util_make_exec spec + end + end + + ## + # Creates the following instance variables: + # + # @spec:: + # a spec named 'a', intended for regular installs + # @user_spec:: + # a spec named 'b', intended for user installs + # + # @gem:: + # the path to a built gem from @spec + # @user_gem:: + # the path to a built gem from @user_spec + # + # And returns a Gem::Installer for the @user_spec that installs into Gem.user_dir + + def setup_base_user_installer + @user_spec = quick_gem 'b' do |spec| + util_make_exec spec + end + + util_build_gem @user_spec + + @user_gem = @user_spec.cache_file + + util_installer @user_spec, Gem.user_dir, :user + end + + ## + # Sets up the base @gem, builds it and returns an installer for it. + # + def util_setup_installer(&block) + @gem = setup_base_gem + + util_setup_gem(&block) + end + + ## + # Builds the @spec gem and returns an installer for it. The built gem + # includes: + # + # bin/executable + # lib/code.rb + # ext/a/mkrf_conf.rb + + def util_setup_gem(ui = @ui, force = true) + @spec.files << File.join('lib', 'code.rb') + @spec.extensions << File.join('ext', 'a', 'mkrf_conf.rb') + + Dir.chdir @tempdir do + FileUtils.mkdir_p 'bin' + FileUtils.mkdir_p 'lib' + FileUtils.mkdir_p File.join('ext', 'a') + + File.open File.join('bin', 'executable'), 'w' do |f| + f.puts "raise 'ran executable'" + end + + File.open File.join('lib', 'code.rb'), 'w' do |f| + f.puts '1' + end + + File.open File.join('ext', 'a', 'mkrf_conf.rb'), 'w' do |f| + f << <<-EOF + File.open 'Rakefile', 'w' do |rf| rf.puts "task :default" end + EOF + end + + yield @spec if block_given? + + use_ui ui do + FileUtils.rm_f @gem + + @gem = Gem::Package.build @spec + end + end + + Gem::Installer.at @gem, :force => force + end + + ## + # Creates an installer for +spec+ that will install into +gem_home+. If + # +user+ is true a user-install will be performed. + + def util_installer(spec, gem_home, user=false, force=true) + Gem::Installer.at(spec.cache_file, + :install_dir => gem_home, + :user_install => user, + :force => force) + end + + @@symlink_supported = nil + + # This is needed for Windows environment without symlink support enabled (the default + # for non admin) to be able to skip test for features using symlinks. + def symlink_supported? + if @@symlink_supported.nil? + begin + File.symlink("", "") + rescue Errno::ENOENT, Errno::EEXIST + @@symlink_supported = true + rescue NotImplementedError, SystemCallError + @@symlink_supported = false + end + end + @@symlink_supported + end +end |