Improve FileSystem tests on FAT32 temp volumes - #130369

Open
Sahithbasani wants to merge 3 commits into
dotnet:mainfrom
Sahithbasani:sahit/issue-66544-fat32-filesystem-tests
Open

Improve FileSystem tests on FAT32 temp volumes#130369
Sahithbasani wants to merge 3 commits into
dotnet:mainfrom
Sahithbasani:sahit/issue-66544-fat32-filesystem-tests

Conversation

@Sahithbasani

Copy link
Copy Markdown
Contributor

Fixes#66544

Summary

  • Add shared temp-volume capability helpers for FAT32, large-file support, alternate data streams, and delete-open-file behavior.
  • Adjust System.IO.FileSystem tests so FAT32 temp volumes use safer timestamp expectations and skip capabilities the volume cannot support.
  • Reuse the shared helpers across File, FileStream, Directory, and LargeFile test cases instead of scattered local detection.

Impact

This should reduce false failures when the test temp path is on FAT32, while keeping the existing assertions active on file systems that support the required capabilities.

Validation

  • git diff --check
  • Roslyn syntax sanity check over the edited C# files using the repo-local compiler package
  • Attempted targeted System.IO.FileSystem.Tests project builds, but the builds did not finish within the local time budget on this machine

@Sahithbasani

Copy link
Copy Markdown
ContributorAuthor

@dotnet-policy-service agree

@Sahithbasani
Sahithbasani marked this pull request as ready for review July 9, 2026 23:16

@jeffhandleyjeffhandley left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Note

This review was generated by the holistic code review workflow being iterated on as part of #130339. Please treat its findings as assistive input for human review.

Holistic Review

Motivation: The linked issue is a real test-infrastructure gap: System.IO.FileSystem.Tests has explicit FAT32 coverage intent, and the existing tests assume NTFS-like ADS, large-file, delete-pending, and timestamp behavior. Improving these tests is justified as long as the changes preserve coverage on capable file systems.

Approach: Centralizing temp-volume capability probes in FileSystemTest is a good direction, and the ADS / large-file / delete-open-file adjustments are narrowly targeted to the temp volume actually used by FileCleanupTestBase. I have one unresolved FAT timestamp concern that needs someone with a FAT32 run (or area expertise) to confirm.

Summary: ⚠️ Needs Human Review. The change looks mostly well-scoped, but a human should focus on whether the timestamp tests still assert exact last-access times on FAT/FAT32 even though Windows documents FAT access time as date-only. Please also sanity-check whether symlink tests remain appropriately skipped on FAT32 when MountHelper.CanCreateSymbolicLinks is evaluated in elevated Windows environments.


Detailed Findings

⚠️ Test Quality — FAT32 last-access timestamp granularity may still be over-asserted

BaseGetSetTimes<T>.SettingUpdatesPropertiesCore now chooses an even second on FAT32 (Base/BaseGetSetTimes.cs:20-24, :78), which addresses FAT write-time's 2-second resolution, and File/GetSetTimes.cs:116-127 still includes both local and UTC last-access time setters/getters in the exact round-trip assertions. However, the Win32 file-time documentation says FAT write time has 2-second resolution while access time has 1-day resolution (it is really the access date): https://learn.microsoft.com/windows/win32/sysinfo/file-times.

If FAT32 returns last-access times with the time-of-day truncated, SettingUpdatesProperties, SettingUpdatesPropertiesAfterAnother, and the symlink variants will still fail on FAT32 despite the new MilliSecondTemporalResolution/even-second handling. I did not run against a FAT32 temp volume, so this is a human-review item rather than a firm blocker, but the central FAT32 timestamp assumption should be verified before relying on this PR to make the test suite pass there.

⚠️ Test Scope — symlink capability may still be filesystem-sensitive on FAT32

The changed timestamp base class still runs SettingPropertiesOnSymlink under [ConditionalTheory(typeof(MountHelper), nameof(MountHelper.CanCreateSymbolicLinks))] (Base/BaseGetSetTimes.cs:119-123). MountHelper.CanCreateSymbolicLinks probes by attempting to create links under Path.GetTempPath(), but its Windows failure path asserts that a privileged process should not fail (src/libraries/Common/tests/System/IO/ReparsePointUtilities.cs:62-80), while the linked issue discussion notes FAT32 itself does not support symlinks.

This may already skip correctly for normal unelevated FAT32 runs, but it is worth a human check for elevated Windows / Developer Mode scenarios: unsupported filesystem capability should ideally skip tests, not fail during condition evaluation.

✅ Test Quality — capability skips are mostly narrow and preserve existing coverage elsewhere

The new SupportsAlternateDataStreams, TempPathSupportsLargeFiles, IsTempPathOnFat32, and DeletesOpenFileNameImmediately helpers are based on the same Path.GetTempPath() root used by FileCleanupTestBase, so the conditions track the volume under test rather than hardcoding a drive. ADS tests remain active when a live probe succeeds, large-file tests are skipped only for FAT32, and delete-open-file expectations remain unchanged for non-FAT32 Windows versions.

@github-actions

github-actionsBot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Workflow state for the Holistic Review Orchestrator.

{
"version": 5,
"last_dispatched_commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"last_dispatched_base_ref": "main",
"last_dispatched_base_sha": "7abe5f60c079129a57c358451cfe01ee198fa40f",
"last_reviewed_commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"last_reviewed_base_ref": "main",
"last_reviewed_base_sha": "7abe5f60c079129a57c358451cfe01ee198fa40f",
"last_recorded_worker_run_id": "29686398719",
"review_attempt_commit": "",
"review_attempt_base_ref": "",
"review_attempt_count": 0,
"max_review_attempts": 5,
"review_history_format": "holistic-review-disclosure-v1",
"review_history": [
{
"commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"review_id": 4730735805
}
]
}

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Holistic Review

Motivation: Fixes #66544. The System.IO.FileSystem tests generate hundreds of false failures when the temp path resides on a FAT32 volume, because they assume capabilities FAT32 lacks: alternate data streams (ADS), sub-second timestamp resolution, files larger than 4 GB, and immediate deletion of files with open handles. The goal is to make these tests pass on FAT32 while keeping the assertions active on file systems that do support those capabilities.

Approach: The PR centralizes temp-volume capability detection into FileSystemTest via lazily-evaluated static helpers (TempDriveFormat, IsTempPathOnFat32, TempPathSupportsLargeFiles, DeletesOpenFileNameImmediately, SupportsAlternateDataStreams). It then replaces scattered, local FAT32/Windows detection (notably the duplicated P/Invoke GetVolumeInformation block in ctor_options.Windows.cs) with these shared helpers. ADS-dependent theories are converted to ConditionalTheory/ConditionalFact gated on SupportsAlternateDataStreams; timestamp tests widen tolerance and use a FAT32-safe seconds value; large-file tests are gated on TempPathSupportsLargeFiles; and open-handle delete tests use DeletesOpenFileNameImmediately. This is a focused, test-only change with no product code impact.

Summary: This is a well-scoped, correct improvement that directly addresses the four failure categories enumerated in the issue and removes duplicated interop code in favor of a single shared detection point. SupportsAlternateDataStreams is a sound design choice: it probes actual behavior (attempt to write/read an ADS) rather than inferring from the volume format, which is more robust than a pure FAT32 check. The lazy caching avoids repeated DriveInfo/probe cost, and the probe cleans up its temp file in a finally. I have one non-blocking inline note about exception-type exactness in InvalidPath_Core. Overall this looks good to merge; verify via CI that the affected test assemblies still build and pass on the standard (non-FAT32) NTFS/Unix legs, since the change touches many [Theory][ConditionalTheory] attribute conversions.

Detailed Findings

No blocking issues. One minor, non-actionable observation left inline on Directory/GetFileSystemEntries_str.cs regarding Assert.Throws<IOException> matching the exact type rather than derived types when SupportsAlternateDataStreams is false.

Note

This review was generated by this repository's Holistic Review agentic workflow to complement the built-in Copilot review.

Generated by Holistic Review · 92 AIC · ⌖ 10.7 AIC · ⊞ 10K

@Sahithbasani
Sahithbasaniforce-pushed the sahit/issue-66544-fat32-filesystem-tests branch from 7687e75 to bd7a21fCompareAugust 2, 2026 16:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-System.IOcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

System.IO.FileSystem tests fail all over with temp on Fat32

2 participants

@Sahithbasani@jeffhandley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Improve FileSystem tests on FAT32 temp volumes - #130369

