worker(alarms): synthetic GUID + degraded/source_provider on emitted transitions
This commit is contained in:
@@ -64,6 +64,41 @@ public sealed class AlarmDispatcherTests
|
||||
Assert.Equal(ts, body.TransitionTimestamp.ToDateTime());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Verifies that a transition enqueued via the subtag fallback
|
||||
/// (<c>degraded: true</c>) is marked <see cref="OnAlarmTransitionEvent.Degraded"/>
|
||||
/// with <see cref="AlarmProviderMode.Subtag"/>, while the default path
|
||||
/// stays on the alarmmgr parity contract.
|
||||
/// </summary>
|
||||
[Fact]
|
||||
public void EnqueueTransition_WhenDegraded_MarksDegradedAndSubtagProvider()
|
||||
{
|
||||
MxAccessEventQueue queue = new MxAccessEventQueue();
|
||||
MxAccessAlarmEventSink sink = new MxAccessAlarmEventSink(queue, new MxAccessEventMapper());
|
||||
sink.Attach(new object(), SessionId);
|
||||
|
||||
DateTime ts = new DateTime(2026, 5, 1, 17, 26, 14, 709, DateTimeKind.Utc);
|
||||
sink.EnqueueTransition(
|
||||
alarmFullReference: "Galaxy!TestArea.TestMachine_001.TestAlarm001",
|
||||
sourceObjectReference: "TestMachine_001.TestAlarm001",
|
||||
alarmTypeName: "DSC",
|
||||
transitionKind: AlarmTransitionKind.Raise,
|
||||
severity: 500,
|
||||
originalRaiseTimestampUtc: null,
|
||||
transitionTimestampUtc: ts,
|
||||
operatorUser: string.Empty,
|
||||
operatorComment: string.Empty,
|
||||
category: "TestArea",
|
||||
description: string.Empty,
|
||||
degraded: true);
|
||||
|
||||
Assert.Equal(1, queue.Count);
|
||||
Assert.True(queue.TryDequeue(out WorkerEvent? workerEvent));
|
||||
OnAlarmTransitionEvent body = workerEvent!.Event.OnAlarmTransition;
|
||||
Assert.True(body.Degraded);
|
||||
Assert.Equal(AlarmProviderMode.Subtag, body.SourceProvider);
|
||||
}
|
||||
|
||||
/// <summary>Verifies that unchanged alarm states do not emit transitions.</summary>
|
||||
[Fact]
|
||||
public void OnTransition_WithConsecutiveUnchangedState_DoesNotEmitTransition()
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
using System;
|
||||
using ZB.MOM.WW.MxGateway.Worker.MxAccess;
|
||||
|
||||
namespace ZB.MOM.WW.MxGateway.Worker.Tests.MxAccess;
|
||||
|
||||
/// <summary>
|
||||
/// Unit tests for <see cref="SyntheticAlarmGuid"/>: the subtag-fallback
|
||||
/// path derives a deterministic GUID from the alarm reference, so identical
|
||||
/// references must collide and distinct references must not.
|
||||
/// </summary>
|
||||
public sealed class SyntheticAlarmGuidTests
|
||||
{
|
||||
/// <summary>Verifies the same reference yields the same GUID.</summary>
|
||||
[Fact]
|
||||
public void SameReference_SameGuid() =>
|
||||
Assert.Equal(SyntheticAlarmGuid.ForReference("A.B.C"), SyntheticAlarmGuid.ForReference("A.B.C"));
|
||||
|
||||
/// <summary>Verifies distinct references yield distinct GUIDs.</summary>
|
||||
[Fact]
|
||||
public void DifferentReference_DifferentGuid() =>
|
||||
Assert.NotEqual(SyntheticAlarmGuid.ForReference("A.B.C"), SyntheticAlarmGuid.ForReference("A.B.D"));
|
||||
|
||||
/// <summary>Verifies a reference produces a non-empty GUID.</summary>
|
||||
[Fact]
|
||||
public void Reference_ProducesNonEmptyGuid() =>
|
||||
Assert.NotEqual(Guid.Empty, SyntheticAlarmGuid.ForReference("A.B.C"));
|
||||
}
|
||||
Reference in New Issue
Block a user