46 lines
1.9 KiB
C#
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();
|
|
}
|
|
}
|