Open
Sahithbasani wants to merge 3 commits into
dotnet:mainfrom
Sahithbasani:sahit/issue-66544-fat32-filesystem-tests
Open

Improve FileSystem tests on FAT32 temp volumes#130369
Sahithbasani wants to merge 3 commits into
dotnet:mainfrom
Sahithbasani:sahit/issue-66544-fat32-filesystem-tests

Conversation

@Sahithbasani

Copy link
Copy Markdown
Contributor

Fixes#66544

Summary

  • Add shared temp-volume capability helpers for FAT32, large-file support, alternate data streams, and delete-open-file behavior.
  • Adjust System.IO.FileSystem tests so FAT32 temp volumes use safer timestamp expectations and skip capabilities the volume cannot support.
  • Reuse the shared helpers across File, FileStream, Directory, and LargeFile test cases instead of scattered local detection.

Impact

This should reduce false failures when the test temp path is on FAT32, while keeping the existing assertions active on file systems that support the required capabilities.

Validation

  • git diff --check
  • Roslyn syntax sanity check over the edited C# files using the repo-local compiler package
  • Attempted targeted System.IO.FileSystem.Tests project builds, but the builds did not finish within the local time budget on this machine

@Sahithbasani

Copy link
Copy Markdown
ContributorAuthor

@dotnet-policy-service agree

@Sahithbasani
Sahithbasani marked this pull request as ready for review July 9, 2026 23:16

@jeffhandleyjeffhandley left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Note

This review was generated by the holistic code review workflow being iterated on as part of #130339. Please treat its findings as assistive input for human review.

Holistic Review

Motivation: The linked issue is a real test-infrastructure gap: System.IO.FileSystem.Tests has explicit FAT32 coverage intent, and the existing tests assume NTFS-like ADS, large-file, delete-pending, and timestamp behavior. Improving these tests is justified as long as the changes preserve coverage on capable file systems.

Approach: Centralizing temp-volume capability probes in FileSystemTest is a good direction, and the ADS / large-file / delete-open-file adjustments are narrowly targeted to the temp volume actually used by FileCleanupTestBase. I have one unresolved FAT timestamp concern that needs someone with a FAT32 run (or area expertise) to confirm.

Summary: ⚠️ Needs Human Review. The change looks mostly well-scoped, but a human should focus on whether the timestamp tests still assert exact last-access times on FAT/FAT32 even though Windows documents FAT access time as date-only. Please also sanity-check whether symlink tests remain appropriately skipped on FAT32 when MountHelper.CanCreateSymbolicLinks is evaluated in elevated Windows environments.


Detailed Findings

⚠️ Test Quality — FAT32 last-access timestamp granularity may still be over-asserted

BaseGetSetTimes<T>.SettingUpdatesPropertiesCore now chooses an even second on FAT32 (Base/BaseGetSetTimes.cs:20-24, :78), which addresses FAT write-time's 2-second resolution, and File/GetSetTimes.cs:116-127 still includes both local and UTC last-access time setters/getters in the exact round-trip assertions. However, the Win32 file-time documentation says FAT write time has 2-second resolution while access time has 1-day resolution (it is really the access date): https://learn.microsoft.com/windows/win32/sysinfo/file-times.

If FAT32 returns last-access times with the time-of-day truncated, SettingUpdatesProperties, SettingUpdatesPropertiesAfterAnother, and the symlink variants will still fail on FAT32 despite the new MilliSecondTemporalResolution/even-second handling. I did not run against a FAT32 temp volume, so this is a human-review item rather than a firm blocker, but the central FAT32 timestamp assumption should be verified before relying on this PR to make the test suite pass there.

⚠️ Test Scope — symlink capability may still be filesystem-sensitive on FAT32

The changed timestamp base class still runs SettingPropertiesOnSymlink under [ConditionalTheory(typeof(MountHelper), nameof(MountHelper.CanCreateSymbolicLinks))] (Base/BaseGetSetTimes.cs:119-123). MountHelper.CanCreateSymbolicLinks probes by attempting to create links under Path.GetTempPath(), but its Windows failure path asserts that a privileged process should not fail (src/libraries/Common/tests/System/IO/ReparsePointUtilities.cs:62-80), while the linked issue discussion notes FAT32 itself does not support symlinks.

This may already skip correctly for normal unelevated FAT32 runs, but it is worth a human check for elevated Windows / Developer Mode scenarios: unsupported filesystem capability should ideally skip tests, not fail during condition evaluation.

✅ Test Quality — capability skips are mostly narrow and preserve existing coverage elsewhere

The new SupportsAlternateDataStreams, TempPathSupportsLargeFiles, IsTempPathOnFat32, and DeletesOpenFileNameImmediately helpers are based on the same Path.GetTempPath() root used by FileCleanupTestBase, so the conditions track the volume under test rather than hardcoding a drive. ADS tests remain active when a live probe succeeds, large-file tests are skipped only for FAT32, and delete-open-file expectations remain unchanged for non-FAT32 Windows versions.

@github-actions

github-actionsBot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Workflow state for the Holistic Review Orchestrator.

{
"version": 5,
"last_dispatched_commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"last_dispatched_base_ref": "main",
"last_dispatched_base_sha": "7abe5f60c079129a57c358451cfe01ee198fa40f",
"last_reviewed_commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"last_reviewed_base_ref": "main",
"last_reviewed_base_sha": "7abe5f60c079129a57c358451cfe01ee198fa40f",
"last_recorded_worker_run_id": "29686398719",
"review_attempt_commit": "",
"review_attempt_base_ref": "",
"review_attempt_count": 0,
"max_review_attempts": 5,
"review_history_format": "holistic-review-disclosure-v1",
"review_history": [
{
"commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"review_id": 4730735805
}
]
}

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Holistic Review

Motivation: Fixes #66544. The System.IO.FileSystem tests generate hundreds of false failures when the temp path resides on a FAT32 volume, because they assume capabilities FAT32 lacks: alternate data streams (ADS), sub-second timestamp resolution, files larger than 4 GB, and immediate deletion of files with open handles. The goal is to make these tests pass on FAT32 while keeping the assertions active on file systems that do support those capabilities.

Approach: The PR centralizes temp-volume capability detection into FileSystemTest via lazily-evaluated static helpers (TempDriveFormat, IsTempPathOnFat32, TempPathSupportsLargeFiles, DeletesOpenFileNameImmediately, SupportsAlternateDataStreams). It then replaces scattered, local FAT32/Windows detection (notably the duplicated P/Invoke GetVolumeInformation block in ctor_options.Windows.cs) with these shared helpers. ADS-dependent theories are converted to ConditionalTheory/ConditionalFact gated on SupportsAlternateDataStreams; timestamp tests widen tolerance and use a FAT32-safe seconds value; large-file tests are gated on TempPathSupportsLargeFiles; and open-handle delete tests use DeletesOpenFileNameImmediately. This is a focused, test-only change with no product code impact.

Summary: This is a well-scoped, correct improvement that directly addresses the four failure categories enumerated in the issue and removes duplicated interop code in favor of a single shared detection point. SupportsAlternateDataStreams is a sound design choice: it probes actual behavior (attempt to write/read an ADS) rather than inferring from the volume format, which is more robust than a pure FAT32 check. The lazy caching avoids repeated DriveInfo/probe cost, and the probe cleans up its temp file in a finally. I have one non-blocking inline note about exception-type exactness in InvalidPath_Core. Overall this looks good to merge; verify via CI that the affected test assemblies still build and pass on the standard (non-FAT32) NTFS/Unix legs, since the change touches many [Theory][ConditionalTheory] attribute conversions.

Detailed Findings

No blocking issues. One minor, non-actionable observation left inline on Directory/GetFileSystemEntries_str.cs regarding Assert.Throws<IOException> matching the exact type rather than derived types when SupportsAlternateDataStreams is false.

Note

This review was generated by this repository's Holistic Review agentic workflow to complement the built-in Copilot review.

Generated by Holistic Review · 92 AIC · ⌖ 10.7 AIC · ⊞ 10K

@Sahithbasani
Sahithbasaniforce-pushed the sahit/issue-66544-fat32-filesystem-tests branch from 7687e75 to bd7a21fCompareAugust 2, 2026 16:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-System.IOcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

System.IO.FileSystem tests fail all over with temp on Fat32

2 participants

@Sahithbasani@jeffhandley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Improve FileSystem tests on FAT32 temp volumes - #130369

