using System.Net; using System.Net.Sockets; using Akka.Actor; using Akka.Configuration; using Xunit; using ZB.MOM.WW.ScadaBridge.Communication.ClusterState; namespace ZB.MOM.WW.ScadaBridge.Communication.Tests; public class ActiveNodeEvaluatorTests : IAsyncLifetime { private ActorSystem? _system; public async Task InitializeAsync() { var port = FreePort(); var config = ConfigurationFactory.ParseString($@" akka {{ actor.provider = cluster remote.dot-netty.tcp {{ hostname = ""127.0.0.1"", port = {port} }} cluster {{ seed-nodes = [""akka.tcp://ane-test@127.0.0.1:{port}""] roles = [""site-x""] min-nr-of-members = 1 }} }}"); _system = ActorSystem.Create("ane-test", config); var cluster = Akka.Cluster.Cluster.Get(_system); var deadline = DateTime.UtcNow.AddSeconds(20); while (cluster.SelfMember.Status != Akka.Cluster.MemberStatus.Up && DateTime.UtcNow < deadline) await Task.Delay(100); } public async Task DisposeAsync() { if (_system != null) await _system.Terminate(); } [Fact] public void SelfIsOldestUp_SoleUpMember_ReturnsTrue() { var cluster = Akka.Cluster.Cluster.Get(_system!); Assert.True(ActiveNodeEvaluator.SelfIsOldestUp(cluster)); Assert.True(ActiveNodeEvaluator.SelfIsOldestUp(cluster, "site-x")); } [Fact] public void SelfIsOldestUp_RoleNotHeld_ReturnsFalse() { var cluster = Akka.Cluster.Cluster.Get(_system!); Assert.False(ActiveNodeEvaluator.SelfIsOldestUp(cluster, "role-nonexistent")); } private static int FreePort() { using var l = new TcpListener(IPAddress.Loopback, 0); l.Start(); return ((IPEndPoint)l.LocalEndpoint).Port; } }