using FizzWare.NBuilder; using FluentAssertions; using NUnit.Framework; using NzbDrone.Core.Download; using NzbDrone.Core.ImportLists; using NzbDrone.Core.Indexers; using NzbDrone.Core.Messaging.Commands; using NzbDrone.Core.Music.Commands; using NzbDrone.Core.Test.Framework; using NzbDrone.Core.Update.Commands; namespace NzbDrone.Core.Test.Messaging.Commands { [TestFixture] public class CommandQueueFixture : CoreTest { private void GivenStartedDiskCommand() { var commandModel = Builder .CreateNew() .With(c => c.Name = "ProcessMonitoredDownloads") .With(c => c.Body = new ProcessMonitoredDownloadsCommand()) .With(c => c.Status = CommandStatus.Started) .Build(); Subject.Add(commandModel); } private void GivenLongRunningCommand() { var commandModel = Builder .CreateNew() .With(c => c.Name = "RssSync") .With(c => c.Body = new RssSyncCommand()) .With(c => c.Status = CommandStatus.Started) .Build(); Subject.Add(commandModel); } private void GivenStartedTypeExclusiveCommand() { var commandModel = Builder .CreateNew() .With(c => c.Name = "ImportListSync") .With(c => c.Body = new ImportListSyncCommand()) .With(c => c.Status = CommandStatus.Started) .Build(); Subject.Add(commandModel); } private void GivenStartedExclusiveCommand() { var commandModel = Builder .CreateNew() .With(c => c.Name = "ApplicationUpdate") .With(c => c.Body = new ApplicationUpdateCommand()) .With(c => c.Status = CommandStatus.Started) .Build(); Subject.Add(commandModel); } [Test] public void should_not_return_disk_access_command_if_another_running() { GivenStartedDiskCommand(); var newCommandModel = Builder .CreateNew() .With(c => c.Name = "ProcessMonitoredDownloads") .With(c => c.Body = new ProcessMonitoredDownloadsCommand()) .Build(); Subject.Add(newCommandModel); Subject.TryGet(out var command); command.Should().BeNull(); } [Test] public void should_not_return_type_exclusive_command_if_another_running() { GivenStartedTypeExclusiveCommand(); var newCommandModel = Builder .CreateNew() .With(c => c.Name = "ImportListSync") .With(c => c.Body = new ImportListSyncCommand()) .Build(); Subject.Add(newCommandModel); Subject.TryGet(out var command); command.Should().BeNull(); } [Test] public void should_not_return_exclusive_command_if_long_running_command_running() { GivenLongRunningCommand(); var newCommandModel = Builder .CreateNew() .With(c => c.Name = "ApplicationUpdate") .With(c => c.Body = new ApplicationUpdateCommand()) .Build(); Subject.Add(newCommandModel); Subject.TryGet(out var command); command.Should().BeNull(); } [Test] public void should_not_return_type_exclusive_command_if_another_and_disk_access_command_running() { GivenStartedTypeExclusiveCommand(); GivenStartedDiskCommand(); var newCommandModel = Builder .CreateNew() .With(c => c.Name = "ImportListSync") .With(c => c.Body = new ImportListSyncCommand()) .Build(); Subject.Add(newCommandModel); Subject.TryGet(out var command); command.Should().BeNull(); } [Test] public void should_return_type_exclusive_command_if_another_not_running() { GivenStartedDiskCommand(); var newCommandModel = Builder .CreateNew() .With(c => c.Name = "ImportListSync") .With(c => c.Body = new ImportListSyncCommand()) .Build(); Subject.Add(newCommandModel); Subject.TryGet(out var command); command.Should().NotBeNull(); command.Status.Should().Be(CommandStatus.Started); } [Test] public void should_return_regular_command_if_type_exclusive_command_running() { GivenStartedTypeExclusiveCommand(); var newCommandModel = Builder .CreateNew() .With(c => c.Name = "RefreshArtist") .With(c => c.Body = new RefreshArtistCommand()) .Build(); Subject.Add(newCommandModel); Subject.TryGet(out var command); command.Should().NotBeNull(); command.Status.Should().Be(CommandStatus.Started); } [Test] public void should_not_return_exclusive_command_if_any_running() { GivenStartedDiskCommand(); var newCommandModel = Builder .CreateNew() .With(c => c.Name = "ApplicationUpdate") .With(c => c.Body = new ApplicationUpdateCommand()) .Build(); Subject.Add(newCommandModel); Subject.TryGet(out var command); command.Should().BeNull(); } [Test] public void should_not_return_any_command_if_exclusive_running() { GivenStartedExclusiveCommand(); var newCommandModel = Builder .CreateNew() .With(c => c.Name = "RefreshArtist") .With(c => c.Body = new RefreshArtistCommand()) .Build(); Subject.Add(newCommandModel); Subject.TryGet(out var command); command.Should().BeNull(); } [Test] public void should_return_null_if_nothing_queued() { GivenStartedDiskCommand(); Subject.TryGet(out var command); command.Should().BeNull(); } } }