using Moq; using Opc.Ua.Client; using Shouldly; using Xunit; namespace ZB.MOM.WW.OtOpcUa.Driver.OpcUaClient.Tests; /// /// #630 (same pattern) — InitializeAsync on a live driver (no ShutdownAsync first) used to /// overwrite Session and orphan the previous session + its keep-alive handler. /// [Trait("Category", "Unit")] public sealed class OpcUaClientReinitializeReleasesSessionTests { /// A second Initialize disposes the live session before attempting to build a new one. [Fact] public async Task Initialize_OnLiveDriver_DisposesThePreviousSession() { var options = new OpcUaClientDriverOptions { EndpointUrl = "opc.tcp://127.0.0.1:1" }; using var drv = new OpcUaClientDriver(options, "opcua-reinit"); var old = new Mock(); drv.SetSessionForTest(old.Object); // The new connect is refused (nothing listens on port 1) — what matters is what happened to the old one. await Should.ThrowAsync(() => drv.InitializeAsync("{}", TestContext.Current.CancellationToken)); old.Verify(s => s.Dispose(), Times.AtLeastOnce); drv.Session.ShouldBeNull(); } }