diff --git a/Libraries/Opc.Ua.Client/Session/Session.cs b/Libraries/Opc.Ua.Client/Session/Session.cs index 21d014100f..14c8a25b5b 100644 --- a/Libraries/Opc.Ua.Client/Session/Session.cs +++ b/Libraries/Opc.Ua.Client/Session/Session.cs @@ -950,8 +950,8 @@ public virtual void Save( { using Activity? activity = m_telemetry.StartActivity(); // Snapshot subscription state - var subscriptionStateCollection = new SubscriptionStateCollection(SubscriptionCount); - foreach (Subscription subscription in Subscriptions) + var subscriptionStateCollection = new SubscriptionStateCollection(); + foreach (Subscription subscription in subscriptions) { subscription.Snapshot(out SubscriptionState state); subscriptionStateCollection.Add(state); diff --git a/Tests/Opc.Ua.Client.Tests/SessionTests.cs b/Tests/Opc.Ua.Client.Tests/SessionTests.cs index 9ad4033741..32947fea60 100644 --- a/Tests/Opc.Ua.Client.Tests/SessionTests.cs +++ b/Tests/Opc.Ua.Client.Tests/SessionTests.cs @@ -28,11 +28,13 @@ * ======================================================================*/ using System; +using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; using Moq; using NUnit.Framework; +using Opc.Ua.Tests; namespace Opc.Ua.Client.Tests { @@ -1340,5 +1342,35 @@ public void OpenAsyncShouldHandleInvalidServerResponse() sut.Channel.Verify(); } + + [Test] + public void SaveShouldOnlySaveSpecifiedSubscriptions() + { + var sut = SessionMock.Create(); + ITelemetryContext telemetry = NUnitTelemetryContext.Create(); + + var subscription1 = new Subscription(telemetry, new SubscriptionOptions { DisplayName = "Subscription1" }); + var subscription2 = new Subscription(telemetry, new SubscriptionOptions { DisplayName = "Subscription2" }); + var subscription3 = new Subscription(telemetry, new SubscriptionOptions { DisplayName = "Subscription3" }); + + sut.AddSubscription(subscription1); + sut.AddSubscription(subscription2); + sut.AddSubscription(subscription3); + + Assert.That(sut.SubscriptionCount, Is.EqualTo(3)); + + // Only save a subset of subscriptions (subscription1 and subscription3) + Subscription[] subscriptionsToSave = [subscription1, subscription3]; + + using var stream = new MemoryStream(); + sut.Save(stream, subscriptionsToSave); + stream.Position = 0; + + var loadSession = SessionMock.Create(); + var loadedSubscriptions = loadSession.Load(stream).ToList(); + + Assert.That(loadedSubscriptions.Count, Is.EqualTo(2), "Only the specified subscriptions should be saved"); + Assert.That(loadedSubscriptions.Select(s => s.DisplayName), Is.EquivalentTo(["Subscription1", "Subscription3"])); + } } }