fix(comm): route Search/Verify/WriteTag commands through SiteCommunicationActor + DeploymentManager (M7 end-to-end)
This commit is contained in:
@@ -1,10 +1,12 @@
|
||||
using Akka.Actor;
|
||||
using Akka.Cluster.Tools.Client;
|
||||
using Akka.TestKit.Xunit2;
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Messages.DataConnection;
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Messages.Deployment;
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Messages.Health;
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Messages.Lifecycle;
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Messages.Integration;
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Messages.Management;
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Messages.Notification;
|
||||
using ZB.MOM.WW.ScadaBridge.Commons.Messages.RemoteQuery;
|
||||
using ZB.MOM.WW.ScadaBridge.Communication.Actors;
|
||||
@@ -284,6 +286,61 @@ public class SiteCommunicationActorTests : TestKit
|
||||
Assert.NotNull(ack.ErrorMessage);
|
||||
}
|
||||
|
||||
// ── M7 OPC UA cross-cluster routing: Search (T15), WriteTag (T14), Verify (T17) ──
|
||||
//
|
||||
// Regression guard for the M7 dead-letter defect. These three interactive
|
||||
// commands have downstream handlers in DataConnectionManagerActor but were NOT
|
||||
// forwarded through SiteCommunicationActor → Deployment Manager, so they
|
||||
// dead-lettered and the central Ask timed out in the real cluster. They must
|
||||
// forward to the Deployment Manager proxy exactly like BrowseNodeCommand, with
|
||||
// the original Ask sender preserved so the result routes straight back.
|
||||
|
||||
[Fact]
|
||||
public void SearchAddressSpaceCommand_ForwardedToDeploymentManager_SenderPreserved()
|
||||
{
|
||||
var dmProbe = CreateTestProbe();
|
||||
var senderProbe = CreateTestProbe();
|
||||
var siteActor = Sys.ActorOf(Props.Create(() =>
|
||||
new SiteCommunicationActor("site1", _options, dmProbe.Ref)));
|
||||
|
||||
var command = new SearchAddressSpaceCommand("conn1", "Temp", 5, 100);
|
||||
siteActor.Tell(command, senderProbe.Ref);
|
||||
|
||||
dmProbe.ExpectMsg<SearchAddressSpaceCommand>(msg => msg.ConnectionName == "conn1");
|
||||
Assert.Equal(senderProbe.Ref, dmProbe.LastSender);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void WriteTagRequest_ForwardedToDeploymentManager_SenderPreserved()
|
||||
{
|
||||
var dmProbe = CreateTestProbe();
|
||||
var senderProbe = CreateTestProbe();
|
||||
var siteActor = Sys.ActorOf(Props.Create(() =>
|
||||
new SiteCommunicationActor("site1", _options, dmProbe.Ref)));
|
||||
|
||||
var request = new WriteTagRequest(
|
||||
"corr-w", "conn1", "Channel1.Device1.Tag1", 42, DateTimeOffset.UtcNow);
|
||||
siteActor.Tell(request, senderProbe.Ref);
|
||||
|
||||
dmProbe.ExpectMsg<WriteTagRequest>(msg => msg.CorrelationId == "corr-w");
|
||||
Assert.Equal(senderProbe.Ref, dmProbe.LastSender);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void VerifyEndpointCommand_ForwardedToDeploymentManager_SenderPreserved()
|
||||
{
|
||||
var dmProbe = CreateTestProbe();
|
||||
var senderProbe = CreateTestProbe();
|
||||
var siteActor = Sys.ActorOf(Props.Create(() =>
|
||||
new SiteCommunicationActor("site1", _options, dmProbe.Ref)));
|
||||
|
||||
var command = new VerifyEndpointCommand("conn1", "OpcUa", "{}");
|
||||
siteActor.Tell(command, senderProbe.Ref);
|
||||
|
||||
dmProbe.ExpectMsg<VerifyEndpointCommand>(msg => msg.ConnectionName == "conn1");
|
||||
Assert.Equal(senderProbe.Ref, dmProbe.LastSender);
|
||||
}
|
||||
|
||||
// ── Communication-018: heartbeat IsActive reflects this node's cluster role ──
|
||||
|
||||
[Theory]
|
||||
|
||||
Reference in New Issue
Block a user