Open
Sahithbasani wants to merge 3 commits into
dotnet:mainfrom
Sahithbasani:sahit/issue-66544-fat32-filesystem-tests
Open

Improve FileSystem tests on FAT32 temp volumes#130369
Sahithbasani wants to merge 3 commits into
dotnet:mainfrom
Sahithbasani:sahit/issue-66544-fat32-filesystem-tests

Conversation

@Sahithbasani

Copy link
Copy Markdown
Contributor

Fixes#66544

Summary

  • Add shared temp-volume capability helpers for FAT32, large-file support, alternate data streams, and delete-open-file behavior.
  • Adjust System.IO.FileSystem tests so FAT32 temp volumes use safer timestamp expectations and skip capabilities the volume cannot support.
  • Reuse the shared helpers across File, FileStream, Directory, and LargeFile test cases instead of scattered local detection.

Impact

This should reduce false failures when the test temp path is on FAT32, while keeping the existing assertions active on file systems that support the required capabilities.

Validation

  • git diff --check
  • Roslyn syntax sanity check over the edited C# files using the repo-local compiler package
  • Attempted targeted System.IO.FileSystem.Tests project builds, but the builds did not finish within the local time budget on this machine

@Sahithbasani

Copy link
Copy Markdown
ContributorAuthor

@dotnet-policy-service agree

@Sahithbasani
Sahithbasani marked this pull request as ready for review July 9, 2026 23:16

@jeffhandleyjeffhandley left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Note

This review was generated by the holistic code review workflow being iterated on as part of #130339. Please treat its findings as assistive input for human review.

Holistic Review

Motivation: The linked issue is a real test-infrastructure gap: System.IO.FileSystem.Tests has explicit FAT32 coverage intent, and the existing tests assume NTFS-like ADS, large-file, delete-pending, and timestamp behavior. Improving these tests is justified as long as the changes preserve coverage on capable file systems.

Approach: Centralizing temp-volume capability probes in FileSystemTest is a good direction, and the ADS / large-file / delete-open-file adjustments are narrowly targeted to the temp volume actually used by FileCleanupTestBase. I have one unresolved FAT timestamp concern that needs someone with a FAT32 run (or area expertise) to confirm.

Summary: ⚠️ Needs Human Review. The change looks mostly well-scoped, but a human should focus on whether the timestamp tests still assert exact last-access times on FAT/FAT32 even though Windows documents FAT access time as date-only. Please also sanity-check whether symlink tests remain appropriately skipped on FAT32 when MountHelper.CanCreateSymbolicLinks is evaluated in elevated Windows environments.


Detailed Findings

⚠️ Test Quality — FAT32 last-access timestamp granularity may still be over-asserted

BaseGetSetTimes<T>.SettingUpdatesPropertiesCore now chooses an even second on FAT32 (Base/BaseGetSetTimes.cs:20-24, :78), which addresses FAT write-time's 2-second resolution, and File/GetSetTimes.cs:116-127 still includes both local and UTC last-access time setters/getters in the exact round-trip assertions. However, the Win32 file-time documentation says FAT write time has 2-second resolution while access time has 1-day resolution (it is really the access date): https://learn.microsoft.com/windows/win32/sysinfo/file-times.

If FAT32 returns last-access times with the time-of-day truncated, SettingUpdatesProperties, SettingUpdatesPropertiesAfterAnother, and the symlink variants will still fail on FAT32 despite the new MilliSecondTemporalResolution/even-second handling. I did not run against a FAT32 temp volume, so this is a human-review item rather than a firm blocker, but the central FAT32 timestamp assumption should be verified before relying on this PR to make the test suite pass there.

⚠️ Test Scope — symlink capability may still be filesystem-sensitive on FAT32

The changed timestamp base class still runs SettingPropertiesOnSymlink under [ConditionalTheory(typeof(MountHelper), nameof(MountHelper.CanCreateSymbolicLinks))] (Base/BaseGetSetTimes.cs:119-123). MountHelper.CanCreateSymbolicLinks probes by attempting to create links under Path.GetTempPath(), but its Windows failure path asserts that a privileged process should not fail (src/libraries/Common/tests/System/IO/ReparsePointUtilities.cs:62-80), while the linked issue discussion notes FAT32 itself does not support symlinks.

This may already skip correctly for normal unelevated FAT32 runs, but it is worth a human check for elevated Windows / Developer Mode scenarios: unsupported filesystem capability should ideally skip tests, not fail during condition evaluation.

✅ Test Quality — capability skips are mostly narrow and preserve existing coverage elsewhere

The new SupportsAlternateDataStreams, TempPathSupportsLargeFiles, IsTempPathOnFat32, and DeletesOpenFileNameImmediately helpers are based on the same Path.GetTempPath() root used by FileCleanupTestBase, so the conditions track the volume under test rather than hardcoding a drive. ADS tests remain active when a live probe succeeds, large-file tests are skipped only for FAT32, and delete-open-file expectations remain unchanged for non-FAT32 Windows versions.

@github-actions

github-actionsBot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Workflow state for the Holistic Review Orchestrator.

{
"version": 5,
"last_dispatched_commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"last_dispatched_base_ref": "main",
"last_dispatched_base_sha": "7abe5f60c079129a57c358451cfe01ee198fa40f",
"last_reviewed_commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"last_reviewed_base_ref": "main",
"last_reviewed_base_sha": "7abe5f60c079129a57c358451cfe01ee198fa40f",
"last_recorded_worker_run_id": "29686398719",
"review_attempt_commit": "",
"review_attempt_base_ref": "",
"review_attempt_count": 0,
"max_review_attempts": 5,
"review_history_format": "holistic-review-disclosure-v1",
"review_history": [
{
"commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"review_id": 4730735805
}
]
}

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Holistic Review

Motivation: Fixes #66544. The System.IO.FileSystem tests generate hundreds of false failures when the temp path resides on a FAT32 volume, because they assume capabilities FAT32 lacks: alternate data streams (ADS), sub-second timestamp resolution, files larger than 4 GB, and immediate deletion of files with open handles. The goal is to make these tests pass on FAT32 while keeping the assertions active on file systems that do support those capabilities.

Approach: The PR centralizes temp-volume capability detection into FileSystemTest via lazily-evaluated static helpers (TempDriveFormat, IsTempPathOnFat32, TempPathSupportsLargeFiles, DeletesOpenFileNameImmediately, SupportsAlternateDataStreams). It then replaces scattered, local FAT32/Windows detection (notably the duplicated P/Invoke GetVolumeInformation block in ctor_options.Windows.cs) with these shared helpers. ADS-dependent theories are converted to ConditionalTheory/ConditionalFact gated on SupportsAlternateDataStreams; timestamp tests widen tolerance and use a FAT32-safe seconds value; large-file tests are gated on TempPathSupportsLargeFiles; and open-handle delete tests use DeletesOpenFileNameImmediately. This is a focused, test-only change with no product code impact.

Summary: This is a well-scoped, correct improvement that directly addresses the four failure categories enumerated in the issue and removes duplicated interop code in favor of a single shared detection point. SupportsAlternateDataStreams is a sound design choice: it probes actual behavior (attempt to write/read an ADS) rather than inferring from the volume format, which is more robust than a pure FAT32 check. The lazy caching avoids repeated DriveInfo/probe cost, and the probe cleans up its temp file in a finally. I have one non-blocking inline note about exception-type exactness in InvalidPath_Core. Overall this looks good to merge; verify via CI that the affected test assemblies still build and pass on the standard (non-FAT32) NTFS/Unix legs, since the change touches many [Theory][ConditionalTheory] attribute conversions.

Detailed Findings

No blocking issues. One minor, non-actionable observation left inline on Directory/GetFileSystemEntries_str.cs regarding Assert.Throws<IOException> matching the exact type rather than derived types when SupportsAlternateDataStreams is false.

Note

This review was generated by this repository's Holistic Review agentic workflow to complement the built-in Copilot review.

Generated by Holistic Review · 92 AIC · ⌖ 10.7 AIC · ⊞ 10K

@Sahithbasani
Sahithbasaniforce-pushed the sahit/issue-66544-fat32-filesystem-tests branch from 7687e75 to bd7a21fCompareAugust 2, 2026 16:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-System.IOcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

System.IO.FileSystem tests fail all over with temp on Fat32

2 participants

@Sahithbasani@jeffhandley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Improve FileSystem tests on FAT32 temp volumes - #130369

