From f3fbbf66e058a9f72acf5114d70b47bddc66add6 Mon Sep 17 00:00:00 2001 From: Mark McDowall Date: Thu, 28 Nov 2013 00:03:58 -0800 Subject: [PATCH] Catching InvalidOperationExceptions when Inheriting folder permissions Fixed: Issue sorting files when series is on a share running on UFS --- .../MoveEpisodeFileFixture.cs | 85 +++++++++++++++++++ .../NzbDrone.Core.Test.csproj | 1 + .../MediaFiles/EpisodeFileMovingService.cs | 21 +++-- 3 files changed, 99 insertions(+), 8 deletions(-) create mode 100644 src/NzbDrone.Core.Test/MediaFiles/EpisodeFileMovingServiceTests/MoveEpisodeFileFixture.cs diff --git a/src/NzbDrone.Core.Test/MediaFiles/EpisodeFileMovingServiceTests/MoveEpisodeFileFixture.cs b/src/NzbDrone.Core.Test/MediaFiles/EpisodeFileMovingServiceTests/MoveEpisodeFileFixture.cs new file mode 100644 index 000000000..a1682fef0 --- /dev/null +++ b/src/NzbDrone.Core.Test/MediaFiles/EpisodeFileMovingServiceTests/MoveEpisodeFileFixture.cs @@ -0,0 +1,85 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using FizzWare.NBuilder; +using Moq; +using NUnit.Framework; +using NzbDrone.Common; +using NzbDrone.Core.MediaFiles; +using NzbDrone.Core.Organizer; +using NzbDrone.Core.Parser.Model; +using NzbDrone.Core.Test.Framework; +using NzbDrone.Core.Tv; + +namespace NzbDrone.Core.Test.MediaFiles.EpisodeFileMovingServiceTests +{ + [TestFixture] + public class MoveEpisodeFileFixture : CoreTest + { + private Series _series; + private EpisodeFile _episodeFile; + private LocalEpisode _localEpisode; + + [SetUp] + public void Setup() + { + _episodeFile = Builder.CreateNew() + .With(f => f.Path = @"C:\Test\File.avi") + .Build(); + + _localEpisode = Builder.CreateNew() + .With(l => l.Series = Builder.CreateNew().Build()) + .With(l => l.Episodes = Builder.CreateListOfSize(1).Build().ToList()) + .Build(); + + Mocker.GetMock() + .Setup(s => s.BuildFilename(It.IsAny>(), It.IsAny(), It.IsAny())) + .Returns("File Name"); + + Mocker.GetMock() + .Setup(s => s.BuildFilePath(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + .Returns(@"C:\Test\File Name.avi"); + + Mocker.GetMock() + .Setup(s => s.FileExists(It.IsAny())) + .Returns(true); + } + + [Test] + public void should_catch_UnauthorizedAccessException_during_folder_inheritance() + { + WindowsOnly(); + + Mocker.GetMock() + .Setup(s => s.InheritFolderPermissions(It.IsAny())) + .Throws(); + + Subject.MoveEpisodeFile(_episodeFile, _localEpisode); + } + + [Test] + public void should_catch_InvalidOperationException_during_folder_inheritance() + { + WindowsOnly(); + + Mocker.GetMock() + .Setup(s => s.InheritFolderPermissions(It.IsAny())) + .Throws(); + + Subject.MoveEpisodeFile(_episodeFile, _localEpisode); + } + + [Test] + public void should_not_catch_generic_Exception_during_folder_inheritance() + { + WindowsOnly(); + + Mocker.GetMock() + .Setup(s => s.InheritFolderPermissions(It.IsAny())) + .Throws(); + + Assert.Throws(() => Subject.MoveEpisodeFile(_episodeFile, _localEpisode)); + } + } +} diff --git a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index 23a7f3ea0..cab12b710 100644 --- a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -143,6 +143,7 @@ + diff --git a/src/NzbDrone.Core/MediaFiles/EpisodeFileMovingService.cs b/src/NzbDrone.Core/MediaFiles/EpisodeFileMovingService.cs index d9cda55e1..4a094e1eb 100644 --- a/src/NzbDrone.Core/MediaFiles/EpisodeFileMovingService.cs +++ b/src/NzbDrone.Core/MediaFiles/EpisodeFileMovingService.cs @@ -18,23 +18,20 @@ public interface IMoveEpisodeFiles string MoveEpisodeFile(EpisodeFile episodeFile, LocalEpisode localEpisode); } - public class MoveEpisodeFiles : IMoveEpisodeFiles + public class EpisodeFileMovingService : IMoveEpisodeFiles { private readonly IEpisodeService _episodeService; private readonly IBuildFileNames _buildFileNames; - private readonly IEventAggregator _eventAggregator; private readonly IDiskProvider _diskProvider; private readonly Logger _logger; - public MoveEpisodeFiles(IEpisodeService episodeService, + public EpisodeFileMovingService(IEpisodeService episodeService, IBuildFileNames buildFileNames, - IEventAggregator eventAggregator, IDiskProvider diskProvider, Logger logger) { _episodeService = episodeService; _buildFileNames = buildFileNames; - _eventAggregator = eventAggregator; _diskProvider = diskProvider; _logger = logger; } @@ -106,10 +103,18 @@ private void MoveFile(EpisodeFile episodeFile, Series series, string destination { _diskProvider.InheritFolderPermissions(destinationFilename); } - catch (UnauthorizedAccessException ex) + catch (Exception ex) { - _logger.Debug("Unable to apply folder permissions to: ", destinationFilename); - _logger.TraceException(ex.Message, ex); + if (ex is UnauthorizedAccessException || ex is InvalidOperationException) + { + _logger.Debug("Unable to apply folder permissions to: ", destinationFilename); + _logger.TraceException(ex.Message, ex); + } + + else + { + throw; + } } } }