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..58462eeb4 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() + { + var path = XFS.Path(@"c:\something\demo.bin"); + var fileSystem = new MockFileSystem(new Dictionary + { + { 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()