Index: Core/Common/test/Core.Common.TestUtil.Test/FileDisposeHelperTest.cs =================================================================== diff -u -r725c5ae26095850ae10dd5da7a87be0d41c98d56 -rc899baf08791f622f518d4cc84ed5a6e27aac4c5 --- Core/Common/test/Core.Common.TestUtil.Test/FileDisposeHelperTest.cs (.../FileDisposeHelperTest.cs) (revision 725c5ae26095850ae10dd5da7a87be0d41c98d56) +++ Core/Common/test/Core.Common.TestUtil.Test/FileDisposeHelperTest.cs (.../FileDisposeHelperTest.cs) (revision c899baf08791f622f518d4cc84ed5a6e27aac4c5) @@ -387,10 +387,10 @@ } [Test] - public void Dispose_FileInUse_ThrowsIOException() + public void Dispose_FileInUse_DoesNotThrowIOException() { // Setup - string filePath = Path.Combine(workingDirectory, nameof(Dispose_FileInUse_ThrowsIOException)); + string filePath = Path.Combine(workingDirectory, nameof(Dispose_FileInUse_DoesNotThrowIOException)); var disposeHelper = new FileDisposeHelper(filePath); @@ -400,7 +400,7 @@ TestDelegate test = () => disposeHelper.Dispose(); // Assert - Assert.Throws(test); + Assert.DoesNotThrow(test); Assert.True(File.Exists(filePath), $"'{filePath}' should still exist."); } } Index: Core/Common/test/Core.Common.TestUtil/DirectoryDisposeHelper.cs =================================================================== diff -u -ref03645b89161cd4351b386fd664acc27a5e1408 -rc899baf08791f622f518d4cc84ed5a6e27aac4c5 --- Core/Common/test/Core.Common.TestUtil/DirectoryDisposeHelper.cs (.../DirectoryDisposeHelper.cs) (revision ef03645b89161cd4351b386fd664acc27a5e1408) +++ Core/Common/test/Core.Common.TestUtil/DirectoryDisposeHelper.cs (.../DirectoryDisposeHelper.cs) (revision c899baf08791f622f518d4cc84ed5a6e27aac4c5) @@ -23,6 +23,7 @@ using System.IO; using System.Linq; using System.Security.AccessControl; +using System.Threading; namespace Core.Common.TestUtil { @@ -120,18 +121,33 @@ directoryPermissionsRevoker?.Dispose(); } - var directoryDeleted = false; + var attempts = 0; + while (!TryDeleteRootFolder() && attempts < 3) + { + attempts++; + + GC.WaitForPendingFinalizers(); + Thread.Sleep(10); + } + + disposed = true; + } + + private bool TryDeleteRootFolder() + { try { Directory.Delete(rootPathToTemp, true); - directoryDeleted = true; } - catch + catch (Exception e) { - // ignored + if (e is IOException) + { + return false; + } + // Ignore other exceptions } - - disposed = !directoryDeleted; + return true; } /// Index: Core/Common/test/Core.Common.TestUtil/FileDisposeHelper.cs =================================================================== diff -u -ref03645b89161cd4351b386fd664acc27a5e1408 -rc899baf08791f622f518d4cc84ed5a6e27aac4c5 --- Core/Common/test/Core.Common.TestUtil/FileDisposeHelper.cs (.../FileDisposeHelper.cs) (revision ef03645b89161cd4351b386fd664acc27a5e1408) +++ Core/Common/test/Core.Common.TestUtil/FileDisposeHelper.cs (.../FileDisposeHelper.cs) (revision c899baf08791f622f518d4cc84ed5a6e27aac4c5) @@ -23,6 +23,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading; using Core.Common.Utils; namespace Core.Common.TestUtil @@ -113,14 +114,14 @@ filePathStream.Value?.Dispose(); filePathStreams[filePathStream.Key] = null; - try + var attempts = 0; + while (!TryDeleteFile(filePathStream.Key) && attempts < 3) { - DeleteFile(filePathStream.Key); + attempts++; + + GC.WaitForPendingFinalizers(); + Thread.Sleep(10); } - catch (ArgumentException) - { - // ignored - } } if (disposing) @@ -130,6 +131,23 @@ disposed = true; } + private static bool TryDeleteFile(string filePath) + { + try + { + DeleteFile(filePath); + } + catch (ArgumentException) + { + // ignored + } + catch (IOException) + { + return false; + } + return true; + } + private void LockFile(string filePath) { try