Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 9 additions & 10 deletions Source/Testably.Abstractions.Testing/Storage/InMemoryStorage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -199,8 +199,14 @@ public IEnumerable<IStorageLocation> EnumerateLocations(
throw ExceptionFactory.DirectoryNotFound(location.FullPath);
}

return EnumerateLocationsImpl(location, type, requestParentAccess, searchPattern,
enumerationOptions, parentContainer);
IDisposable parentAccess = new NoOpDisposable();
if (requestParentAccess)
{
parentAccess = parentContainer.RequestAccess(FileAccess.Read, FileShare.ReadWrite);
}

return EnumerateLocationsImpl(location, type, searchPattern,
enumerationOptions, parentAccess);
}

/// <summary>
Expand All @@ -210,17 +216,10 @@ public IEnumerable<IStorageLocation> EnumerateLocations(
private IEnumerable<IStorageLocation> EnumerateLocationsImpl(
IStorageLocation location,
FileSystemTypes type,
bool requestParentAccess,
string searchPattern,
EnumerationOptions? enumerationOptions,
IStorageContainer parentContainer)
IDisposable parentAccess)
{
IDisposable parentAccess = new NoOpDisposable();
if (requestParentAccess)
{
parentAccess = parentContainer.RequestAccess(FileAccess.Read, FileShare.ReadWrite);
}

using (parentAccess)
{
enumerationOptions ??= EnumerationOptionsHelper.Compatible;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
using Testably.Abstractions.Testing.FileSystem;

namespace Testably.Abstractions.Testing.Tests.FileSystem;

public class DirectoryMockTests
{
[Fact]
public async Task
EnumerateDirectories_UnauthorizedParentAccess_ShouldThrowUnauthorizedAccessExceptionImmediately()
{
Skip.IfNot(Test.RunsOnWindows);

string path = "foo";
MockFileSystem fileSystem = new();
IDirectoryInfo sut = fileSystem.Directory.CreateDirectory(path);
fileSystem.WithAccessControlStrategy(
new DefaultAccessControlStrategy((p, _)
=> !p.EndsWith(path, StringComparison.Ordinal)));

void Act() =>
_ = fileSystem.Directory.EnumerateDirectories(path);

await That(Act).Throws<UnauthorizedAccessException>()
.WithMessageContaining($"'{sut.FullName}'").And
.WithHResult(-2147024891);
}

[Fact]
public async Task
EnumerateFiles_UnauthorizedParentAccess_ShouldThrowUnauthorizedAccessExceptionImmediately()
{
Skip.IfNot(Test.RunsOnWindows);

string path = "foo";
MockFileSystem fileSystem = new();
IDirectoryInfo sut = fileSystem.Directory.CreateDirectory(path);
fileSystem.WithAccessControlStrategy(
new DefaultAccessControlStrategy((p, _)
=> !p.EndsWith(path, StringComparison.Ordinal)));

void Act() =>
_ = fileSystem.Directory.EnumerateFiles(path);

await That(Act).Throws<UnauthorizedAccessException>()
.WithMessageContaining($"'{sut.FullName}'").And
.WithHResult(-2147024891);
}

[Fact]
public async Task
EnumerateFileSystemEntries_UnauthorizedParentAccess_ShouldThrowUnauthorizedAccessExceptionImmediately()
{
Skip.IfNot(Test.RunsOnWindows);

string path = "foo";
MockFileSystem fileSystem = new();
IDirectoryInfo sut = fileSystem.Directory.CreateDirectory(path);
fileSystem.WithAccessControlStrategy(
new DefaultAccessControlStrategy((p, _)
=> !p.EndsWith(path, StringComparison.Ordinal)));

void Act() =>
_ = fileSystem.Directory.EnumerateFileSystemEntries(path);

await That(Act).Throws<UnauthorizedAccessException>()
.WithMessageContaining($"'{sut.FullName}'").And
.WithHResult(-2147024891);
}
}
Loading