Class: Gem::InstallerTestCase

Inherits:
TestCase show all
Defined in:
lib/rubygems/installer_test_case.rb

Overview

A test case for Gem::Installer.

Constant Summary collapse

nil

Constants inherited from TestCase

TestCase::PRIVATE_KEY_PASSPHRASE, TestCase::TEST_PATH

Instance Attribute Summary

Attributes inherited from TestCase

#fetcher, #gem_repo, #uri

Instance Method Summary collapse

Methods inherited from TestCase

#_synchronize, #add_to_fetcher, #all_spec_names, #assert_activate, #assert_contains_make_command, #assert_directory_exists, #bindir, #build_rake_in, #capture_subprocess_io, cert_path, #common_installer_setup, #common_installer_teardown, #credential_setup, #credential_teardown, #dep, #dependency_request, #enable_shared, #exeext, #git_gem, #have_git?, #in_path?, #install_default_gems, #install_gem, #install_gem_user, #install_specs, #java_platform?, java_platform?, key_path, load_cert, load_key, #load_yaml, #load_yaml_file, #loaded_spec_names, #make_command, make_command, #mu_pp, #new_default_spec, #nmake_found?, #parse_make_command_line, process_based_port, #process_based_port, #quick_gem, #read_binary, #read_cache, #req, #ruby_with_rubygems_in_load_path, rubybin, #save_gemspec, #save_loaded_features, #scan_make_command_lines, #spec, #spec_fetcher, #teardown, #uninstall_gem, #unresolved_names, #util_build_gem, #util_clear_RUBY_VERSION, #util_clear_gems, #util_gem, #util_gzip, #util_make_gems, #util_remove_gem, #util_restore_RUBY_VERSION, #util_set_RUBY_VERSION, #util_set_arch, #util_setup_spec_fetcher, #util_spec, #util_zip, #v, #vc_windows?, vc_windows?, #vendor_gem, #vendordir, #wait_for_child_process_to_exit, win_platform?, #win_platform?, #with_clean_path_to_ruby, #without_any_upwards_gemfiles, #write_file

Methods included from Deprecate

#deprecate, next_rubygems_major_version, rubygems_deprecate, rubygems_deprecate_command, skip, skip=, skip_during

Methods included from DefaultUserInteraction

ui, #ui, ui=, #ui=, use_ui, #use_ui

Methods included from Text

#clean_text, #format_text, #levenshtein_distance, #min3, #truncate_text

Instance Method Details

#setupObject



66
67
68
69
70
# File 'lib/rubygems/installer_test_case.rb', line 66

def setup
  super

  Gem::Installer.path_warning = false
end

#setup_base_gemObject

Creates the following instance variables:

@spec

a spec named ‘a’, intended for regular installs

And returns a gem built for the @spec



124
125
126
127
128
# File 'lib/rubygems/installer_test_case.rb', line 124

def setup_base_gem
  @spec = setup_base_spec
  util_build_gem @spec
  @spec.cache_file
end

#setup_base_installer(force = true) ⇒ Object

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



111
112
113
114
# File 'lib/rubygems/installer_test_case.rb', line 111

def setup_base_installer(force = true)
  @gem = setup_base_gem
  util_installer @spec, @gemhome, false, force
end

#setup_base_specObject

Sets up a generic specification for testing the rubygems installer

And returns it



135
136
137
138
139
# File 'lib/rubygems/installer_test_case.rb', line 135

def setup_base_spec
  quick_gem 'a' do |spec|
    util_make_exec spec
  end
end

#setup_base_user_installerObject

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



156
157
158
159
160
161
162
163
164
165
166
# File 'lib/rubygems/installer_test_case.rb', line 156

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

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.

Returns:

  • (Boolean)


235
236
237
238
239
240
241
242
243
244
245
246
# File 'lib/rubygems/installer_test_case.rb', line 235

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

#util_inst_bindirObject

The path where installed executables live



75
76
77
# File 'lib/rubygems/installer_test_case.rb', line 75

def util_inst_bindir
  File.join @gemhome, "bin"
end

#util_installer(spec, gem_home, user = false, force = true) ⇒ Object

Creates an installer for spec that will install into gem_home. If user is true a user-install will be performed.



224
225
226
227
228
229
# File 'lib/rubygems/installer_test_case.rb', line 224

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

#util_make_exec(spec = @spec, shebang = "#!/usr/bin/ruby", bindir = "bin") ⇒ Object

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.



85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'lib/rubygems/installer_test_case.rb', line 85

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

#util_setup_gem(ui = @ui, force = true) ⇒ Object

Builds the @spec gem and returns an installer for it. The built gem includes:

bin/executable
lib/code.rb
ext/a/mkrf_conf.rb


185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
# File 'lib/rubygems/installer_test_case.rb', line 185

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

#util_setup_installer(&block) ⇒ Object

Sets up the base @gem, builds it and returns an installer for it.



171
172
173
174
175
# File 'lib/rubygems/installer_test_case.rb', line 171

def util_setup_installer(&block)
  @gem = setup_base_gem

  util_setup_gem(&block)
end