Open
Sahithbasani wants to merge 3 commits into
dotnet:mainfrom
Sahithbasani:sahit/issue-66544-fat32-filesystem-tests
Open

Improve FileSystem tests on FAT32 temp volumes#130369
Sahithbasani wants to merge 3 commits into
dotnet:mainfrom
Sahithbasani:sahit/issue-66544-fat32-filesystem-tests

Conversation

@Sahithbasani

Copy link
Copy Markdown
Contributor

Fixes#66544

Summary

  • Add shared temp-volume capability helpers for FAT32, large-file support, alternate data streams, and delete-open-file behavior.
  • Adjust System.IO.FileSystem tests so FAT32 temp volumes use safer timestamp expectations and skip capabilities the volume cannot support.
  • Reuse the shared helpers across File, FileStream, Directory, and LargeFile test cases instead of scattered local detection.

Impact

This should reduce false failures when the test temp path is on FAT32, while keeping the existing assertions active on file systems that support the required capabilities.

Validation

  • git diff --check
  • Roslyn syntax sanity check over the edited C# files using the repo-local compiler package
  • Attempted targeted System.IO.FileSystem.Tests project builds, but the builds did not finish within the local time budget on this machine

@Sahithbasani

Copy link
Copy Markdown
ContributorAuthor

@dotnet-policy-service agree

@Sahithbasani
Sahithbasani marked this pull request as ready for review July 9, 2026 23:16

@jeffhandleyjeffhandley left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Note

This review was generated by the holistic code review workflow being iterated on as part of #130339. Please treat its findings as assistive input for human review.

Holistic Review

Motivation: The linked issue is a real test-infrastructure gap: System.IO.FileSystem.Tests has explicit FAT32 coverage intent, and the existing tests assume NTFS-like ADS, large-file, delete-pending, and timestamp behavior. Improving these tests is justified as long as the changes preserve coverage on capable file systems.

Approach: Centralizing temp-volume capability probes in FileSystemTest is a good direction, and the ADS / large-file / delete-open-file adjustments are narrowly targeted to the temp volume actually used by FileCleanupTestBase. I have one unresolved FAT timestamp concern that needs someone with a FAT32 run (or area expertise) to confirm.

Summary: ⚠️ Needs Human Review. The change looks mostly well-scoped, but a human should focus on whether the timestamp tests still assert exact last-access times on FAT/FAT32 even though Windows documents FAT access time as date-only. Please also sanity-check whether symlink tests remain appropriately skipped on FAT32 when MountHelper.CanCreateSymbolicLinks is evaluated in elevated Windows environments.


Detailed Findings

⚠️ Test Quality — FAT32 last-access timestamp granularity may still be over-asserted

BaseGetSetTimes<T>.SettingUpdatesPropertiesCore now chooses an even second on FAT32 (Base/BaseGetSetTimes.cs:20-24, :78), which addresses FAT write-time's 2-second resolution, and File/GetSetTimes.cs:116-127 still includes both local and UTC last-access time setters/getters in the exact round-trip assertions. However, the Win32 file-time documentation says FAT write time has 2-second resolution while access time has 1-day resolution (it is really the access date): https://learn.microsoft.com/windows/win32/sysinfo/file-times.

If FAT32 returns last-access times with the time-of-day truncated, SettingUpdatesProperties, SettingUpdatesPropertiesAfterAnother, and the symlink variants will still fail on FAT32 despite the new MilliSecondTemporalResolution/even-second handling. I did not run against a FAT32 temp volume, so this is a human-review item rather than a firm blocker, but the central FAT32 timestamp assumption should be verified before relying on this PR to make the test suite pass there.

⚠️ Test Scope — symlink capability may still be filesystem-sensitive on FAT32

The changed timestamp base class still runs SettingPropertiesOnSymlink under [ConditionalTheory(typeof(MountHelper), nameof(MountHelper.CanCreateSymbolicLinks))] (Base/BaseGetSetTimes.cs:119-123). MountHelper.CanCreateSymbolicLinks probes by attempting to create links under Path.GetTempPath(), but its Windows failure path asserts that a privileged process should not fail (src/libraries/Common/tests/System/IO/ReparsePointUtilities.cs:62-80), while the linked issue discussion notes FAT32 itself does not support symlinks.

This may already skip correctly for normal unelevated FAT32 runs, but it is worth a human check for elevated Windows / Developer Mode scenarios: unsupported filesystem capability should ideally skip tests, not fail during condition evaluation.

✅ Test Quality — capability skips are mostly narrow and preserve existing coverage elsewhere

The new SupportsAlternateDataStreams, TempPathSupportsLargeFiles, IsTempPathOnFat32, and DeletesOpenFileNameImmediately helpers are based on the same Path.GetTempPath() root used by FileCleanupTestBase, so the conditions track the volume under test rather than hardcoding a drive. ADS tests remain active when a live probe succeeds, large-file tests are skipped only for FAT32, and delete-open-file expectations remain unchanged for non-FAT32 Windows versions.

@github-actions

github-actionsBot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Workflow state for the Holistic Review Orchestrator.

{
"version": 5,
"last_dispatched_commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"last_dispatched_base_ref": "main",
"last_dispatched_base_sha": "7abe5f60c079129a57c358451cfe01ee198fa40f",
"last_reviewed_commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"last_reviewed_base_ref": "main",
"last_reviewed_base_sha": "7abe5f60c079129a57c358451cfe01ee198fa40f",
"last_recorded_worker_run_id": "29686398719",
"review_attempt_commit": "",
"review_attempt_base_ref": "",
"review_attempt_count": 0,
"max_review_attempts": 5,
"review_history_format": "holistic-review-disclosure-v1",
"review_history": [
{
"commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"review_id": 4730735805
}
]
}

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Holistic Review

Motivation: Fixes #66544. The System.IO.FileSystem tests generate hundreds of false failures when the temp path resides on a FAT32 volume, because they assume capabilities FAT32 lacks: alternate data streams (ADS), sub-second timestamp resolution, files larger than 4 GB, and immediate deletion of files with open handles. The goal is to make these tests pass on FAT32 while keeping the assertions active on file systems that do support those capabilities.

Approach: The PR centralizes temp-volume capability detection into FileSystemTest via lazily-evaluated static helpers (TempDriveFormat, IsTempPathOnFat32, TempPathSupportsLargeFiles, DeletesOpenFileNameImmediately, SupportsAlternateDataStreams). It then replaces scattered, local FAT32/Windows detection (notably the duplicated P/Invoke GetVolumeInformation block in ctor_options.Windows.cs) with these shared helpers. ADS-dependent theories are converted to ConditionalTheory/ConditionalFact gated on SupportsAlternateDataStreams; timestamp tests widen tolerance and use a FAT32-safe seconds value; large-file tests are gated on TempPathSupportsLargeFiles; and open-handle delete tests use DeletesOpenFileNameImmediately. This is a focused, test-only change with no product code impact.

Summary: This is a well-scoped, correct improvement that directly addresses the four failure categories enumerated in the issue and removes duplicated interop code in favor of a single shared detection point. SupportsAlternateDataStreams is a sound design choice: it probes actual behavior (attempt to write/read an ADS) rather than inferring from the volume format, which is more robust than a pure FAT32 check. The lazy caching avoids repeated DriveInfo/probe cost, and the probe cleans up its temp file in a finally. I have one non-blocking inline note about exception-type exactness in InvalidPath_Core. Overall this looks good to merge; verify via CI that the affected test assemblies still build and pass on the standard (non-FAT32) NTFS/Unix legs, since the change touches many [Theory][ConditionalTheory] attribute conversions.

Detailed Findings

No blocking issues. One minor, non-actionable observation left inline on Directory/GetFileSystemEntries_str.cs regarding Assert.Throws<IOException> matching the exact type rather than derived types when SupportsAlternateDataStreams is false.

Note

This review was generated by this repository's Holistic Review agentic workflow to complement the built-in Copilot review.

Generated by Holistic Review · 92 AIC · ⌖ 10.7 AIC · ⊞ 10K

@Sahithbasani
Sahithbasaniforce-pushed the sahit/issue-66544-fat32-filesystem-tests branch from 7687e75 to bd7a21fCompareAugust 2, 2026 16:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-System.IOcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

System.IO.FileSystem tests fail all over with temp on Fat32

2 participants

@Sahithbasani@jeffhandley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Improve FileSystem tests on FAT32 temp volumes - #130369

Open
Sahithbasani wants to merge 3 commits into
dotnet:mainfrom
Sahithbasani:sahit/issue-66544-fat32-filesystem-tests
Open

