From 12b011cfa3260d5d157e0e0f991699e8cde88752 Mon Sep 17 00:00:00 2001 From: D Date: Mon, 28 Oct 2019 14:24:44 +0100 Subject: [PATCH 1/5] Add MockFileSystemSerializationTests.cs Bug: Serialize and then Deserialize a MockFileSystem make fileSystem.File.ReadAllBytes fails but fileSystem.GetFile(path).Contents works OK --- .../MockFileSystemSerializationTests.cs | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 System.IO.Abstractions.TestingHelpers.Tests/MockFileSystemSerializationTests.cs diff --git a/System.IO.Abstractions.TestingHelpers.Tests/MockFileSystemSerializationTests.cs b/System.IO.Abstractions.TestingHelpers.Tests/MockFileSystemSerializationTests.cs new file mode 100644 index 000000000..90071c7fc --- /dev/null +++ b/System.IO.Abstractions.TestingHelpers.Tests/MockFileSystemSerializationTests.cs @@ -0,0 +1,95 @@ +namespace System.IO.Abstractions.TestingHelpers.Tests +{ + using NUnit.Framework; + using System.Reflection; + using System.Runtime.Serialization; + using System.Runtime.Serialization.Formatters.Binary; + using Text; + using XFS = MockUnixSupport; + [TestFixture] + class MockFileSystemSerializationTests + { + + const string FS_FILENAME = @"test.fs"; + + [Test] + public void SerializationTexts() + { + // Arrange + string path = XFS.Path(@"c:\something\demo.txt"); + + var content = "Hello there!" + Environment.NewLine + "Second line!" + Environment.NewLine; + + var fileSystem = new MockFileSystem(); + fileSystem.AddDirectory(XFS.Path(@"c:\something")); + + fileSystem.File.WriteAllText(path, content); + + //Act + SaveFileSystem(fileSystem); + fileSystem = (MockFileSystem) LoadFileSystem(); + + //Clear + ClearFileSystem(); + + // Assert + Assert.AreEqual( + content, + fileSystem.GetFile(path).Contents); + Assert.AreEqual( + content, + fileSystem.File.ReadAllText(path)); + + } + [Test] + public void SerializationBytes() + { + // Arrange + string path = XFS.Path(@"c:\something\demo.txt"); + + var content = "Hello there!" + Environment.NewLine + "Second line!" + Environment.NewLine; + var expected = Encoding.ASCII.GetBytes(content); //Convert a C# string to a byte array + + var fileSystem = new MockFileSystem(); + fileSystem.AddDirectory(XFS.Path(@"c:\something")); + + fileSystem.File.WriteAllBytes(path, expected); + + //Act + SaveFileSystem(fileSystem); + fileSystem = (MockFileSystem)LoadFileSystem(); + + //Clear + ClearFileSystem(); + + // Assert + Assert.AreEqual( + expected, + fileSystem.GetFile(path).Contents); + Assert.AreEqual( + content, + fileSystem.File.ReadAllBytes(path)); + } + private void SaveFileSystem(MockFileSystem fileSystem) + { + IFormatter formatter = new BinaryFormatter(); + Stream stream = new FileStream(Path.GetTempPath() + FS_FILENAME, FileMode.Create, FileAccess.Write); + formatter.Serialize(stream, fileSystem); + stream.Close(); + } + private IFileSystem LoadFileSystem() + { + IFormatter formatter = new BinaryFormatter(); + Stream stream = new FileStream(Path.GetTempPath() + FS_FILENAME, FileMode.Open, FileAccess.Read); + IFileSystem fileSystem = (MockFileSystem)formatter.Deserialize(stream); + stream.Close(); + return fileSystem; + } + private void ClearFileSystem() + { + string temp = Path.GetTempPath() + FS_FILENAME; + if (File.Exists(temp)) + File.Delete(temp); + } + } +} From 5db025d4d34d3b4d5323dc01bdfdc3bed8c1ab1f Mon Sep 17 00:00:00 2001 From: darl2ng Date: Mon, 28 Oct 2019 22:54:44 +0100 Subject: [PATCH 2/5] Fix MockFileSystem serialization empty PathVerifier --- .../MockFileSystemSerializationTests.cs | 3 +-- System.IO.Abstractions.TestingHelpers/MockFileSystem.cs | 1 - System.IO.Abstractions.TestingHelpers/PathVerifier.cs | 1 + 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/System.IO.Abstractions.TestingHelpers.Tests/MockFileSystemSerializationTests.cs b/System.IO.Abstractions.TestingHelpers.Tests/MockFileSystemSerializationTests.cs index 90071c7fc..46be07013 100644 --- a/System.IO.Abstractions.TestingHelpers.Tests/MockFileSystemSerializationTests.cs +++ b/System.IO.Abstractions.TestingHelpers.Tests/MockFileSystemSerializationTests.cs @@ -1,7 +1,6 @@ namespace System.IO.Abstractions.TestingHelpers.Tests { using NUnit.Framework; - using System.Reflection; using System.Runtime.Serialization; using System.Runtime.Serialization.Formatters.Binary; using Text; @@ -27,7 +26,7 @@ public void SerializationTexts() //Act SaveFileSystem(fileSystem); - fileSystem = (MockFileSystem) LoadFileSystem(); + fileSystem = (MockFileSystem)LoadFileSystem(); //Clear ClearFileSystem(); diff --git a/System.IO.Abstractions.TestingHelpers/MockFileSystem.cs b/System.IO.Abstractions.TestingHelpers/MockFileSystem.cs index 83957f0d8..a9cd3b49d 100644 --- a/System.IO.Abstractions.TestingHelpers/MockFileSystem.cs +++ b/System.IO.Abstractions.TestingHelpers/MockFileSystem.cs @@ -13,7 +13,6 @@ public class MockFileSystem : IFileSystem, IMockFileDataAccessor private const string DEFAULT_CURRENT_DIRECTORY = @"C:\"; private readonly IDictionary files; - [NonSerialized] private readonly PathVerifier pathVerifier; public MockFileSystem() : this(null) { } diff --git a/System.IO.Abstractions.TestingHelpers/PathVerifier.cs b/System.IO.Abstractions.TestingHelpers/PathVerifier.cs index c32680276..ad2e82445 100644 --- a/System.IO.Abstractions.TestingHelpers/PathVerifier.cs +++ b/System.IO.Abstractions.TestingHelpers/PathVerifier.cs @@ -4,6 +4,7 @@ namespace System.IO.Abstractions.TestingHelpers { using XFS = MockUnixSupport; + [Serializable] public class PathVerifier { private static readonly char[] AdditionalInvalidPathChars = { '*', '?' }; From bae0f42980365d6e18df206346437dc45d28f326 Mon Sep 17 00:00:00 2001 From: Darl Date: Sat, 2 Nov 2019 21:25:50 +0100 Subject: [PATCH 3/5] Update test unit using MemoryStream to avoid touching actual file system --- .../MockFileSystemSerializationTests.cs | 32 ------------------- 1 file changed, 32 deletions(-) diff --git a/System.IO.Abstractions.TestingHelpers.Tests/MockFileSystemSerializationTests.cs b/System.IO.Abstractions.TestingHelpers.Tests/MockFileSystemSerializationTests.cs index 46be07013..626446800 100644 --- a/System.IO.Abstractions.TestingHelpers.Tests/MockFileSystemSerializationTests.cs +++ b/System.IO.Abstractions.TestingHelpers.Tests/MockFileSystemSerializationTests.cs @@ -8,38 +8,6 @@ namespace System.IO.Abstractions.TestingHelpers.Tests [TestFixture] class MockFileSystemSerializationTests { - - const string FS_FILENAME = @"test.fs"; - - [Test] - public void SerializationTexts() - { - // Arrange - string path = XFS.Path(@"c:\something\demo.txt"); - - var content = "Hello there!" + Environment.NewLine + "Second line!" + Environment.NewLine; - - var fileSystem = new MockFileSystem(); - fileSystem.AddDirectory(XFS.Path(@"c:\something")); - - fileSystem.File.WriteAllText(path, content); - - //Act - SaveFileSystem(fileSystem); - fileSystem = (MockFileSystem)LoadFileSystem(); - - //Clear - ClearFileSystem(); - - // Assert - Assert.AreEqual( - content, - fileSystem.GetFile(path).Contents); - Assert.AreEqual( - content, - fileSystem.File.ReadAllText(path)); - - } [Test] public void SerializationBytes() { From d61bc681b0d5b4d8d9ac4fc5710ce2490906ab74 Mon Sep 17 00:00:00 2001 From: Darl Date: Sat, 2 Nov 2019 21:28:53 +0100 Subject: [PATCH 4/5] Update test unit using MemoryStream to avoid touching actual file system --- .../MockFileSystemSerializationTests.cs | 33 ++++--------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/System.IO.Abstractions.TestingHelpers.Tests/MockFileSystemSerializationTests.cs b/System.IO.Abstractions.TestingHelpers.Tests/MockFileSystemSerializationTests.cs index 626446800..809f7966c 100644 --- a/System.IO.Abstractions.TestingHelpers.Tests/MockFileSystemSerializationTests.cs +++ b/System.IO.Abstractions.TestingHelpers.Tests/MockFileSystemSerializationTests.cs @@ -23,11 +23,13 @@ public void SerializationBytes() fileSystem.File.WriteAllBytes(path, expected); //Act - SaveFileSystem(fileSystem); - fileSystem = (MockFileSystem)LoadFileSystem(); - - //Clear - ClearFileSystem(); + var memoryStream = new MemoryStream(); + var serializer = new Runtime.Serialization.Formatters.Binary.BinaryFormatter(); + serializer.Serialize(memoryStream, fileSystem); + memoryStream.Flush(); + memoryStream.Position = 0; + fileSystem = (MockFileSystem)serializer.Deserialize(memoryStream); + memoryStream.Dispose(); // Assert Assert.AreEqual( @@ -37,26 +39,5 @@ public void SerializationBytes() content, fileSystem.File.ReadAllBytes(path)); } - private void SaveFileSystem(MockFileSystem fileSystem) - { - IFormatter formatter = new BinaryFormatter(); - Stream stream = new FileStream(Path.GetTempPath() + FS_FILENAME, FileMode.Create, FileAccess.Write); - formatter.Serialize(stream, fileSystem); - stream.Close(); - } - private IFileSystem LoadFileSystem() - { - IFormatter formatter = new BinaryFormatter(); - Stream stream = new FileStream(Path.GetTempPath() + FS_FILENAME, FileMode.Open, FileAccess.Read); - IFileSystem fileSystem = (MockFileSystem)formatter.Deserialize(stream); - stream.Close(); - return fileSystem; - } - private void ClearFileSystem() - { - string temp = Path.GetTempPath() + FS_FILENAME; - if (File.Exists(temp)) - File.Delete(temp); - } } } From 80377a02ab160a47d10649fbdbddbfd9e695656a Mon Sep 17 00:00:00 2001 From: Darl Date: Sat, 2 Nov 2019 21:28:53 +0100 Subject: [PATCH 5/5] Update test unit using MemoryStream to avoid touching actual file system --- .../MockFileSystemSerializationTests.cs | 37 ++++--------------- 1 file changed, 8 insertions(+), 29 deletions(-) diff --git a/System.IO.Abstractions.TestingHelpers.Tests/MockFileSystemSerializationTests.cs b/System.IO.Abstractions.TestingHelpers.Tests/MockFileSystemSerializationTests.cs index 626446800..3d6623cc5 100644 --- a/System.IO.Abstractions.TestingHelpers.Tests/MockFileSystemSerializationTests.cs +++ b/System.IO.Abstractions.TestingHelpers.Tests/MockFileSystemSerializationTests.cs @@ -1,8 +1,6 @@ namespace System.IO.Abstractions.TestingHelpers.Tests { using NUnit.Framework; - using System.Runtime.Serialization; - using System.Runtime.Serialization.Formatters.Binary; using Text; using XFS = MockUnixSupport; [TestFixture] @@ -23,11 +21,13 @@ public void SerializationBytes() fileSystem.File.WriteAllBytes(path, expected); //Act - SaveFileSystem(fileSystem); - fileSystem = (MockFileSystem)LoadFileSystem(); - - //Clear - ClearFileSystem(); + var memoryStream = new MemoryStream(); + var serializer = new Runtime.Serialization.Formatters.Binary.BinaryFormatter(); + serializer.Serialize(memoryStream, fileSystem); + memoryStream.Flush(); + memoryStream.Position = 0; + fileSystem = (MockFileSystem)serializer.Deserialize(memoryStream); + memoryStream.Dispose(); // Assert Assert.AreEqual( @@ -37,26 +37,5 @@ public void SerializationBytes() content, fileSystem.File.ReadAllBytes(path)); } - private void SaveFileSystem(MockFileSystem fileSystem) - { - IFormatter formatter = new BinaryFormatter(); - Stream stream = new FileStream(Path.GetTempPath() + FS_FILENAME, FileMode.Create, FileAccess.Write); - formatter.Serialize(stream, fileSystem); - stream.Close(); - } - private IFileSystem LoadFileSystem() - { - IFormatter formatter = new BinaryFormatter(); - Stream stream = new FileStream(Path.GetTempPath() + FS_FILENAME, FileMode.Open, FileAccess.Read); - IFileSystem fileSystem = (MockFileSystem)formatter.Deserialize(stream); - stream.Close(); - return fileSystem; - } - private void ClearFileSystem() - { - string temp = Path.GetTempPath() + FS_FILENAME; - if (File.Exists(temp)) - File.Delete(temp); - } } -} +} \ No newline at end of file