Skip to content

Commit 15320f7

Browse files
authored
feat: added support for GetUnixFileMode and SetUnixFileMode (#1160)
* only overload with string path is added, overload with SafeFileHandle fileHandle is not added
1 parent 3df422f commit 15320f7

File tree

5 files changed

+141
-3
lines changed

5 files changed

+141
-3
lines changed

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

+18-2
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,15 @@ public override DateTime GetLastWriteTimeUtc(SafeFileHandle fileHandle)
424424
/// <inheritdoc />
425425
public override UnixFileMode GetUnixFileMode(string path)
426426
{
427-
throw CommonExceptions.NotImplemented();
427+
mockFileDataAccessor.PathVerifier.IsLegalAbsoluteOrRelative(path, "path");
428+
429+
if (!mockFileDataAccessor.FileExists(path))
430+
{
431+
throw CommonExceptions.FileNotFound(path);
432+
}
433+
434+
var mockFileData = mockFileDataAccessor.GetFile(path);
435+
return mockFileData.UnixMode;
428436
}
429437
#endif
430438

@@ -954,7 +962,15 @@ public override void SetLastWriteTimeUtc(SafeFileHandle fileHandle, DateTime las
954962
/// <inheritdoc />
955963
public override void SetUnixFileMode(string path, UnixFileMode mode)
956964
{
957-
throw CommonExceptions.NotImplemented();
965+
mockFileDataAccessor.PathVerifier.IsLegalAbsoluteOrRelative(path, "path");
966+
967+
if (!mockFileDataAccessor.FileExists(path))
968+
{
969+
throw CommonExceptions.FileNotFound(path);
970+
}
971+
972+
var mockFileData = mockFileDataAccessor.GetFile(path);
973+
mockFileData.UnixMode = mode;
958974
}
959975
#endif
960976

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

+10
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,16 @@ public FileSecurity AccessControl
201201
/// Gets or sets the File sharing mode for this file, this allows you to lock a file for reading or writing.
202202
/// </summary>
203203
public FileShare AllowedFileShare { get; set; } = FileShare.ReadWrite | FileShare.Delete;
204+
205+
#if FEATURE_UNIX_FILE_MODE
206+
/// <summary>
207+
/// Gets or sets the Unix file mode (permissions) for this file.
208+
/// This allows you to configure the read, write and execute access for user, group and other.
209+
/// </summary>
210+
public UnixFileMode UnixMode { get; set; } = UnixFileMode.UserRead | UnixFileMode.GroupRead |
211+
UnixFileMode.OtherRead | UnixFileMode.UserWrite;
212+
#endif
213+
204214
/// <summary>
205215
/// Checks whether the file is accessible for this type of FileAccess.
206216
/// MockFileData can be configured to have FileShare.None, which indicates it is locked by a 'different process'.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
#if FEATURE_UNIX_FILE_MODE
2+
using System.Runtime.Versioning;
3+
4+
namespace System.IO.Abstractions.TestingHelpers.Tests
5+
{
6+
using Collections.Generic;
7+
8+
using NUnit.Framework;
9+
10+
using XFS = MockUnixSupport;
11+
12+
[UnsupportedOSPlatform("windows")]
13+
[UnixOnly("This feature is not supported on Windows.")]
14+
public class MockFileGetUnixFileModeTests
15+
{
16+
[Test]
17+
public void MockFile_GetUnixFileMode_ShouldReturnDefaultAccessMode()
18+
{
19+
// Arrange
20+
var expected = UnixFileMode.UserRead |
21+
UnixFileMode.GroupRead |
22+
UnixFileMode.OtherRead |
23+
UnixFileMode.UserWrite;
24+
25+
var fileSystem = new MockFileSystem(new Dictionary<string, MockFileData>
26+
{
27+
{ XFS.Path(@"C:\something\some.txt"), new MockFileData("Demo text content") }
28+
});
29+
30+
// Act
31+
var result = fileSystem.File.GetUnixFileMode(XFS.Path(@"C:\something\some.txt"));
32+
33+
// Assert
34+
Assert.That(result, Is.EqualTo(expected));
35+
}
36+
37+
[Test]
38+
public void MockFile_GetUnixFileMode_ShouldReturnSpecifiedAccessMode([Values] UnixFileMode unixFileMode)
39+
{
40+
// Arrange
41+
var mockFileData = new MockFileData("Demo text content")
42+
{
43+
UnixMode = unixFileMode
44+
};
45+
46+
var fileSystem = new MockFileSystem(new Dictionary<string, MockFileData>
47+
{
48+
{ XFS.Path(@"C:\something\some.txt"), mockFileData }
49+
});
50+
51+
// Act
52+
var result = fileSystem.File.GetUnixFileMode(XFS.Path(@"C:\something\some.txt"));
53+
54+
// Assert
55+
Assert.That(result, Is.EqualTo(unixFileMode));
56+
}
57+
}
58+
}
59+
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
#if FEATURE_UNIX_FILE_MODE
2+
using System.Runtime.Versioning;
3+
4+
namespace System.IO.Abstractions.TestingHelpers.Tests
5+
{
6+
using Collections.Generic;
7+
8+
using NUnit.Framework;
9+
10+
using XFS = MockUnixSupport;
11+
12+
[UnsupportedOSPlatform("windows")]
13+
[UnixOnly("This feature is not supported on Windows.")]
14+
public class MockFileSetUnixFileModeTests
15+
{
16+
[Test]
17+
public void MockFile_SetUnixFileMode_ShouldSetSpecifiedAccessMode([Values] UnixFileMode unixFileMode)
18+
{
19+
// Arrange
20+
var mockFileData = new MockFileData("Demo text content");
21+
var fileSystem = new MockFileSystem(new Dictionary<string, MockFileData>
22+
{
23+
{ XFS.Path(@"C:\something\some.txt"), mockFileData }
24+
});
25+
26+
// Act
27+
fileSystem.File.SetUnixFileMode(XFS.Path(@"C:\something\some.txt"), unixFileMode);
28+
29+
// Assert
30+
Assert.That(mockFileData.UnixMode, Is.EqualTo(unixFileMode));
31+
}
32+
33+
[TestCase(UnixFileMode.UserRead | UnixFileMode.GroupRead | UnixFileMode.OtherRead)]
34+
[TestCase(UnixFileMode.UserRead | UnixFileMode.UserWrite | UnixFileMode.UserExecute)]
35+
[TestCase(UnixFileMode.UserExecute | UnixFileMode.OtherWrite | UnixFileMode.GroupRead)]
36+
public void MockFile_SetUnixFileMode_ShouldSetSpecifiedAccessModeFlags(UnixFileMode unixFileMode)
37+
{
38+
// Arrange
39+
var mockFileData = new MockFileData("Demo text content");
40+
var fileSystem = new MockFileSystem(new Dictionary<string, MockFileData>
41+
{
42+
{ XFS.Path(@"C:\something\some.txt"), mockFileData }
43+
});
44+
45+
// Act
46+
fileSystem.File.SetUnixFileMode(XFS.Path(@"C:\something\some.txt"), unixFileMode);
47+
48+
// Assert
49+
Assert.That(mockFileData.UnixMode, Is.EqualTo(unixFileMode));
50+
}
51+
}
52+
}
53+
#endif

version.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"$schema": "https://raw.githubusercontent.com/AArnott/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json",
3-
"version": "21.0",
3+
"version": "21.1",
44
"assemblyVersion": {
55
"precision": "major"
66
},

0 commit comments

Comments
 (0)