Fixed: Mono internals does not properly copy/move symlinks, but instead copies the contents.

This commit is contained in:
Qstick
2017-12-20 22:30:28 -05:00
parent c83353e7ee
commit a4e632d95a
3 changed files with 144 additions and 3 deletions
@@ -1,4 +1,6 @@
using System;
using System;
using System.IO;
using FluentAssertions;
using Mono.Unix;
using NUnit.Framework;
using NzbDrone.Common.Test.DiskTests;
@@ -35,5 +37,55 @@ namespace NzbDrone.Mono.Test.DiskProviderTests
entry.FileAccessPermissions &= ~(FileAccessPermissions.UserWrite | FileAccessPermissions.GroupWrite | FileAccessPermissions.OtherWrite);
}
}
[Test]
public void should_move_symlink()
{
var tempFolder = GetTempFilePath();
Directory.CreateDirectory(tempFolder);
var file = Path.Combine(tempFolder, "target.txt");
var source = Path.Combine(tempFolder, "symlink_source.txt");
var destination = Path.Combine(tempFolder, "symlink_destination.txt");
File.WriteAllText(file, "Some content");
new UnixSymbolicLinkInfo(source).CreateSymbolicLinkTo(file);
Subject.MoveFile(source, destination);
File.Exists(file).Should().BeTrue();
File.Exists(source).Should().BeFalse();
File.Exists(destination).Should().BeTrue();
UnixFileSystemInfo.GetFileSystemEntry(destination).IsSymbolicLink.Should().BeTrue();
File.ReadAllText(destination).Should().Be("Some content");
}
[Test]
public void should_copy_symlink()
{
var tempFolder = GetTempFilePath();
Directory.CreateDirectory(tempFolder);
var file = Path.Combine(tempFolder, "target.txt");
var source = Path.Combine(tempFolder, "symlink_source.txt");
var destination = Path.Combine(tempFolder, "symlink_destination.txt");
File.WriteAllText(file, "Some content");
new UnixSymbolicLinkInfo(source).CreateSymbolicLinkTo(file);
Subject.CopyFile(source, destination);
File.Exists(file).Should().BeTrue();
File.Exists(source).Should().BeTrue();
File.Exists(destination).Should().BeTrue();
UnixFileSystemInfo.GetFileSystemEntry(source).IsSymbolicLink.Should().BeTrue();
UnixFileSystemInfo.GetFileSystemEntry(destination).IsSymbolicLink.Should().BeTrue();
File.ReadAllText(source).Should().Be("Some content");
File.ReadAllText(destination).Should().Be("Some content");
}
}
}