New: List Status Checks/Backoffs

This commit is contained in:
Qstick
2020-04-07 22:37:48 -04:00
parent d10e60587b
commit b1fd924188
25 changed files with 396 additions and 34 deletions
@@ -0,0 +1,87 @@
using System;
using System.Collections.Generic;
using Moq;
using NUnit.Framework;
using NzbDrone.Core.HealthCheck.Checks;
using NzbDrone.Core.NetImport;
using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.HealthCheck.Checks
{
[TestFixture]
public class NetImportStatusCheckFixture : CoreTest<NetImportStatusCheck>
{
private List<INetImport> _lists = new List<INetImport>();
private List<NetImportStatus> _blockedLists = new List<NetImportStatus>();
[SetUp]
public void SetUp()
{
Mocker.GetMock<INetImportFactory>()
.Setup(v => v.GetAvailableProviders())
.Returns(_lists);
Mocker.GetMock<INetImportStatusService>()
.Setup(v => v.GetBlockedProviders())
.Returns(_blockedLists);
}
private Mock<INetImport> GivenList(int i, double backoffHours, double failureHours)
{
var id = i;
var mockList = new Mock<INetImport>();
mockList.SetupGet(s => s.Definition).Returns(new NetImportDefinition { Id = id });
mockList.SetupGet(s => s.EnableAuto).Returns(true);
_lists.Add(mockList.Object);
if (backoffHours != 0.0)
{
_blockedLists.Add(new NetImportStatus
{
ProviderId = id,
InitialFailure = DateTime.UtcNow.AddHours(-failureHours),
MostRecentFailure = DateTime.UtcNow.AddHours(-0.1),
EscalationLevel = 5,
DisabledTill = DateTime.UtcNow.AddHours(backoffHours)
});
}
return mockList;
}
[Test]
public void should_not_return_error_when_no_indexers()
{
Subject.Check().ShouldBeOk();
}
[Test]
public void should_return_warning_if_indexer_unavailable()
{
GivenList(1, 10.0, 24.0);
GivenList(2, 0.0, 0.0);
Subject.Check().ShouldBeWarning();
}
[Test]
public void should_return_error_if_all_indexers_unavailable()
{
GivenList(1, 10.0, 24.0);
Subject.Check().ShouldBeError();
}
[Test]
public void should_return_warning_if_few_indexers_unavailable()
{
GivenList(1, 10.0, 24.0);
GivenList(2, 10.0, 24.0);
GivenList(3, 0.0, 0.0);
Subject.Check().ShouldBeWarning();
}
}
}
@@ -0,0 +1,72 @@
using System;
using System.Linq;
using FluentAssertions;
using Moq;
using NUnit.Framework;
using NzbDrone.Common.EnvironmentInfo;
using NzbDrone.Core.NetImport;
using NzbDrone.Core.Test.Framework;
namespace NzbDrone.Core.Test.NetImport
{
public class NetImportStatusServiceFixture : CoreTest<NetImportStatusService>
{
private DateTime _epoch;
[SetUp]
public void SetUp()
{
_epoch = DateTime.UtcNow;
Mocker.GetMock<IRuntimeInfo>()
.SetupGet(v => v.StartTime)
.Returns(_epoch - TimeSpan.FromHours(1));
}
private void WithStatus(NetImportStatus status)
{
Mocker.GetMock<INetImportStatusRepository>()
.Setup(v => v.FindByProviderId(1))
.Returns(status);
Mocker.GetMock<INetImportStatusRepository>()
.Setup(v => v.All())
.Returns(new[] { status });
}
private void VerifyUpdate()
{
Mocker.GetMock<INetImportStatusRepository>()
.Verify(v => v.Upsert(It.IsAny<NetImportStatus>()), Times.Once());
}
private void VerifyNoUpdate()
{
Mocker.GetMock<INetImportStatusRepository>()
.Verify(v => v.Upsert(It.IsAny<NetImportStatus>()), Times.Never());
}
[Test]
public void should_cancel_backoff_on_success()
{
WithStatus(new NetImportStatus { EscalationLevel = 2 });
Subject.RecordSuccess(1);
VerifyUpdate();
var status = Subject.GetBlockedProviders().FirstOrDefault();
status.Should().BeNull();
}
[Test]
public void should_not_store_update_if_already_okay()
{
WithStatus(new NetImportStatus { EscalationLevel = 0 });
Subject.RecordSuccess(1);
VerifyNoUpdate();
}
}
}