Skip to content

Commit cd2a151

Browse files
feat: moved open file handles state to mock file system and ran API acceptance tests
1 parent 611907b commit cd2a151

9 files changed

+30
-5
lines changed

src/TestableIO.System.IO.Abstractions.TestingHelpers/IMockFileDataAccessor.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections.Generic;
1+
using System.Collections.Concurrent;
2+
using System.Collections.Generic;
23
using System.Reflection;
34

45
namespace System.IO.Abstractions.TestingHelpers;
@@ -110,4 +111,9 @@ public interface IMockFileDataAccessor : IFileSystem
110111
/// Gets a reference to the underlying file system.
111112
/// </summary>
112113
IFileSystem FileSystem { get; }
114+
115+
/// <summary>
116+
/// Gets a reference to the open file handles.
117+
/// </summary>
118+
ConcurrentDictionary<string, ConcurrentDictionary<Guid, (FileAccess, FileShare)>> FileHandles { get; }
113119
}

src/TestableIO.System.IO.Abstractions.TestingHelpers/MockFileStream.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ public NullFileSystemStream() : base(Null, ".", true)
3838
private readonly FileOptions options;
3939
private readonly MockFileData fileData;
4040
private bool disposed;
41-
private static ConcurrentDictionary<string, ConcurrentDictionary<Guid, (FileAccess access, FileShare share)>> _fileHandles = new();
4241

