From 590e49787211cf928cedca43cfebb1155baf8844 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Sun, 14 Jun 2026 01:32:34 -0400 Subject: [PATCH] fix(runtime): narrow ActorNodeWriteGateway catch + drop vacuous no-actor assertion --- .../Drivers/ActorNodeWriteGateway.cs | 14 ++++++++++++-- .../Drivers/ActorNodeWriteGatewayTests.cs | 4 ---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/Server/ZB.MOM.WW.OtOpcUa.Runtime/Drivers/ActorNodeWriteGateway.cs b/src/Server/ZB.MOM.WW.OtOpcUa.Runtime/Drivers/ActorNodeWriteGateway.cs index 7bba6cc0..ccb91771 100644 --- a/src/Server/ZB.MOM.WW.OtOpcUa.Runtime/Drivers/ActorNodeWriteGateway.cs +++ b/src/Server/ZB.MOM.WW.OtOpcUa.Runtime/Drivers/ActorNodeWriteGateway.cs @@ -60,10 +60,20 @@ public sealed class ActorNodeWriteGateway : IOpcUaNodeWriteGateway _logger.LogWarning("Operator write to {NodeId} rejected: {Reason}", nodeId, result.Reason); return new NodeWriteOutcome(result.Success, result.Reason); } - catch (Exception ex) // AskTimeoutException, actor faults, cancellation + catch (OperationCanceledException ex) { - _logger.LogWarning(ex, "Operator write to {NodeId} failed or timed out", nodeId); + _logger.LogWarning(ex, "Operator write to {NodeId} cancelled", nodeId); + return new NodeWriteOutcome(false, "write cancelled"); + } + catch (AskTimeoutException ex) + { + _logger.LogWarning(ex, "Operator write to {NodeId} timed out", nodeId); return new NodeWriteOutcome(false, "write timeout"); } + catch (Exception ex) + { + _logger.LogError(ex, "Operator write to {NodeId} failed unexpectedly", nodeId); + return new NodeWriteOutcome(false, "write error"); + } } } diff --git a/tests/Server/ZB.MOM.WW.OtOpcUa.Runtime.Tests/Drivers/ActorNodeWriteGatewayTests.cs b/tests/Server/ZB.MOM.WW.OtOpcUa.Runtime.Tests/Drivers/ActorNodeWriteGatewayTests.cs index 5d6acf33..d70484bc 100644 --- a/tests/Server/ZB.MOM.WW.OtOpcUa.Runtime.Tests/Drivers/ActorNodeWriteGatewayTests.cs +++ b/tests/Server/ZB.MOM.WW.OtOpcUa.Runtime.Tests/Drivers/ActorNodeWriteGatewayTests.cs @@ -75,15 +75,11 @@ public sealed class ActorNodeWriteGatewayTests : RuntimeActorTestBase [Fact] public async Task No_actor_registered_maps_to_writes_unavailable() { - var probe = CreateTestProbe(); var gateway = new ActorNodeWriteGateway(resolveDriverHost: () => null, NullLogger.Instance); var outcome = await gateway.WriteAsync("eq-1/speed", 123.0, CancellationToken.None); outcome.Success.ShouldBeFalse(); outcome.Reason.ShouldBe("writes unavailable"); - - // The resolver returned null, so nothing should have been messaged anywhere. - probe.ExpectNoMsg(TimeSpan.FromMilliseconds(200)); } }