merge revision(s) 62244,62246,62301,62302,62303,62422,62436,62452: [Backport #14481]

Merge RubyGems-2.7.5 from upstream.

	  Please see its details: http://blog.rubygems.org/2018/02/06/2.7.5-released.html

	test_gem_util.rb: fix broken test

	* test/rubygems/test_gem_util.rb: no guarantee that tmpdir is
	  always underneath the root directory at all.

	test_gem_commands_setup_command.rb: BUNDLER_VERS

	* test/rubygems/test_gem_commands_setup_command.rb: run bundled
	  gem command, instead of installed one.

	no need to set bundled bundler unless Gem::USE_BUNDLER_FOR_GEMDEPS


	revert r62302 and force to define the version constant


	Merge RubyGems 2.7.6 from upstream.

	  It fixed some security vulnerabilities.

	  http://blog.rubygems.org/2018/02/15/2.7.6-released.html

	fix regexp literal warning.

	test/rubygems/test_gem_server.rb: eliminate duplicated character class warning.
	[Bug #14481]

	Remove unnecessary `[]`s

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_5@62837 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
naruse 2018-03-19 08:27:04 +00:00
parent 6d6880ff40
commit 90df7a08e4
58 changed files with 633 additions and 197 deletions

View file

@ -463,7 +463,7 @@ class TestGem < Gem::TestCase
assert File.directory?(util_cache_dir)
end
unless win_platform? || Process.uid == 0 then # only for FS that support write protection
unless win_platform? || Process.uid.zero? then # only for FS that support write protection
def test_self_ensure_gem_directories_write_protected
gemdir = File.join @tempdir, "egd"
FileUtils.rm_r gemdir rescue nil
@ -775,7 +775,7 @@ class TestGem < Gem::TestCase
end
def test_self_read_binary
open 'test', 'w' do |io|
File.open 'test', 'w' do |io|
io.write "\xCF\x80"
end
@ -1642,7 +1642,7 @@ class TestGem < Gem::TestCase
spec = Gem::Specification.find { |s| s == spec }
refute spec.activated?
open gem_deps_file, 'w' do |io|
File.open gem_deps_file, 'w' do |io|
io.write 'gem "a"'
end
@ -1661,7 +1661,7 @@ class TestGem < Gem::TestCase
refute spec.activated?
open 'gem.deps.rb', 'w' do |io|
File.open 'gem.deps.rb', 'w' do |io|
io.write 'gem "a"'
end
@ -1705,7 +1705,7 @@ class TestGem < Gem::TestCase
refute spec.activated?
open 'Gemfile', 'w' do |io|
File.open 'Gemfile', 'w' do |io|
io.write 'gem "a"'
end
@ -1734,7 +1734,7 @@ class TestGem < Gem::TestCase
refute spec.activated?
open 'gem.deps.rb', 'w' do |io|
File.open 'gem.deps.rb', 'w' do |io|
io.write 'gem "a"'
end
@ -1749,7 +1749,7 @@ class TestGem < Gem::TestCase
skip 'Insecure operation - read' if RUBY_VERSION <= "1.8.7"
rubygems_gemdeps, ENV['RUBYGEMS_GEMDEPS'] = ENV['RUBYGEMS_GEMDEPS'], 'x'
open 'x', 'w' do |io|
File.open 'x', 'w' do |io|
io.write 'gem "a"'
end
@ -1790,7 +1790,7 @@ You may need to `gem install -g` to install missing gems
spec = Gem::Specification.find { |s| s == spec }
refute spec.activated?
open 'x', 'w' do |io|
File.open 'x', 'w' do |io|
io.write 'gem "a"'
end

View file

@ -158,7 +158,7 @@ class TestGemCommandsCleanupCommand < Gem::TestCase
assert_path_exists @a_1_1.gem_dir
ensure
FileUtils.chmod 0755, @gemhome
end unless win_platform? || Process.uid == 0
end unless win_platform? || Process.uid.zero?
def test_execute_dry_run
@cmd.options[:args] = %w[a]

View file

@ -131,7 +131,7 @@ class TestGemCommandsInstallCommand < Gem::TestCase
def test_execute_no_user_install
skip 'skipped on MS Windows (chmod has no effect)' if win_platform?
skip 'skipped in root privilege' if Process.uid == 0
skip 'skipped in root privilege' if Process.uid.zero?
specs = spec_fetcher do |fetcher|
fetcher.gem 'a', 2

View file

@ -43,6 +43,31 @@ EOF
assert_match %r{- 4}, @ui.output
end
def test_show_owners_dont_load_objects
skip "testing a psych-only API" unless defined?(::Psych::DisallowedClass)
response = <<EOF
---
- email: !ruby/object:Object {}
id: 1
handle: user1
- email: user2@example.com
- id: 3
handle: user3
- id: 4
EOF
@fetcher.data["#{Gem.host}/api/v1/gems/freewill/owners.yaml"] = [response, 200, 'OK']
assert_raises Psych::DisallowedClass do
use_ui @ui do
@cmd.show_owners("freewill")
end
end
end
def test_show_owners_setting_up_host_through_env_var
response = "- email: user1@example.com\n"
host = "http://rubygems.example"

View file

@ -132,7 +132,7 @@ class TestGemCommandsPushCommand < Gem::TestCase
}
FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
open Gem.configuration.credentials_path, 'w' do |f|
File.open Gem.configuration.credentials_path, 'w' do |f|
f.write keys.to_yaml
end
Gem.configuration.load_api_keys
@ -166,7 +166,7 @@ class TestGemCommandsPushCommand < Gem::TestCase
}
FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
open Gem.configuration.credentials_path, 'w' do |f|
File.open Gem.configuration.credentials_path, 'w' do |f|
f.write keys.to_yaml
end
Gem.configuration.load_api_keys
@ -193,7 +193,7 @@ class TestGemCommandsPushCommand < Gem::TestCase
}
FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
open Gem.configuration.credentials_path, 'w' do |f|
File.open Gem.configuration.credentials_path, 'w' do |f|
f.write keys.to_yaml
end
Gem.configuration.load_api_keys
@ -235,7 +235,7 @@ class TestGemCommandsPushCommand < Gem::TestCase
}
FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
open Gem.configuration.credentials_path, 'w' do |f|
File.open Gem.configuration.credentials_path, 'w' do |f|
f.write keys.to_yaml
end
Gem.configuration.load_api_keys
@ -266,7 +266,7 @@ class TestGemCommandsPushCommand < Gem::TestCase
}
FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
open Gem.configuration.credentials_path, 'w' do |f|
File.open Gem.configuration.credentials_path, 'w' do |f|
f.write keys.to_yaml
end
Gem.configuration.load_api_keys

