Files
lmxopcua/tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests/Sdk2ActivationPeerTests.cs
T

46 lines
1.9 KiB
C#

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<InvalidOperationException>(async () =>
await server.WithActivationPeerAddressAsync(null, () => throw new InvalidOperationException("failed activation")));
server.ActivationPeerAddress.ShouldBe(outer);
await Should.ThrowAsync<OperationCanceledException>(async () =>
await server.WithActivationPeerAddressAsync(IPAddress.IPv6Loopback, () => throw new OperationCanceledException()));
server.ActivationPeerAddress.ShouldBe(outer);
return new ActivateSessionResponse();
});
server.ActivationPeerAddress.ShouldBeNull();
}
}