Skip to content

Commit 3bb6644

Browse files
committed
Split DirectoryOperationsTest into platform-specific test classes
- Created DirectoryOperationsWindowsTest for Windows-specific tests - Created DirectoryOperationsUnixTest for Unix-specific tests - Added RuntimeInformation platform check in Unix test setup - Added [Platform(Exclude="Win")] to DirectoryUnixInformationTest - Removed original mixed DirectoryOperationsTest file This completes the platform-specific test refactoring to fix OneTimeSetUp errors on Windows for net481 target framework.
1 parent 86de02e commit 3bb6644

File tree

3 files changed

+169
-0
lines changed

3 files changed

+169
-0
lines changed
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
using System.Collections.Generic;
2+
using System.IO;
3+
using System.Runtime.InteropServices;
4+
using Mono.Unix;
5+
using Mono.Unix.Native;
6+
using NUnit.Framework;
7+
using Snowflake.Data.Core.Tools;
8+
using Snowflake.Data.Tests.Mock;
9+
10+
namespace Snowflake.Data.Tests.UnitTests.Tools
11+
{
12+
[TestFixture, NonParallelizable]
13+
[Platform(Exclude = "Win")]
14+
public class DirectoryOperationsUnixTest
15+
{
16+
private static DirectoryOperations s_directoryOperations;
17+
private static readonly string s_relativeWorkingDirectory = $"directory_operations_test_{Path.GetRandomFileName()}";
18+
private static readonly string s_workingDirectory = Path.Combine(TempUtil.GetTempPath(), s_relativeWorkingDirectory);
19+
private static readonly string s_dirName = "testdir";
20+
private static readonly string s_dirAbsolutePath = Path.Combine(s_workingDirectory, s_dirName);
21+
22+
[SetUp]
23+
public static void Before()
24+
{
25+
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
26+
{
27+
Assert.Ignore("Unix-specific tests are not run on Windows");
28+
}
29+
30+
if (!Directory.Exists(s_workingDirectory))
31+
{
32+
Directory.CreateDirectory(s_workingDirectory);
33+
}
34+
35+
s_directoryOperations = new DirectoryOperations();
36+
}
37+
38+
[TearDown]
39+
public static void After()
40+
{
41+
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
42+
{
43+
return;
44+
}
45+
46+
Directory.Delete(s_workingDirectory, true);
47+
}
48+
49+
[Test]
50+
public void TestDirectoryIsNotSafeOnNotWindowsWhenPermissionsAreTooBroad(
51+
[ValueSource(nameof(InsecurePermissions))]
52+
FileAccessPermissions permissions)
53+
{
54+
// arrange
55+
Syscall.mkdir(s_dirAbsolutePath, (FilePermissions)permissions);
56+
57+
// act and assert
58+
Assert.IsFalse(s_directoryOperations.IsDirectorySafe(s_dirAbsolutePath));
59+
}
60+
61+
[Test]
62+
public void TestOwnerIsCurrentUser()
63+
{
64+
// arrange
65+
var mockUnixOperations = new MockUnixOperations { CurrentUserId = 1, DirectoryOwnerId = 1 };
66+
var dirOps = new DirectoryOperations(mockUnixOperations);
67+
68+
// act and assert
69+
Assert.IsTrue(dirOps.IsDirectoryOwnedByCurrentUser(s_dirAbsolutePath));
70+
}
71+
72+
[Test]
73+
public void TestOwnerIsNotCurrentUser()
74+
{
75+
// arrange
76+
var mockUnixOperations = new MockUnixOperations { CurrentUserId = 1, DirectoryOwnerId = 2 };
77+
var dirOps = new DirectoryOperations(mockUnixOperations);
78+
79+
// act and assert
80+
Assert.IsFalse(dirOps.IsDirectoryOwnedByCurrentUser(s_dirAbsolutePath));
81+
}
82+
83+
[Test]
84+
public void TestDirectoryIsNotSecureWhenNotOwnedByCurrentUser()
85+
{
86+
// arrange
87+
var mockUnixOperations = new MockUnixOperations { CurrentUserId = 1, DirectoryOwnerId = 2 };
88+
var dirOps = new DirectoryOperations(mockUnixOperations);
89+
90+
// act and assert
91+
Assert.IsFalse(dirOps.IsDirectorySafe(s_dirAbsolutePath));
92+
}
93+
94+
// User permissions are required for all of the tests to be able to access directory information
95+
public static IEnumerable<FileAccessPermissions> InsecurePermissions()
96+
{
97+
yield return FileAccessPermissions.UserReadWriteExecute | FileAccessPermissions.GroupRead;
98+
yield return FileAccessPermissions.UserReadWriteExecute | FileAccessPermissions.GroupRead | FileAccessPermissions.GroupWrite;
99+
yield return FileAccessPermissions.UserReadWriteExecute | FileAccessPermissions.GroupExecute;
100+
yield return FileAccessPermissions.UserReadWriteExecute | FileAccessPermissions.GroupReadWriteExecute;
101+
yield return FileAccessPermissions.UserReadWriteExecute | FileAccessPermissions.OtherRead;
102+
yield return FileAccessPermissions.UserReadWriteExecute | FileAccessPermissions.OtherRead | FileAccessPermissions.OtherWrite;
103+
yield return FileAccessPermissions.UserReadWriteExecute | FileAccessPermissions.OtherExecute;
104+
yield return FileAccessPermissions.UserReadWriteExecute | FileAccessPermissions.OtherReadWriteExecute;
105+
yield return FileAccessPermissions.UserReadWriteExecute | FileAccessPermissions.AllPermissions;
106+
}
107+
}
108+
}
109+
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
using System.IO;
2+
using NUnit.Framework;
3+
using Snowflake.Data.Core.Tools;
4+
5+
namespace Snowflake.Data.Tests.UnitTests.Tools
6+
{
7+
[TestFixture, NonParallelizable]
8+
[Platform("Win")]
9+
public class DirectoryOperationsWindowsTest
10+
{
11+
private static DirectoryOperations s_directoryOperations;
12+
private static readonly string s_relativeWorkingDirectory = $"directory_operations_test_{Path.GetRandomFileName()}";
13+
private static readonly string s_workingDirectory = Path.Combine(TempUtil.GetTempPath(), s_relativeWorkingDirectory);
14+
private static readonly string s_dirName = "testdir";
15+
16+
[SetUp]
17+
public static void Before()
18+
{
19+
if (!Directory.Exists(s_workingDirectory))
20+
{
21+
Directory.CreateDirectory(s_workingDirectory);
22+
}
23+
24+
s_directoryOperations = new DirectoryOperations();
25+
}
26+
27+
[TearDown]
28+
public static void After()
29+
{
30+
Directory.Delete(s_workingDirectory, true);
31+
}
32+
33+
[Test]
34+
public void TestDirectoryIsSafeOnWindows()
35+
{
36+
// arrange
37+
var absoluteFilePath = Path.Combine(s_workingDirectory, s_dirName);
38+
Directory.CreateDirectory(absoluteFilePath);
39+
40+
// act and assert
41+
Assert.IsTrue(s_directoryOperations.IsDirectorySafe(absoluteFilePath));
42+
}
43+
44+
[Test]
45+
public void TestShouldCreateDirectoryWithSafePermissions()
46+
{
47+
// arrange
48+
var dirAbsolutePath = Path.Combine(s_workingDirectory, s_dirName);
49+
50+
// act
51+
s_directoryOperations.CreateDirectory(dirAbsolutePath);
52+
53+
// assert
54+
Assert.IsTrue(Directory.Exists(dirAbsolutePath));
55+
Assert.IsTrue(s_directoryOperations.IsDirectorySafe(dirAbsolutePath));
56+
}
57+
}
58+
}
59+

Snowflake.Data.Tests/UnitTests/Tools/DirectoryUnixInformationTest.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
namespace Snowflake.Data.Tests.UnitTests.Tools
77
{
88
[TestFixture]
9+
[Platform(Exclude = "Win")]
910
public class DirectoryUnixInformationTest
1011
{
1112
private const long UserId = 5;

0 commit comments

Comments
 (0)