ruby-changes:50669
From: naruse <ko1@a...>
Date: Mon, 19 Mar 2018 17:15:23 +0900 (JST)
Subject: [ruby-changes:50669] naruse:r62834 (ruby_2_5): merge revision(s) 61501, 61758: [Backport #14481]
naruse 2018-03-19 17:15:16 +0900 (Mon, 19 Mar 2018) New Revision: 62834 https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=62834 Log: merge revision(s) 61501,61758: [Backport #14481] fix concurrent test. * test/rubygems/test_require.rb (test_concurrent_require): Synchronizations should be in ensure clause. Sometimes `require` fails (not sure why) and latch is not released. Such case introduces unlimited awaiting. This patch soleve this problem. skip some tests so that no failure occurs in root privilege Some tests had failed on `sudo make test-all`, mainly because root can access any files regardless of permission. This change adds `skip` guards into such tests. Note that almost all tests in which `skip` guards is added, already have "windows" guard. This is because there is no support to avoid read access by owner on Windows. Modified directories: branches/ruby_2_5/ Modified files: branches/ruby_2_5/test/dbm/test_dbm.rb branches/ruby_2_5/test/gdbm/test_gdbm.rb branches/ruby_2_5/test/irb/test_workspace.rb branches/ruby_2_5/test/pathname/test_pathname.rb branches/ruby_2_5/test/rdoc/test_rdoc_options.rb branches/ruby_2_5/test/rdoc/test_rdoc_rdoc.rb branches/ruby_2_5/test/rdoc/test_rdoc_rubygems_hook.rb branches/ruby_2_5/test/rubygems/test_gem.rb branches/ruby_2_5/test/rubygems/test_gem_commands_cleanup_command.rb branches/ruby_2_5/test/rubygems/test_gem_commands_install_command.rb branches/ruby_2_5/test/rubygems/test_gem_install_update_options.rb branches/ruby_2_5/test/rubygems/test_gem_installer.rb branches/ruby_2_5/test/rubygems/test_gem_rdoc.rb branches/ruby_2_5/test/rubygems/test_gem_remote_fetcher.rb branches/ruby_2_5/test/rubygems/test_gem_specification.rb branches/ruby_2_5/test/rubygems/test_require.rb branches/ruby_2_5/test/sdbm/test_sdbm.rb branches/ruby_2_5/test/test_find.rb branches/ruby_2_5/version.h Index: ruby_2_5/test/gdbm/test_gdbm.rb =================================================================== --- ruby_2_5/test/gdbm/test_gdbm.rb (revision 62833) +++ ruby_2_5/test/gdbm/test_gdbm.rb (revision 62834) @@ -43,6 +43,8 @@ if defined? GDBM https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/gdbm/test_gdbm.rb#L43 end def test_delete_rdonly + skip("skipped because root can open anything") if Process.uid == 0 + if /^CYGWIN_9/ !~ SYSTEM assert_raise(GDBMError) { @gdbm_rdonly.delete("foo") @@ -211,6 +213,8 @@ if defined? GDBM https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/gdbm/test_gdbm.rb#L213 end if defined? GDBM::NOLOCK # gdbm 1.8.0 specific def test_s_open_error + skip if Process.uid == 0 # because root can open anything + assert_instance_of(GDBM, gdbm = GDBM.open("#{@tmpdir}/#{@prefix}", 0)) assert_raise(Errno::EACCES, Errno::EWOULDBLOCK) { GDBM.open("#{@tmpdir}/#{@prefix}", 0) Index: ruby_2_5/test/sdbm/test_sdbm.rb =================================================================== --- ruby_2_5/test/sdbm/test_sdbm.rb (revision 62833) +++ ruby_2_5/test/sdbm/test_sdbm.rb (revision 62834) @@ -108,6 +108,7 @@ class TestSDBM < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/sdbm/test_sdbm.rb#L108 def test_s_open_error skip "doesn't support to avoid read access by owner on Windows" if /mswin|mingw/ =~ RUBY_PLATFORM + skip "skipped because root can open anything" if Process.uid == 0 assert_instance_of(SDBM, sdbm = SDBM.open("#{@tmpdir}/#{@prefix}", 0)) assert_raise(Errno::EACCES) { SDBM.open("#{@tmpdir}/#{@prefix}", 0) @@ -519,6 +520,7 @@ class TestSDBM < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/sdbm/test_sdbm.rb#L520 end def test_readonly + skip "skipped because root can read anything" if /mswin|mingw/ !~ RUBY_PLATFORM && Process.uid == 0 @sdbm["bar"] = "baz" @sdbm.close File.chmod(0444, @path + ".dir") Index: ruby_2_5/test/rubygems/test_require.rb =================================================================== --- ruby_2_5/test/rubygems/test_require.rb (revision 62833) +++ ruby_2_5/test/rubygems/test_require.rb (revision 62834) @@ -38,18 +38,6 @@ class TestGemRequire < Gem::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/rubygems/test_require.rb#L38 assert require(path), "'#{path}' was already required" end - def append_latch spec - dir = spec.gem_dir - Dir.chdir dir do - spec.files.each do |file| - File.open file, 'a' do |fp| - fp.puts "FILE_ENTERED_LATCH.release" - fp.puts "FILE_EXIT_LATCH.await" - end - end - end - end - # Providing -I on the commandline should always beat gems def test_dash_i_beats_gems a1 = new_spec "a", "1", {"b" => "= 1"}, "lib/test_gem_require_a.rb" @@ -80,6 +68,15 @@ class TestGemRequire < Gem::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/rubygems/test_require.rb#L68 Object.send :remove_const, :HELLO if Object.const_defined? :HELLO end + def create_sync_thread + Thread.new do + yield + ensure + FILE_ENTERED_LATCH.release + FILE_EXIT_LATCH.await + end + end + def test_concurrent_require skip 'deadlock' if /^1\.8\./ =~ RUBY_VERSION @@ -91,11 +88,8 @@ class TestGemRequire < Gem::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/rubygems/test_require.rb#L88 install_specs a1, b1 - append_latch a1 - append_latch b1 - - t1 = Thread.new { assert_require 'a' } - t2 = Thread.new { assert_require 'b' } + t1 = create_sync_thread{ assert_require 'a' } + t2 = create_sync_thread{ assert_require 'b' } # wait until both files are waiting on the exit latch FILE_ENTERED_LATCH.await @@ -106,8 +100,6 @@ class TestGemRequire < Gem::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/rubygems/test_require.rb#L100 assert t1.join, "thread 1 should exit" assert t2.join, "thread 2 should exit" ensure - return if $! # skipping - Object.send :remove_const, :FILE_ENTERED_LATCH Object.send :remove_const, :FILE_EXIT_LATCH end Index: ruby_2_5/test/rubygems/test_gem_rdoc.rb =================================================================== --- ruby_2_5/test/rubygems/test_gem_rdoc.rb (revision 62833) +++ ruby_2_5/test/rubygems/test_gem_rdoc.rb (revision 62834) @@ -223,6 +223,7 @@ class TestGemRDoc < Gem::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/rubygems/test_gem_rdoc.rb#L223 def test_remove_unwritable skip 'chmod not supported' if Gem.win_platform? + skip 'skipped in root privilege' if Process.uid == 0 FileUtils.mkdir_p @a.base_dir FileUtils.chmod 0, @a.base_dir @@ -251,6 +252,7 @@ class TestGemRDoc < Gem::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/rubygems/test_gem_rdoc.rb#L252 def test_setup_unwritable skip 'chmod not supported' if Gem.win_platform? + skip 'skipped in root privilege' if Process.uid == 0 FileUtils.mkdir_p @a.doc_dir FileUtils.chmod 0, @a.doc_dir Index: ruby_2_5/test/rubygems/test_gem_commands_cleanup_command.rb =================================================================== --- ruby_2_5/test/rubygems/test_gem_commands_cleanup_command.rb (revision 62833) +++ ruby_2_5/test/rubygems/test_gem_commands_cleanup_command.rb (revision 62834) @@ -158,7 +158,7 @@ class TestGemCommandsCleanupCommand < Ge https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/rubygems/test_gem_commands_cleanup_command.rb#L158 assert_path_exists @a_1_1.gem_dir ensure FileUtils.chmod 0755, @gemhome - end unless win_platform? + end unless win_platform? || Process.uid == 0 def test_execute_dry_run @cmd.options[:args] = %w[a] Index: ruby_2_5/test/rubygems/test_gem_commands_install_command.rb =================================================================== --- ruby_2_5/test/rubygems/test_gem_commands_install_command.rb (revision 62833) +++ ruby_2_5/test/rubygems/test_gem_commands_install_command.rb (revision 62834) @@ -131,6 +131,7 @@ class TestGemCommandsInstallCommand < Ge https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/rubygems/test_gem_commands_install_command.rb#L131 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 specs = spec_fetcher do |fetcher| fetcher.gem 'a', 2 Index: ruby_2_5/test/rubygems/test_gem_remote_fetcher.rb =================================================================== --- ruby_2_5/test/rubygems/test_gem_remote_fetcher.rb (revision 62833) +++ ruby_2_5/test/rubygems/test_gem_remote_fetcher.rb (revision 62834) @@ -431,7 +431,7 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg== https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/rubygems/test_gem_remote_fetcher.rb#L431 assert File.exist?(a1_cache_gem) end - unless win_platform? # File.chmod doesn't work + unless win_platform? || Process.uid == 0 # File.chmod doesn't work def test_download_local_read_only FileUtils.mv @a1_gem, @tempdir local_path = File.join @tempdir, @a1.file_name Index: ruby_2_5/test/rubygems/test_gem_installer.rb =================================================================== --- ruby_2_5/test/rubygems/test_gem_installer.rb (revision 62833) +++ ruby_2_5/test/rubygems/test_gem_installer.rb (revision 62834) @@ -437,6 +437,8 @@ gem 'other', version https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/rubygems/test_gem_installer.rb#L437 if win_platform? skip('test_generate_bin_script_no_perms skipped on MS Windows') + elsif Process.uid == 0 + skip('test_generate_bin_script_no_perms skipped in root privilege') else FileUtils.chmod 0000, util_inst_bindir @@ -529,6 +531,8 @@ gem 'other', version https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/rubygems/test_gem_installer.rb#L531 if win_platform? skip('test_generate_bin_symlink_no_perms skipped on MS Windows') + elsif Process.uid == 0 + skip('test_user_install_disabled_read_only test skipped in root privilege') else FileUtils.chmod 0000, util_inst_bindir Index: ruby_2_5/test/rubygems/test_gem_specification.rb =================================================================== --- ruby_2_5/test/rubygems/test_gem_specification.rb (revision 62833) +++ ruby_2_5/test/rubygems/test_gem_specification.rb (revision 62834) @@ -1461,6 +1461,7 @@ dependencies: [] https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/rubygems/test_gem_specification.rb#L1461 def test_build_extensions_extensions_dir_unwritable skip 'chmod not supported' if Gem.win_platform? + skip 'skipped in root privilege' if Process.uid == 0 ext_spec @@ -1486,7 +1487,7 @@ dependencies: [] https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/rubygems/test_gem_specification.rb#L1487 @ext.build_extensions refute_path_exists @ext.extension_dir ensure - unless ($DEBUG or win_platform?) then + unless ($DEBUG or win_platform? or Process.uid == 0) then FileUtils.chmod 0755, File.join(@ext.base_dir, 'extensions') FileUtils.chmod 0755, @ext.base_dir end Index: ruby_2_5/test/rubygems/test_gem.rb =================================================================== --- ruby_2_5/test/rubygems/test_gem.rb (revision 62833) +++ ruby_2_5/test/rubygems/test_gem.rb (revision 62834) @@ -463,7 +463,7 @@ class TestGem < Gem::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/rubygems/test_gem.rb#L463 assert File.directory?(util_cache_dir) end - unless win_platform? then # only for FS that support write protection + unless win_platform? || Process.uid == 0 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 Index: ruby_2_5/test/rubygems/test_gem_install_update_options.rb =================================================================== --- ruby_2_5/test/rubygems/test_gem_install_update_options.rb (revision 62833) +++ ruby_2_5/test/rubygems/test_gem_install_update_options.rb (revision 62834) @@ -141,6 +141,8 @@ class TestGemInstallUpdateOptions < Gem: https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/rubygems/test_gem_install_update_options.rb#L141 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 + skip('test_user_install_disabled_read_only test skipped in root privilege') else @cmd.handle_options %w[--no-user-install] Index: ruby_2_5/test/pathname/test_pathname.rb =================================================================== --- ruby_2_5/test/pathname/test_pathname.rb (revision 62833) +++ ruby_2_5/test/pathname/test_pathname.rb (revision 62834) @@ -1336,6 +1336,7 @@ class TestPathname < Test::Unit::TestCas https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/pathname/test_pathname.rb#L1336 assert_equal([Pathname("d"), Pathname("d/x")], a) skip "no meaning test on Windows" if /mswin|mingw/ =~ RUBY_PLATFORM + skip 'skipped in root privilege' if Process.uid == 0 a = []; assert_raise_with_message(Errno::EACCES, %r{d/x}) do Pathname(".").find(ignore_error: false) {|v| a << v } Index: ruby_2_5/test/irb/test_workspace.rb =================================================================== --- ruby_2_5/test/irb/test_workspace.rb (revision 62833) +++ ruby_2_5/test/irb/test_workspace.rb (revision 62834) @@ -34,6 +34,7 @@ module TestIRB https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/irb/test_workspace.rb#L34 def test_code_around_binding_with_existing_unreadable_file skip 'chmod cannot make file unreadable on windows' if windows? + skip 'skipped in root privilege' if Process.uid == 0 Tempfile.create do |f| code = "IRB::WorkSpace.new(binding)\n" Index: ruby_2_5/test/rdoc/test_rdoc_rdoc.rb =================================================================== --- ruby_2_5/test/rdoc/test_rdoc_rdoc.rb (revision 62833) +++ ruby_2_5/test/rdoc/test_rdoc_rdoc.rb (revision 62834) @@ -296,6 +296,7 @@ class TestRDocRDoc < RDoc::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/rdoc/test_rdoc_rdoc.rb#L296 def test_parse_file_forbidden skip 'chmod not supported' if Gem.win_platform? + skip 'skipped in root privilege' if Process.uid == 0 @rdoc.store = RDoc::Store.new Index: ruby_2_5/test/rdoc/test_rdoc_rubygems_hook.rb =================================================================== --- ruby_2_5/test/rdoc/test_rdoc_rubygems_hook.rb (revision 62833) +++ ruby_2_5/test/rdoc/test_rdoc_rubygems_hook.rb (revision 62834) @@ -200,6 +200,7 @@ class TestRDocRubygemsHook < Gem::TestCa https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/rdoc/test_rdoc_rubygems_hook.rb#L200 def test_remove_unwritable skip 'chmod not supported' if Gem.win_platform? + skip 'skipped in root privilege' if Process.uid == 0 FileUtils.mkdir_p @a.base_dir FileUtils.chmod 0, @a.base_dir @@ -228,6 +229,7 @@ class TestRDocRubygemsHook < Gem::TestCa https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/rdoc/test_rdoc_rubygems_hook.rb#L229 def test_setup_unwritable skip 'chmod not supported' if Gem.win_platform? + skip 'skipped in root privilege' if Process.uid == 0 FileUtils.mkdir_p @a.doc_dir FileUtils.chmod 0, @a.doc_dir Index: ruby_2_5/test/rdoc/test_rdoc_options.rb =================================================================== --- ruby_2_5/test/rdoc/test_rdoc_options.rb (revision 62833) +++ ruby_2_5/test/rdoc/test_rdoc_options.rb (revision 62834) @@ -18,6 +18,7 @@ class TestRDocOptions < RDoc::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/rdoc/test_rdoc_options.rb#L18 def test_check_files skip "assumes UNIX permission model" if /mswin|mingw/ =~ RUBY_PLATFORM + skip "skipped in root privilege" if Process.uid == 0 out, err = capture_io do temp_dir do Index: ruby_2_5/test/test_find.rb =================================================================== --- ruby_2_5/test/test_find.rb (revision 62833) +++ ruby_2_5/test/test_find.rb (revision 62834) @@ -104,6 +104,8 @@ class TestFind < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/test_find.rb#L104 def test_unreadable_dir skip "no meaning test on Windows" if /mswin|mingw/ =~ RUBY_PLATFORM + skip if Process.uid == 0 # because root can read anything + Dir.mktmpdir {|d| Dir.mkdir(dir = "#{d}/dir") File.open("#{dir}/foo", "w"){} @@ -157,6 +159,8 @@ class TestFind < Test::Unit::TestCase https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/test_find.rb#L159 assert_equal([d, dir, file], a) skip "no meaning test on Windows" if /mswin|mingw/ =~ RUBY_PLATFORM + skip "skipped because root can read anything" if Process.uid == 0 + a = [] assert_raise_with_message(Errno::EACCES, /#{Regexp.quote(file)}/) do Find.find(d, ignore_error: false) {|f| a << f } Index: ruby_2_5/test/dbm/test_dbm.rb =================================================================== --- ruby_2_5/test/dbm/test_dbm.rb (revision 62833) +++ ruby_2_5/test/dbm/test_dbm.rb (revision 62834) @@ -47,6 +47,8 @@ if defined? DBM https://github.com/ruby/ruby/blob/trunk/ruby_2_5/test/dbm/test_dbm.rb#L47 end def test_delete_rdonly + skip("skipped because root can read anything") if Process.uid == 0 + if /^CYGWIN_9/ !~ SYSTEM assert_raise(DBMError) { @dbm_rdonly.delete("foo") Index: ruby_2_5/version.h =================================================================== --- ruby_2_5/version.h (revision 62833) +++ ruby_2_5/version.h (revision 62834) @@ -1,10 +1,10 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_5/version.h#L1 #define RUBY_VERSION "2.5.0" -#define RUBY_RELEASE_DATE "2018-03-15" -#define RUBY_PATCHLEVEL 40 +#define RUBY_RELEASE_DATE "2018-03-19" +#define RUBY_PATCHLEVEL 41 #define RUBY_RELEASE_YEAR 2018 #define RUBY_RELEASE_MONTH 3 -#define RUBY_RELEASE_DAY 15 +#define RUBY_RELEASE_DAY 19 #include "ruby/version.h" Index: ruby_2_5 =================================================================== --- ruby_2_5 (revision 62833) +++ ruby_2_5 (revision 62834) Property changes on: ruby_2_5 ___________________________________________________________________ Modified: svn:mergeinfo ## -0,0 +0,1 ## Merged /trunk:r61501,61758 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/