Skip to content

Commit 96f9886

Browse files
rcdaileyfgreinacher
andcommitted
fix: improve cache invalidation in MockDirectoryInfo (#862)
When invoking the `Create()` and `Delete()` methods on `MockDirectoryInfo`, the `Exists` property should intrinsically invoke `Refresh()` the next time it is called. This is necessary to prevent returning stale state about the directory after those operations. Additional test cases have been added for `MoveTo()` as well, to ensure it also not returning stale state. For context, this change was motivated by PR #828 where similar issues were solved in `MockFileInfo`. Co-authored-by: Florian Greinacher <[email protected]>
1 parent fc2d041 commit 96f9886

File tree

2 files changed

+76
-1
lines changed

2 files changed

+76
-1
lines changed

src/System.IO.Abstractions.TestingHelpers/MockDirectoryInfo.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public MockDirectoryInfo(IMockFileDataAccessor mockFileDataAccessor, string dire
4242
public override void Delete()
4343
{
4444
mockFileDataAccessor.Directory.Delete(directoryPath);
45+
refreshOnNextRead = true;
4546
}
4647

4748
/// <inheritdoc />
@@ -160,12 +161,14 @@ public override string Name
160161
public override void Create()
161162
{
162163
mockFileDataAccessor.Directory.CreateDirectory(FullName);
164+
refreshOnNextRead = true;
163165
}
164166

165167
/// <inheritdoc />
166168
public override void Create(DirectorySecurity directorySecurity)
167169
{
168170
mockFileDataAccessor.Directory.CreateDirectory(FullName, directorySecurity);
171+
refreshOnNextRead = true;
169172
}
170173

171174
/// <inheritdoc />
@@ -178,6 +181,7 @@ public override IDirectoryInfo CreateSubdirectory(string path)
178181
public override void Delete(bool recursive)
179182
{
180183
mockFileDataAccessor.Directory.Delete(directoryPath, recursive);
184+
refreshOnNextRead = true;
181185
}
182186

183187
/// <inheritdoc />

tests/System.IO.Abstractions.TestingHelpers.Tests/MockDirectoryInfoTests.cs

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Collections.Generic;
22
using System.Linq;
3+
using System.Security.AccessControl;
34
using NUnit.Framework;
45

56
namespace System.IO.Abstractions.TestingHelpers.Tests
@@ -444,6 +445,76 @@ public void MockDirectoryInfo_Exists_ShouldUpdateCachedDataOnRefresh()
444445
Assert.IsTrue(directoryInfo.Exists);
445446
}
446447

448+
[Test]
449+
public void Directory_exists_after_creation()
450+
{
451+
// Arrange
452+
var fileSystem = new MockFileSystem();
453+
var directoryInfo = fileSystem.DirectoryInfo.FromDirectoryName(XFS.Path(@"c:\abc"));
454+
455+
// Act
456+
directoryInfo.Create();
457+
458+
// Assert
459+
Assert.IsTrue(directoryInfo.Exists);
460+
}
461+
462+
[Test, WindowsOnly(WindowsSpecifics.AccessControlLists)]
463+
public void Directory_exists_after_creation_with_security()
464+
{
465+
// Arrange
466+
var fileSystem = new MockFileSystem();
467+
var directoryInfo = fileSystem.DirectoryInfo.FromDirectoryName(XFS.Path(@"c:\abc"));
468+
469+
// Act
470+
directoryInfo.Create(new DirectorySecurity());
471+
472+
// Assert
473+
Assert.IsTrue(directoryInfo.Exists);
474+
}
475+
476+
[Test]
477+
public void Directory_does_not_exist_after_delete()
478+
{
479+
// Arrange
480+
var fileSystem = new MockFileSystem();
481+
var directoryInfo = fileSystem.Directory.CreateDirectory(XFS.Path(@"c:\abc"));
482+
483+
// Act
484+
directoryInfo.Delete();
485+
486+
// Assert
487+
Assert.IsFalse(directoryInfo.Exists);
488+
}
489+
490+
[Test]
491+
public void Directory_does_not_exist_after_recursive_delete()
492+
{
493+
// Arrange
494+
var fileSystem = new MockFileSystem();
495+
var directoryInfo = fileSystem.Directory.CreateDirectory(XFS.Path(@"c:\abc"));
496+
497+
// Act
498+
directoryInfo.Delete(true);
499+
500+
// Assert
501+
Assert.IsFalse(directoryInfo.Exists);
502+
}
503+
504+
[Test]
505+
public void Directory_still_exists_after_move()
506+
{
507+
// Arrange
508+
var fileSystem = new MockFileSystem();
509+
var directoryInfo = fileSystem.Directory.CreateDirectory(XFS.Path(@"c:\abc"));
510+
511+
// Act
512+
directoryInfo.MoveTo(XFS.Path(@"c:\abc2"));
513+
514+
// Assert
515+
Assert.IsTrue(directoryInfo.Exists);
516+
}
517+
447518
[Test]
448519
public void MockDirectoryInfo_LastAccessTime_ShouldReflectChangedValue()
449520
{
@@ -584,4 +655,4 @@ public void MockDirectoryInfo_LastWriteTimeUtc_SetterShouldThrowDirectoryNotFoun
584655
}
585656

586657
}
587-
}
658+
}

0 commit comments

Comments
 (0)