Improve FileSystem tests on FAT32 temp volumes#130369
Sahithbasani wants to merge 3 commits into
dotnet:mainfrom
Sahithbasani:sahit/issue-66544-fat32-filesystem-tests

Conversation

@Sahithbasani

Copy link
Copy Markdown
Contributor

Fixes#66544

Summary

  • Add shared temp-volume capability helpers for FAT32, large-file support, alternate data streams, and delete-open-file behavior.
  • Adjust System.IO.FileSystem tests so FAT32 temp volumes use safer timestamp expectations and skip capabilities the volume cannot support.
  • Reuse the shared helpers across File, FileStream, Directory, and LargeFile test cases instead of scattered local detection.

Impact

This should reduce false failures when the test temp path is on FAT32, while keeping the existing assertions active on file systems that support the required capabilities.

Validation

  • git diff --check
  • Roslyn syntax sanity check over the edited C# files using the repo-local compiler package
  • Attempted targeted System.IO.FileSystem.Tests project builds, but the builds did not finish within the local time budget on this machine

@Sahithbasani

Copy link
Copy Markdown
ContributorAuthor

@dotnet-policy-service agree

@Sahithbasani
Sahithbasani marked this pull request as ready for review July 9, 2026 23:16

@jeffhandleyjeffhandley left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Note

This review was generated by the holistic code review workflow being iterated on as part of #130339. Please treat its findings as assistive input for human review.

Holistic Review

Motivation: The linked issue is a real test-infrastructure gap: System.IO.FileSystem.Tests has explicit FAT32 coverage intent, and the existing tests assume NTFS-like ADS, large-file, delete-pending, and timestamp behavior. Improving these tests is justified as long as the changes preserve coverage on capable file systems.

Approach: Centralizing temp-volume capability probes in FileSystemTest is a good direction, and the ADS / large-file / delete-open-file adjustments are narrowly targeted to the temp volume actually used by FileCleanupTestBase. I have one unresolved FAT timestamp concern that needs someone with a FAT32 run (or area expertise) to confirm.

Summary: ⚠️ Needs Human Review. The change looks mostly well-scoped, but a human should focus on whether the timestamp tests still assert exact last-access times on FAT/FAT32 even though Windows documents FAT access time as date-only. Please also sanity-check whether symlink tests remain appropriately skipped on FAT32 when MountHelper.CanCreateSymbolicLinks is evaluated in elevated Windows environments.


Detailed Findings

⚠️ Test Quality — FAT32 last-access timestamp granularity may still be over-asserted

BaseGetSetTimes<T>.SettingUpdatesPropertiesCore now chooses an even second on FAT32 (Base/BaseGetSetTimes.cs:20-24, :78), which addresses FAT write-time's 2-second resolution, and File/GetSetTimes.cs:116-127 still includes both local and UTC last-access time setters/getters in the exact round-trip assertions. However, the Win32 file-time documentation says FAT write time has 2-second resolution while access time has 1-day resolution (it is really the access date): https://learn.microsoft.com/windows/win32/sysinfo/file-times.

If FAT32 returns last-access times with the time-of-day truncated, SettingUpdatesProperties, SettingUpdatesPropertiesAfterAnother, and the symlink variants will still fail on FAT32 despite the new MilliSecondTemporalResolution/even-second handling. I did not run against a FAT32 temp volume, so this is a human-review item rather than a firm blocker, but the central FAT32 timestamp assumption should be verified before relying on this PR to make the test suite pass there.

⚠️ Test Scope — symlink capability may still be filesystem-sensitive on FAT32

The changed timestamp base class still runs SettingPropertiesOnSymlink under [ConditionalTheory(typeof(MountHelper), nameof(MountHelper.CanCreateSymbolicLinks))] (Base/BaseGetSetTimes.cs:119-123). MountHelper.CanCreateSymbolicLinks probes by attempting to create links under Path.GetTempPath(), but its Windows failure path asserts that a privileged process should not fail (src/libraries/Common/tests/System/IO/ReparsePointUtilities.cs:62-80), while the linked issue discussion notes FAT32 itself does not support symlinks.

This may already skip correctly for normal unelevated FAT32 runs, but it is worth a human check for elevated Windows / Developer Mode scenarios: unsupported filesystem capability should ideally skip tests, not fail during condition evaluation.

✅ Test Quality — capability skips are mostly narrow and preserve existing coverage elsewhere

The new SupportsAlternateDataStreams, TempPathSupportsLargeFiles, IsTempPathOnFat32, and DeletesOpenFileNameImmediately helpers are based on the same Path.GetTempPath() root used by FileCleanupTestBase, so the conditions track the volume under test rather than hardcoding a drive. ADS tests remain active when a live probe succeeds, large-file tests are skipped only for FAT32, and delete-open-file expectations remain unchanged for non-FAT32 Windows versions.

@github-actions

github-actionsBot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Workflow state for the Holistic Review Orchestrator.

{
"version": 5,
"last_dispatched_commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"last_dispatched_base_ref": "main",
"last_dispatched_base_sha": "7abe5f60c079129a57c358451cfe01ee198fa40f",
"last_reviewed_commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"last_reviewed_base_ref": "main",
"last_reviewed_base_sha": "7abe5f60c079129a57c358451cfe01ee198fa40f",
"last_recorded_worker_run_id": "29686398719",
"review_attempt_commit": "",
"review_attempt_base_ref": "",
"review_attempt_count": 0,
"max_review_attempts": 5,
"review_history_format": "holistic-review-disclosure-v1",
"review_history": [
{
"commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"review_id": 4730735805
}
]
}

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Holistic Review

Motivation: Fixes #66544. The System.IO.FileSystem tests generate hundreds of false failures when the temp path resides on a FAT32 volume, because they assume capabilities FAT32 lacks: alternate data streams (ADS), sub-second timestamp resolution, files larger than 4 GB, and immediate deletion of files with open handles. The goal is to make these tests pass on FAT32 while keeping the assertions active on file systems that do support those capabilities.

Approach: The PR centralizes temp-volume capability detection into FileSystemTest via lazily-evaluated static helpers (TempDriveFormat, IsTempPathOnFat32, TempPathSupportsLargeFiles, DeletesOpenFileNameImmediately, SupportsAlternateDataStreams). It then replaces scattered, local FAT32/Windows detection (notably the duplicated P/Invoke GetVolumeInformation block in ctor_options.Windows.cs) with these shared helpers. ADS-dependent theories are converted to ConditionalTheory/ConditionalFact gated on SupportsAlternateDataStreams; timestamp tests widen tolerance and use a FAT32-safe seconds value; large-file tests are gated on TempPathSupportsLargeFiles; and open-handle delete tests use DeletesOpenFileNameImmediately. This is a focused, test-only change with no product code impact.

Summary: This is a well-scoped, correct improvement that directly addresses the four failure categories enumerated in the issue and removes duplicated interop code in favor of a single shared detection point. SupportsAlternateDataStreams is a sound design choice: it probes actual behavior (attempt to write/read an ADS) rather than inferring from the volume format, which is more robust than a pure FAT32 check. The lazy caching avoids repeated DriveInfo/probe cost, and the probe cleans up its temp file in a finally. I have one non-blocking inline note about exception-type exactness in InvalidPath_Core. Overall this looks good to merge; verify via CI that the affected test assemblies still build and pass on the standard (non-FAT32) NTFS/Unix legs, since the change touches many [Theory][ConditionalTheory] attribute conversions.

Detailed Findings

No blocking issues. One minor, non-actionable observation left inline on Directory/GetFileSystemEntries_str.cs regarding Assert.Throws<IOException> matching the exact type rather than derived types when SupportsAlternateDataStreams is false.

Note

This review was generated by this repository's Holistic Review agentic workflow to complement the built-in Copilot review.

Generated by Holistic Review · 92 AIC · ⌖ 10.7 AIC · ⊞ 10K

@Sahithbasani
Sahithbasaniforce-pushed the sahit/issue-66544-fat32-filesystem-tests branch from 7687e75 to bd7a21fCompareAugust 2, 2026 16:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-System.IOcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

System.IO.FileSystem tests fail all over with temp on Fat32

2 participants

@Sahithbasani@jeffhandley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Improve FileSystem tests on FAT32 temp volumes - #130369

Open
Sahithbasani wants to merge 3 commits into
dotnet:mainfrom
Sahithbasani:sahit/issue-66544-fat32-filesystem-tests
Open

