2
0

ManagedFileSystemTests.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using System;
  2. using System.Diagnostics.CodeAnalysis;
  3. using System.IO;
  4. using System.Runtime.InteropServices;
  5. using AutoFixture;
  6. using AutoFixture.AutoMoq;
  7. using Emby.Server.Implementations.IO;
  8. using Xunit;
  9. namespace Jellyfin.Server.Implementations.Tests.IO
  10. {
  11. public class ManagedFileSystemTests
  12. {
  13. private readonly IFixture _fixture;
  14. private readonly ManagedFileSystem _sut;
  15. public ManagedFileSystemTests()
  16. {
  17. _fixture = new Fixture().Customize(new AutoMoqCustomization { ConfigureMembers = true });
  18. _sut = _fixture.Create<ManagedFileSystem>();
  19. }
  20. [SkippableTheory]
  21. [InlineData("/Volumes/Library/Sample/Music/Playlists/", "../Beethoven/Misc/Moonlight Sonata.mp3", "/Volumes/Library/Sample/Music/Beethoven/Misc/Moonlight Sonata.mp3")]
  22. [InlineData("/Volumes/Library/Sample/Music/Playlists/", "../../Beethoven/Misc/Moonlight Sonata.mp3", "/Volumes/Library/Sample/Beethoven/Misc/Moonlight Sonata.mp3")]
  23. [InlineData("/Volumes/Library/Sample/Music/Playlists/", "Beethoven/Misc/Moonlight Sonata.mp3", "/Volumes/Library/Sample/Music/Playlists/Beethoven/Misc/Moonlight Sonata.mp3")]
  24. [InlineData("/Volumes/Library/Sample/Music/Playlists/", "/mnt/Beethoven/Misc/Moonlight Sonata.mp3", "/mnt/Beethoven/Misc/Moonlight Sonata.mp3")]
  25. public void MakeAbsolutePathCorrectlyHandlesRelativeFilePathsOnUnixLike(
  26. string folderPath,
  27. string filePath,
  28. string expectedAbsolutePath)
  29. {
  30. Skip.If(OperatingSystem.IsWindows());
  31. var generatedPath = _sut.MakeAbsolutePath(folderPath, filePath);
  32. Assert.Equal(expectedAbsolutePath, generatedPath);
  33. }
  34. [SkippableTheory]
  35. [InlineData(@"C:\\Volumes\Library\Sample\Music\Playlists\", @"..\Beethoven\Misc\Moonlight Sonata.mp3", @"C:\Volumes\Library\Sample\Music\Beethoven\Misc\Moonlight Sonata.mp3")]
  36. [InlineData(@"C:\\Volumes\Library\Sample\Music\Playlists\", @"..\..\Beethoven\Misc\Moonlight Sonata.mp3", @"C:\Volumes\Library\Sample\Beethoven\Misc\Moonlight Sonata.mp3")]
  37. [InlineData(@"C:\\Volumes\Library\Sample\Music\Playlists\", @"Beethoven\Misc\Moonlight Sonata.mp3", @"C:\Volumes\Library\Sample\Music\Playlists\Beethoven\Misc\Moonlight Sonata.mp3")]
  38. [InlineData(@"C:\\Volumes\Library\Sample\Music\Playlists\", @"D:\\Beethoven\Misc\Moonlight Sonata.mp3", @"D:\\Beethoven\Misc\Moonlight Sonata.mp3")]
  39. public void MakeAbsolutePathCorrectlyHandlesRelativeFilePathsOnWindows(
  40. string folderPath,
  41. string filePath,
  42. string expectedAbsolutePath)
  43. {
  44. Skip.If(!OperatingSystem.IsWindows());
  45. var generatedPath = _sut.MakeAbsolutePath(folderPath, filePath);
  46. Assert.Equal(expectedAbsolutePath, generatedPath);
  47. }
  48. [Theory]
  49. [InlineData("ValidFileName", "ValidFileName")]
  50. [InlineData("AC/DC", "AC DC")]
  51. [InlineData("Invalid\0", "Invalid ")]
  52. [InlineData("AC/DC\0KD/A", "AC DC KD A")]
  53. public void GetValidFilename_ReturnsValidFilename(string filename, string expectedFileName)
  54. {
  55. Assert.Equal(expectedFileName, _sut.GetValidFilename(filename));
  56. }
  57. [SkippableFact]
  58. public void GetFileInfo_DanglingSymlink_ExistsFalse()
  59. {
  60. Skip.If(OperatingSystem.IsWindows());
  61. string testFileDir = Path.Combine(Path.GetTempPath(), "jellyfin-test-data");
  62. string testFileName = Path.Combine(testFileDir, Path.GetRandomFileName() + "-danglingsym.link");
  63. Directory.CreateDirectory(testFileDir);
  64. Assert.Equal(0, symlink("thispathdoesntexist", testFileName));
  65. Assert.True(File.Exists(testFileName));
  66. var metadata = _sut.GetFileInfo(testFileName);
  67. Assert.False(metadata.Exists);
  68. }
  69. [SuppressMessage("Naming Rules", "SA1300:ElementMustBeginWithUpperCaseLetter", Justification = "Have to")]
  70. [DllImport("libc", SetLastError = true, CharSet = CharSet.Ansi)]
  71. [DefaultDllImportSearchPaths(DllImportSearchPath.UserDirectories)]
  72. private static extern int symlink(string target, string linkpath);
  73. }
  74. }