View file

@ -6,6 +6,13 @@ require 'rubygems/commands/setup_command'
class TestGemCommandsSetupCommand < Gem::TestCase
bundler_gemspec = File.expand_path("../../../bundler/lib/bundler/version.rb", __FILE__)
if File.exist?(bundler_gemspec)
BUNDLER_VERS = File.read(bundler_gemspec).match(/VERSION = "(#{Gem::Version::VERSION_PATTERN})"/)[1]
else
BUNDLER_VERS = "1.16.1"
end
def setup
super
@ -16,27 +23,27 @@ class TestGemCommandsSetupCommand < Gem::TestCase
FileUtils.mkdir_p 'bin'
FileUtils.mkdir_p 'lib/rubygems/ssl_certs/rubygems.org'
open 'bin/gem', 'w' do |io| io.puts '# gem' end
open 'lib/rubygems.rb', 'w' do |io| io.puts '# rubygems.rb' end
open 'lib/rubygems/test_case.rb', 'w' do |io| io.puts '# test_case.rb' end
open 'lib/rubygems/ssl_certs/rubygems.org/foo.pem', 'w' do |io| io.puts 'PEM' end
File.open 'bin/gem', 'w' do |io| io.puts '# gem' end
File.open 'lib/rubygems.rb', 'w' do |io| io.puts '# rubygems.rb' end
File.open 'lib/rubygems/test_case.rb', 'w' do |io| io.puts '# test_case.rb' end
File.open 'lib/rubygems/ssl_certs/rubygems.org/foo.pem', 'w' do |io| io.puts 'PEM' end
FileUtils.mkdir_p 'bundler/exe'
FileUtils.mkdir_p 'bundler/lib/bundler'
open 'bundler/exe/bundle', 'w' do |io| io.puts '# bundle' end
open 'bundler/lib/bundler.rb', 'w' do |io| io.puts '# bundler.rb' end
open 'bundler/lib/bundler/b.rb', 'w' do |io| io.puts '# b.rb' end
File.open 'bundler/exe/bundle', 'w' do |io| io.puts '# bundle' end
File.open 'bundler/lib/bundler.rb', 'w' do |io| io.puts '# bundler.rb' end
File.open 'bundler/lib/bundler/b.rb', 'w' do |io| io.puts '# b.rb' end
FileUtils.mkdir_p 'default/gems'
gemspec = Gem::Specification.new
gemspec.name = "bundler"
gemspec.version = "1.16.0"
gemspec.version = BUNDLER_VERS
gemspec.bindir = "exe"
gemspec.executables = ["bundle"]
open 'bundler/bundler.gemspec', 'w' do |io|
File.open 'bundler/bundler.gemspec', 'w' do |io|
io.puts gemspec.to_ruby
end
@ -46,6 +53,11 @@ class TestGemCommandsSetupCommand < Gem::TestCase
end
FileUtils.mkdir_p File.join(Gem.default_dir, "specifications")
open(File.join(Gem.default_dir, "specifications", "bundler-#{BUNDLER_VERS}.gemspec"), 'w') do |io|
io.puts "# bundler-#{BUNDLER_VERS}"
end
open(File.join(Gem.default_dir, "specifications", "bundler-audit-1.0.0.gemspec"), 'w') do |io|
io.puts '# bundler-audit'
end
@ -134,13 +146,25 @@ class TestGemCommandsSetupCommand < Gem::TestCase
default_dir = Gem::Specification.default_specifications_dir
# expect to remove other versions of bundler gemspecs on default specification directory.
refute_path_exists File.join(default_dir, "bundler-1.15.4.gemspec")
refute_path_exists 'default/gems/bundler-1.15.4'
assert_path_exists File.join(default_dir, "bundler-1.16.0.gemspec")
assert_path_exists 'default/gems/bundler-1.16.0'
assert_path_exists File.join(default_dir, "bundler-#{BUNDLER_VERS}.gemspec")
# expect to not remove bundler-* gemspecs.
assert_path_exists File.join(Gem.default_dir, "specifications", "bundler-audit-1.0.0.gemspec")
# expect to remove normal gem that was same version. because it's promoted default gems.
refute_path_exists File.join(Gem.default_dir, "specifications", "bundler-#{BUNDLER_VERS}.gemspec")
# expect to install default gems. It location was `site_ruby` directory on real world.
assert_path_exists "default/gems/bundler-#{BUNDLER_VERS}"
# expect to not remove other versions of bundler on `site_ruby`
assert_path_exists 'default/gems/bundler-1.15.4'
# TODO: We need to assert to remove same version of bundler on gem_dir directory(It's not site_ruby dir)
# expect to not remove bundler-* direcotyr.
assert_path_exists 'default/gems/bundler-audit-1.0.0'
end if Gem::USE_BUNDLER_FOR_GEMDEPS
@ -162,14 +186,14 @@ class TestGemCommandsSetupCommand < Gem::TestCase
FileUtils.mkdir_p lib_rubygems_defaults
FileUtils.mkdir_p lib_bundler
open securerandom_rb, 'w' do |io| io.puts '# securerandom.rb' end
File.open securerandom_rb, 'w' do |io| io.puts '# securerandom.rb' end
open old_builder_rb, 'w' do |io| io.puts '# builder.rb' end
open old_format_rb, 'w' do |io| io.puts '# format.rb' end
open old_bundler_c_rb, 'w' do |io| io.puts '# c.rb' end
File.open old_builder_rb, 'w' do |io| io.puts '# builder.rb' end
File.open old_format_rb, 'w' do |io| io.puts '# format.rb' end
File.open old_bundler_c_rb, 'w' do |io| io.puts '# c.rb' end
open engine_defaults_rb, 'w' do |io| io.puts '# jruby.rb' end
open os_defaults_rb, 'w' do |io| io.puts '# operating_system.rb' end
File.open engine_defaults_rb, 'w' do |io| io.puts '# jruby.rb' end
File.open os_defaults_rb, 'w' do |io| io.puts '# operating_system.rb' end
@cmd.remove_old_lib_files lib
@ -191,7 +215,7 @@ class TestGemCommandsSetupCommand < Gem::TestCase
@cmd.options[:previous_version] = Gem::Version.new '2.0.2'
open 'History.txt', 'w' do |io|
File.open 'History.txt', 'w' do |io|
io.puts <<-History_txt
# coding: UTF-8

View file

