namespace ScadaLink.ClusterInfrastructure.Tests; /// /// Tests for ClusterOptions default values and property setters. /// public class ClusterOptionsTests { [Fact] public void DefaultValues_AreCorrect() { var options = new ClusterOptions(); Assert.Equal("keep-oldest", options.SplitBrainResolverStrategy); Assert.Equal(TimeSpan.FromSeconds(15), options.StableAfter); Assert.Equal(TimeSpan.FromSeconds(2), options.HeartbeatInterval); Assert.Equal(TimeSpan.FromSeconds(10), options.FailureDetectionThreshold); Assert.Equal(1, options.MinNrOfMembers); Assert.True(options.DownIfAlone); } [Fact] public void DownIfAlone_CanBeSet() { var options = new ClusterOptions { DownIfAlone = false }; Assert.False(options.DownIfAlone); } [Fact] public void SeedNodes_DefaultsToEmptyList() { var options = new ClusterOptions(); Assert.NotNull(options.SeedNodes); Assert.Empty(options.SeedNodes); } // ClusterInfra-011: SectionName constant deleted — the previous test // `SectionName_IsTheExpectedAppSettingsSection` is removed alongside it. // The Host's SiteServiceRegistration / StartupValidator continue to // reference the `"ScadaLink:Cluster"` literal directly; reinstating the // constant should happen when those Host binding sites can be updated in // the same change. [Fact] public void Properties_CanBeSetToCustomValues() { // ClusterInfra-013: this test exercises the POCO property setters only — // `SplitBrainResolverStrategy = "keep-majority"` and `MinNrOfMembers = 2` // are values the design doc explicitly forbids in production // (`keep-majority` causes total shutdown on a two-node partition; // `MinNrOfMembers = 2` blocks the cluster singleton after failover). // The POCO accepts any value by design; rejection lives in // `ClusterOptionsValidator` and is covered by // `ClusterOptionsValidatorTests.UnsupportedSplitBrainStrategy_FailsValidation` // and `ClusterOptionsValidatorTests.MinNrOfMembers_NotOne_FailsValidation`. // Do NOT read these values as endorsed runtime configuration. var options = new ClusterOptions { SeedNodes = new List { "akka.tcp://system@node1:2551", "akka.tcp://system@node2:2551" }, SplitBrainResolverStrategy = "keep-majority", StableAfter = TimeSpan.FromSeconds(30), HeartbeatInterval = TimeSpan.FromSeconds(5), FailureDetectionThreshold = TimeSpan.FromSeconds(20), MinNrOfMembers = 2 }; Assert.Equal(2, options.SeedNodes.Count); Assert.Contains("akka.tcp://system@node1:2551", options.SeedNodes); Assert.Contains("akka.tcp://system@node2:2551", options.SeedNodes); Assert.Equal("keep-majority", options.SplitBrainResolverStrategy); Assert.Equal(TimeSpan.FromSeconds(30), options.StableAfter); Assert.Equal(TimeSpan.FromSeconds(5), options.HeartbeatInterval); Assert.Equal(TimeSpan.FromSeconds(20), options.FailureDetectionThreshold); Assert.Equal(2, options.MinNrOfMembers); } }