Skip to content

Commit d69dd99

Browse files
mpdreamzclaude
andcommitted
fix: accept BackupOrRestore only from .NET 9, as the runtime does
.NET 8's options check rejects `FileOptions` 0x02000000; .NET 9 and later accept it. The mock now does the same on each target. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TymoqrVYgZwdNSper5ZZB1
1 parent 67e514f commit d69dd99

2 files changed

Lines changed: 20 additions & 2 deletions

File tree

‎src/TestableIO.System.IO.Abstractions.TestingHelpers/MockSafeFileHandles.cs‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,10 @@ internal sealed class MockSafeFileHandles
3030
FileOptions.DeleteOnClose |
3131
FileOptions.SequentialScan |
3232
FileOptions.Encrypted |
33-
(FileOptions)0x20000000 | // NoBuffering
34-
(FileOptions)0x02000000; // BackupOrRestore
33+
#if NET9_0_OR_GREATER
34+
(FileOptions)0x02000000 | // BackupOrRestore, accepted since .NET 9
35+
#endif
36+
(FileOptions)0x20000000; // NoBuffering
3537

3638
private readonly IMockFileDataAccessor mockFileDataAccessor;
3739
private readonly Dictionary<IntPtr, Entry> entries = new();

‎tests/TestableIO.System.IO.Abstractions.TestingHelpers.Tests/MockFileOpenHandleTests.cs‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,9 @@ await That(() => fileSystem.File.OpenHandle(FilePath, FileMode.Create, FileAcces
143143
.Throws<ArgumentOutOfRangeException>().WithParamName("preallocationSize");
144144
}
145145

146+
#if NET9_0_OR_GREATER
146147
[TestCase((FileOptions)0x02000000)]
148+
#endif
147149
[TestCase((FileOptions)0x20000000)]
148150
[TestCase(FileOptions.Asynchronous | FileOptions.WriteThrough)]
149151
public async Task OpenHandle_WithAnOptionTheRuntimeAccepts_ShouldOpen(FileOptions options)
@@ -158,6 +160,20 @@ await That(() =>
158160
}).DoesNotThrow();
159161
}
160162

163+
#if !NET9_0_OR_GREATER
164+
[Test]
165+
public async Task OpenHandle_WithBackupOrRestoreBeforeNet9_ShouldThrowArgumentOutOfRangeException()
166+
{
167+
var fileSystem = new MockFileSystem();
168+
fileSystem.AddFile(FilePath, new MockFileData("content"));
169+
170+
await That(() => fileSystem.File.OpenHandle(FilePath, FileMode.Open, FileAccess.Read, FileShare.Read,
171+
(FileOptions)0x02000000))
172+
.Throws<ArgumentOutOfRangeException>().WithParamName("options")
173+
.Because("the runtime accepts BackupOrRestore only since .NET 9");
174+
}
175+
176+
#endif
161177
[Test]
162178
public async Task OpenHandle_PreallocationSizeOnExistingFile_ShouldThrowArgumentException()
163179
{

0 commit comments

Comments
 (0)