@ -92,7 +92,7 @@ class TestGemCommandsUninstallCommand < Gem::InstallerTestCase
# Evil hack to prevent false removal success
FileUtils.rm_f @executable
open @executable, "wb+" do |f| f.puts "binary" end
File.open @executable, "wb+" do |f| f.puts "binary" end
@cmd.options[:executables] = true
@cmd.options[:args] = [@spec.name]
@ -204,7 +204,7 @@ class TestGemCommandsUninstallCommand < Gem::InstallerTestCase
end
assert Gem::Specification.find_all_by_name('dep_x').length > 0
assert Gem::Specification.find_all_by_name('x').length == 0
assert Gem::Specification.find_all_by_name('x').length.zero?
end
def test_execute_all

View file

@ -424,7 +424,7 @@ class TestGemDependencyInstaller < Gem::TestCase
extconf_rb = File.join @gemhome, 'gems', 'e-1', 'extconf.rb'
FileUtils.mkdir_p File.dirname extconf_rb
open extconf_rb, 'w' do |io|
File.open extconf_rb, 'w' do |io|
io.write <<-EXTCONF_RB
require 'mkmf'
create_makefile 'e'

View file

@ -24,7 +24,7 @@ class TestGemDoctor < Gem::TestCase
FileUtils.rm b.spec_file
open c.spec_file, 'w' do |io|
File.open c.spec_file, 'w' do |io|
io.write 'this will raise an exception when evaluated.'
end
@ -77,7 +77,7 @@ Removed directory gems/c-2
FileUtils.rm b.spec_file
open c.spec_file, 'w' do |io|
File.open c.spec_file, 'w' do |io|
io.write 'this will raise an exception when evaluated.'
end

View file

@ -32,7 +32,7 @@ class TestGemExtBuilder < Gem::TestCase
results = []
Dir.chdir @ext do
open 'Makefile', 'w' do |io|
File.open 'Makefile', 'w' do |io|
io.puts <<-MAKEFILE
all:
\t@#{Gem.ruby} -e "puts %Q{all: \#{ENV['DESTDIR']}}"
@ -72,7 +72,7 @@ install:
results = []
Dir.chdir @ext do
open 'Makefile', 'w' do |io|
File.open 'Makefile', 'w' do |io|
io.puts <<-MAKEFILE
all:
\t@#{Gem.ruby} -e "puts %Q{all: \#{ENV['DESTDIR']}}"
@ -107,7 +107,7 @@ install:
extconf_rb = File.join ext_dir, 'extconf.rb'
open extconf_rb, 'w' do |f|
File.open extconf_rb, 'w' do |f|
f.write <<-'RUBY'
require 'mkmf'
@ -168,7 +168,7 @@ install:
extconf_rb = File.join ext_dir, 'extconf.rb'
open extconf_rb, 'w' do |f|
File.open extconf_rb, 'w' do |f|
f.write <<-'RUBY'
require 'mkmf'
@ -290,7 +290,7 @@ install:
FileUtils.mkdir_p @spec.gem_dir
open File.join(@spec.gem_dir, "extconf.rb"), "w" do |f|
File.open File.join(@spec.gem_dir, "extconf.rb"), "w" do |f|
f.write <<-'RUBY'
puts "IN EXTCONF"
extconf_args = File.join File.dirname(__FILE__), 'extconf_args'
@ -323,7 +323,7 @@ install:
build_info_file = File.join build_info_dir, "#{@spec.full_name}.info"
open build_info_file, 'w' do |io|
File.open build_info_file, 'w' do |io|
io.puts '--with-foo-dir=/nonexistent'
end

View file

@ -31,7 +31,7 @@ class TestGemGemcutterUtilities < Gem::TestCase
FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
open Gem.configuration.credentials_path, 'w' do |f|
File.open Gem.configuration.credentials_path, 'w' do |f|
f.write keys.to_yaml
end
@ -46,7 +46,7 @@ class TestGemGemcutterUtilities < Gem::TestCase
keys = { :rubygems_api_key => 'KEY' }
FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
open Gem.configuration.credentials_path, 'w' do |f|
File.open Gem.configuration.credentials_path, 'w' do |f|
f.write keys.to_yaml
end
@ -59,7 +59,7 @@ class TestGemGemcutterUtilities < Gem::TestCase
keys = { :rubygems_api_key => 'KEY', :other => 'OTHER' }
FileUtils.mkdir_p File.dirname Gem.configuration.credentials_path
open Gem.configuration.credentials_path, 'w' do |f|
File.open Gem.configuration.credentials_path, 'w' do |f|
f.write keys.to_yaml
end
@ -163,7 +163,7 @@ class TestGemGemcutterUtilities < Gem::TestCase
other_api_key = 'f46dbb18bb6a9c97cdc61b5b85c186a17403cdcbf'
FileUtils.mkdir_p File.dirname(Gem.configuration.credentials_path)
open Gem.configuration.credentials_path, 'w' do |f|
File.open Gem.configuration.credentials_path, 'w' do |f|
f.write Hash[:other_api_key, other_api_key].to_yaml
end
util_sign_in [api_key, 200, 'OK']

View file

