diff --git a/src/ZB.MOM.WW.ScadaBridge.SiteRuntime/SiteRuntimeOptionsValidator.cs b/src/ZB.MOM.WW.ScadaBridge.SiteRuntime/SiteRuntimeOptionsValidator.cs index 8de19199..e34ef736 100644 --- a/src/ZB.MOM.WW.ScadaBridge.SiteRuntime/SiteRuntimeOptionsValidator.cs +++ b/src/ZB.MOM.WW.ScadaBridge.SiteRuntime/SiteRuntimeOptionsValidator.cs @@ -56,5 +56,14 @@ public sealed class SiteRuntimeOptionsValidator : OptionsValidatorBase= 0, $"ScadaBridge:SiteRuntime:ConfigFetchRetryCount must be >= 0 " + $"(was {options.ConfigFetchRetryCount})."); + + builder.RequireThat(options.TagSubscribeRetryIntervalMs > 0, + $"ScadaBridge:SiteRuntime:TagSubscribeRetryIntervalMs must be greater than 0 " + + $"(was {options.TagSubscribeRetryIntervalMs}); a zero interval hot-loops the tag-subscribe " + + "retry and a negative one throws inside the Instance Actor's retry scheduling."); + + builder.RequireThat(options.StuckScriptGraceMs >= 0, + $"ScadaBridge:SiteRuntime:StuckScriptGraceMs must be >= 0 " + + $"(was {options.StuckScriptGraceMs}); a negative grace throws inside the stuck-script watchdog's delay."); } } diff --git a/tests/ZB.MOM.WW.ScadaBridge.SiteRuntime.Tests/SiteRuntimeOptionsValidatorTests.cs b/tests/ZB.MOM.WW.ScadaBridge.SiteRuntime.Tests/SiteRuntimeOptionsValidatorTests.cs index e8bbf54e..1d627316 100644 --- a/tests/ZB.MOM.WW.ScadaBridge.SiteRuntime.Tests/SiteRuntimeOptionsValidatorTests.cs +++ b/tests/ZB.MOM.WW.ScadaBridge.SiteRuntime.Tests/SiteRuntimeOptionsValidatorTests.cs @@ -40,6 +40,24 @@ public class SiteRuntimeOptionsValidatorTests Assert.Contains("ScriptExecutionThreadCount", result.FailureMessage); } + [Fact] + public void ZeroTagSubscribeRetryIntervalMs_IsRejected() + { + var result = Validate(new SiteRuntimeOptions { TagSubscribeRetryIntervalMs = 0 }); + + Assert.True(result.Failed); + Assert.Contains("TagSubscribeRetryIntervalMs", result.FailureMessage); + } + + [Fact] + public void NegativeStuckScriptGraceMs_IsRejected() + { + var result = Validate(new SiteRuntimeOptions { StuckScriptGraceMs = -1 }); + + Assert.True(result.Failed); + Assert.Contains("StuckScriptGraceMs", result.FailureMessage); + } + [Fact] public void ZeroStreamBufferSize_IsRejected() {