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));
+ }
+ }
}
}