@ -39,8 +39,7 @@ class TestGemIndexer < Gem::TestCase
def test_initialize
assert_equal @tempdir, @indexer.dest_directory
assert_equal File.join(Dir.tmpdir, "gem_generate_index_#{$$}"),
@indexer.directory
assert_match %r{#{Dir.mktmpdir('gem_generate_index').match(/.*-/)}}, @indexer.directory
indexer = Gem::Indexer.new @tempdir
assert indexer.build_modern

View file

@ -141,7 +141,7 @@ class TestGemInstallUpdateOptions < Gem::InstallerTestCase
def test_user_install_disabled_read_only
if win_platform?
skip('test_user_install_disabled_read_only test skipped on MS Windows')
elsif Process.uid == 0
elsif Process.uid.zero?
skip('test_user_install_disabled_read_only test skipped in root privilege')
else
@cmd.handle_options %w[--no-user-install]

View file

@ -140,7 +140,7 @@ end
s.require_path = 'lib'
end
open File.join(util_inst_bindir, 'executable'), 'w' do |io|
File.open File.join(util_inst_bindir, 'executable'), 'w' do |io|
io.write <<-EXEC
#!/usr/local/bin/ruby
#
@ -437,7 +437,7 @@ gem 'other', version
if win_platform?
skip('test_generate_bin_script_no_perms skipped on MS Windows')
elsif Process.uid == 0
elsif Process.uid.zero?
skip('test_generate_bin_script_no_perms skipped in root privilege')
else
FileUtils.chmod 0000, util_inst_bindir
@ -531,7 +531,7 @@ gem 'other', version
if win_platform?
skip('test_generate_bin_symlink_no_perms skipped on MS Windows')
elsif Process.uid == 0
elsif Process.uid.zero?
skip('test_user_install_disabled_read_only test skipped in root privilege')
else
FileUtils.chmod 0000, util_inst_bindir

View file

@ -24,7 +24,7 @@ class TestGemPackage < Gem::Package::TarTestCase
end
def test_class_new_old_format
open 'old_format.gem', 'wb' do |io|
File.open 'old_format.gem', 'wb' do |io|
io.write SIMPLE_GEM
end
@ -45,7 +45,7 @@ class TestGemPackage < Gem::Package::TarTestCase
FileUtils.mkdir 'lib'
open 'lib/code.rb', 'w' do |io|
File.open 'lib/code.rb', 'w' do |io|
io.write '# lib/code.rb'
end
@ -110,8 +110,8 @@ class TestGemPackage < Gem::Package::TarTestCase
FileUtils.mkdir_p 'lib/empty'
open 'lib/code.rb', 'w' do |io| io.write '# lib/code.rb' end
open 'lib/extra.rb', 'w' do |io| io.write '# lib/extra.rb' end
File.open 'lib/code.rb', 'w' do |io| io.write '# lib/code.rb' end
File.open 'lib/extra.rb', 'w' do |io| io.write '# lib/extra.rb' end
package = Gem::Package.new 'bogus.gem'
package.spec = spec
@ -140,7 +140,7 @@ class TestGemPackage < Gem::Package::TarTestCase
spec.files = %w[lib/code.rb lib/code_sym.rb]
FileUtils.mkdir_p 'lib'
open 'lib/code.rb', 'w' do |io| io.write '# lib/code.rb' end
File.open 'lib/code.rb', 'w' do |io| io.write '# lib/code.rb' end
# NOTE: 'code.rb' is correct, because it's relative to lib/code_sym.rb
File.symlink('code.rb', 'lib/code_sym.rb')
@ -179,7 +179,7 @@ class TestGemPackage < Gem::Package::TarTestCase
FileUtils.mkdir 'lib'
open 'lib/code.rb', 'w' do |io|
File.open 'lib/code.rb', 'w' do |io|
io.write '# lib/code.rb'
end
@ -218,7 +218,7 @@ class TestGemPackage < Gem::Package::TarTestCase
FileUtils.mkdir 'lib'
open 'lib/code.rb', 'w' do |io|
File.open 'lib/code.rb', 'w' do |io|
io.write '# lib/code.rb'
end
@ -261,7 +261,7 @@ class TestGemPackage < Gem::Package::TarTestCase
FileUtils.mkdir 'lib'
open 'lib/code.rb', 'w' do |io|
File.open 'lib/code.rb', 'w' do |io|
io.write '# lib/code.rb'
end
@ -311,7 +311,7 @@ class TestGemPackage < Gem::Package::TarTestCase
FileUtils.mkdir 'lib'
open 'lib/code.rb', 'w' do |io|
File.open 'lib/code.rb', 'w' do |io|
io.write '# lib/code.rb'
end
@ -348,7 +348,7 @@ class TestGemPackage < Gem::Package::TarTestCase
FileUtils.mkdir 'lib'
open 'lib/code.rb', 'w' do |io|
File.open 'lib/code.rb', 'w' do |io|
io.write '# lib/code.rb'
end
@ -408,7 +408,7 @@ class TestGemPackage < Gem::Package::TarTestCase
end
end
open 'empty.gem', 'wb' do |io|
File.open 'empty.gem', 'wb' do |io|
io.write gem.string
end
@ -455,6 +455,31 @@ class TestGemPackage < Gem::Package::TarTestCase
File.read(extracted)
end
def test_extract_symlink_parent
skip 'symlink not supported' if Gem.win_platform?
package = Gem::Package.new @gem
tgz_io = util_tar_gz do |tar|
tar.mkdir 'lib', 0755
tar.add_symlink 'lib/link', '../..', 0644
tar.add_file 'lib/link/outside.txt', 0644 do |io| io.write 'hi' end
end
# Extract into a subdirectory of @destination; if this test fails it writes
# a file outside destination_subdir, but we want the file to remain inside
# @destination so it will be cleaned up.
destination_subdir = File.join @destination, 'subdir'
FileUtils.mkdir_p destination_subdir
e = assert_raises Gem::Package::PathError do
package.extract_tar_gz tgz_io, destination_subdir
end
assert_equal("installing into parent path lib/link/outside.txt of " +
"#{destination_subdir} is not allowed", e.message)
end
def test_extract_tar_gz_directory
package = Gem::Package.new @gem
@ -566,6 +591,21 @@ class TestGemPackage < Gem::Package::TarTestCase
"#{@destination} is not allowed", e.message)
end
def test_install_location_suffix
package = Gem::Package.new @gem
filename = "../#{File.basename(@destination)}suffix.rb"
e = assert_raises Gem::Package::PathError do
package.install_location filename, @destination
end
parent = File.expand_path File.join @destination, filename
assert_equal("installing into parent path #{parent} of " +
"#{@destination} is not allowed", e.message)
end
def test_load_spec
entry = StringIO.new Gem.gzip @spec.to_yaml
def entry.full_name() 'metadata.gz' end
@ -620,7 +660,7 @@ class TestGemPackage < Gem::Package::TarTestCase
end
end
open 'mismatch.gem', 'wb' do |io|
File.open 'mismatch.gem', 'wb' do |io|
io.write gem.string
end
@ -670,7 +710,7 @@ class TestGemPackage < Gem::Package::TarTestCase
end
end
open 'data_checksum_missing.gem', 'wb' do |io|
File.open 'data_checksum_missing.gem', 'wb' do |io|
io.write gem.string
end
@ -723,6 +763,32 @@ class TestGemPackage < Gem::Package::TarTestCase
assert_match %r%nonexistent.gem$%, e.message
end
def test_verify_duplicate_file
FileUtils.mkdir_p 'lib'
FileUtils.touch 'lib/code.rb'
build = Gem::Package.new @gem
build.spec = @spec
build.setup_signer
open @gem, 'wb' do |gem_io|
Gem::Package::TarWriter.new gem_io do |gem|
build.add_metadata gem
build.add_contents gem
gem.add_file_simple 'a.sig', 0444, 0
gem.add_file_simple 'a.sig', 0444, 0
end
end
package = Gem::Package.new @gem
e = assert_raises Gem::Security::Exception do
package.verify
end
assert_equal 'duplicate files in the package: ("a.sig")', e.message
end
def test_verify_security_policy
skip 'openssl is missing' unless defined?(OpenSSL::SSL)
@ -773,14 +839,20 @@ class TestGemPackage < Gem::Package::TarTestCase
FileUtils.mkdir 'lib'
FileUtils.touch 'lib/code.rb'
open @gem, 'wb' do |gem_io|
File.open @gem, 'wb' do |gem_io|
Gem::Package::TarWriter.new gem_io do |gem|
build.add_metadata gem
build.add_contents gem
# write bogus data.tar.gz to foil signature
bogus_data = Gem.gzip 'hello'
gem.add_file_simple 'data.tar.gz', 0444, bogus_data.length do |io|
fake_signer = Class.new do
def digest_name; 'SHA512'; end
def digest_algorithm; Digest(:SHA512); end
def key; 'key'; end
def sign(*); 'fake_sig'; end
end
gem.add_file_signed 'data2.tar.gz', 0444, fake_signer.new do |io|
io.write bogus_data
end
@ -804,7 +876,7 @@ class TestGemPackage < Gem::Package::TarTestCase
end
def test_verify_truncate
open 'bad.gem', 'wb' do |io|
File.open 'bad.gem', 'wb' do |io|
io.write File.read(@gem, 1024) # don't care about newlines
end

