Skip to content

Conversation

@vbreuss
Copy link
Member

@vbreuss vbreuss commented Sep 12, 2025

This PR fixes a bug where UnauthorizedAccessException was not thrown immediately when attempting to enumerate directories without proper access. The fix moves the access control check from inside the enumeration implementation to before enumeration begins, ensuring the exception is thrown synchronously rather than when the enumeration is actually consumed.

Key Changes

  • Access control validation is now performed immediately when enumeration methods are called
  • Refactored enumeration implementation to separate access checking from the actual enumeration logic
  • Added comprehensive tests to verify the immediate exception behavior

@vbreuss vbreuss self-assigned this Sep 12, 2025
Copilot AI review requested due to automatic review settings September 12, 2025 05:45
@vbreuss vbreuss added the bug Something isn't working label Sep 12, 2025
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR fixes a bug where UnauthorizedAccessException was not thrown immediately when attempting to enumerate directories without proper access. The fix moves the access control check from inside the enumeration implementation to before enumeration begins, ensuring the exception is thrown synchronously rather than when the enumeration is actually consumed.

Key Changes

  • Access control validation is now performed immediately when enumeration methods are called
  • Refactored enumeration implementation to separate access checking from the actual enumeration logic
  • Added comprehensive tests to verify the immediate exception behavior

Reviewed Changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 4 comments.

File Description
Tests/Testably.Abstractions.Testing.Tests/FileSystem/DirectoryMockTests.cs Adds new test class with tests verifying immediate UnauthorizedAccessException for directory enumeration methods
Source/Testably.Abstractions.Testing/Storage/InMemoryStorage.cs Refactors enumeration logic to check access permissions immediately rather than during lazy enumeration

@github-actions
Copy link

Test Results

    37 files  ± 0      37 suites  ±0   20m 58s ⏱️ -25s
44 294 tests + 4  41 862 ✅ +1  2 429 💤 ±0   3 ❌ + 3 
86 037 runs  +21  76 994 ✅ +9  9 031 💤 ±0  12 ❌ +12 

For more details on these failures, see this check.

Results for commit a5e501e. ± Comparison against base commit b16c3ce.

This pull request removes 36327 and adds 36331 tests. Note that renamed tests count towards both.
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path03f44b0a-7367-4563-9674-c48acdb0ecb7")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path0ceaf400-bafd-4d63-aaab-8b7ec2706ac8")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path836683cb-352c-47fc-9cb2-0b9c1f1440e0")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "patha15df330-53bc-4942-a9e8-2472d720e5e3")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathdfb61204-b8bf-4936-a5d6-b910a05333c6")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathe22faab2-506e-4e14-a11b-23a79d5454f4")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathe515a691-f363-4ee6-ab7b-633cd14d215f")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path2d23c749-0f66-4e79-8f32-39bc8df9acee")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path3e438f07-f4ee-4233-9962-6dd65b66c1d4")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path3fa7cebd-3e28-4254-bbad-fc91e5c6ad34")
…
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path1fd71bb5-155a-40b9-a549-15a21d8d8bc4")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path60fcfb73-9a4b-4d21-9905-fefe85823fed")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path85001132-1062-4b97-b487-d34979ceee40")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "patha6cf3cba-6b16-41cf-a4bd-36fd1a853d10")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathb7897580-2968-432d-8b49-c550cb65c424")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathb8cc4a83-b9ca-48b6-a9fb-7c72582635ef")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "patheca7e646-0a2f-473d-a356-9bd93efbe26c")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path0dade4d9-46fc-48e4-9081-5edbbb82b1bc")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path6fbc94c8-611e-49be-926d-30ba7d4beb79")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path95df61a0-beb9-4bec-a611-6c13754aee9b")
…
This pull request removes 1784 skipped tests and adds 1784 skipped tests. Note that renamed tests count towards both.
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path03f44b0a-7367-4563-9674-c48acdb0ecb7")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path0ceaf400-bafd-4d63-aaab-8b7ec2706ac8")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathdfb61204-b8bf-4936-a5d6-b910a05333c6")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathe515a691-f363-4ee6-ab7b-633cd14d215f")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path2d23c749-0f66-4e79-8f32-39bc8df9acee")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathadc92964-4ce6-4d49-9432-592c323f19a4")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathc4b22721-d33a-4c76-bdb1-5da2dc491c1b")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathdee0520a-c471-4253-bc1b-e0a932e78a00")
Testably.Abstractions.Testing.Tests.FileSystem.FileMockTests ‑ GetUnixFileMode_SafeFileHandle_ShouldThrowPlatformNotSupportedExceptionOnWindows(path: "path2cda6d4c-628b-4056-aa14-f932422d175d")
Testably.Abstractions.Testing.Tests.FileSystem.FileMockTests ‑ GetUnixFileMode_SafeFileHandle_ShouldThrowPlatformNotSupportedExceptionOnWindows(path: "path62f185bf-2c14-4356-863a-1b84462e14d9")
…
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path60fcfb73-9a4b-4d21-9905-fefe85823fed")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path85001132-1062-4b97-b487-d34979ceee40")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathb7897580-2968-432d-8b49-c550cb65c424")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+MockFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "patheca7e646-0a2f-473d-a356-9bd93efbe26c")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path0dade4d9-46fc-48e4-9081-5edbbb82b1bc")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "path95df61a0-beb9-4bec-a611-6c13754aee9b")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathe5a0c497-d4a2-4dab-97d0-bfbd167c67ed")
Testably.Abstractions.AccessControl.Tests.DirectoryInfoAclExtensionsTests+RealFileSystemTests ‑ SetAccessControl_ShouldNotUpdateTimes(path: "pathf06ce379-305e-41b8-8db9-ac5ee9b5e27e")
Testably.Abstractions.Testing.Tests.FileSystem.FileMockTests ‑ GetUnixFileMode_SafeFileHandle_ShouldThrowPlatformNotSupportedExceptionOnWindows(path: "path50d94e47-f088-40cf-8f8c-f7ba588e2e58")
Testably.Abstractions.Testing.Tests.FileSystem.FileMockTests ‑ GetUnixFileMode_SafeFileHandle_ShouldThrowPlatformNotSupportedExceptionOnWindows(path: "path96048ee7-7ff2-4425-9b80-6e817ca2fd6a")
…

@vbreuss vbreuss enabled auto-merge (squash) September 12, 2025 06:27
@sonarqubecloud
Copy link

@vbreuss vbreuss merged commit d055a3a into main Sep 12, 2025
13 checks passed
@vbreuss vbreuss deleted the topic/throw-unauthorizedaccessexception-when-enumerating-a-directory branch September 12, 2025 06:51
@github-actions
Copy link

This is addressed in release v4.3.7.

This was referenced Sep 12, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working state: released

Projects

None yet

Development

Successfully merging this pull request may close these issues.

DirectoryMock.EnumerateDirectories does not throw exceptions until enumerated

2 participants