Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Opc.Ua.Server/Session/SessionContinuationPoints.cs
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ public void SaveBrowse(ContinuationPoint continuationPoint)
m_browse ??= [];

// remove the first continuation point if too many points.
while (m_browse.Count > MaxBrowse)
while (m_browse.Count >= MaxBrowse)
{
ContinuationPoint cp = m_browse[0];
m_browse.RemoveAt(0);
Expand Down
24 changes: 24 additions & 0 deletions tests/Opc.Ua.Server.Tests/SessionContinuationPointsTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,30 @@ public void SaveBrowseEvictsOldestAndNotifiesStore()
Times.Once);
}

[Test]
public void SaveBrowseEvictsWhenCountReachesConfiguredLimit()
{
var store = new Mock<IContinuationPointStore>(MockBehavior.Loose);
SessionContinuationPoints holder = NewHolder(maxBrowse: 2, store: store.Object);

var evicted = new TrackingDisposable();
ContinuationPoint cp1 = NewBrowsePoint(data: evicted);
ContinuationPoint cp2 = NewBrowsePoint();
ContinuationPoint cp3 = NewBrowsePoint();

holder.SaveBrowse(cp1);
holder.SaveBrowse(cp2);
holder.SaveBrowse(cp3);

Assert.That(evicted.Disposed, Is.True);
Assert.That(holder.RestoreBrowse(ToByteString(cp1.Id)), Is.Null);
Assert.That(holder.RestoreBrowse(ToByteString(cp2.Id)), Is.SameAs(cp2));
Assert.That(holder.RestoreBrowse(ToByteString(cp3.Id)), Is.SameAs(cp3));
store.Verify(
s => s.RemoveContinuationPoint(s_sessionId, ContinuationPointKind.Browse, cp1.Id),
Times.Once);
}

[Test]
public void SaveBrowseStoresEnvelopeWithNormalizedNodeIds()
{
Expand Down
Loading