using System; using ZB.MOM.WW.MxGateway.Worker.MxAccess; namespace ZB.MOM.WW.MxGateway.Worker.Tests.MxAccess; /// /// Unit tests for : the subtag-fallback /// path derives a deterministic GUID from the alarm reference, so identical /// references must collide and distinct references must not. /// public sealed class SyntheticAlarmGuidTests { /// Verifies the same reference yields the same GUID. [Fact] public void SameReference_SameGuid() => Assert.Equal(SyntheticAlarmGuid.ForReference("A.B.C"), SyntheticAlarmGuid.ForReference("A.B.C")); /// Verifies distinct references yield distinct GUIDs. [Fact] public void DifferentReference_DifferentGuid() => Assert.NotEqual(SyntheticAlarmGuid.ForReference("A.B.C"), SyntheticAlarmGuid.ForReference("A.B.D")); /// Verifies a reference produces a non-empty GUID. [Fact] public void Reference_ProducesNonEmptyGuid() => Assert.NotEqual(Guid.Empty, SyntheticAlarmGuid.ForReference("A.B.C")); /// /// Verifies the empty string still derives a non-empty GUID. The length /// fold in the derivation prevents a degenerate all-zero (Guid.Empty) /// result, which would collide with the unset-record default downstream. /// [Fact] public void EmptyReference_ProducesNonEmptyGuid() => Assert.NotEqual(Guid.Empty, SyntheticAlarmGuid.ForReference(string.Empty)); /// /// Worker-027 regression: /// must derive its GUID without routing through /// , because on net48 /// MD5.Create() throws under the Windows FIPS-compliance policy. /// This test enables the per-AppContext FIPS-enforcement switch (which the /// managed crypto factories honour) and asserts the derivation still /// succeeds deterministically — a regression that reintroduced a FIPS-gated /// provider would throw here instead of returning a stable GUID. /// [Fact] public void ForReference_UnderFipsEnforcement_DoesNotThrowAndStaysDeterministic() { const string switchName = "Switch.System.Security.Cryptography.UseLegacyFipsThrow"; bool original = AppContext.TryGetSwitch(switchName, out bool value) && value; AppContext.SetSwitch(switchName, true); try { Guid first = SyntheticAlarmGuid.ForReference("Galaxy!Area.Tank01.Level.HiHi"); Guid second = SyntheticAlarmGuid.ForReference("Galaxy!Area.Tank01.Level.HiHi"); Assert.NotEqual(Guid.Empty, first); Assert.Equal(first, second); } finally { AppContext.SetSwitch(switchName, original); } } }