View file

@ -7,7 +7,7 @@ class TestGemPackageOld < Gem::TestCase
def setup
super
open 'old_format.gem', 'wb' do |io|
File.open 'old_format.gem', 'wb' do |io|
io.write SIMPLE_GEM
end

View file

@ -143,5 +143,25 @@ group\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
assert_equal '012467', @tar_header.checksum
end
def test_from_bad_octal
test_cases = [
"00000006,44\000", # bogus character
"00000006789\000", # non-octal digit
"+0000001234\000", # positive sign
"-0000001000\000", # negative sign
"0x000123abc\000", # radix prefix
]
test_cases.each do |val|
header_s = @tar_header.to_s
# overwrite the size field
header_s[124, 12] = val
io = TempIO.new header_s
assert_raises ArgumentError do
new_header = Gem::Package::TarHeader.from io
end
end
end
end

View file

@ -223,7 +223,7 @@ class TestGemRDoc < Gem::TestCase
def test_remove_unwritable
skip 'chmod not supported' if Gem.win_platform?
skip 'skipped in root privilege' if Process.uid == 0
skip 'skipped in root privilege' if Process.uid.zero?
FileUtils.mkdir_p @a.base_dir
FileUtils.chmod 0, @a.base_dir
@ -252,7 +252,7 @@ class TestGemRDoc < Gem::TestCase
def test_setup_unwritable
skip 'chmod not supported' if Gem.win_platform?
skip 'skipped in root privilege' if Process.uid == 0
skip 'skipped in root privilege' if Process.uid.zero?
FileUtils.mkdir_p @a.doc_dir
FileUtils.chmod 0, @a.doc_dir

View file

@ -431,7 +431,7 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
assert File.exist?(a1_cache_gem)
end
unless win_platform? || Process.uid == 0 # File.chmod doesn't work
unless win_platform? || Process.uid.zero? # File.chmod doesn't work
def test_download_local_read_only
FileUtils.mv @a1_gem, @tempdir
local_path = File.join @tempdir, @a1.file_name

View file

@ -52,7 +52,7 @@ class TestGemRequestSet < Gem::TestCase
rs = Gem::RequestSet.new
installed = []
open 'gem.deps.rb', 'w' do |io|
File.open 'gem.deps.rb', 'w' do |io|
io.puts 'gem "a"'
io.flush
@ -78,7 +78,7 @@ class TestGemRequestSet < Gem::TestCase
rs = Gem::RequestSet.new
open 'gem.deps.rb', 'w' do |io|
File.open 'gem.deps.rb', 'w' do |io|
io.puts 'gem "a"'
io.flush
@ -104,7 +104,7 @@ Gems to install:
rs = Gem::RequestSet.new
installed = []
open 'gem.deps.rb', 'w' do |io|
File.open 'gem.deps.rb', 'w' do |io|
io.puts 'gem "a"'
end
@ -128,7 +128,7 @@ Gems to install:
rs = Gem::RequestSet.new
open 'gem.deps.rb', 'w' do |io|
File.open 'gem.deps.rb', 'w' do |io|
io.puts 'gem "a"'
io.flush
@ -150,7 +150,7 @@ Gems to install:
rs = Gem::RequestSet.new
installed = []
open 'gem.deps.rb.lock', 'w' do |io|
File.open 'gem.deps.rb.lock', 'w' do |io|
io.puts <<-LOCKFILE
GEM
remote: #{@gem_repo}
@ -167,7 +167,7 @@ DEPENDENCIES
LOCKFILE
end
open 'gem.deps.rb', 'w' do |io|
File.open 'gem.deps.rb', 'w' do |io|
io.puts 'gem "b"'
end
@ -190,7 +190,7 @@ DEPENDENCIES
rs = Gem::RequestSet.new
installed = []
open 'gem.deps.rb', 'w' do |io|
File.open 'gem.deps.rb', 'w' do |io|
io.puts <<-GEM_DEPS
gem "a"
ruby "0"

View file

@ -31,7 +31,7 @@ class TestGemRequestSetLockfile < Gem::TestCase
def write_lockfile lockfile
@lock_file = File.expand_path "#{@gem_deps_file}.lock"
open @lock_file, 'w' do |io|
File.open @lock_file, 'w' do |io|
io.write lockfile
end
end
@ -387,7 +387,7 @@ DEPENDENCIES
s.add_dependency 'c', '~> 1.0'
end
open 'b.gemspec', 'w' do |io|
File.open 'b.gemspec', 'w' do |io|
io.write b.to_ruby
end
@ -400,7 +400,7 @@ DEPENDENCIES
Dir.chdir 'c' do
c = Gem::Specification.new 'c', 1
open 'c.gemspec', 'w' do |io|
File.open 'c.gemspec', 'w' do |io|
io.write c.to_ruby
end
@ -455,7 +455,7 @@ DEPENDENCIES
gem_deps_lock_file = "#{@gem_deps_file}.lock"
open gem_deps_lock_file, 'w' do |io|
File.open gem_deps_lock_file, 'w' do |io|
io.write 'hello'
end

View file

@ -536,7 +536,7 @@ DEPENDENCIES
end
def write_lockfile lockfile
open @lock_file, 'w' do |io|
File.open @lock_file, 'w' do |io|
io.write lockfile
end
end

View file

@ -295,7 +295,7 @@ GEM
end
def write_lockfile lockfile
open @lock_file, 'w' do |io|
File.open @lock_file, 'w' do |io|
io.write lockfile
end
end

View file