4342
/// <inheritdoc />
4443
public MockFileStream(
@@ -103,7 +102,7 @@ public MockFileStream(
103102
mockFileDataAccessor.AddFile(path, fileData);
104103
}
105104

106-
var fileHandlesEntry = _fileHandles.GetOrAdd(path, _ => new ConcurrentDictionary<Guid, (FileAccess access, FileShare share)>());
105+
var fileHandlesEntry = mockFileDataAccessor.FileHandles.GetOrAdd(path, _ => new ConcurrentDictionary<Guid, (FileAccess access, FileShare share)>());
107106
fileHandlesEntry[guid] = (access, share);
108107
this.access = access;
109108
this.share = share;
@@ -153,12 +152,12 @@ protected override void Dispose(bool disposing)
153152
{
154153
return;
155154
}
156-
if (_fileHandles.TryGetValue(path, out var fileHandlesEntry))
155+
if (mockFileDataAccessor.FileHandles.TryGetValue(path, out var fileHandlesEntry))
157156
{
158157
fileHandlesEntry.TryRemove(guid, out _);
159158
if (fileHandlesEntry.IsEmpty)
160159
{
161-
_fileHandles.TryRemove(path, out _);
160+
mockFileDataAccessor.FileHandles.TryRemove(path, out _);
162161
}
163162
}
164163
InternalFlush();

src/TestableIO.System.IO.Abstractions.TestingHelpers/MockFileSystem.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.Collections.Concurrent;
12
using System.Collections.Generic;
23
using System.Linq;
34
using System.Reflection;
@@ -21,6 +22,10 @@ public class MockFileSystem : FileSystemBase, IMockFileDataAccessor
2122
private readonly PathVerifier pathVerifier;
2223
#if FEATURE_SERIALIZABLE
2324
[NonSerialized]
25+
#endif
26+
private readonly ConcurrentDictionary<string, ConcurrentDictionary<Guid, (FileAccess access, FileShare share)>> fileHandles = new();
27+
#if FEATURE_SERIALIZABLE
28+
[NonSerialized]
2429
#endif
2530
private Func<DateTime> dateTimeProvider = defaultDateTimeProvider;
2631
private static Func<DateTime> defaultDateTimeProvider = () => DateTime.UtcNow;
@@ -114,6 +119,9 @@ public MockFileSystem(IDictionary<string, MockFileData> files, MockFileSystemOpt
114119
public IFileSystem FileSystem => this;
115120
/// <inheritdoc />
116121
public PathVerifier PathVerifier => pathVerifier;
122+
/// <inheritdoc />
123+
public ConcurrentDictionary<string, ConcurrentDictionary<Guid, (FileAccess, FileShare)>> FileHandles
124+
=> fileHandles;
117125

118126
/// <summary>
119127
/// Replaces the time provider with a mocked instance. This allows to influence the used time in tests.

tests/TestableIO.System.IO.Abstractions.Api.Tests/Expected/TestableIO.System.IO.Abstractions.TestingHelpers_net472.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ namespace System.IO.Abstractions.TestingHelpers
88
System.Collections.Generic.IEnumerable<string> AllDrives { get; }
99
System.Collections.Generic.IEnumerable<string> AllFiles { get; }
1010
System.Collections.Generic.IEnumerable<string> AllPaths { get; }
11+
System.Collections.Concurrent.ConcurrentDictionary<string, System.Collections.Concurrent.ConcurrentDictionary<System.Guid, System.ValueTuple<System.IO.FileAccess, System.IO.FileShare>>> FileHandles { get; }
1112
System.IO.Abstractions.IFileSystem FileSystem { get; }
1213
System.IO.Abstractions.TestingHelpers.PathVerifier PathVerifier { get; }
1314
System.IO.Abstractions.TestingHelpers.StringOperations StringOperations { get; }
@@ -347,6 +348,7 @@ namespace System.IO.Abstractions.TestingHelpers
347348
public override System.IO.Abstractions.IDirectoryInfoFactory DirectoryInfo { get; }
348349
public override System.IO.Abstractions.IDriveInfoFactory DriveInfo { get; }
349350
public override System.IO.Abstractions.IFile File { get; }
351+
public System.Collections.Concurrent.ConcurrentDictionary<string, System.Collections.Concurrent.ConcurrentDictionary<System.Guid, System.ValueTuple<System.IO.FileAccess, System.IO.FileShare>>> FileHandles { get; }
350352
public override System.IO.Abstractions.IFileInfoFactory FileInfo { get; }
351353
public override System.IO.Abstractions.IFileStreamFactory FileStream { get; }
352354
public System.IO.Abstractions.IFileSystem FileSystem { get; }

tests/TestableIO.System.IO.Abstractions.Api.Tests/Expected/TestableIO.System.IO.Abstractions.TestingHelpers_net6.0.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ namespace System.IO.Abstractions.TestingHelpers
88
System.Collections.Generic.IEnumerable<string> AllDrives { get; }
99
System.Collections.Generic.IEnumerable<string> AllFiles { get; }
1010
System.Collections.Generic.IEnumerable<string> AllPaths { get; }
11+
System.Collections.Concurrent.ConcurrentDictionary<string, System.Collections.Concurrent.ConcurrentDictionary<System.Guid, System.ValueTuple<System.IO.FileAccess, System.IO.FileShare>>> FileHandles { get; }
1112
System.IO.Abstractions.IFileSystem FileSystem { get; }
1213
System.IO.Abstractions.TestingHelpers.PathVerifier PathVerifier { get; }
1314
System.IO.Abstractions.TestingHelpers.StringOperations StringOperations { get; }
@@ -402,6 +403,7 @@ namespace System.IO.Abstractions.TestingHelpers
402403
public override System.IO.Abstractions.IDirectoryInfoFactory DirectoryInfo { get; }
403404
public override System.IO.Abstractions.IDriveInfoFactory DriveInfo { get; }
404405
public override System.IO.Abstractions.IFile File { get; }
406+
public System.Collections.Concurrent.ConcurrentDictionary<string, System.Collections.Concurrent.ConcurrentDictionary<System.Guid, System.ValueTuple<System.IO.FileAccess, System.IO.FileShare>>> FileHandles { get; }
405407
public override System.IO.Abstractions.IFileInfoFactory FileInfo { get; }
406408
public override System.IO.Abstractions.IFileStreamFactory FileStream { get; }
407409
public System.IO.Abstractions.IFileSystem FileSystem { get; }

tests/TestableIO.System.IO.Abstractions.Api.Tests/Expected/TestableIO.System.IO.Abstractions.TestingHelpers_net8.0.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ namespace System.IO.Abstractions.TestingHelpers
88
System.Collections.Generic.IEnumerable<string> AllDrives { get; }
99
System.Collections.Generic.IEnumerable<string> AllFiles { get; }
1010
System.Collections.Generic.IEnumerable<string> AllPaths { get; }
11+
System.Collections.Concurrent.ConcurrentDictionary<string, System.Collections.Concurrent.ConcurrentDictionary<System.Guid, System.ValueTuple<System.IO.FileAccess, System.IO.FileShare>>> FileHandles { get; }
1112
System.IO.Abstractions.IFileSystem FileSystem { get; }
1213
System.IO.Abstractions.TestingHelpers.PathVerifier PathVerifier { get; }
1314
System.IO.Abstractions.TestingHelpers.StringOperations StringOperations { get; }
@@ -426,6 +427,7 @@ namespace System.IO.Abstractions.TestingHelpers
426427
public override System.IO.Abstractions.IDirectoryInfoFactory DirectoryInfo { get; }
427428
public override System.IO.Abstractions.IDriveInfoFactory DriveInfo { get; }
428429
public override System.IO.Abstractions.IFile File { get; }
430+
public System.Collections.Concurrent.ConcurrentDictionary<string, System.Collections.Concurrent.ConcurrentDictionary<System.Guid, System.ValueTuple<System.IO.FileAccess, System.IO.FileShare>>> FileHandles { get; }
429431
public override System.IO.Abstractions.IFileInfoFactory FileInfo { get; }
430432
public override System.IO.Abstractions.IFileStreamFactory FileStream { get; }
431433
public System.IO.Abstractions.IFileSystem FileSystem { get; }

tests/TestableIO.System.IO.Abstractions.Api.Tests/Expected/TestableIO.System.IO.Abstractions.TestingHelpers_net9.0.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ namespace System.IO.Abstractions.TestingHelpers
88
System.Collections.Generic.IEnumerable<string> AllDrives { get; }
99
System.Collections.Generic.IEnumerable<string> AllFiles { get; }
1010
System.Collections.Generic.IEnumerable<string> AllPaths { get; }
11+
System.Collections.Concurrent.ConcurrentDictionary<string, System.Collections.Concurrent.ConcurrentDictionary<System.Guid, System.ValueTuple<System.IO.FileAccess, System.IO.FileShare>>> FileHandles { get; }
1112
System.IO.Abstractions.IFileSystem FileSystem { get; }
1213
System.IO.Abstractions.TestingHelpers.PathVerifier PathVerifier { get; }
1314
System.IO.Abstractions.TestingHelpers.StringOperations StringOperations { get; }
@@ -440,6 +441,7 @@ namespace System.IO.Abstractions.TestingHelpers
440441
public override System.IO.Abstractions.IDirectoryInfoFactory DirectoryInfo { get; }
441442
public override System.IO.Abstractions.IDriveInfoFactory DriveInfo { get; }
442443
public override System.IO.Abstractions.IFile File { get; }
444+
public System.Collections.Concurrent.ConcurrentDictionary<string, System.Collections.Concurrent.ConcurrentDictionary<System.Guid, System.ValueTuple<System.IO.FileAccess, System.IO.FileShare>>> FileHandles { get; }
443445
public override System.IO.Abstractions.IFileInfoFactory FileInfo { get; }
444446
public override System.IO.Abstractions.IFileStreamFactory FileStream { get; }
445447
public System.IO.Abstractions.IFileSystem FileSystem { get; }

tests/TestableIO.System.IO.Abstractions.Api.Tests/Expected/TestableIO.System.IO.Abstractions.TestingHelpers_netstandard2.0.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ namespace System.IO.Abstractions.TestingHelpers
88
System.Collections.Generic.IEnumerable<string> AllDrives { get; }
99
System.Collections.Generic.IEnumerable<string> AllFiles { get; }
1010
System.Collections.Generic.IEnumerable<string> AllPaths { get; }
11+
System.Collections.Concurrent.ConcurrentDictionary<string, System.Collections.Concurrent.ConcurrentDictionary<System.Guid, System.ValueTuple<System.IO.FileAccess, System.IO.FileShare>>> FileHandles { get; }
1112
System.IO.Abstractions.IFileSystem FileSystem { get; }
1213
System.IO.Abstractions.TestingHelpers.PathVerifier PathVerifier { get; }
1314
System.IO.Abstractions.TestingHelpers.StringOperations StringOperations { get; }
@@ -347,6 +348,7 @@ namespace System.IO.Abstractions.TestingHelpers
347348
public override System.IO.Abstractions.IDirectoryInfoFactory DirectoryInfo { get; }
348349
public override System.IO.Abstractions.IDriveInfoFactory DriveInfo { get; }
349350
public override System.IO.Abstractions.IFile File { get; }
351+
public System.Collections.Concurrent.ConcurrentDictionary<string, System.Collections.Concurrent.ConcurrentDictionary<System.Guid, System.ValueTuple<System.IO.FileAccess, System.IO.FileShare>>> FileHandles { get; }
350352
public override System.IO.Abstractions.IFileInfoFactory FileInfo { get; }
351353
public override System.IO.Abstractions.IFileStreamFactory FileStream { get; }
352354
public System.IO.Abstractions.IFileSystem FileSystem { get; }

tests/TestableIO.System.IO.Abstractions.Api.Tests/Expected/TestableIO.System.IO.Abstractions.TestingHelpers_netstandard2.1.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ namespace System.IO.Abstractions.TestingHelpers
88
System.Collections.Generic.IEnumerable<string> AllDrives { get; }
99
System.Collections.Generic.IEnumerable<string> AllFiles { get; }
1010
System.Collections.Generic.IEnumerable<string> AllPaths { get; }
11+
System.Collections.Concurrent.ConcurrentDictionary<string, System.Collections.Concurrent.ConcurrentDictionary<System.Guid, System.ValueTuple<System.IO.FileAccess, System.IO.FileShare>>> FileHandles { get; }
1112
System.IO.Abstractions.IFileSystem FileSystem { get; }
1213
System.IO.Abstractions.TestingHelpers.PathVerifier PathVerifier { get; }
1314
System.IO.Abstractions.TestingHelpers.StringOperations StringOperations { get; }
@@ -375,6 +376,7 @@ namespace System.IO.Abstractions.TestingHelpers
375376
public override System.IO.Abstractions.IDirectoryInfoFactory DirectoryInfo { get; }
376377
public override System.IO.Abstractions.IDriveInfoFactory DriveInfo { get; }
377378
public override System.IO.Abstractions.IFile File { get; }
379+
public System.Collections.Concurrent.ConcurrentDictionary<string, System.Collections.Concurrent.ConcurrentDictionary<System.Guid, System.ValueTuple<System.IO.FileAccess, System.IO.FileShare>>> FileHandles { get; }
378380
public override System.IO.Abstractions.IFileInfoFactory FileInfo { get; }
379381
public override System.IO.Abstractions.IFileStreamFactory FileStream { get; }
380382
public System.IO.Abstractions.IFileSystem FileSystem { get; }

0 commit comments

Comments
 (0)