From d893c33933de1b44e36a5a840dc2fd0fcd27cdbe Mon Sep 17 00:00:00 2001 From: Kentaro Hayashi Date: Fri, 5 Mar 2021 16:31:54 +0900 Subject: [PATCH] test in_tail: use safer method to cleanup This PR aims to fix in_tail test cases on Windows. On Windows, when the file or directory is removed and created frequently, there is a case that creating file or directory will fail. This situation is caused by pending file or directory deletion which is mentioned on win32 API document. ref. https://docs.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilea#files As a workaround, execute rename and remove method. Signed-off-by: Kentaro Hayashi --- test/plugin/test_in_tail.rb | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/test/plugin/test_in_tail.rb b/test/plugin/test_in_tail.rb index b84e26e5a7..0a826c4b10 100644 --- a/test/plugin/test_in_tail.rb +++ b/test/plugin/test_in_tail.rb @@ -6,6 +6,8 @@ require 'net/http' require 'flexmock/test_unit' require 'timecop' +require 'tmpdir' +require 'securerandom' class TailInputTest < Test::Unit::TestCase include FlexMock::TestCase @@ -22,28 +24,42 @@ def teardown end def cleanup_directory(path) + unless Dir.exist?(path) + FileUtils.mkdir_p(path) + return + end + + dir = File.join(Dir.tmpdir, SecureRandom.hex(10)) begin - FileUtils.rm_f(path, secure: true) + files = Dir.glob("*", base: path) + if files.empty? + FileUtils.mv(path, dir) + else + files.each do |name| + FileUtils.rm_rf(File.join(path, name)) + end + end + GC.start(full_mark: true, immediate_mark: true, immediate_sweep: true) + FileUtils.rm_rf(dir, secure: true) rescue ArgumentError - FileUtils.rm_f(path) # For Ruby 2.6 or before. - end - if File.exist?(path) - FileUtils.remove_entry_secure(path, true) + FileUtils.rm_rf(dir) # For Ruby 2.6 or before. end FileUtils.mkdir_p(path) end def cleanup_file(path) + file = File.join(Dir.tmpdir, SecureRandom.hex(10)) begin - FileUtils.rm_f(path, secure: true) + FileUtils.mv(path, file) + FileUtils.rm_rf(file, secure: true) rescue ArgumentError - FileUtils.rm_f(path) # For Ruby 2.6 or before. + FileUtils.rm_rf(file) # For Ruby 2.6 or before. end - if File.exist?(path) + if File.exist?(file) # ensure files are closed for Windows, on which deleted files # are still visible from filesystem GC.start(full_mark: true, immediate_mark: true, immediate_sweep: true) - FileUtils.remove_entry_secure(path, true) + FileUtils.remove_entry_secure(file, true) end end