Skip to content

Commit 34ae96a

Browse files
authored
feat: add ReparsePoint attribute when creating a symbolic link (#1024)
Files or directories which are a symbolic link should have the `ReparsePoint` attribute set.
1 parent 57ffb85 commit 34ae96a

File tree

4 files changed

+34
-2
lines changed

4 files changed

+34
-2
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,9 @@ public override IFileSystemInfo CreateSymbolicLink(string path, string pathToTar
107107
mockFileDataAccessor.AddDirectory(path);
108108
mockFileDataAccessor.GetFile(path).LinkTarget = pathToTarget;
109109

110-
return new MockDirectoryInfo(mockFileDataAccessor, path);
110+
var directoryInfo = new MockDirectoryInfo(mockFileDataAccessor, path);
111+
directoryInfo.Attributes |= FileAttributes.ReparsePoint;
112+
return directoryInfo;
111113
}
112114
#endif
113115

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,9 @@ public override IFileSystemInfo CreateSymbolicLink(string path, string pathToTar
195195
destFileData.LinkTarget = pathToTarget;
196196
mockFileDataAccessor.AddFile(path, destFileData);
197197

198-
return new MockFileInfo(mockFileDataAccessor, path);
198+
var mockFileInfo = new MockFileInfo(mockFileDataAccessor, path);
199+
mockFileInfo.Attributes |= FileAttributes.ReparsePoint;
200+
return mockFileInfo;
199201
}
200202
#endif
201203
/// <inheritdoc />

tests/TestableIO.System.IO.Abstractions.TestingHelpers.Tests/MockDirectorySymlinkTests.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,20 @@ public void MockDirectory_CreateSymbolicLink_ShouldFailIfTargetDoesNotExist()
198198
Assert.That(ex.Message.Contains(pathToTarget));
199199
}
200200

201+
[Test]
202+
public void MockDirectory_CreateSymbolicLink_ShouldSetReparsePointAttribute()
203+
{
204+
var path = "foo";
205+
var pathToTarget = "bar";
206+
var fileSystem = new MockFileSystem();
207+
fileSystem.Directory.CreateDirectory(pathToTarget);
208+
209+
fileSystem.Directory.CreateSymbolicLink(path, pathToTarget);
210+
211+
var attributes = fileSystem.DirectoryInfo.New(path).Attributes;
212+
Assert.IsTrue(attributes.HasFlag(FileAttributes.ReparsePoint));
213+
}
214+
201215
[Test]
202216
public void MockDirectory_ResolveLinkTarget_ShouldReturnPathOfTargetLink()
203217
{

tests/TestableIO.System.IO.Abstractions.TestingHelpers.Tests/MockFileSymlinkTests.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,20 @@ public void MockFile_CreateSymbolicLink_ShouldFailIfPathDirectoryDoesNotExist()
228228
Assert.That(ex.Message.Contains(path));
229229
}
230230

231+
[Test]
232+
public void MockFile_CreateSymbolicLink_ShouldSetReparsePointAttribute()
233+
{
234+
var path = "foo.txt";
235+
var pathToTarget = "bar.txt";
236+
var fileSystem = new MockFileSystem();
237+
fileSystem.File.WriteAllText(pathToTarget, "some content");
238+
239+
fileSystem.File.CreateSymbolicLink(path, pathToTarget);
240+
241+
var attributes = fileSystem.FileInfo.New(path).Attributes;
242+
Assert.IsTrue(attributes.HasFlag(FileAttributes.ReparsePoint));
243+
}
244+
231245
[Test]
232246
public void MockFile_ResolveLinkTarget_ShouldReturnPathOfTargetLink()
233247
{

0 commit comments

Comments
 (0)