Improve FileSystem tests on FAT32 temp volumes#130369
Sahithbasani wants to merge 3 commits into
dotnet:mainfrom
Sahithbasani:sahit/issue-66544-fat32-filesystem-tests

Conversation

@Sahithbasani

Copy link
Copy Markdown
Contributor

Fixes#66544

Summary

  • Add shared temp-volume capability helpers for FAT32, large-file support, alternate data streams, and delete-open-file behavior.
  • Adjust System.IO.FileSystem tests so FAT32 temp volumes use safer timestamp expectations and skip capabilities the volume cannot support.
  • Reuse the shared helpers across File, FileStream, Directory, and LargeFile test cases instead of scattered local detection.

Impact

This should reduce false failures when the test temp path is on FAT32, while keeping the existing assertions active on file systems that support the required capabilities.

Validation

  • git diff --check
  • Roslyn syntax sanity check over the edited C# files using the repo-local compiler package
  • Attempted targeted System.IO.FileSystem.Tests project builds, but the builds did not finish within the local time budget on this machine

@Sahithbasani

Copy link
Copy Markdown
ContributorAuthor

@dotnet-policy-service agree

@Sahithbasani
Sahithbasani marked this pull request as ready for review July 9, 2026 23:16

@jeffhandleyjeffhandley left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Note

This review was generated by the holistic code review workflow being iterated on as part of #130339. Please treat its findings as assistive input for human review.

Holistic Review

Motivation: The linked issue is a real test-infrastructure gap: System.IO.FileSystem.Tests has explicit FAT32 coverage intent, and the existing tests assume NTFS-like ADS, large-file, delete-pending, and timestamp behavior. Improving these tests is justified as long as the changes preserve coverage on capable file systems.

Approach: Centralizing temp-volume capability probes in FileSystemTest is a good direction, and the ADS / large-file / delete-open-file adjustments are narrowly targeted to the temp volume actually used by FileCleanupTestBase. I have one unresolved FAT timestamp concern that needs someone with a FAT32 run (or area expertise) to confirm.

Summary: ⚠️ Needs Human Review. The change looks mostly well-scoped, but a human should focus on whether the timestamp tests still assert exact last-access times on FAT/FAT32 even though Windows documents FAT access time as date-only. Please also sanity-check whether symlink tests remain appropriately skipped on FAT32 when MountHelper.CanCreateSymbolicLinks is evaluated in elevated Windows environments.


Detailed Findings

⚠️ Test Quality — FAT32 last-access timestamp granularity may still be over-asserted

BaseGetSetTimes<T>.SettingUpdatesPropertiesCore now chooses an even second on FAT32 (Base/BaseGetSetTimes.cs:20-24, :78), which addresses FAT write-time's 2-second resolution, and File/GetSetTimes.cs:116-127 still includes both local and UTC last-access time setters/getters in the exact round-trip assertions. However, the Win32 file-time documentation says FAT write time has 2-second resolution while access time has 1-day resolution (it is really the access date): https://learn.microsoft.com/windows/win32/sysinfo/file-times.

If FAT32 returns last-access times with the time-of-day truncated, SettingUpdatesProperties, SettingUpdatesPropertiesAfterAnother, and the symlink variants will still fail on FAT32 despite the new MilliSecondTemporalResolution/even-second handling. I did not run against a FAT32 temp volume, so this is a human-review item rather than a firm blocker, but the central FAT32 timestamp assumption should be verified before relying on this PR to make the test suite pass there.

⚠️ Test Scope — symlink capability may still be filesystem-sensitive on FAT32

The changed timestamp base class still runs SettingPropertiesOnSymlink under [ConditionalTheory(typeof(MountHelper), nameof(MountHelper.CanCreateSymbolicLinks))] (Base/BaseGetSetTimes.cs:119-123). MountHelper.CanCreateSymbolicLinks probes by attempting to create links under Path.GetTempPath(), but its Windows failure path asserts that a privileged process should not fail (src/libraries/Common/tests/System/IO/ReparsePointUtilities.cs:62-80), while the linked issue discussion notes FAT32 itself does not support symlinks.

This may already skip correctly for normal unelevated FAT32 runs, but it is worth a human check for elevated Windows / Developer Mode scenarios: unsupported filesystem capability should ideally skip tests, not fail during condition evaluation.

✅ Test Quality — capability skips are mostly narrow and preserve existing coverage elsewhere

The new SupportsAlternateDataStreams, TempPathSupportsLargeFiles, IsTempPathOnFat32, and DeletesOpenFileNameImmediately helpers are based on the same Path.GetTempPath() root used by FileCleanupTestBase, so the conditions track the volume under test rather than hardcoding a drive. ADS tests remain active when a live probe succeeds, large-file tests are skipped only for FAT32, and delete-open-file expectations remain unchanged for non-FAT32 Windows versions.

@github-actions

github-actionsBot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Workflow state for the Holistic Review Orchestrator.

{
"version": 5,
"last_dispatched_commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"last_dispatched_base_ref": "main",
"last_dispatched_base_sha": "7abe5f60c079129a57c358451cfe01ee198fa40f",
"last_reviewed_commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"last_reviewed_base_ref": "main",
"last_reviewed_base_sha": "7abe5f60c079129a57c358451cfe01ee198fa40f",
"last_recorded_worker_run_id": "29686398719",
"review_attempt_commit": "",
"review_attempt_base_ref": "",
"review_attempt_count": 0,
"max_review_attempts": 5,
"review_history_format": "holistic-review-disclosure-v1",
"review_history": [
{
"commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"review_id": 4730735805
}
]
}

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Holistic Review

Motivation: Fixes #66544. The System.IO.FileSystem tests generate hundreds of false failures when the temp path resides on a FAT32 volume, because they assume capabilities FAT32 lacks: alternate data streams (ADS), sub-second timestamp resolution, files larger than 4 GB, and immediate deletion of files with open handles. The goal is to make these tests pass on FAT32 while keeping the assertions active on file systems that do support those capabilities.

Approach: The PR centralizes temp-volume capability detection into FileSystemTest via lazily-evaluated static helpers (TempDriveFormat, IsTempPathOnFat32, TempPathSupportsLargeFiles, DeletesOpenFileNameImmediately, SupportsAlternateDataStreams). It then replaces scattered, local FAT32/Windows detection (notably the duplicated P/Invoke GetVolumeInformation block in ctor_options.Windows.cs) with these shared helpers. ADS-dependent theories are converted to ConditionalTheory/ConditionalFact gated on SupportsAlternateDataStreams; timestamp tests widen tolerance and use a FAT32-safe seconds value; large-file tests are gated on TempPathSupportsLargeFiles; and open-handle delete tests use DeletesOpenFileNameImmediately. This is a focused, test-only change with no product code impact.

Summary: This is a well-scoped, correct improvement that directly addresses the four failure categories enumerated in the issue and removes duplicated interop code in favor of a single shared detection point. SupportsAlternateDataStreams is a sound design choice: it probes actual behavior (attempt to write/read an ADS) rather than inferring from the volume format, which is more robust than a pure FAT32 check. The lazy caching avoids repeated DriveInfo/probe cost, and the probe cleans up its temp file in a finally. I have one non-blocking inline note about exception-type exactness in InvalidPath_Core. Overall this looks good to merge; verify via CI that the affected test assemblies still build and pass on the standard (non-FAT32) NTFS/Unix legs, since the change touches many [Theory][ConditionalTheory] attribute conversions.

Detailed Findings

No blocking issues. One minor, non-actionable observation left inline on Directory/GetFileSystemEntries_str.cs regarding Assert.Throws<IOException> matching the exact type rather than derived types when SupportsAlternateDataStreams is false.

Note

This review was generated by this repository's Holistic Review agentic workflow to complement the built-in Copilot review.

Generated by Holistic Review · 92 AIC · ⌖ 10.7 AIC · ⊞ 10K

@Sahithbasani
Sahithbasaniforce-pushed the sahit/issue-66544-fat32-filesystem-tests branch from 7687e75 to bd7a21fCompareAugust 2, 2026 16:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-System.IOcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

System.IO.FileSystem tests fail all over with temp on Fat32

2 participants

@Sahithbasani@jeffhandley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Improve FileSystem tests on FAT32 temp volumes - #130369

Open
Sahithbasani wants to merge 3 commits into
dotnet:mainfrom
Sahithbasani:sahit/issue-66544-fat32-filesystem-tests
Open

