diff --git a/src/System.IO.Abstractions.TestingHelpers/IMockFileDataAccessor.cs b/src/System.IO.Abstractions.TestingHelpers/IMockFileDataAccessor.cs index 1aeeb89d2..2a3c84329 100644 --- a/src/System.IO.Abstractions.TestingHelpers/IMockFileDataAccessor.cs +++ b/src/System.IO.Abstractions.TestingHelpers/IMockFileDataAccessor.cs @@ -77,6 +77,11 @@ public interface IMockFileDataAccessor : IFileSystem /// PathVerifier PathVerifier { get; } + /// + /// Get if attributes for a file created via stream should be set to default or not + /// + bool SetAttributesOnStreamCreation { get; } + /// /// Gets a reference to the underlying file system. /// diff --git a/src/System.IO.Abstractions.TestingHelpers/MockFile.cs b/src/System.IO.Abstractions.TestingHelpers/MockFile.cs index d1b23cb92..44b3475bc 100644 --- a/src/System.IO.Abstractions.TestingHelpers/MockFile.cs +++ b/src/System.IO.Abstractions.TestingHelpers/MockFile.cs @@ -150,7 +150,10 @@ private Stream CreateInternal(string path, FileAccess access, FileOptions option mockFileDataAccessor.PathVerifier.IsLegalAbsoluteOrRelative(path, nameof(path)); VerifyDirectoryExists(path); - var mockFileData = new MockFileData(new byte[0]); + var mockFileData = mockFileDataAccessor.SetAttributesOnStreamCreation + ? MockFileData.NewObject + : new MockFileData(Array.Empty()); + mockFileDataAccessor.AddFile(path, mockFileData); return OpenInternal(path, FileMode.Open, access, options); } diff --git a/src/System.IO.Abstractions.TestingHelpers/MockFileData.cs b/src/System.IO.Abstractions.TestingHelpers/MockFileData.cs index 0fe04c386..8a1fdff23 100644 --- a/src/System.IO.Abstractions.TestingHelpers/MockFileData.cs +++ b/src/System.IO.Abstractions.TestingHelpers/MockFileData.cs @@ -27,6 +27,14 @@ public class MockFileData Attributes = (FileAttributes)(-1), }; + internal static readonly MockFileData NewObject = new MockFileData(string.Empty) + { + CreationTime = DateTime.Now, + LastWriteTime = DateTime.Now, + LastAccessTime = DateTime.Now, + Attributes = FileAttributes.Normal, + }; + /// /// Gets the default date time offset. /// E.g. for not existing files. diff --git a/src/System.IO.Abstractions.TestingHelpers/MockFileStream.cs b/src/System.IO.Abstractions.TestingHelpers/MockFileStream.cs index 755d6d19e..a25f76fb7 100644 --- a/src/System.IO.Abstractions.TestingHelpers/MockFileStream.cs +++ b/src/System.IO.Abstractions.TestingHelpers/MockFileStream.cs @@ -59,7 +59,11 @@ public MockFileStream( throw CommonExceptions.FileNotFound(path); } - mockFileDataAccessor.AddFile(path, new MockFileData(new byte[] { })); + var mfd = mockFileDataAccessor.SetAttributesOnStreamCreation + ? MockFileData.NewObject + : new MockFileData(Array.Empty()); + + mockFileDataAccessor.AddFile(path, mfd); } this.access = access; diff --git a/src/System.IO.Abstractions.TestingHelpers/MockFileSystem.cs b/src/System.IO.Abstractions.TestingHelpers/MockFileSystem.cs index eff56ad73..18f760cc4 100644 --- a/src/System.IO.Abstractions.TestingHelpers/MockFileSystem.cs +++ b/src/System.IO.Abstractions.TestingHelpers/MockFileSystem.cs @@ -87,6 +87,8 @@ public MockFileSystem(IDictionary files, string currentDir public IFileSystem FileSystem => this; /// public PathVerifier PathVerifier => pathVerifier; + /// + public bool SetAttributesOnStreamCreation { get; set; } private string FixPath(string path, bool checkCaps = false) { diff --git a/tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileInfoTests.cs b/tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileInfoTests.cs index fbaa47307..f634b54db 100644 --- a/tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileInfoTests.cs +++ b/tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileInfoTests.cs @@ -853,6 +853,28 @@ public void MockFileInfo_CreateText_ShouldUpdateCachedDataAndReturnTrueForExists Assert.IsTrue(fileInfo.Exists); } + [Test] + public void MockFileInfo_Create_ShouldSetProperDefaultAttributes() + { + // Arrange + var fileSystem = new MockFileSystem(); + fileSystem.SetAttributesOnStreamCreation = true; + var file = XFS.Path(@"C:\test\test.txt"); + var fi = fileSystem.FileInfo.FromFileName(file); + if (!fi.Directory.Exists) + { + fi.Directory.Create(); + } + + // Act + using (var stream = fi.Create()) + { + // Assert + Assert.AreEqual(FileAttributes.Normal, fi.Attributes); + Assert.LessOrEqual(DateTime.Now - fi.CreationTime, TimeSpan.FromSeconds(1)); + } + } + [Test] public void MockFileInfo_Delete_ShouldUpdateCachedDataAndReturnFalseForExists() { diff --git a/tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileStreamTests.cs b/tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileStreamTests.cs index 3e87fed44..807af62c4 100644 --- a/tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileStreamTests.cs +++ b/tests/System.IO.Abstractions.TestingHelpers.Tests/MockFileStreamTests.cs @@ -184,5 +184,25 @@ public void MockFileStream_Flush_ShouldNotChangePosition() Assert.AreEqual(200, stream.Position); } } + + [Test] + public void MockFileStream_Create_ShouldSetProperDefaultAttributes() + { + // Arrange + var fileSystem = new MockFileSystem(); + fileSystem.SetAttributesOnStreamCreation = true; + var dir = XFS.Path(@"C:\test\"); + var file = XFS.Path(@"C:\test\test.txt"); + fileSystem.Directory.CreateDirectory(dir); + + // Act + using (var stream = fileSystem.FileStream.Create(file, FileMode.Create)) + { + var fi = fileSystem.FileInfo.FromFileName(file); + // Assert + Assert.AreEqual(FileAttributes.Normal, fi.Attributes); + Assert.LessOrEqual(DateTime.Now - fi.CreationTime, TimeSpan.FromSeconds(1)); + } + } } }