summaryrefslogtreecommitdiff
path: root/test/rubygems/test_gem_util.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/rubygems/test_gem_util.rb')
-rw-r--r--test/rubygems/test_gem_util.rb24
1 files changed, 23 insertions, 1 deletions
diff --git a/test/rubygems/test_gem_util.rb b/test/rubygems/test_gem_util.rb
index dc85d25586..80dbff4b9e 100644
--- a/test/rubygems/test_gem_util.rb
+++ b/test/rubygems/test_gem_util.rb
@@ -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,28 @@ 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]
+ # File.expand_path with macOS returns `/private` prefix.
+ if 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