Improve FileSystem tests on FAT32 temp volumes#130369
Sahithbasani wants to merge 3 commits into
dotnet:mainfrom
Sahithbasani:sahit/issue-66544-fat32-filesystem-tests

Conversation

@Sahithbasani

Copy link
Copy Markdown
Contributor

Fixes#66544

Summary

  • Add shared temp-volume capability helpers for FAT32, large-file support, alternate data streams, and delete-open-file behavior.
  • Adjust System.IO.FileSystem tests so FAT32 temp volumes use safer timestamp expectations and skip capabilities the volume cannot support.
  • Reuse the shared helpers across File, FileStream, Directory, and LargeFile test cases instead of scattered local detection.

Impact

This should reduce false failures when the test temp path is on FAT32, while keeping the existing assertions active on file systems that support the required capabilities.

Validation

  • git diff --check
  • Roslyn syntax sanity check over the edited C# files using the repo-local compiler package
  • Attempted targeted System.IO.FileSystem.Tests project builds, but the builds did not finish within the local time budget on this machine

@Sahithbasani

Copy link
Copy Markdown
ContributorAuthor

@dotnet-policy-service agree

@Sahithbasani
Sahithbasani marked this pull request as ready for review July 9, 2026 23:16

@jeffhandleyjeffhandley left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Note

This review was generated by the holistic code review workflow being iterated on as part of #130339. Please treat its findings as assistive input for human review.

Holistic Review

Motivation: The linked issue is a real test-infrastructure gap: System.IO.FileSystem.Tests has explicit FAT32 coverage intent, and the existing tests assume NTFS-like ADS, large-file, delete-pending, and timestamp behavior. Improving these tests is justified as long as the changes preserve coverage on capable file systems.

Approach: Centralizing temp-volume capability probes in FileSystemTest is a good direction, and the ADS / large-file / delete-open-file adjustments are narrowly targeted to the temp volume actually used by FileCleanupTestBase. I have one unresolved FAT timestamp concern that needs someone with a FAT32 run (or area expertise) to confirm.

Summary: ⚠️ Needs Human Review. The change looks mostly well-scoped, but a human should focus on whether the timestamp tests still assert exact last-access times on FAT/FAT32 even though Windows documents FAT access time as date-only. Please also sanity-check whether symlink tests remain appropriately skipped on FAT32 when MountHelper.CanCreateSymbolicLinks is evaluated in elevated Windows environments.


Detailed Findings

⚠️ Test Quality — FAT32 last-access timestamp granularity may still be over-asserted

BaseGetSetTimes<T>.SettingUpdatesPropertiesCore now chooses an even second on FAT32 (Base/BaseGetSetTimes.cs:20-24, :78), which addresses FAT write-time's 2-second resolution, and File/GetSetTimes.cs:116-127 still includes both local and UTC last-access time setters/getters in the exact round-trip assertions. However, the Win32 file-time documentation says FAT write time has 2-second resolution while access time has 1-day resolution (it is really the access date): https://learn.microsoft.com/windows/win32/sysinfo/file-times.

If FAT32 returns last-access times with the time-of-day truncated, SettingUpdatesProperties, SettingUpdatesPropertiesAfterAnother, and the symlink variants will still fail on FAT32 despite the new MilliSecondTemporalResolution/even-second handling. I did not run against a FAT32 temp volume, so this is a human-review item rather than a firm blocker, but the central FAT32 timestamp assumption should be verified before relying on this PR to make the test suite pass there.

⚠️ Test Scope — symlink capability may still be filesystem-sensitive on FAT32

The changed timestamp base class still runs SettingPropertiesOnSymlink under [ConditionalTheory(typeof(MountHelper), nameof(MountHelper.CanCreateSymbolicLinks))] (Base/BaseGetSetTimes.cs:119-123). MountHelper.CanCreateSymbolicLinks probes by attempting to create links under Path.GetTempPath(), but its Windows failure path asserts that a privileged process should not fail (src/libraries/Common/tests/System/IO/ReparsePointUtilities.cs:62-80), while the linked issue discussion notes FAT32 itself does not support symlinks.

This may already skip correctly for normal unelevated FAT32 runs, but it is worth a human check for elevated Windows / Developer Mode scenarios: unsupported filesystem capability should ideally skip tests, not fail during condition evaluation.

✅ Test Quality — capability skips are mostly narrow and preserve existing coverage elsewhere

The new SupportsAlternateDataStreams, TempPathSupportsLargeFiles, IsTempPathOnFat32, and DeletesOpenFileNameImmediately helpers are based on the same Path.GetTempPath() root used by FileCleanupTestBase, so the conditions track the volume under test rather than hardcoding a drive. ADS tests remain active when a live probe succeeds, large-file tests are skipped only for FAT32, and delete-open-file expectations remain unchanged for non-FAT32 Windows versions.

@github-actions

github-actionsBot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Workflow state for the Holistic Review Orchestrator.

{
"version": 5,
"last_dispatched_commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"last_dispatched_base_ref": "main",
"last_dispatched_base_sha": "7abe5f60c079129a57c358451cfe01ee198fa40f",
"last_reviewed_commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"last_reviewed_base_ref": "main",
"last_reviewed_base_sha": "7abe5f60c079129a57c358451cfe01ee198fa40f",
"last_recorded_worker_run_id": "29686398719",
"review_attempt_commit": "",
"review_attempt_base_ref": "",
"review_attempt_count": 0,
"max_review_attempts": 5,
"review_history_format": "holistic-review-disclosure-v1",
"review_history": [
{
"commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"review_id": 4730735805
}
]
}

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Holistic Review

Motivation: Fixes #66544. The System.IO.FileSystem tests generate hundreds of false failures when the temp path resides on a FAT32 volume, because they assume capabilities FAT32 lacks: alternate data streams (ADS), sub-second timestamp resolution, files larger than 4 GB, and immediate deletion of files with open handles. The goal is to make these tests pass on FAT32 while keeping the assertions active on file systems that do support those capabilities.

Approach: The PR centralizes temp-volume capability detection into FileSystemTest via lazily-evaluated static helpers (TempDriveFormat, IsTempPathOnFat32, TempPathSupportsLargeFiles, DeletesOpenFileNameImmediately, SupportsAlternateDataStreams). It then replaces scattered, local FAT32/Windows detection (notably the duplicated P/Invoke GetVolumeInformation block in ctor_options.Windows.cs) with these shared helpers. ADS-dependent theories are converted to ConditionalTheory/ConditionalFact gated on SupportsAlternateDataStreams; timestamp tests widen tolerance and use a FAT32-safe seconds value; large-file tests are gated on TempPathSupportsLargeFiles; and open-handle delete tests use DeletesOpenFileNameImmediately. This is a focused, test-only change with no product code impact.

Summary: This is a well-scoped, correct improvement that directly addresses the four failure categories enumerated in the issue and removes duplicated interop code in favor of a single shared detection point. SupportsAlternateDataStreams is a sound design choice: it probes actual behavior (attempt to write/read an ADS) rather than inferring from the volume format, which is more robust than a pure FAT32 check. The lazy caching avoids repeated DriveInfo/probe cost, and the probe cleans up its temp file in a finally. I have one non-blocking inline note about exception-type exactness in InvalidPath_Core. Overall this looks good to merge; verify via CI that the affected test assemblies still build and pass on the standard (non-FAT32) NTFS/Unix legs, since the change touches many [Theory][ConditionalTheory] attribute conversions.

Detailed Findings

No blocking issues. One minor, non-actionable observation left inline on Directory/GetFileSystemEntries_str.cs regarding Assert.Throws<IOException> matching the exact type rather than derived types when SupportsAlternateDataStreams is false.

Note

This review was generated by this repository's Holistic Review agentic workflow to complement the built-in Copilot review.

Generated by Holistic Review · 92 AIC · ⌖ 10.7 AIC · ⊞ 10K

@Sahithbasani
Sahithbasaniforce-pushed the sahit/issue-66544-fat32-filesystem-tests branch from 7687e75 to bd7a21fCompareAugust 2, 2026 16:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-System.IOcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

System.IO.FileSystem tests fail all over with temp on Fat32

2 participants

@Sahithbasani@jeffhandley
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Improve FileSystem tests on FAT32 temp volumes - #130369

Open
Sahithbasani wants to merge 3 commits into
dotnet:mainfrom
Sahithbasani:sahit/issue-66544-fat32-filesystem-tests
Open

