using System.Net; using Opc.Ua; using Shouldly; using Xunit; namespace ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests; public sealed class Sdk2ActivationPeerTests { [Fact] public async Task Concurrent_activations_keep_their_own_peer_across_awaits() { using var server = new OtOpcUaSdkServer(); var peers = new IPAddress?[] { IPAddress.Parse("127.0.0.1"), IPAddress.Parse("::1"), IPAddress.Parse("::ffff:10.1.2.3"), null }; var entered = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var count = 0; await Task.WhenAll(peers.Select(async peer => await server.WithActivationPeerAddressAsync(peer, async () => { server.ActivationPeerAddress.ShouldBe(peer); if (Interlocked.Increment(ref count) == peers.Length) entered.SetResult(); await entered.Task; server.ActivationPeerAddress.ShouldBe(peer); return new ActivateSessionResponse(); }))); server.ActivationPeerAddress.ShouldBeNull(); } [Fact] public async Task Failure_and_cancellation_restore_the_outer_peer_including_unknown() { using var server = new OtOpcUaSdkServer(); var outer = IPAddress.Parse("10.2.3.4"); await server.WithActivationPeerAddressAsync(outer, async () => { await Should.ThrowAsync(async () => await server.WithActivationPeerAddressAsync(null, () => throw new InvalidOperationException("failed activation"))); server.ActivationPeerAddress.ShouldBe(outer); await Should.ThrowAsync(async () => await server.WithActivationPeerAddressAsync(IPAddress.IPv6Loopback, () => throw new OperationCanceledException())); server.ActivationPeerAddress.ShouldBe(outer); return new ActivateSessionResponse(); }); server.ActivationPeerAddress.ShouldBeNull(); } }