ManagedFileSystemTests.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. [Theory]
  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. public void MakeAbsolutePathCorrectlyHandlesRelativeFilePaths(
  25. string folderPath,
  26. string filePath,
  27. string expectedAbsolutePath)
  28. {
  29. var generatedPath = _sut.MakeAbsolutePath(folderPath, filePath);
  30. if (OperatingSystem.IsWindows())
  31. {
  32. var expectedWindowsPath = expectedAbsolutePath.Replace('/', '\\');
  33. Assert.Equal(expectedWindowsPath, generatedPath.Split(':')[1]);
  34. }
  35. else
  36. {
  37. Assert.Equal(expectedAbsolutePath, generatedPath);
  38. }
  39. }
  40. [Theory]
  41. [InlineData("ValidFileName", "ValidFileName")]
  42. [InlineData("AC/DC", "AC DC")]
  43. [InlineData("Invalid\0", "Invalid ")]
  44. [InlineData("AC/DC\0KD/A", "AC DC KD A")]
  45. public void GetValidFilename_ReturnsValidFilename(string filename, string expectedFileName)
  46. {
  47. Assert.Equal(expectedFileName, _sut.GetValidFilename(filename));
  48. }
  49. [SkippableFact]
  50. public void GetFileInfo_DanglingSymlink_ExistsFalse()
  51. {
  52. Skip.If(OperatingSystem.IsWindows());
  53. string testFileDir = Path.Combine(Path.GetTempPath(), "jellyfin-test-data");
  54. string testFileName = Path.Combine(testFileDir, Path.GetRandomFileName() + "-danglingsym.link");
  55. Directory.CreateDirectory(testFileDir);
  56. Assert.Equal(0, symlink("thispathdoesntexist", testFileName));
  57. Assert.True(File.Exists(testFileName));
  58. var metadata = _sut.GetFileInfo(testFileName);
  59. Assert.False(metadata.Exists);
  60. }
  61. [SuppressMessage("Naming Rules", "SA1300:ElementMustBeginWithUpperCaseLetter", Justification = "Have to")]
  62. [DllImport("libc", SetLastError = true, CharSet = CharSet.Ansi)]
  63. [DefaultDllImportSearchPaths(DllImportSearchPath.UserDirectories)]
  64. private static extern int symlink(string target, string linkpath);
  65. }
  66. }