Radarr/src/NzbDrone.Mono.Test/DiskProviderTests/DiskProviderFixture.cs

132 lines
4.5 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using FluentAssertions;
2015-02-04 00:10:16 +00:00
using Mono.Unix;
using Moq;
using NUnit.Framework;
using NzbDrone.Common.Disk;
using NzbDrone.Common.Test.DiskTests;
2016-08-12 03:30:18 +00:00
using NzbDrone.Mono.Disk;
namespace NzbDrone.Mono.Test.DiskProviderTests
{
[TestFixture]
2019-10-14 20:21:00 +00:00
[Platform(Exclude="Win")]
public class DiskProviderFixture : DiskProviderFixtureBase<DiskProvider>
{
public DiskProviderFixture()
{
2019-10-14 20:21:00 +00:00
PosixOnly();
}
protected override void SetWritePermissions(string path, bool writable)
{
2015-02-04 00:10:16 +00:00
if (Environment.UserName == "root")
{
Assert.Inconclusive("Need non-root user to test write permissions.");
}
// Remove Write permissions, we're still owner so we can clean it up, but we'll have to do that explicitly.
var entry = UnixFileSystemInfo.GetFileSystemEntry(path);
if (writable)
{
entry.FileAccessPermissions |= FileAccessPermissions.UserWrite | FileAccessPermissions.GroupWrite | FileAccessPermissions.OtherWrite;
}
else
{
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");
}
private void GivenSpecialMount(string rootDir)
{
Mocker.GetMock<ISymbolicLinkResolver>()
.Setup(v => v.GetCompleteRealPath(It.IsAny<string>()))
.Returns<string>(s => s);
Mocker.GetMock<IProcMountProvider>()
.Setup(v => v.GetMounts())
.Returns(new List<IMount> {
new ProcMount(DriveType.Fixed, rootDir, rootDir, "myfs", new MountOptions(new Dictionary<string, string>()))
});
}
[TestCase("/snap/blaat")]
[TestCase("/var/lib/docker/zfs-storage-mount")]
public void should_ignore_special_mounts(string rootDir)
{
GivenSpecialMount(rootDir);
var mounts = Subject.GetMounts();
mounts.Select(d => d.RootDirectory).Should().NotContain(rootDir);
}
[TestCase("/snap/blaat")]
[TestCase("/var/lib/docker/zfs-storage-mount")]
public void should_return_special_mount_when_queried(string rootDir)
{
GivenSpecialMount(rootDir);
var mount = Subject.GetMount(Path.Combine(rootDir, "dir/somefile.mkv"));
mount.Should().NotBeNull();
mount.RootDirectory.Should().Be(rootDir);
}
}
}