Skip to content

Commit 08ee72a

Browse files
roketworksfgreinacher
authored andcommitted
Added File Access check to MockFileStream
1 parent c107e19 commit 08ee72a

File tree

2 files changed

+46
-3
lines changed

2 files changed

+46
-3
lines changed

System.IO.Abstractions.TestingHelpers.Tests/MockFileStreamTests.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,46 @@ public void MockFileStream_Constructor_ReadTypeNotWritable()
7676
Assert.IsFalse(stream.CanWrite);
7777
Assert.Throws<NotSupportedException>(() => stream.WriteByte(1));
7878
}
79+
80+
[Test]
81+
[TestCase(FileShare.None, MockFileStream.StreamType.READ)]
82+
[TestCase(FileShare.None, MockFileStream.StreamType.WRITE)]
83+
[TestCase(FileShare.None, MockFileStream.StreamType.APPEND)]
84+
[TestCase(FileShare.None, MockFileStream.StreamType.TRUNCATE)]
85+
[TestCase(FileShare.Read, MockFileStream.StreamType.WRITE)]
86+
[TestCase(FileShare.Read, MockFileStream.StreamType.APPEND)]
87+
[TestCase(FileShare.Read, MockFileStream.StreamType.TRUNCATE)]
88+
[TestCase(FileShare.Write, MockFileStream.StreamType.READ)]
89+
public void MockFileStream_Constructor_Insufficient_FileShare_Throws_Exception(FileShare allowedFileShare, MockFileStream.StreamType streamType)
90+
{
91+
var filePath = @"C:\locked.txt";
92+
var fileSystem = new MockFileSystem(new Dictionary<string, MockFileData>
93+
{
94+
{ filePath, new MockFileData("cannot access") { AllowedFileShare = allowedFileShare } }
95+
});
96+
97+
Assert.Throws<IOException>(() => new MockFileStream(fileSystem, filePath, streamType));
98+
}
99+
100+
[Test]
101+
[TestCase(FileShare.Read, MockFileStream.StreamType.READ)]
102+
[TestCase(FileShare.Read | FileShare.Write, MockFileStream.StreamType.READ)]
103+
[TestCase(FileShare.Read | FileShare.Write, MockFileStream.StreamType.APPEND)]
104+
[TestCase(FileShare.Read | FileShare.Write, MockFileStream.StreamType.TRUNCATE)]
105+
[TestCase(FileShare.ReadWrite, MockFileStream.StreamType.READ)]
106+
[TestCase(FileShare.ReadWrite, MockFileStream.StreamType.WRITE)]
107+
[TestCase(FileShare.ReadWrite, MockFileStream.StreamType.APPEND)]
108+
[TestCase(FileShare.ReadWrite, MockFileStream.StreamType.TRUNCATE)]
109+
public void MockFileStream_Constructor_Sufficient_FileShare_Does_Not_Throw_Exception(FileShare allowedFileShare, MockFileStream.StreamType streamType)
110+
{
111+
var filePath = @"C:\locked.txt";
112+
var fileSystem = new MockFileSystem(new Dictionary<string, MockFileData>
113+
{
114+
{ filePath, new MockFileData("cannot access") { AllowedFileShare = allowedFileShare } }
115+
});
116+
117+
Assert.DoesNotThrow(() => new MockFileStream(fileSystem, filePath, streamType));
118+
}
79119

80120
[Test]
81121
public void MockFileStream_Close_MultipleCallsDontThrow()

System.IO.Abstractions.TestingHelpers/MockFileStream.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,14 @@ public MockFileStream(
3939
this.mockFileDataAccessor = mockFileDataAccessor ?? throw new ArgumentNullException(nameof(mockFileDataAccessor));
4040
this.path = path;
4141
this.options = options;
42-
42+
4343
if (mockFileDataAccessor.FileExists(path))
4444
{
45+
var fileData = mockFileDataAccessor.GetFile(path);
46+
fileData.CheckFileAccess(path, streamType != StreamType.READ ? FileAccess.Write : FileAccess.Read);
47+
4548
/* only way to make an expandable MemoryStream that starts with a particular content */
46-
var data = mockFileDataAccessor.GetFile(path).Contents;
49+
var data = fileData.Contents;
4750
if (data != null && data.Length > 0 && streamType != StreamType.TRUNCATE)
4851
{
4952
Write(data, 0, data.Length);
@@ -60,7 +63,7 @@ public MockFileStream(
6063
}
6164
mockFileDataAccessor.AddFile(path, new MockFileData(new byte[] { }));
6265
}
63-
66+
6467
canWrite = streamType != StreamType.READ;
6568
}
6669

0 commit comments

Comments
 (0)