docs(alarms): note operator/IDE toggle drives the live subtag smoke test

C6a: the rig's TestAlarm attributes are object-driven; a flip script OR a manual
operator/IDE toggle drives them (confirmed live 2026-06-14). Update the how-to-run
comments and Skip reason accordingly.
This commit is contained in:
Joseph Doherty
2026-06-14 02:35:59 -04:00
parent 986dcee14a
commit 393e326275
@@ -16,9 +16,12 @@
// 1. On the dev rig with AVEVA System Platform installed and Galaxy running:
// $env:MXGATEWAY_RUN_LIVE_MXACCESS_TESTS = "1"
// 2. Remove (or set to null) the Skip parameter on the [Fact] below.
// 3. Run with an alarm flip script (same one used by AlarmsLiveSmokeTests)
// so that TestMachine_001.TestAlarm001 toggles its Active/Acked subtags
// on a ~10 s cadence.
// 3. Drive a TestMachine alarm so its Active/Acked subtags toggle — either an
// alarm flip script (same one used by AlarmsLiveSmokeTests, ~10 s cadence)
// or a manual operator/IDE toggle of the alarm attribute. The rig's
// TestAlarm attributes are object-driven, so an external MXAccess Write
// cannot toggle them (confirmed live 2026-06-14 by toggling TestAlarm002
// from the IDE).
//
// net48/x86 constraints:
// - No init-only properties, records, index/range operators, C# 8+ pattern
@@ -49,8 +52,9 @@ namespace ZB.MOM.WW.MxGateway.Worker.Tests.Probes;
/// <see cref="SubtagAlarmConsumer.AcknowledgeByName"/> writes the
/// ack-comment subtag (AckMsg) successfully.
///
/// Skip-gated; flip <c>Skip=null</c> on the dev rig with the alarm flip
/// script running. The remaining live-validation item is confirming that
/// Skip-gated; flip <c>Skip=null</c> on the dev rig with an alarm being
/// driven (flip script or a manual operator/IDE toggle of the alarm
/// attribute). The remaining live-validation item is confirming that
/// the runtime MXAccess item reference path requires no intermediate
/// alarm-condition segment (i.e. <c>&lt;Object&gt;.&lt;AlarmAttr&gt;.InAlarm</c>
/// resolves as-is).
@@ -117,7 +121,7 @@ public sealed class AlarmSubtagLiveSmokeTests
/// the Degraded flag and synthetic GUID are stamped, then
/// AcknowledgeByName and verifies the ack-comment write returns 0.
/// </summary>
[Fact(Skip = "Live dev-rig smoke test — flip Skip=null with AVEVA + an alarm flip script running. Subtag fallback path. Field names confirmed (InAlarm/Acked/AckMsg/Priority); live-validate runtime path resolves without intermediate alarm-condition segment.")]
[Fact(Skip = "Live dev-rig smoke test — flip Skip=null with AVEVA + an alarm being driven (flip script or manual operator/IDE toggle of the alarm attribute). Subtag fallback path. Field names confirmed (InAlarm/Acked/AckMsg/Priority); live-validate runtime path resolves without intermediate alarm-condition segment.")]
public void SubtagFallback_FullPipelineRoundTrip_SynthesizesRaiseAndAcknowledges()
{
Exception? threadException = null;
@@ -342,9 +346,10 @@ public sealed class AlarmSubtagLiveSmokeTests
consumer.Subscribe(subscriptionExpression);
Log("Subscribe returned OK.");
// 1. Wait for a Raise transition. The alarm flip script (same one
// used by AlarmsLiveSmokeTests) writes the active subtag on a
// ~10 s cadence. LmxSubtagAlarmSource delivers OnDataChange via
// 1. Wait for a Raise transition. Whatever is driving the alarm — a
// flip script (same one used by AlarmsLiveSmokeTests, ~10 s cadence)
// or a manual operator/IDE toggle — writes the active subtag.
// LmxSubtagAlarmSource delivers OnDataChange via
// the Windows message pump on the STA, so we must pump messages
// here while we wait — mirroring how AlarmsLiveSmokeTests drives
// its WnWrapAlarmConsumer.PollOnce() from the STA in a tight loop.