diff --git a/src/Opc.Ua.Server/Session/SessionContinuationPoints.cs b/src/Opc.Ua.Server/Session/SessionContinuationPoints.cs index c90c740280..c3d6e98506 100644 --- a/src/Opc.Ua.Server/Session/SessionContinuationPoints.cs +++ b/src/Opc.Ua.Server/Session/SessionContinuationPoints.cs @@ -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); diff --git a/tests/Opc.Ua.Server.Tests/SessionContinuationPointsTests.cs b/tests/Opc.Ua.Server.Tests/SessionContinuationPointsTests.cs index 362f4c8880..d1e5176d7c 100644 --- a/tests/Opc.Ua.Server.Tests/SessionContinuationPointsTests.cs +++ b/tests/Opc.Ua.Server.Tests/SessionContinuationPointsTests.cs @@ -109,6 +109,33 @@ public void SaveBrowseEvictsOldestAndNotifiesStore() 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.Null); + Assert.That(holder.RestoreBrowse(ToByteString(cp3.Id)), Is.SameAs(cp3)); + store.Verify( + s => s.RemoveContinuationPoint(s_sessionId, ContinuationPointKind.Browse, cp1.Id), + Times.Once); + store.Verify( + s => s.RemoveContinuationPoint(s_sessionId, ContinuationPointKind.Browse, cp2.Id), + Times.Once); + } + + [Test] + public void SaveBrowseEvictsWhenCountReachesConfiguredLimit() + { + var store = new Mock(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));