From 34fc304712fd91ca5210f1b03336524786617367 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Fri, 26 Jun 2026 07:27:09 -0400 Subject: [PATCH] fix(otopcua): guard discovered-injection equipment id + cover deferred forwarding --- .../OpcUa/IOpcUaAddressSpaceSink.cs | 8 ++++++-- .../ZB.MOM.WW.OtOpcUa.OpcUaServer/AddressSpaceApplier.cs | 1 + .../DeferredAddressSpaceSinkTests.cs | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Core/ZB.MOM.WW.OtOpcUa.Commons/OpcUa/IOpcUaAddressSpaceSink.cs b/src/Core/ZB.MOM.WW.OtOpcUa.Commons/OpcUa/IOpcUaAddressSpaceSink.cs index 0f74db9b..87c9cac7 100644 --- a/src/Core/ZB.MOM.WW.OtOpcUa.Commons/OpcUa/IOpcUaAddressSpaceSink.cs +++ b/src/Core/ZB.MOM.WW.OtOpcUa.Commons/OpcUa/IOpcUaAddressSpaceSink.cs @@ -85,8 +85,12 @@ public interface IOpcUaAddressSpaceSink /// void RebuildAddressSpace(); - /// Announce that nodes were added at runtime (discovered-node injection) under - /// so subscribed clients refresh their browse (Part 3 GeneralModelChangeEvent, verb NodeAdded). + /// + /// Announce that nodes were added at runtime (discovered-node injection) under + /// so subscribed clients refresh their browse + /// (Part 3 GeneralModelChangeEvent, verb NodeAdded). + /// + /// The node under which discovered nodes were added. void RaiseNodesAddedModelChange(string affectedNodeId); } diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer/AddressSpaceApplier.cs b/src/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer/AddressSpaceApplier.cs index 1dfac048..8c0af790 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer/AddressSpaceApplier.cs +++ b/src/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer/AddressSpaceApplier.cs @@ -319,6 +319,7 @@ public sealed class AddressSpaceApplier IReadOnlyList folders, IReadOnlyList variables) { + ArgumentException.ThrowIfNullOrEmpty(equipmentRootNodeId); ArgumentNullException.ThrowIfNull(folders); ArgumentNullException.ThrowIfNull(variables); if (folders.Count == 0 && variables.Count == 0) return; diff --git a/tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests/DeferredAddressSpaceSinkTests.cs b/tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests/DeferredAddressSpaceSinkTests.cs index 7ebbb2a9..2fedad28 100644 --- a/tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests/DeferredAddressSpaceSinkTests.cs +++ b/tests/Server/ZB.MOM.WW.OtOpcUa.OpcUaServer.Tests/DeferredAddressSpaceSinkTests.cs @@ -30,8 +30,9 @@ public sealed class DeferredAddressSpaceSinkTests deferred.WriteValue("x", 42, OpcUaQuality.Good, DateTime.UtcNow); deferred.WriteAlarmCondition("a-1", Snapshot(active: true), DateTime.UtcNow); deferred.RebuildAddressSpace(); + deferred.RaiseNodesAddedModelChange("eq-1"); - inner.Calls.ShouldBe(new[] { "WV:x", "WA:a-1", "RB" }); + inner.Calls.ShouldBe(new[] { "WV:x", "WA:a-1", "RB", "NA:eq-1" }); } /// Verifies that setting sink to null reverts to null sink.