diff --git a/src/NzbDrone.Common/Extensions/PathExtensions.cs b/src/NzbDrone.Common/Extensions/PathExtensions.cs index 8f4c0b22d..1ce4aef40 100644 --- a/src/NzbDrone.Common/Extensions/PathExtensions.cs +++ b/src/NzbDrone.Common/Extensions/PathExtensions.cs @@ -170,6 +170,11 @@ namespace NzbDrone.Common.Extensions public static bool ContainsInvalidPathChars(this string text) { + if (text.IsNullOrWhiteSpace()) + { + throw new ArgumentNullException("text"); + } + return text.IndexOfAny(Path.GetInvalidPathChars()) >= 0; } diff --git a/src/NzbDrone.Core.Test/HealthCheck/Checks/RootFolderCheckFixture.cs b/src/NzbDrone.Core.Test/HealthCheck/Checks/RootFolderCheckFixture.cs index 80e388d02..7f5cefc17 100644 --- a/src/NzbDrone.Core.Test/HealthCheck/Checks/RootFolderCheckFixture.cs +++ b/src/NzbDrone.Core.Test/HealthCheck/Checks/RootFolderCheckFixture.cs @@ -7,7 +7,9 @@ using NzbDrone.Common.Disk; using NzbDrone.Core.HealthCheck.Checks; using NzbDrone.Core.Localization; using NzbDrone.Core.Movies; +using NzbDrone.Core.RootFolders; using NzbDrone.Core.Test.Framework; +using NzbDrone.Test.Common; namespace NzbDrone.Core.Test.HealthCheck.Checks { @@ -22,7 +24,7 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks .Returns("Some Warning Message"); } - private void GivenMissingRootFolder() + private void GivenMissingRootFolder(string rootFolderPath) { var movies = Builder.CreateListOfSize(1) .Build() @@ -32,9 +34,9 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks .Setup(s => s.AllMoviePaths()) .Returns(movies.ToDictionary(x => x.Id, x => x.Path)); - Mocker.GetMock() - .Setup(s => s.GetParentFolder(movies.First().Path)) - .Returns(@"C:\Movies"); + Mocker.GetMock() + .Setup(s => s.GetBestRootFolderPath(It.IsAny(), null)) + .Returns(rootFolderPath); Mocker.GetMock() .Setup(s => s.FolderExists(It.IsAny())) @@ -54,7 +56,25 @@ namespace NzbDrone.Core.Test.HealthCheck.Checks [Test] public void should_return_error_if_movie_parent_is_missing() { - GivenMissingRootFolder(); + GivenMissingRootFolder(@"C:\Movies".AsOsAgnostic()); + + Subject.Check().ShouldBeError(); + } + + [Test] + public void should_return_error_if_series_path_is_for_posix_os() + { + WindowsOnly(); + GivenMissingRootFolder("/mnt/movies"); + + Subject.Check().ShouldBeError(); + } + + [Test] + public void should_return_error_if_series_path_is_for_windows() + { + PosixOnly(); + GivenMissingRootFolder(@"C:\Movies"); Subject.Check().ShouldBeError(); } diff --git a/src/NzbDrone.Core/DiskSpace/DiskSpaceService.cs b/src/NzbDrone.Core/DiskSpace/DiskSpaceService.cs index f7dcd3893..23f0654a7 100644 --- a/src/NzbDrone.Core/DiskSpace/DiskSpaceService.cs +++ b/src/NzbDrone.Core/DiskSpace/DiskSpaceService.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Text.RegularExpressions; using NLog; using NzbDrone.Common.Disk; +using NzbDrone.Common.Extensions; using NzbDrone.Core.Movies; namespace NzbDrone.Core.DiskSpace @@ -43,7 +44,7 @@ namespace NzbDrone.Core.DiskSpace private IEnumerable GetMoviesRootPaths() { return _movieService.AllMoviePaths() - .Where(s => _diskProvider.FolderExists(s.Value)) + .Where(s => s.Value.IsPathValid(PathValidationType.CurrentOs) && _diskProvider.FolderExists(s.Value)) .Select(s => _diskProvider.GetPathRoot(s.Value)) .Distinct(); } diff --git a/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs b/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs index b991adfcd..b694ddb4f 100644 --- a/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs +++ b/src/NzbDrone.Core/HealthCheck/Checks/RootFolderCheck.cs @@ -1,5 +1,6 @@ using System.Linq; using NzbDrone.Common.Disk; +using NzbDrone.Common.Extensions; using NzbDrone.Core.Localization; using NzbDrone.Core.MediaFiles.Events; using NzbDrone.Core.Movies; @@ -32,7 +33,7 @@ namespace NzbDrone.Core.HealthCheck.Checks .Select(s => _rootFolderService.GetBestRootFolderPath(s.Value)) .Distinct(); - var missingRootFolders = rootFolders.Where(s => !_diskProvider.FolderExists(s)) + var missingRootFolders = rootFolders.Where(s => !s.IsPathValid(PathValidationType.CurrentOs) || !_diskProvider.FolderExists(s)) .ToList(); if (missingRootFolders.Any()) diff --git a/src/NzbDrone.Core/RootFolders/RootFolderService.cs b/src/NzbDrone.Core/RootFolders/RootFolderService.cs index e5cbdb9b8..a77fbc165 100644 --- a/src/NzbDrone.Core/RootFolders/RootFolderService.cs +++ b/src/NzbDrone.Core/RootFolders/RootFolderService.cs @@ -188,10 +188,12 @@ namespace NzbDrone.Core.RootFolders if (possibleRootFolder == null) { - return _diskProvider.GetParentFolder(path); + var osPath = new OsPath(path); + + return osPath.Directory.ToString(); } - return possibleRootFolder.Path; + return possibleRootFolder?.Path; } private void GetDetails(RootFolder rootFolder, Dictionary moviePaths, bool timeout)