Improve FileSystem tests on FAT32 temp volumes#130369
Sahithbasani wants to merge 3 commits into
dotnet:mainfrom
Sahithbasani:sahit/issue-66544-fat32-filesystem-tests

Conversation

@Sahithbasani

Copy link
Copy Markdown
Contributor

Fixes#66544

Summary

  • Add shared temp-volume capability helpers for FAT32, large-file support, alternate data streams, and delete-open-file behavior.
  • Adjust System.IO.FileSystem tests so FAT32 temp volumes use safer timestamp expectations and skip capabilities the volume cannot support.
  • Reuse the shared helpers across File, FileStream, Directory, and LargeFile test cases instead of scattered local detection.

Impact

This should reduce false failures when the test temp path is on FAT32, while keeping the existing assertions active on file systems that support the required capabilities.

Validation

  • git diff --check
  • Roslyn syntax sanity check over the edited C# files using the repo-local compiler package
  • Attempted targeted System.IO.FileSystem.Tests project builds, but the builds did not finish within the local time budget on this machine

@Sahithbasani

Copy link
Copy Markdown
ContributorAuthor

@dotnet-policy-service agree

@Sahithbasani
Sahithbasani marked this pull request as ready for review July 9, 2026 23:16

@jeffhandleyjeffhandley left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Note

This review was generated by the holistic code review workflow being iterated on as part of #130339. Please treat its findings as assistive input for human review.

Holistic Review

Motivation: The linked issue is a real test-infrastructure gap: System.IO.FileSystem.Tests has explicit FAT32 coverage intent, and the existing tests assume NTFS-like ADS, large-file, delete-pending, and timestamp behavior. Improving these tests is justified as long as the changes preserve coverage on capable file systems.

Approach: Centralizing temp-volume capability probes in FileSystemTest is a good direction, and the ADS / large-file / delete-open-file adjustments are narrowly targeted to the temp volume actually used by FileCleanupTestBase. I have one unresolved FAT timestamp concern that needs someone with a FAT32 run (or area expertise) to confirm.

Summary: ⚠️ Needs Human Review. The change looks mostly well-scoped, but a human should focus on whether the timestamp tests still assert exact last-access times on FAT/FAT32 even though Windows documents FAT access time as date-only. Please also sanity-check whether symlink tests remain appropriately skipped on FAT32 when MountHelper.CanCreateSymbolicLinks is evaluated in elevated Windows environments.


Detailed Findings

⚠️ Test Quality — FAT32 last-access timestamp granularity may still be over-asserted

BaseGetSetTimes<T>.SettingUpdatesPropertiesCore now chooses an even second on FAT32 (Base/BaseGetSetTimes.cs:20-24, :78), which addresses FAT write-time's 2-second resolution, and File/GetSetTimes.cs:116-127 still includes both local and UTC last-access time setters/getters in the exact round-trip assertions. However, the Win32 file-time documentation says FAT write time has 2-second resolution while access time has 1-day resolution (it is really the access date): https://learn.microsoft.com/windows/win32/sysinfo/file-times.

If FAT32 returns last-access times with the time-of-day truncated, SettingUpdatesProperties, SettingUpdatesPropertiesAfterAnother, and the symlink variants will still fail on FAT32 despite the new MilliSecondTemporalResolution/even-second handling. I did not run against a FAT32 temp volume, so this is a human-review item rather than a firm blocker, but the central FAT32 timestamp assumption should be verified before relying on this PR to make the test suite pass there.

⚠️ Test Scope — symlink capability may still be filesystem-sensitive on FAT32

The changed timestamp base class still runs SettingPropertiesOnSymlink under [ConditionalTheory(typeof(MountHelper), nameof(MountHelper.CanCreateSymbolicLinks))] (Base/BaseGetSetTimes.cs:119-123). MountHelper.CanCreateSymbolicLinks probes by attempting to create links under Path.GetTempPath(), but its Windows failure path asserts that a privileged process should not fail (src/libraries/Common/tests/System/IO/ReparsePointUtilities.cs:62-80), while the linked issue discussion notes FAT32 itself does not support symlinks.

This may already skip correctly for normal unelevated FAT32 runs, but it is worth a human check for elevated Windows / Developer Mode scenarios: unsupported filesystem capability should ideally skip tests, not fail during condition evaluation.

✅ Test Quality — capability skips are mostly narrow and preserve existing coverage elsewhere

The new SupportsAlternateDataStreams, TempPathSupportsLargeFiles, IsTempPathOnFat32, and DeletesOpenFileNameImmediately helpers are based on the same Path.GetTempPath() root used by FileCleanupTestBase, so the conditions track the volume under test rather than hardcoding a drive. ADS tests remain active when a live probe succeeds, large-file tests are skipped only for FAT32, and delete-open-file expectations remain unchanged for non-FAT32 Windows versions.

@github-actions

github-actionsBot commented Jul 19, 2026

Copy link
Copy Markdown
Contributor

Workflow state for the Holistic Review Orchestrator.

{
"version": 5,
"last_dispatched_commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"last_dispatched_base_ref": "main",
"last_dispatched_base_sha": "7abe5f60c079129a57c358451cfe01ee198fa40f",
"last_reviewed_commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"last_reviewed_base_ref": "main",
"last_reviewed_base_sha": "7abe5f60c079129a57c358451cfe01ee198fa40f",
"last_recorded_worker_run_id": "29686398719",
"review_attempt_commit": "",
"review_attempt_base_ref": "",
"review_attempt_count": 0,
"max_review_attempts": 5,
"review_history_format": "holistic-review-disclosure-v1",
"review_history": [
{
"commit": "346a22802976bfa6c9749850b1329923b2cd1ac2",
"review_id": 4730735805
}
]
}

@github-actionsgithub-actionsBot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Holistic Review

Motivation: Fixes #66544. The System.IO.FileSystem tests generate hundreds of false failures when the temp path resides on a FAT32 volume, because they assume capabilities FAT32 lacks: alternate data streams (ADS), sub-second timestamp resolution, files larger than 4 GB, and immediate deletion of files with open handles. The goal is to make these tests pass on FAT32 while keeping the assertions active on file systems that do support those capabilities.

Approach: The PR centralizes temp-volume capability detection into FileSystemTest via lazily-evaluated static helpers (TempDriveFormat, IsTempPathOnFat32, TempPathSupportsLargeFiles, DeletesOpenFileNameImmediately, SupportsAlternateDataStreams). It then replaces scattered, local FAT32/Windows detection (notably the duplicated P/Invoke GetVolumeInformation block in ctor_options.Windows.cs) with these shared helpers. ADS-dependent theories are converted to ConditionalTheory/ConditionalFact gated on SupportsAlternateDataStreams; timestamp tests widen tolerance and use a FAT32-safe seconds value; large-file tests are gated on TempPathSupportsLargeFiles; and open-handle delete tests use DeletesOpenFileNameImmediately. This is a focused, test-only change with no product code impact.

Summary: This is a well-scoped, correct improvement that directly addresses the four failure categories enumerated in the issue and removes duplicated interop code in favor of a single shared detection point. SupportsAlternateDataStreams is a sound design choice: it probes actual behavior (attempt to write/read an ADS) rather than inferring from the volume format, which is more robust than a pure FAT32 check. The lazy caching avoids repeated DriveInfo/probe cost, and the probe cleans up its temp file in a finally. I have one non-blocking inline note about exception-type exactness in InvalidPath_Core. Overall this looks good to merge; verify via CI that the affected test assemblies still build and pass on the standard (non-FAT32) NTFS/Unix legs, since the change touches many [Theory][ConditionalTheory] attribute conversions.

Detailed Findings

No blocking issues. One minor, non-actionable observation left inline on Directory/GetFileSystemEntries_str.cs regarding Assert.Throws<IOException> matching the exact type rather than derived types when SupportsAlternateDataStreams is false.

Note

This review was generated by this repository's Holistic Review agentic workflow to complement the built-in Copilot review.

Generated by Holistic Review · 92 AIC · ⌖ 10.7 AIC · ⊞ 10K

@Sahithbasani
Sahithbasaniforce-pushed the sahit/issue-66544-fat32-filesystem-tests branch from 7687e75 to bd7a21fCompareAugust 2, 2026 16:49
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area-System.IOcommunity-contributionIndicates that the PR has been added by a community member

Projects

None yet

Development

Successfully merging this pull request may close these issues.

System.IO.FileSystem tests fail all over with temp on Fat32

2 participants

@Sahithbasani@jeffhandley