From 9b7916bb2ede9288677e2249c398e3b788066957 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Fri, 29 May 2026 07:57:36 -0400 Subject: [PATCH] refactor(browse): rename BrowseOpcUaNode* to protocol-agnostic BrowseNode* Renames BrowseOpcUaNodeCommand/Result -> BrowseNodeCommand/Result and CommunicationService.BrowseOpcUaNodeAsync -> BrowseNodeAsync across Commons, Communication, SiteRuntime, DCL actors, and CentralUI. Wire manifest name follows (BrowseOpcUaNode -> BrowseNode). Browse regression tests green. --- README.md | 1 - ...28-mxgateway-data-connection.md.tasks.json | 6 +++--- .../ServiceCollectionExtensions.cs | 2 +- .../Services/IOpcUaBrowseService.cs | 4 ++-- .../Services/OpcUaBrowseService.cs | 14 ++++++------- .../Messages/Management/BrowseCommands.cs | 4 ++-- .../Management/ReadTagValuesCommand.cs | 2 +- .../Actors/SiteCommunicationActor.cs | 4 ++-- .../CommunicationService.cs | 8 ++++---- .../Actors/DataConnectionActor.cs | 20 +++++++++---------- .../Actors/DataConnectionManagerActor.cs | 8 ++++---- .../Actors/DeploymentManagerActor.cs | 4 ++-- .../Messages/BrowseCommandsRegistryTests.cs | 10 +++++----- ...DataConnectionManagerBrowseHandlerTests.cs | 18 ++++++++--------- 14 files changed, 52 insertions(+), 53 deletions(-) diff --git a/README.md b/README.md index 7e87fb98..e246cc07 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,6 @@ This document serves as the master index for the SCADA system design. The system ### Scale -- ~10 site clusters, each with 50–500 machines, 25–75 live tags per machine. - Central cluster: 2-node active/standby behind a load balancer. - Site clusters: 2-node active/standby, headless (no UI). diff --git a/docs/plans/2026-05-28-mxgateway-data-connection.md.tasks.json b/docs/plans/2026-05-28-mxgateway-data-connection.md.tasks.json index b77f9e6e..1a8f32ae 100644 --- a/docs/plans/2026-05-28-mxgateway-data-connection.md.tasks.json +++ b/docs/plans/2026-05-28-mxgateway-data-connection.md.tasks.json @@ -1,11 +1,11 @@ { "planPath": "docs/plans/2026-05-28-mxgateway-data-connection.md", "tasks": [ - {"id": 6, "planTask": 1, "subject": "Task 1: Packaging foundation (Gitea feed + package refs)", "status": "pending"}, - {"id": 7, "planTask": 2, "subject": "Task 2: MxGatewayEndpointConfig type", "status": "pending"}, + {"id": 6, "planTask": 1, "subject": "Task 1: Packaging foundation (Gitea feed + package refs)", "status": "completed"}, + {"id": 7, "planTask": 2, "subject": "Task 2: MxGatewayEndpointConfig type", "status": "completed"}, {"id": 8, "planTask": 3, "subject": "Task 3: MxGatewayEndpointConfigSerializer + tests", "status": "pending", "blockedBy": [7]}, {"id": 9, "planTask": 4, "subject": "Task 4: MxGatewayEndpointConfigValidator + tests", "status": "pending", "blockedBy": [7]}, - {"id": 10, "planTask": 5, "subject": "Task 5: Client seam interfaces + MxGatewayGlobalOptions", "status": "pending"}, + {"id": 10, "planTask": 5, "subject": "Task 5: Client seam interfaces + MxGatewayGlobalOptions", "status": "completed"}, {"id": 11, "planTask": 6, "subject": "Task 6: Adapter connect/disconnect/Disconnected + value mapping", "status": "pending", "blockedBy": [7, 10]}, {"id": 12, "planTask": 7, "subject": "Task 7: Adapter subscribe/unsubscribe + event routing", "status": "pending", "blockedBy": [11]}, {"id": 13, "planTask": 8, "subject": "Task 8: Adapter read/write batch + error classification", "status": "pending", "blockedBy": [11]}, diff --git a/src/ZB.MOM.WW.ScadaBridge.CentralUI/ServiceCollectionExtensions.cs b/src/ZB.MOM.WW.ScadaBridge.CentralUI/ServiceCollectionExtensions.cs index 7db879ac..651e6be2 100644 --- a/src/ZB.MOM.WW.ScadaBridge.CentralUI/ServiceCollectionExtensions.cs +++ b/src/ZB.MOM.WW.ScadaBridge.CentralUI/ServiceCollectionExtensions.cs @@ -50,7 +50,7 @@ public static class ServiceCollectionExtensions // Backs the Audit Log page's Export button via GET /api/centralui/audit/export. services.AddScoped(); - // OPC UA Tag Browser (Task 14): facade over CommunicationService.BrowseOpcUaNodeAsync + // OPC UA Tag Browser (Task 14): facade over CommunicationService.BrowseNodeAsync // that enforces the CentralUI-side Design-role trust boundary and translates // transport failures into typed BrowseFailure results for the dialog. services.AddScoped(); diff --git a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Services/IOpcUaBrowseService.cs b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Services/IOpcUaBrowseService.cs index ea9aaf0e..47730ed3 100644 --- a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Services/IOpcUaBrowseService.cs +++ b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Services/IOpcUaBrowseService.cs @@ -6,7 +6,7 @@ namespace ZB.MOM.WW.ScadaBridge.CentralUI.Services; /// CentralUI facade over the central-to-site OPC UA browse command. Backs the /// OPC UA Tag Browser dialog: each tree expansion / manual node-id paste calls /// , which forwards a -/// to the owning site via +/// to the owning site via /// . /// /// @@ -29,7 +29,7 @@ public interface IOpcUaBrowseService /// Name of the site-local data connection to browse against — the site's DataConnectionManagerActor indexes its children by name. /// Node to browse, or null to browse from the server root. /// Cancellation token. - Task BrowseChildrenAsync( + Task BrowseChildrenAsync( string siteId, string connectionName, string? parentNodeId, diff --git a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Services/OpcUaBrowseService.cs b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Services/OpcUaBrowseService.cs index 1fb2d686..8c60126a 100644 --- a/src/ZB.MOM.WW.ScadaBridge.CentralUI/Services/OpcUaBrowseService.cs +++ b/src/ZB.MOM.WW.ScadaBridge.CentralUI/Services/OpcUaBrowseService.cs @@ -8,7 +8,7 @@ namespace ZB.MOM.WW.ScadaBridge.CentralUI.Services; /// /// Default implementation — a thin facade over -/// that enforces the +/// that enforces the /// CentralUI-side Design-role trust boundary and translates transport /// exceptions into a typed result. /// @@ -36,7 +36,7 @@ public sealed class OpcUaBrowseService : IOpcUaBrowseService } /// - public async Task BrowseChildrenAsync( + public async Task BrowseChildrenAsync( string siteId, string connectionName, string? parentNodeId, @@ -47,7 +47,7 @@ public sealed class OpcUaBrowseService : IOpcUaBrowseService var state = await _auth.GetAuthenticationStateAsync(); if (!state.User.HasClaim(JwtTokenService.RoleClaimType, "Design")) { - return new BrowseOpcUaNodeResult( + return new BrowseNodeResult( Array.Empty(), Truncated: false, new BrowseFailure(BrowseFailureKind.ServerError, "Not authorized.")); @@ -55,9 +55,9 @@ public sealed class OpcUaBrowseService : IOpcUaBrowseService try { - return await _communication.BrowseOpcUaNodeAsync( + return await _communication.BrowseNodeAsync( siteId, - new BrowseOpcUaNodeCommand(connectionName, parentNodeId), + new BrowseNodeCommand(connectionName, parentNodeId), cancellationToken); } catch (TimeoutException ex) @@ -65,7 +65,7 @@ public sealed class OpcUaBrowseService : IOpcUaBrowseService // Akka Ask timed out — the site (or its OPC UA session) didn't answer // within CommunicationOptions.QueryTimeout. Surface as a typed // Timeout failure so the dialog can render an inline banner. - return new BrowseOpcUaNodeResult( + return new BrowseNodeResult( Array.Empty(), Truncated: false, new BrowseFailure(BrowseFailureKind.Timeout, ex.Message)); @@ -80,7 +80,7 @@ public sealed class OpcUaBrowseService : IOpcUaBrowseService { // Any other transport / serialization failure: keep the dialog // alive and let the user fall back to manual node-id paste. - return new BrowseOpcUaNodeResult( + return new BrowseNodeResult( Array.Empty(), Truncated: false, new BrowseFailure(BrowseFailureKind.ServerError, ex.Message)); diff --git a/src/ZB.MOM.WW.ScadaBridge.Commons/Messages/Management/BrowseCommands.cs b/src/ZB.MOM.WW.ScadaBridge.Commons/Messages/Management/BrowseCommands.cs index 73fffa58..c72c404f 100644 --- a/src/ZB.MOM.WW.ScadaBridge.Commons/Messages/Management/BrowseCommands.cs +++ b/src/ZB.MOM.WW.ScadaBridge.Commons/Messages/Management/BrowseCommands.cs @@ -15,11 +15,11 @@ namespace ZB.MOM.WW.ScadaBridge.Commons.Messages.Management; /// /// Name of the site-local data connection to browse against. /// Node to browse, or null to browse from the server root (ObjectsFolder). -public record BrowseOpcUaNodeCommand( +public record BrowseNodeCommand( string ConnectionName, string? ParentNodeId); -public record BrowseOpcUaNodeResult( +public record BrowseNodeResult( IReadOnlyList Children, bool Truncated, BrowseFailure? Failure); diff --git a/src/ZB.MOM.WW.ScadaBridge.Commons/Messages/Management/ReadTagValuesCommand.cs b/src/ZB.MOM.WW.ScadaBridge.Commons/Messages/Management/ReadTagValuesCommand.cs index b0416016..3be3ab78 100644 --- a/src/ZB.MOM.WW.ScadaBridge.Commons/Messages/Management/ReadTagValuesCommand.cs +++ b/src/ZB.MOM.WW.ScadaBridge.Commons/Messages/Management/ReadTagValuesCommand.cs @@ -8,7 +8,7 @@ namespace ZB.MOM.WW.ScadaBridge.Commons.Messages.Management; /// /// /// Keyed by (not id) for the same reason as -/// : the site-side +/// : the site-side /// DataConnectionManagerActor indexes its children by connection name, /// and the central UI already has the connection name in scope from the /// bindings table. The central DataConnections table's id is not diff --git a/src/ZB.MOM.WW.ScadaBridge.Communication/Actors/SiteCommunicationActor.cs b/src/ZB.MOM.WW.ScadaBridge.Communication/Actors/SiteCommunicationActor.cs index b82596d8..d3641c52 100644 --- a/src/ZB.MOM.WW.ScadaBridge.Communication/Actors/SiteCommunicationActor.cs +++ b/src/ZB.MOM.WW.ScadaBridge.Communication/Actors/SiteCommunicationActor.cs @@ -152,10 +152,10 @@ public class SiteCommunicationActor : ReceiveActor, IWithTimers // DataConnectionActor children (which own the live OPC UA sessions) // only exist on the singleton's node. The singleton then re-forwards // to its own /user/dcl-manager, which DOES have the connection. - Receive(msg => _deploymentManagerProxy.Forward(msg)); + Receive(msg => _deploymentManagerProxy.Forward(msg)); // Test Bindings (interactive design-time read) — same routing rationale - // as BrowseOpcUaNodeCommand above: the singleton always lands on the + // as BrowseNodeCommand above: the singleton always lands on the // active site node, which is the node that owns the DataConnectionActor // children holding the live OPC UA sessions. Receive(msg => _deploymentManagerProxy.Forward(msg)); diff --git a/src/ZB.MOM.WW.ScadaBridge.Communication/CommunicationService.cs b/src/ZB.MOM.WW.ScadaBridge.Communication/CommunicationService.cs index 8d06e110..816ff8d3 100644 --- a/src/ZB.MOM.WW.ScadaBridge.Communication/CommunicationService.cs +++ b/src/ZB.MOM.WW.ScadaBridge.Communication/CommunicationService.cs @@ -360,13 +360,13 @@ public class CommunicationService /// The OPC UA browse command. /// Cancellation token. /// The browse result (children + truncation flag + structured failure). - public Task BrowseOpcUaNodeAsync( + public Task BrowseNodeAsync( string siteId, - BrowseOpcUaNodeCommand command, + BrowseNodeCommand command, CancellationToken cancellationToken = default) { var envelope = new SiteEnvelope(siteId, command); - return GetActor().Ask( + return GetActor().Ask( envelope, _options.QueryTimeout, cancellationToken); } @@ -377,7 +377,7 @@ public class CommunicationService /// server backing the given data connection. Used by the CentralUI "Test /// Bindings" dialog on the Configure Instance page. The Ask is bounded by /// — same latency budget - /// as (both are interactive one-shot + /// as (both are interactive one-shot /// design-time queries). /// /// The target site identifier. diff --git a/src/ZB.MOM.WW.ScadaBridge.DataConnectionLayer/Actors/DataConnectionActor.cs b/src/ZB.MOM.WW.ScadaBridge.DataConnectionLayer/Actors/DataConnectionActor.cs index 918111f7..74bd2cff 100644 --- a/src/ZB.MOM.WW.ScadaBridge.DataConnectionLayer/Actors/DataConnectionActor.cs +++ b/src/ZB.MOM.WW.ScadaBridge.DataConnectionLayer/Actors/DataConnectionActor.cs @@ -234,7 +234,7 @@ public class DataConnectionActor : UntypedActor, IWithStash, IWithTimers // apply it so its state survives into the next ReSubscribeAll. HandleSubscribeCompleted(sc); break; - case BrowseOpcUaNodeCommand browse: + case BrowseNodeCommand browse: // Browse is an interactive design-time query; never stash. The // adapter has no session yet in this state, so reply with a // typed ConnectionNotConnected failure so the dialog can render @@ -307,7 +307,7 @@ public class DataConnectionActor : UntypedActor, IWithStash, IWithTimers case RetryTagResolution: HandleRetryTagResolution(); break; - case BrowseOpcUaNodeCommand browse: + case BrowseNodeCommand browse: HandleBrowse(browse); break; case ReadTagValuesCommand read: @@ -432,7 +432,7 @@ public class DataConnectionActor : UntypedActor, IWithStash, IWithTimers // apply it so its state survives into the next ReSubscribeAll. HandleSubscribeCompleted(sc); break; - case BrowseOpcUaNodeCommand browse: + case BrowseNodeCommand browse: // Browse is design-time and never stashed. While reconnecting // the adapter has no live session, so the adapter call will // throw ConnectionNotConnectedException — mapped by HandleBrowse. @@ -982,7 +982,7 @@ public class DataConnectionActor : UntypedActor, IWithStash, IWithTimers // ── OPC UA Tag Browser (interactive design-time query) ── /// - /// Handles a forwarded by the + /// Handles a forwarded by the /// . The capability check (does /// this adapter support browsing?) and all browse-failure mapping live /// here because the adapter is held by this actor, not the manager. @@ -999,14 +999,14 @@ public class DataConnectionActor : UntypedActor, IWithStash, IWithTimers /// — so the captured is /// safe to use from the continuation (which runs off the actor thread). /// - private void HandleBrowse(BrowseOpcUaNodeCommand command) + private void HandleBrowse(BrowseNodeCommand command) { var sender = Sender; if (_adapter is not IBrowsableDataConnection browsable) { _log.Debug("[{0}] Browse requested but adapter does not implement IBrowsableDataConnection", _connectionName); - sender.Tell(new BrowseOpcUaNodeResult( + sender.Tell(new BrowseNodeResult( Array.Empty(), Truncated: false, new BrowseFailure( @@ -1021,21 +1021,21 @@ public class DataConnectionActor : UntypedActor, IWithStash, IWithTimers { if (t.IsCompletedSuccessfully) { - return new BrowseOpcUaNodeResult(t.Result.Children, t.Result.Truncated, Failure: null); + return new BrowseNodeResult(t.Result.Children, t.Result.Truncated, Failure: null); } var baseEx = t.Exception?.GetBaseException(); return baseEx switch { - ConnectionNotConnectedException notConnected => new BrowseOpcUaNodeResult( + ConnectionNotConnectedException notConnected => new BrowseNodeResult( Array.Empty(), Truncated: false, new BrowseFailure(BrowseFailureKind.ConnectionNotConnected, notConnected.Message)), - OperationCanceledException => new BrowseOpcUaNodeResult( + OperationCanceledException => new BrowseNodeResult( Array.Empty(), Truncated: false, new BrowseFailure(BrowseFailureKind.Timeout, "Browse cancelled.")), - _ => new BrowseOpcUaNodeResult( + _ => new BrowseNodeResult( Array.Empty(), Truncated: false, new BrowseFailure( diff --git a/src/ZB.MOM.WW.ScadaBridge.DataConnectionLayer/Actors/DataConnectionManagerActor.cs b/src/ZB.MOM.WW.ScadaBridge.DataConnectionLayer/Actors/DataConnectionManagerActor.cs index 1bf21ee0..1bab2494 100644 --- a/src/ZB.MOM.WW.ScadaBridge.DataConnectionLayer/Actors/DataConnectionManagerActor.cs +++ b/src/ZB.MOM.WW.ScadaBridge.DataConnectionLayer/Actors/DataConnectionManagerActor.cs @@ -46,7 +46,7 @@ public class DataConnectionManagerActor : ReceiveActor Receive(HandleRouteWrite); Receive(HandleRemoveConnection); Receive(HandleGetAllHealthReports); - Receive(HandleBrowse); + Receive(HandleBrowse); Receive(HandleReadTagValues); } @@ -115,7 +115,7 @@ public class DataConnectionManagerActor : ReceiveActor } /// - /// Routes a from the central UI's OPC UA + /// Routes a from the central UI's OPC UA /// Tag Browser to the child that owns the /// named connection. The manager is the only actor that knows whether a /// connection exists at this site — so it owns the @@ -123,7 +123,7 @@ public class DataConnectionManagerActor : ReceiveActor /// else (capability check, session state, server errors) lives inside the /// child where the adapter is held. /// - private void HandleBrowse(BrowseOpcUaNodeCommand command) + private void HandleBrowse(BrowseNodeCommand command) { if (_connectionActors.TryGetValue(command.ConnectionName, out var actor)) { @@ -132,7 +132,7 @@ public class DataConnectionManagerActor : ReceiveActor else { _log.Warning("No connection actor for {0} during browse", command.ConnectionName); - Sender.Tell(new BrowseOpcUaNodeResult( + Sender.Tell(new BrowseNodeResult( Array.Empty(), Truncated: false, new BrowseFailure( diff --git a/src/ZB.MOM.WW.ScadaBridge.SiteRuntime/Actors/DeploymentManagerActor.cs b/src/ZB.MOM.WW.ScadaBridge.SiteRuntime/Actors/DeploymentManagerActor.cs index a7175a7f..4117d929 100644 --- a/src/ZB.MOM.WW.ScadaBridge.SiteRuntime/Actors/DeploymentManagerActor.cs +++ b/src/ZB.MOM.WW.ScadaBridge.SiteRuntime/Actors/DeploymentManagerActor.cs @@ -149,12 +149,12 @@ public class DeploymentManagerActor : ReceiveActor, IWithTimers Receive(RouteInboundApiSetAttributes); // OPC UA Tag Browser — singleton-only re-forward to local /user/dcl-manager. - // BrowseOpcUaNodeCommand is routed to this singleton (active node) by + // BrowseNodeCommand is routed to this singleton (active node) by // SiteCommunicationActor so the dcl-manager we forward to is guaranteed // to be the one holding the live DataConnectionActor children. ActorSelection // has no Forward() extension in this Akka.NET version, so we Tell with the // original Sender preserved (semantically identical to Forward). - Receive(msg => + Receive(msg => Context.ActorSelection("/user/dcl-manager").Tell(msg, Sender)); // Test Bindings — same singleton-only re-forward as the browse handler diff --git a/tests/ZB.MOM.WW.ScadaBridge.Commons.Tests/Messages/BrowseCommandsRegistryTests.cs b/tests/ZB.MOM.WW.ScadaBridge.Commons.Tests/Messages/BrowseCommandsRegistryTests.cs index a2042bd3..6fa96525 100644 --- a/tests/ZB.MOM.WW.ScadaBridge.Commons.Tests/Messages/BrowseCommandsRegistryTests.cs +++ b/tests/ZB.MOM.WW.ScadaBridge.Commons.Tests/Messages/BrowseCommandsRegistryTests.cs @@ -3,7 +3,7 @@ using ZB.MOM.WW.ScadaBridge.Commons.Messages.Management; namespace ZB.MOM.WW.ScadaBridge.Commons.Tests.Messages; /// -/// Verifies that is discovered by +/// Verifies that is discovered by /// so it travels over the management /// boundary as a known command (resolvable by wire name and round-trippable /// through GetCommandName / Resolve). @@ -11,13 +11,13 @@ namespace ZB.MOM.WW.ScadaBridge.Commons.Tests.Messages; public class BrowseCommandsRegistryTests { [Fact] - public void Registry_discovers_BrowseOpcUaNodeCommand() + public void Registry_discovers_BrowseNodeCommand() { // GetCommandName throws ArgumentException for any type the registry // does not contain, so a successful call here is proof of discovery. - var name = ManagementCommandRegistry.GetCommandName(typeof(BrowseOpcUaNodeCommand)); + var name = ManagementCommandRegistry.GetCommandName(typeof(BrowseNodeCommand)); - Assert.Equal("BrowseOpcUaNode", name); - Assert.Equal(typeof(BrowseOpcUaNodeCommand), ManagementCommandRegistry.Resolve(name)); + Assert.Equal("BrowseNode", name); + Assert.Equal(typeof(BrowseNodeCommand), ManagementCommandRegistry.Resolve(name)); } } diff --git a/tests/ZB.MOM.WW.ScadaBridge.DataConnectionLayer.Tests/Actors/DataConnectionManagerBrowseHandlerTests.cs b/tests/ZB.MOM.WW.ScadaBridge.DataConnectionLayer.Tests/Actors/DataConnectionManagerBrowseHandlerTests.cs index 110fdce3..20933a6d 100644 --- a/tests/ZB.MOM.WW.ScadaBridge.DataConnectionLayer.Tests/Actors/DataConnectionManagerBrowseHandlerTests.cs +++ b/tests/ZB.MOM.WW.ScadaBridge.DataConnectionLayer.Tests/Actors/DataConnectionManagerBrowseHandlerTests.cs @@ -14,7 +14,7 @@ namespace ZB.MOM.WW.ScadaBridge.DataConnectionLayer.Tests.Actors; /// Task 10 (opcua-tag-browser): the site-side /// + child /// together resolve -/// against the live adapter and surface +/// against the live adapter and surface /// every browse outcome as a typed . The split is: /// the manager owns (only it /// knows the per-site connection set); everything else lives in the child where @@ -50,9 +50,9 @@ public class DataConnectionManagerBrowseHandlerTests : TestKit // No CreateConnectionCommand sent — the manager has zero children, so a // browse against any name must be rejected with ConnectionNotFound // (the manager is the only actor with site-level visibility). - manager.Tell(new BrowseOpcUaNodeCommand("unknown-connection", ParentNodeId: null)); + manager.Tell(new BrowseNodeCommand("unknown-connection", ParentNodeId: null)); - var reply = ExpectMsg(); + var reply = ExpectMsg(); Assert.NotNull(reply.Failure); Assert.Equal(BrowseFailureKind.ConnectionNotFound, reply.Failure!.Kind); Assert.Empty(reply.Children); @@ -80,9 +80,9 @@ public class DataConnectionManagerBrowseHandlerTests : TestKit () => _factory.ReceivedCalls().Any(c => c.GetMethodInfo().Name == "Create"), TimeSpan.FromSeconds(2)); - manager.Tell(new BrowseOpcUaNodeCommand("conn-bare", ParentNodeId: null)); + manager.Tell(new BrowseNodeCommand("conn-bare", ParentNodeId: null)); - var reply = ExpectMsg(TimeSpan.FromSeconds(3)); + var reply = ExpectMsg(TimeSpan.FromSeconds(3)); Assert.NotNull(reply.Failure); Assert.Equal(BrowseFailureKind.NotBrowsable, reply.Failure!.Kind); Assert.Empty(reply.Children); @@ -120,9 +120,9 @@ public class DataConnectionManagerBrowseHandlerTests : TestKit () => _factory.ReceivedCalls().Any(c => c.GetMethodInfo().Name == "Create"), TimeSpan.FromSeconds(2)); - manager.Tell(new BrowseOpcUaNodeCommand("conn-ok", ParentNodeId: null)); + manager.Tell(new BrowseNodeCommand("conn-ok", ParentNodeId: null)); - var reply = ExpectMsg(TimeSpan.FromSeconds(3)); + var reply = ExpectMsg(TimeSpan.FromSeconds(3)); Assert.Null(reply.Failure); Assert.Equal(2, reply.Children.Count); Assert.Equal("ns=2;s=A", reply.Children[0].NodeId); @@ -155,9 +155,9 @@ public class DataConnectionManagerBrowseHandlerTests : TestKit () => _factory.ReceivedCalls().Any(c => c.GetMethodInfo().Name == "Create"), TimeSpan.FromSeconds(2)); - manager.Tell(new BrowseOpcUaNodeCommand("conn-down", ParentNodeId: null)); + manager.Tell(new BrowseNodeCommand("conn-down", ParentNodeId: null)); - var reply = ExpectMsg(TimeSpan.FromSeconds(3)); + var reply = ExpectMsg(TimeSpan.FromSeconds(3)); Assert.NotNull(reply.Failure); Assert.Equal(BrowseFailureKind.ConnectionNotConnected, reply.Failure!.Kind); Assert.Empty(reply.Children);