using Microsoft.Extensions.Options; namespace ZB.MOM.WW.ScadaBridge.DataConnectionLayer.Tests; /// /// Regression: intervals/timeouts drive the /// DCL reconnect/tag-resolution timers and the seed-read retry loop; a /// zero/negative duration (or a non-positive SeedReadMaxAttempts) must be /// rejected at startup by an with a /// clear, key-naming message rather than surfacing later at runtime. /// public class DataConnectionOptionsValidatorTests { private static ValidateOptionsResult Validate(DataConnectionOptions options) => new DataConnectionOptionsValidator().Validate(Options.DefaultName, options); /// Verifies that the default options are valid. [Fact] public void DefaultOptions_AreValid() { var result = Validate(new DataConnectionOptions()); Assert.True(result.Succeeded, result.FailureMessage); } /// Verifies that a zero reconnect interval is rejected. [Fact] public void ZeroReconnectInterval_IsRejected() { var result = Validate(new DataConnectionOptions { ReconnectInterval = TimeSpan.Zero }); Assert.True(result.Failed); Assert.Contains("ReconnectInterval", result.FailureMessage); } /// Verifies that a non-positive seed-read max attempts value is rejected. [Fact] public void NonPositiveSeedReadMaxAttempts_IsRejected() { var result = Validate(new DataConnectionOptions { SeedReadMaxAttempts = 0 }); Assert.True(result.Failed); Assert.Contains("SeedReadMaxAttempts", result.FailureMessage); } /// Verifies that an out-of-range MxGateway alarm-reopen debounce is rejected (review 2026-10-21 02/P3). /// The debounce under test. [Theory] [InlineData(-1)] [InlineData(5001)] public void OutOfRangeMxAlarmStreamReopenDebounce_IsRejected(int milliseconds) { var result = Validate(new DataConnectionOptions { MxAlarmStreamReopenDebounce = TimeSpan.FromMilliseconds(milliseconds) }); Assert.True(result.Failed); Assert.Contains("MxAlarmStreamReopenDebounce", result.FailureMessage); } /// Verifies that a zero debounce (reopen per subscribe) is accepted. [Fact] public void ZeroMxAlarmStreamReopenDebounce_IsAccepted() { var result = Validate(new DataConnectionOptions { MxAlarmStreamReopenDebounce = TimeSpan.Zero }); Assert.True(result.Succeeded, result.FailureMessage); } }