Skip to content

Commit 95b4242

Browse files
committed
add requeue test
1 parent b3b764d commit 95b4242

File tree

1 file changed

+50
-0
lines changed

1 file changed

+50
-0
lines changed

Tests/Opc.Ua.Server.Tests/SessionPublishQueueTests.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,56 @@ public async Task GetSubscriptionToPublish_SelectsHighestPriorityAndOldest()
425425
Assert.That(result3, Is.SameAs(sub1.Object));
426426
}
427427

428+
[Test]
429+
public async Task PublishAsync_RequeueTrue_AddsToFrontOfQueue()
430+
{
431+
using var queue = new SessionPublishQueue(m_serverMock.Object, m_sessionMock.Object, MaxPublishRequests);
432+
433+
var subMock = new Mock<ISubscription>();
434+
subMock.Setup(s => s.Id).Returns(1);
435+
queue.Add(subMock.Object);
436+
437+
var taskA = queue.PublishAsync("channel1", DateTime.MaxValue, false, CancellationToken.None);
438+
var taskB = queue.PublishAsync("channel1", DateTime.MaxValue, true, CancellationToken.None);
439+
var taskC = queue.PublishAsync("channel1", DateTime.MaxValue, false, CancellationToken.None);
440+
441+
subMock.Setup(s => s.PublishTimerExpired()).Returns(PublishingState.NotificationsAvailable);
442+
443+
// First expiration should complete taskB because it was requeued (added to front)
444+
queue.PublishTimerExpired();
445+
var resultB = await taskB.ConfigureAwait(false);
446+
Assert.That(resultB, Is.SameAs(subMock.Object));
447+
Assert.That(taskA.IsCompleted, Is.False);
448+
Assert.That(taskC.IsCompleted, Is.False);
449+
450+
queue.Remove(subMock.Object, false);
451+
452+
// Need another subscription to fulfill the next request
453+
var subMock2 = new Mock<ISubscription>();
454+
subMock2.Setup(s => s.Id).Returns(2);
455+
subMock2.Setup(s => s.PublishTimerExpired()).Returns(PublishingState.NotificationsAvailable);
456+
queue.Add(subMock2.Object);
457+
458+
// Second expiration should complete taskA (it was the first added with requeue=false)
459+
queue.PublishTimerExpired();
460+
var resultA = await taskA.ConfigureAwait(false);
461+
Assert.That(resultA, Is.SameAs(subMock2.Object));
462+
Assert.That(taskC.IsCompleted, Is.False);
463+
464+
queue.Remove(subMock2.Object, false);
465+
466+
// Need a third subscription to fulfill the last request
467+
var subMock3 = new Mock<ISubscription>();
468+
subMock3.Setup(s => s.Id).Returns(3);
469+
subMock3.Setup(s => s.PublishTimerExpired()).Returns(PublishingState.NotificationsAvailable);
470+
queue.Add(subMock3.Object);
471+
472+
// Third expiration should complete taskC
473+
queue.PublishTimerExpired();
474+
var resultC = await taskC.ConfigureAwait(false);
475+
Assert.That(resultC, Is.SameAs(subMock3.Object));
476+
}
477+
428478
[Test]
429479
public async Task Concurrency_MultipleRequestsAndSubscriptions()
430480
{

0 commit comments

Comments
 (0)