DD.WellWorkover.Cloud/AsbCloudWebApi.Tests/ServicesTests/BackgroundWorkerService_WorkQueue_Test.cs
2022-12-01 17:48:35 +05:00

110 lines
3.1 KiB
C#

using AsbCloudInfrastructure.Services.Background;
using System;
using System.Threading;
using System.Threading.Tasks;
using Xunit;
namespace AsbCloudWebApi.Tests.ServicesTests
{
public class BackgroundWorkerService_WorkQueue_Test
{
private readonly TimeSpan period = TimeSpan.FromSeconds(10);
private readonly Func<string, IServiceProvider, CancellationToken, Task> somAction = (string id, IServiceProvider scope, CancellationToken token) => Task.CompletedTask;
[Fact]
public void Push_not_unique_id_should_throw()
{
var work1 = new WorkPeriodic("1", somAction, TimeSpan.FromSeconds(30));
var work2 = new WorkBase("1", somAction);
var queue = new WorkQueue();
queue.Push(work1);
Assert.Throws<ArgumentException>(
() => queue.Push(work2));
}
[Fact]
public void Pop_should_return_null()
{
var work1 = new WorkPeriodic("1", somAction, TimeSpan.FromSeconds(30))
{ LastStart = DateTime.Now };
var queue = new WorkQueue();
queue.Push(work1);
var workpoPoped= queue.Pop();
Assert.Null(workpoPoped);
}
[Fact]
public void Pop_primary_first()
{
var work1 = new WorkBase("1", somAction);
var work2 = new WorkPeriodic("1", somAction, period);
var queue = new WorkQueue();
queue.Push(work2);
queue.Push(work1);
var workpoPoped= queue.Pop();
Assert.Equal(work1, workpoPoped);
}
[Fact]
public void Pop_second_after_delete_first()
{
var work1 = new WorkPeriodic("1", somAction, period);
var work2 = new WorkPeriodic("2", somAction, period);
var queue = new WorkQueue();
queue.Push(work1);
queue.Push(work2);
queue.Delete("1");
var workpoPoped= queue.Pop();
Assert.Equal(work2, workpoPoped);
}
[Fact]
public void Pop_closest_to_nextStart()
{
var work1 = new WorkPeriodic("1", somAction, period) {
LastStart = DateTime.Now,
};
var work2 = new WorkPeriodic("2", somAction, period);
var queue = new WorkQueue();
queue.Push(work1);
queue.Push(work2);
var workpoPoped= queue.Pop();
Assert.Equal(work2, workpoPoped);
}
[Fact]
public void Pop_closest_to_explicit_nextStart()
{
var baseTime = DateTime.Now - period;
var work1 = new WorkPeriodic("1", somAction, period)
{
LastStart = baseTime - TimeSpan.FromSeconds(-1),
};
var work2 = new WorkPeriodic("2", somAction, period)
{
LastStart = baseTime,
};
var queue = new WorkQueue();
queue.Push(work1);
queue.Push(work2);
var workpoPoped= queue.Pop();
Assert.Equal(work2, workpoPoped);
}
}
}