From 914fef86cbf579aab800a207fc6d7f81b72a0063 Mon Sep 17 00:00:00 2001 From: jamesmoore Date: Sat, 28 May 2022 09:23:10 +0100 Subject: [PATCH 1/2] clone the bytes in read/write allbytes methods --- .../MockFile.cs | 4 ++-- .../MockFileReadAllBytesTests.cs | 22 +++++++++++++++++++ .../MockFileWriteAllBytesTests.cs | 21 ++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/System.IO.Abstractions.TestingHelpers/MockFile.cs b/src/System.IO.Abstractions.TestingHelpers/MockFile.cs index 78155cdd2..d1b23cb92 100644 --- a/src/System.IO.Abstractions.TestingHelpers/MockFile.cs +++ b/src/System.IO.Abstractions.TestingHelpers/MockFile.cs @@ -538,7 +538,7 @@ public override byte[] ReadAllBytes(string path) throw CommonExceptions.FileNotFound(path); } mockFileDataAccessor.GetFile(path).CheckFileAccess(path, FileAccess.Read); - return mockFileDataAccessor.GetFile(path).Contents; + return mockFileDataAccessor.GetFile(path).Contents.ToArray(); } /// @@ -784,7 +784,7 @@ public override void WriteAllBytes(string path, byte[] bytes) mockFileDataAccessor.PathVerifier.IsLegalAbsoluteOrRelative(path, "path"); VerifyDirectoryExists(path); - mockFileDataAccessor.AddFile(path, new MockFileData(bytes)); + mockFileDataAccessor.AddFile(path, new MockFileData(bytes.ToArray())); } /// diff --git a/tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileReadAllBytesTests.cs b/tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileReadAllBytesTests.cs index 923321f2c..e38022f27 100644 --- a/tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileReadAllBytesTests.cs +++ b/tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileReadAllBytesTests.cs @@ -62,6 +62,28 @@ public void MockFile_ReadAllBytes_ShouldTolerateAltDirectorySeparatorInPath() Assert.AreEqual(data, fileSystem.File.ReadAllBytes(altPath)); } + + [Test] + public void MockFile_ReadAllBytes_ShouldReturnANewCopyOfTheFileContents() + { + const string path = @"c:\something\demo.bin"; + var fileSystem = new MockFileSystem(new Dictionary + { + { XFS.Path(path), new MockFileData(new byte[] { 1, 2, 3, 4 }) } + }); + + var firstRead = fileSystem.File.ReadAllBytes(path); + + var secondRead = fileSystem.File.ReadAllBytes(path); + + for (int i = 0; i < firstRead.Length; i++) + { + firstRead[i] += 1; + } + + Assert.AreNotEqual(firstRead, secondRead); + } + #if FEATURE_ASYNC_FILE [Test] public async Task MockFile_ReadAllBytesAsync_ShouldReturnOriginalByteData() diff --git a/tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileWriteAllBytesTests.cs b/tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileWriteAllBytesTests.cs index c48f28587..7a3f0a02a 100644 --- a/tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileWriteAllBytesTests.cs +++ b/tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileWriteAllBytesTests.cs @@ -83,6 +83,27 @@ public void MockFile_WriteAllBytes_ShouldThrowAnArgumentNullExceptionIfBytesAreN Assert.That(exception.ParamName, Is.EqualTo("bytes")); } + [Test] + public void MockFile_WriteAllBytes_ShouldWriteASeparateCopyToTheFileSystem() + { + var fileSystem = new MockFileSystem(); + string path = XFS.Path(@"c:\something\file.bin"); + fileSystem.AddDirectory(XFS.Path(@"c:\something")); + var fileContent = new byte[] { 1, 2, 3, 4 }; + + fileSystem.File.WriteAllBytes(path, fileContent); + + for(int i = 0; i < fileContent.Length; i++) + { + fileContent[i] += 1; + } + + var readAgain = fileSystem.File.ReadAllBytes(path); + + Assert.AreNotEqual(fileContent, readAgain); + } + + #if FEATURE_ASYNC_FILE [Test] public void MockFile_WriteAllBytesAsync_ShouldThrowDirectoryNotFoundExceptionIfPathDoesNotExists() From 537ce70734ce78040d136f8a22eca19229339a8c Mon Sep 17 00:00:00 2001 From: jamesmoore Date: Mon, 30 May 2022 21:41:55 +0100 Subject: [PATCH 2/2] unix/macos path fix --- .../MockFileReadAllBytesTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileReadAllBytesTests.cs b/tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileReadAllBytesTests.cs index e38022f27..58462eeb4 100644 --- a/tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileReadAllBytesTests.cs +++ b/tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileReadAllBytesTests.cs @@ -66,10 +66,10 @@ public void MockFile_ReadAllBytes_ShouldTolerateAltDirectorySeparatorInPath() [Test] public void MockFile_ReadAllBytes_ShouldReturnANewCopyOfTheFileContents() { - const string path = @"c:\something\demo.bin"; + var path = XFS.Path(@"c:\something\demo.bin"); var fileSystem = new MockFileSystem(new Dictionary { - { XFS.Path(path), new MockFileData(new byte[] { 1, 2, 3, 4 }) } + { path, new MockFileData(new byte[] { 1, 2, 3, 4 }) } }); var firstRead = fileSystem.File.ReadAllBytes(path);