Skip to content

Commit ff509cf

Browse files
Fixes #568: MockFile.Copy does not honor AccessFileShare on MockFileData (#569)
* fixes #568, MockFile.Copy should honor FileShare * add missing coverage on MockFile.Move Co-authored-by: Florian Greinacher <fgreinacher@users.noreply.github.com>
1 parent 4493b9e commit ff509cf

3 files changed

Lines changed: 54 additions & 0 deletions

File tree

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,5 +381,24 @@ public void MockFile_Copy_ShouldWorkWithRelativePaths()
381381

382382
Assert.That(fileSystem.File.Exists(destinationFile));
383383
}
384+
385+
[Test]
386+
public void MockFile_Copy_ShouldThrowIOExceptionForInvalidFileShare()
387+
{
388+
string sourceFileName = XFS.Path(@"c:\source\demo.txt");
389+
var sourceContents = new MockFileData("Source content")
390+
{
391+
AllowedFileShare = FileShare.None
392+
};
393+
var fileSystem = new MockFileSystem(new Dictionary<string, MockFileData>
394+
{
395+
{sourceFileName, sourceContents}
396+
});
397+
fileSystem.AddDirectory(XFS.Path(@"c:\something"));
398+
399+
TestDelegate action = () => fileSystem.File.Copy(sourceFileName, XFS.Path(@"c:\something\demo.txt"));
400+
401+
Assert.Throws<IOException>(action);
402+
}
384403
}
385404
}

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,5 +381,39 @@ public void MockFile_Move_ShouldRetainMetadata()
381381

382382
Assert.That(fileSystem.File.GetCreationTimeUtc(destFilePath), Is.EqualTo(creationTime.UtcDateTime));
383383
}
384+
385+
[Test]
386+
public void MockFile_Move_ShouldThrowExceptionWhenSourceFileShare_Is_Not_Delete()
387+
{
388+
string sourceFileReadDelete = XFS.Path(@"c:\something\IHaveReadDelete.txt");
389+
string sourceFileDelete = XFS.Path(@"c:\something\IHaveDelete.txt");
390+
string sourceFileRead = XFS.Path(@"c:\something\IHaveRead.txt");
391+
string sourceFileNone = XFS.Path(@"c:\something\IHaveNone.txt");
392+
var fileSystem = new MockFileSystem(new Dictionary<string, MockFileData>
393+
{
394+
{ sourceFileDelete, new MockFileData("") { AllowedFileShare = FileShare.Delete } },
395+
{ sourceFileRead, new MockFileData("") { AllowedFileShare = FileShare.Read } },
396+
{ sourceFileReadDelete, new MockFileData("") { AllowedFileShare = FileShare.Delete | FileShare.Read } },
397+
{ sourceFileNone, new MockFileData("") { AllowedFileShare = FileShare.None } },
398+
});
399+
400+
AssertMoveSuccess(sourceFileReadDelete);
401+
AssertMoveSuccess(sourceFileDelete);
402+
AssertMoveThrowsIOException(sourceFileRead);
403+
AssertMoveThrowsIOException(sourceFileNone);
404+
405+
void AssertMoveThrowsIOException(string sourceFile)
406+
{
407+
var target = sourceFile + ".moved";
408+
Assert.Throws<IOException>(() => fileSystem.File.Move(sourceFile, target));
409+
}
410+
411+
void AssertMoveSuccess(string sourceFile)
412+
{
413+
var target = sourceFile + ".moved";
414+
fileSystem.File.Move(sourceFile, target);
415+
Assert.That(fileSystem.File.Exists(target), Is.True);
416+
}
417+
}
384418
}
385419
}

System.IO.Abstractions.TestingHelpers/MockFile.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ public override void Copy(string sourceFileName, string destFileName, bool overw
122122
}
123123

124124
var sourceFileData = mockFileDataAccessor.GetFile(sourceFileName);
125+
sourceFileData.CheckFileAccess(sourceFileName, FileAccess.Read);
125126
mockFileDataAccessor.AddFile(destFileName, new MockFileData(sourceFileData));
126127
}
127128

0 commit comments

Comments
 (0)