@ -70,7 +70,7 @@ class TestGemResolverGitSpecification < Gem::TestCase
Dir.chdir 'git/a' do
FileUtils.mkdir_p 'ext/lib'
open 'ext/extconf.rb', 'w' do |io|
File.open 'ext/extconf.rb', 'w' do |io|
io.puts 'require "mkmf"'
io.puts 'create_makefile "a"'
end

View file

@ -100,7 +100,7 @@ class TestGemServer < Gem::TestCase
specs_dir = File.join dir, 'specifications'
FileUtils.mkdir_p specs_dir
open File.join(specs_dir, spec.spec_name), 'w' do |io|
File.open File.join(specs_dir, spec.spec_name), 'w' do |io|
io.write spec.to_ruby
end
@ -198,7 +198,7 @@ class TestGemServer < Gem::TestCase
FileUtils.mkdir_p specs_dir
open File.join(specs_dir, spec.spec_name), 'w' do |io|
File.open File.join(specs_dir, spec.spec_name), 'w' do |io|
io.write spec.to_ruby
end
@ -339,7 +339,7 @@ class TestGemServer < Gem::TestCase
specs_dir = File.join dir, 'specifications'
FileUtils.mkdir_p specs_dir
open File.join(specs_dir, spec.spec_name), 'w' do |io|
File.open File.join(specs_dir, spec.spec_name), 'w' do |io|
io.write spec.to_ruby
end
@ -353,6 +353,171 @@ class TestGemServer < Gem::TestCase
assert_match 'z 9', @res.body
end
def test_xss_homepage_fix_289313
data = StringIO.new "GET / HTTP/1.0\r\n\r\n"
dir = "#{@gemhome}2"
spec = util_spec 'xsshomepagegem', 1
spec.homepage = "javascript:confirm(document.domain)"
specs_dir = File.join dir, 'specifications'
FileUtils.mkdir_p specs_dir
open File.join(specs_dir, spec.spec_name), 'w' do |io|
io.write spec.to_ruby
end
server = Gem::Server.new dir, process_based_port, false
@req.parse data
server.root @req, @res
assert_equal 200, @res.status
assert_match 'xsshomepagegem 1', @res.body
# This verifies that the homepage for this spec is not displayed and is set to ".", because it's not a
# valid HTTP/HTTPS URL and could be unsafe in an HTML context. We would prefer to throw an exception here,
# but spec.homepage is currently free form and not currently required to be a URL, this behavior may be
# validated in future versions of Gem::Specification.
#
# There are two variant we're checking here, one where rdoc is not present, and one where rdoc is present in the same regex:
#
# Variant #1 - rdoc not installed
#
# <b>xsshomepagegem 1</b>
#
#
# <span title="rdoc not installed">[rdoc]</span>
#
#
#
# <a href="." title=".">[www]</a>
#
# Variant #2 - rdoc installed
#
# <b>xsshomepagegem 1</b>
#
#
# <a href="\/doc_root\/xsshomepagegem-1\/">\[rdoc\]<\/a>
#
#
#
# <a href="." title=".">[www]</a>
regex_match = /xsshomepagegem 1<\/b>\s+(<span title="rdoc not installed">\[rdoc\]<\/span>|<a href="\/doc_root\/xsshomepagegem-1\/">\[rdoc\]<\/a>)\s+<a href="\." title="\.">\[www\]<\/a>/
assert_match regex_match, @res.body
end
def test_invalid_homepage
data = StringIO.new "GET / HTTP/1.0\r\n\r\n"
dir = "#{@gemhome}2"
spec = util_spec 'invalidhomepagegem', 1
spec.homepage = "notavalidhomepageurl"
specs_dir = File.join dir, 'specifications'
FileUtils.mkdir_p specs_dir
open File.join(specs_dir, spec.spec_name), 'w' do |io|
io.write spec.to_ruby
end
server = Gem::Server.new dir, process_based_port, false
@req.parse data
server.root @req, @res
assert_equal 200, @res.status
assert_match 'invalidhomepagegem 1', @res.body
# This verifies that the homepage for this spec is not displayed and is set to ".", because it's not a
# valid HTTP/HTTPS URL and could be unsafe in an HTML context. We would prefer to throw an exception here,
# but spec.homepage is currently free form and not currently required to be a URL, this behavior may be
# validated in future versions of Gem::Specification.
#
# There are two variant we're checking here, one where rdoc is not present, and one where rdoc is present in the same regex:
#
# Variant #1 - rdoc not installed
#
# <b>invalidhomepagegem 1</b>
#
#
# <span title="rdoc not installed">[rdoc]</span>
#
#
#
# <a href="." title=".">[www]</a>
#
# Variant #2 - rdoc installed
#
# <b>invalidhomepagegem 1</b>
#
#
# <a href="\/doc_root\/invalidhomepagegem-1\/">\[rdoc\]<\/a>
#
#
#
# <a href="." title=".">[www]</a>
regex_match = /invalidhomepagegem 1<\/b>\s+(<span title="rdoc not installed">\[rdoc\]<\/span>|<a href="\/doc_root\/invalidhomepagegem-1\/">\[rdoc\]<\/a>)\s+<a href="\." title="\.">\[www\]<\/a>/
assert_match regex_match, @res.body
end
def test_valid_homepage_http
data = StringIO.new "GET / HTTP/1.0\r\n\r\n"
dir = "#{@gemhome}2"
spec = util_spec 'validhomepagegemhttp', 1
spec.homepage = "http://rubygems.org"
specs_dir = File.join dir, 'specifications'
FileUtils.mkdir_p specs_dir
open File.join(specs_dir, spec.spec_name), 'w' do |io|
io.write spec.to_ruby
end
server = Gem::Server.new dir, process_based_port, false
@req.parse data
server.root @req, @res
assert_equal 200, @res.status
assert_match 'validhomepagegemhttp 1', @res.body
regex_match = /validhomepagegemhttp 1<\/b>\s+(<span title="rdoc not installed">\[rdoc\]<\/span>|<a href="\/doc_root\/validhomepagegemhttp-1\/">\[rdoc\]<\/a>)\s+<a href="http:\/\/rubygems\.org" title="http:\/\/rubygems\.org">\[www\]<\/a>/
assert_match regex_match, @res.body
end
def test_valid_homepage_https
data = StringIO.new "GET / HTTP/1.0\r\n\r\n"
dir = "#{@gemhome}2"
spec = util_spec 'validhomepagegemhttps', 1
spec.homepage = "https://rubygems.org"
specs_dir = File.join dir, 'specifications'
FileUtils.mkdir_p specs_dir
open File.join(specs_dir, spec.spec_name), 'w' do |io|
io.write spec.to_ruby
end
server = Gem::Server.new dir, process_based_port, false
@req.parse data
server.root @req, @res
assert_equal 200, @res.status
assert_match 'validhomepagegemhttps 1', @res.body
regex_match = /validhomepagegemhttps 1<\/b>\s+(<span title="rdoc not installed">\[rdoc\]<\/span>|<a href="\/doc_root\/validhomepagegemhttps-1\/">\[rdoc\]<\/a>)\s+<a href="https:\/\/rubygems\.org" title="https:\/\/rubygems\.org">\[www\]<\/a>/
assert_match regex_match, @res.body
end
def test_specs
data = StringIO.new "GET /specs.#{Gem.marshal_version} HTTP/1.0\r\n\r\n"
@req.parse data
@ -378,7 +543,7 @@ class TestGemServer < Gem::TestCase
specs_dir = File.join dir, 'specifications'
FileUtils.mkdir_p specs_dir
open File.join(specs_dir, spec.spec_name), 'w' do |io|
File.open File.join(specs_dir, spec.spec_name), 'w' do |io|
io.write spec.to_ruby
end

