using System.Collections.Immutable; using Akka.Actor; using Akka.Cluster.Tools.Client; using Akka.Configuration; using Akka.TestKit.Xunit2; using Xunit; using ZB.MOM.WW.ScadaBridge.Communication.Actors; namespace ZB.MOM.WW.ScadaBridge.Communication.Tests; public class DefaultSiteClientFactoryTests : TestKit { private static readonly Config TestConfig = ConfigurationFactory.ParseString(@" akka.actor.provider = cluster akka.remote.dot-netty.tcp.port = 0 akka.remote.dot-netty.tcp.hostname = localhost") .WithFallback(ClusterClientReceptionist.DefaultConfig()); public DefaultSiteClientFactoryTests() : base(TestConfig) { } private static ImmutableHashSet Contacts() => ImmutableHashSet.Create(ActorPath.Parse("akka.tcp://other@localhost:2552/system/receptionist")); [Fact] public void Create_TwiceForSameSite_DoesNotCollide() { var factory = new DefaultSiteClientFactory(); var first = factory.Create(Sys, "site-a", Contacts()); var second = factory.Create(Sys, "site-a", Contacts()); // pre-fix: InvalidActorNameException Assert.NotEqual(first.Path, second.Path); } [Theory] [InlineData("site/with/slashes")] [InlineData("site with spaces")] [InlineData("näme#!")] public void Create_WithUnsafeSiteId_SanitizesAndSucceeds(string siteId) { var factory = new DefaultSiteClientFactory(); var client = factory.Create(Sys, siteId, Contacts()); // pre-fix: InvalidActorNameException Assert.NotNull(client); } [Theory] [InlineData("plant-01", "plant-01")] [InlineData("a/b c", "a_b_c")] [InlineData("", "site")] public void SanitizeForActorName_ProducesValidPathElement(string input, string expected) { Assert.Equal(expected, DefaultSiteClientFactory.SanitizeForActorName(input)); Assert.True(ActorPath.IsValidPathElement( DefaultSiteClientFactory.SanitizeForActorName(input))); } }