From 9f56ded2d536a4b62bad368c1ec17c7c9ec4dd68 Mon Sep 17 00:00:00 2001 From: Peter Sereda Date: Tue, 30 Oct 2018 15:05:19 +0300 Subject: [PATCH 1/4] Fix for #284: MockFile.Delete does not throw exception when file does not exist. --- .../MockFileDeleteTests.cs | 21 ++++++++++++++++++- .../MockFileStreamTests.cs | 2 +- .../MockFileTests.cs | 11 +++++++--- .../MockFile.cs | 11 +++++++++- 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/System.IO.Abstractions.TestingHelpers.Tests/MockFileDeleteTests.cs b/System.IO.Abstractions.TestingHelpers.Tests/MockFileDeleteTests.cs index c5a1e9c01..a033d8c3f 100644 --- a/System.IO.Abstractions.TestingHelpers.Tests/MockFileDeleteTests.cs +++ b/System.IO.Abstractions.TestingHelpers.Tests/MockFileDeleteTests.cs @@ -10,7 +10,7 @@ public class MockFileDeleteTests public void MockFile_Delete_ShouldDeleteFile() { var fileSystem = new MockFileSystem(); - var path = XFS.Path("C:\\test"); + var path = XFS.Path("C:\\some_folder\\test"); var directory = fileSystem.Path.GetDirectoryName(path); fileSystem.AddFile(path, new MockFileData("Bla")); @@ -35,5 +35,24 @@ public void MockFile_Delete_ShouldThrowArgumentExceptionIfPathContainsOnlyWhites // Assert Assert.Throws(action); } + + [Test] + public void MockFile_Delete_ShouldThrowDirectoryNotFoundExceptionIfParentFolderAbsent() + { + var fileSystem = new MockFileSystem(); + var path = XFS.Path("C:\\test\\somefile.txt"); + + Assert.Throws(() => fileSystem.File.Delete(path)); + } + + [Test] + public void MockFile_Delete_ShouldSilentlyReturnIfNonExistingFileInExistingFolder() + { + var fileSystem = new MockFileSystem(); + fileSystem.Directory.CreateDirectory("c:\\temp"); + + //Delete() returns void, so there is nothing to check here beside absense of an exception + fileSystem.File.Delete("C:\\temp\\somefile.txt"); + } } } \ No newline at end of file diff --git a/System.IO.Abstractions.TestingHelpers.Tests/MockFileStreamTests.cs b/System.IO.Abstractions.TestingHelpers.Tests/MockFileStreamTests.cs index b2a14abfb..f958e3657 100644 --- a/System.IO.Abstractions.TestingHelpers.Tests/MockFileStreamTests.cs +++ b/System.IO.Abstractions.TestingHelpers.Tests/MockFileStreamTests.cs @@ -29,7 +29,7 @@ public void MockFileStream_Flush_WritesByteToFile() public void MockFileStream_Dispose_ShouldNotResurrectFile() { var fileSystem = new MockFileSystem(); - var path = XFS.Path("C:\\test"); + var path = XFS.Path("C:\\some_folder\\test"); var directory = fileSystem.Path.GetDirectoryName(path); fileSystem.AddFile(path, new MockFileData("Bla")); var stream = fileSystem.File.Open(path, FileMode.Open, FileAccess.ReadWrite, FileShare.Delete); diff --git a/System.IO.Abstractions.TestingHelpers.Tests/MockFileTests.cs b/System.IO.Abstractions.TestingHelpers.Tests/MockFileTests.cs index 2468c9824..d26a382bd 100644 --- a/System.IO.Abstractions.TestingHelpers.Tests/MockFileTests.cs +++ b/System.IO.Abstractions.TestingHelpers.Tests/MockFileTests.cs @@ -482,9 +482,14 @@ public void MockFile_Delete_Should_RemoveFiles() [Test] public void MockFile_Delete_No_File_Does_Nothing() - { - string filePath = XFS.Path(@"c:\something\demo.txt"); - var fileSystem = new MockFileSystem(); + { + var fileSystem = new MockFileSystem(new Dictionary() + { + { XFS.Path(@"c:\something\exist.txt"), new MockFileData("Demo text content") }, + }); + + string filePath = XFS.Path(@"c:\something\not_exist.txt"); + fileSystem.File.Delete(filePath); } diff --git a/System.IO.Abstractions.TestingHelpers/MockFile.cs b/System.IO.Abstractions.TestingHelpers/MockFile.cs index 1322e2e29..b77d644e7 100644 --- a/System.IO.Abstractions.TestingHelpers/MockFile.cs +++ b/System.IO.Abstractions.TestingHelpers/MockFile.cs @@ -191,6 +191,11 @@ public override void Delete(string path) { mockFileDataAccessor.PathVerifier.IsLegalAbsoluteOrRelative(path, "path"); + // We mimic exact behavior of the standard File.Delete() method + // which throws exception only if the folder does not exist, + // but silently returns if deleting a non-existing file in an existing folder. + VerifyDirectoryExists(path); + mockFileDataAccessor.RemoveFile(path); } @@ -991,7 +996,11 @@ private void VerifyDirectoryExists(string path) DirectoryInfoBase dir = mockFileDataAccessor.Directory.GetParent(path); if (!dir.Exists) { - throw new DirectoryNotFoundException(string.Format(CultureInfo.InvariantCulture, StringResources.Manager.GetString("COULD_NOT_FIND_PART_OF_PATH_EXCEPTION"), dir)); + throw new DirectoryNotFoundException( + string.Format( + CultureInfo.InvariantCulture, + StringResources.Manager.GetString("COULD_NOT_FIND_PART_OF_PATH_EXCEPTION"), + dir)); } } } From 2721e03168fdb09e0a0b78dabcdf44866787249c Mon Sep 17 00:00:00 2001 From: Peter Sereda Date: Tue, 30 Oct 2018 15:21:30 +0300 Subject: [PATCH 2/4] Fixed Failing Delete File unit-test. --- .../MockFileDeleteTests.cs | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/System.IO.Abstractions.TestingHelpers.Tests/MockFileDeleteTests.cs b/System.IO.Abstractions.TestingHelpers.Tests/MockFileDeleteTests.cs index a033d8c3f..8b9e4d4b6 100644 --- a/System.IO.Abstractions.TestingHelpers.Tests/MockFileDeleteTests.cs +++ b/System.IO.Abstractions.TestingHelpers.Tests/MockFileDeleteTests.cs @@ -1,6 +1,7 @@ namespace System.IO.Abstractions.TestingHelpers.Tests { - using NUnit.Framework; + using System.Collections.Generic; + using NUnit.Framework; using XFS = MockUnixSupport; @@ -48,11 +49,15 @@ public void MockFile_Delete_ShouldThrowDirectoryNotFoundExceptionIfParentFolderA [Test] public void MockFile_Delete_ShouldSilentlyReturnIfNonExistingFileInExistingFolder() { - var fileSystem = new MockFileSystem(); - fileSystem.Directory.CreateDirectory("c:\\temp"); + var fileSystem = new MockFileSystem(new Dictionary() + { + { XFS.Path("C:\\temp\\exist.txt"), new MockFileData("foobar") }, + }); + + string filePath = XFS.Path("C:\\temp\\somefile.txt"); - //Delete() returns void, so there is nothing to check here beside absense of an exception - fileSystem.File.Delete("C:\\temp\\somefile.txt"); + // Delete() returns void, so there is nothing to check here beside absense of an exception + fileSystem.File.Delete(filePath); } } } \ No newline at end of file From d51c513d87c3243d7597d19e8697c9851eb441e2 Mon Sep 17 00:00:00 2001 From: Peter Sereda Date: Wed, 31 Oct 2018 12:40:18 +0300 Subject: [PATCH 3/4] Fixed code review comments. --- .../MockFileDeleteTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/System.IO.Abstractions.TestingHelpers.Tests/MockFileDeleteTests.cs b/System.IO.Abstractions.TestingHelpers.Tests/MockFileDeleteTests.cs index 8b9e4d4b6..6f9fd93fc 100644 --- a/System.IO.Abstractions.TestingHelpers.Tests/MockFileDeleteTests.cs +++ b/System.IO.Abstractions.TestingHelpers.Tests/MockFileDeleteTests.cs @@ -57,7 +57,7 @@ public void MockFile_Delete_ShouldSilentlyReturnIfNonExistingFileInExistingFolde string filePath = XFS.Path("C:\\temp\\somefile.txt"); // Delete() returns void, so there is nothing to check here beside absense of an exception - fileSystem.File.Delete(filePath); + Assert.DoesNotThrow(() => fileSystem.File.Delete(filePath)); } } } \ No newline at end of file From 7847d7040f10dddfa0e1e7fea5cd59eb1890e7f1 Mon Sep 17 00:00:00 2001 From: Peter Sereda Date: Mon, 5 Nov 2018 11:24:18 +0300 Subject: [PATCH 4/4] Added requested comment with a github issue link. --- .../MockFileStreamTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/System.IO.Abstractions.TestingHelpers.Tests/MockFileStreamTests.cs b/System.IO.Abstractions.TestingHelpers.Tests/MockFileStreamTests.cs index f958e3657..ec3781b4c 100644 --- a/System.IO.Abstractions.TestingHelpers.Tests/MockFileStreamTests.cs +++ b/System.IO.Abstractions.TestingHelpers.Tests/MockFileStreamTests.cs @@ -28,6 +28,8 @@ public void MockFileStream_Flush_WritesByteToFile() [Test] public void MockFileStream_Dispose_ShouldNotResurrectFile() { + // path in this test case is a subject to Directory.GetParent(path) Linux issue + // https://github.com/System-IO-Abstractions/System.IO.Abstractions/issues/395 var fileSystem = new MockFileSystem(); var path = XFS.Path("C:\\some_folder\\test"); var directory = fileSystem.Path.GetDirectoryName(path);