View file

@ -110,7 +110,7 @@ class TestGemSource < Gem::TestCase
cache_file = File.join cache_dir, a1.spec_name
open cache_file, 'wb' do |io|
File.open cache_file, 'wb' do |io|
Marshal.dump a1, io
end
@ -163,7 +163,7 @@ class TestGemSource < Gem::TestCase
cache_file = File.join cache_dir, "latest_specs.#{Gem.marshal_version}"
open cache_file, 'wb' do |io|
File.open cache_file, 'wb' do |io|
Marshal.dump latest_specs, io
end
@ -187,7 +187,7 @@ class TestGemSource < Gem::TestCase
cache_file = File.join cache_dir, "latest_specs.#{Gem.marshal_version}"
open cache_file, 'wb' do |io|
File.open cache_file, 'wb' do |io|
# Setup invalid data in the cache:
io.write Marshal.dump(latest_specs)[0, 10]
end

View file

@ -229,7 +229,7 @@ class TestGemSourceGit < Gem::TestCase
Dir.chdir 'b' do
b = Gem::Specification.new 'b', 1
open 'b.gemspec', 'w' do |io|
File.open 'b.gemspec', 'w' do |io|
io.write b.to_ruby
end

View file

@ -922,7 +922,7 @@ dependencies: []
end
def test_self_load_relative
open 'a-2.gemspec', 'w' do |io|
File.open 'a-2.gemspec', 'w' do |io|
io.write @a2.to_ruby_for_cache
end
@ -1111,7 +1111,7 @@ dependencies: []
end
def test_self_remove_spec_removed
open @a1.spec_file, 'w' do |io|
File.open @a1.spec_file, 'w' do |io|
io.write @a1.to_ruby
end
@ -1363,13 +1363,13 @@ dependencies: []
assert_empty @ext.build_args
open @ext.build_info_file, 'w' do |io|
File.open @ext.build_info_file, 'w' do |io|
io.puts
end
assert_empty @ext.build_args
open @ext.build_info_file, 'w' do |io|
File.open @ext.build_info_file, 'w' do |io|
io.puts '--with-foo-dir=wherever'
end
@ -1385,9 +1385,9 @@ dependencies: []
extconf_rb = File.join @ext.gem_dir, @ext.extensions.first
FileUtils.mkdir_p File.dirname extconf_rb
open extconf_rb, 'w' do |f|
File.open extconf_rb, 'w' do |f|
f.write <<-'RUBY'
open 'Makefile', 'w' do |f|
File.open 'Makefile', 'w' do |f|
f.puts "clean:\n\techo clean"
f.puts "default:\n\techo built"
f.puts "install:\n\techo installed"
@ -1435,9 +1435,9 @@ dependencies: []
extconf_rb = File.join spec.gem_dir, spec.extensions.first
FileUtils.mkdir_p File.dirname extconf_rb
open extconf_rb, 'w' do |f|
File.open extconf_rb, 'w' do |f|
f.write <<-'RUBY'
open 'Makefile', 'w' do |f|
File.open 'Makefile', 'w' do |f|
f.puts "default:\n\techo built"
f.puts "install:\n\techo installed"
end
@ -1461,7 +1461,7 @@ dependencies: []
def test_build_extensions_extensions_dir_unwritable
skip 'chmod not supported' if Gem.win_platform?
skip 'skipped in root privilege' if Process.uid == 0
skip 'skipped in root privilege' if Process.uid.zero?
ext_spec
@ -1470,9 +1470,9 @@ dependencies: []
extconf_rb = File.join @ext.gem_dir, @ext.extensions.first
FileUtils.mkdir_p File.dirname extconf_rb
open extconf_rb, 'w' do |f|
File.open extconf_rb, 'w' do |f|
f.write <<-'RUBY'
open 'Makefile', 'w' do |f|
File.open 'Makefile', 'w' do |f|
f.puts "clean:\n\techo clean"
f.puts "default:\n\techo built"
f.puts "install:\n\techo installed"
@ -1487,7 +1487,7 @@ dependencies: []
@ext.build_extensions
refute_path_exists @ext.extension_dir
ensure
unless ($DEBUG or win_platform? or Process.uid == 0) then
unless ($DEBUG or win_platform? or Process.uid.zero?) then
FileUtils.chmod 0755, File.join(@ext.base_dir, 'extensions')
FileUtils.chmod 0755, @ext.base_dir
end
@ -1503,9 +1503,9 @@ dependencies: []
extconf_rb = File.join @ext.gem_dir, @ext.extensions.first
FileUtils.mkdir_p File.dirname extconf_rb
open extconf_rb, 'w' do |f|
File.open extconf_rb, 'w' do |f|
f.write <<-'RUBY'
open 'Makefile', 'w' do |f|
File.open 'Makefile', 'w' do |f|
f.puts "clean:\n\techo clean"
f.puts "default:\n\techo built"
f.puts "install:\n\techo installed"
@ -1552,9 +1552,9 @@ dependencies: []
extconf_rb = File.join @ext.gem_dir, @ext.extensions.first
FileUtils.mkdir_p File.dirname extconf_rb
open extconf_rb, 'w' do |f|
File.open extconf_rb, 'w' do |f|
f.write <<-'RUBY'
open 'Makefile', 'w' do |f|
File.open 'Makefile', 'w' do |f|
f.puts "clean:\n\techo clean"
f.puts "default:\n\techo built"
f.puts "install:\n\techo installed"
@ -2883,7 +2883,22 @@ duplicate dependency on c (>= 1.2.3, development), (~> 1.2) use:
@a1.validate
end
assert_equal '"over at my cool site" is not a URI', e.message
assert_equal '"over at my cool site" is not a valid HTTP URI', e.message
@a1.homepage = 'ftp://rubygems.org'
e = assert_raises Gem::InvalidSpecificationException do
@a1.validate
end
assert_equal '"ftp://rubygems.org" is not a valid HTTP URI', e.message
@a1.homepage = 'http://rubygems.org'
assert_equal true, @a1.validate
@a1.homepage = 'https://rubygems.org'
assert_equal true, @a1.validate
end
end
@ -3419,9 +3434,9 @@ end
extconf_rb = File.join @ext.gem_dir, @ext.extensions.first
FileUtils.mkdir_p File.dirname extconf_rb
open extconf_rb, 'w' do |f|
File.open extconf_rb, 'w' do |f|
f.write <<-'RUBY'
open 'Makefile', 'w' do |f|
File.open 'Makefile', 'w' do |f|
f.puts "clean:\n\techo clean"
f.puts "default:\n\techo built"
f.puts "install:\n\techo installed"

View file

@ -127,9 +127,9 @@ class TestStubSpecification < Gem::TestCase
extconf_rb = File.join s.gem_dir, s.extensions.first
FileUtils.mkdir_p File.dirname extconf_rb
open extconf_rb, 'w' do |f|
File.open extconf_rb, 'w' do |f|
f.write <<-'RUBY'
open 'Makefile', 'w' do |f|
File.open 'Makefile', 'w' do |f|
f.puts "clean:\n\techo clean"
f.puts "default:\n\techo built"
f.puts "install:\n\techo installed"
@ -149,7 +149,7 @@ class TestStubSpecification < Gem::TestCase
spec = new_default_spec 'default', 1
spec.extensions << 'extconf.rb'
open spec.loaded_from, 'w' do |io|
File.open spec.loaded_from, 'w' do |io|
io.write spec.to_ruby_for_cache
end
@ -198,7 +198,7 @@ class TestStubSpecification < Gem::TestCase
def stub_with_version
spec = File.join @gemhome, 'specifications', 'stub_e-2.gemspec'
open spec, 'w' do |io|
File.open spec, 'w' do |io|
io.write <<-STUB
# -*- encoding: utf-8 -*-
# stub: stub_v 2 ruby lib
@ -221,7 +221,7 @@ end
def stub_without_version
spec = File.join @gemhome, 'specifications', 'stub-2.gemspec'
open spec, 'w' do |io|
File.open spec, 'w' do |io|
io.write <<-STUB
# -*- encoding: utf-8 -*-
# stub: stub_v ruby lib
@ -245,7 +245,7 @@ end
def stub_with_extension
spec = File.join @gemhome, 'specifications', 'stub_e-2.gemspec'
open spec, 'w' do |io|
File.open spec, 'w' do |io|
io.write <<-STUB
# -*- encoding: utf-8 -*-
# stub: stub_e 2 ruby lib
@ -271,7 +271,7 @@ end
def stub_without_extension
spec = File.join @gemhome, 'specifications', 'stub-2.gemspec'
open spec, 'w' do |io|
File.open spec, 'w' do |io|
io.write <<-STUB
# -*- encoding: utf-8 -*-
# stub: stub 2 ruby lib

View file

@ -5,7 +5,7 @@ require 'rubygems/util'
class TestGemUtil < Gem::TestCase
def test_class_popen
skip "MJIT executes process and it's caught by Process.wait(-1)" if RubyVM::MJIT.enabled?
skip "MJIT executes process and it's caught by Process.wait(-1)" if defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled?
assert_equal "0\n", Gem::Util.popen(Gem.ruby, '-e', 'p 0')
assert_raises Errno::ECHILD do
@ -30,6 +30,30 @@ class TestGemUtil < Gem::TestCase
loop { break if enum.next.nil? } # exhaust the enumerator
end
def test_traverse_parents_does_not_crash_on_permissions_error
skip 'skipped on MS Windows (chmod has no effect)' if win_platform?
FileUtils.mkdir_p 'd/e/f'
# remove 'execute' permission from "e" directory and make it
# impossible to cd into it and its children
FileUtils.chmod(0666, 'd/e')
paths = Gem::Util.traverse_parents('d/e/f').to_a
assert_equal File.join(@tempdir, 'd'), paths[0]
assert_equal @tempdir, paths[1]
if File.respond_to?(:realpath)
assert_equal File.realpath(Dir.tmpdir), paths[2]
assert_equal File.realpath("..", Dir.tmpdir), paths[3]
elsif RUBY_PLATFORM !~ /darwin/
assert_equal Dir.tmpdir, paths[2]
assert_equal '/', paths[3]
end
ensure
# restore default permissions, allow the directory to be removed
FileUtils.chmod(0775, 'd/e') unless win_platform?
end
def test_linked_list_find
list = [1,2,3,4,5].inject(Gem::List.new(0)) { |m,o|
Gem::List.new o, m

View file

@ -2,6 +2,8 @@
require 'rubygems/test_case'
require "rubygems/version"
require "minitest/benchmark"
class TestGemVersion < Gem::TestCase
class V < ::Gem::Version
@ -102,6 +104,15 @@ class TestGemVersion < Gem::TestCase
end
end
def bench_anchored_version_pattern
assert_performance_linear 0.5 do |count|
version_string = count.times.map {|i| "0" * i.succ }.join(".") << "."
version_string =~ Gem::Version::ANCHORED_VERSION_PATTERN
end
rescue RegexpError
skip "It fails to allocate the memory for regex pattern of Gem::Version::ANCHORED_VERSION_PATTERN"
end
def test_empty_version
["", " ", " "].each do |empty|
assert_equal "0", Gem::Version.new(empty).version

View file

@ -70,10 +70,12 @@ class TestGemRequire < Gem::TestCase
def create_sync_thread
Thread.new do
yield
ensure
FILE_ENTERED_LATCH.release
FILE_EXIT_LATCH.await
begin
yield
ensure
FILE_ENTERED_LATCH.release
FILE_EXIT_LATCH.await
end
end
end
@ -100,8 +102,8 @@ class TestGemRequire < Gem::TestCase
assert t1.join, "thread 1 should exit"
assert t2.join, "thread 2 should exit"
ensure
Object.send :remove_const, :FILE_ENTERED_LATCH
Object.send :remove_const, :FILE_EXIT_LATCH
Object.send :remove_const, :FILE_ENTERED_LATCH if Object.const_defined? :FILE_ENTERED_LATCH
Object.send :remove_const, :FILE_EXIT_LATCH if Object.const_defined? :FILE_EXIT_LATCH
end
def test_require_is_not_lazy_with_exact_req