fix(driver-galaxy): resolve Medium code-review finding (Driver.Galaxy-003)
StatusCodeMap.FromMxStatus checked `success != 0` to determine success, but the mxaccessgw proto contract explicitly documents that `success` is not a boolean and that clients must branch on `category` (MX_STATUS_CATEGORY_OK), not on `success` alone. Replace the raw field check with `status.IsSuccess()` from MxStatusProxyExtensions, which requires both `success != 0` AND `category == Ok`. A worker reporting success=1 with a non-OK category was previously misreported as Good. Updated StatusCodeMapTests with a regression case covering the inverted scenario. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2,6 +2,7 @@ using MxGateway.Contracts.Proto;
|
||||
using Shouldly;
|
||||
using Xunit;
|
||||
using ZB.MOM.WW.OtOpcUa.Driver.Galaxy.Runtime;
|
||||
// MxStatusCategory needed for Driver.Galaxy-003 regression tests.
|
||||
|
||||
namespace ZB.MOM.WW.OtOpcUa.Driver.Galaxy.Tests.Runtime;
|
||||
|
||||
@@ -46,6 +47,12 @@ public sealed class StatusCodeMapTests
|
||||
else mapped.ShouldBe(StatusCodeMap.Bad);
|
||||
}
|
||||
|
||||
// ===== Driver.Galaxy-003 regression: FromMxStatus uses IsSuccess() (category + success) =====
|
||||
// The proto doc: "clients should branch on category, not on a specific success value."
|
||||
// IsSuccess() requires BOTH success != 0 AND category == Ok — checking success alone
|
||||
// would invert the mapping when the worker sets success=1 for an error code (the numeric
|
||||
// value is NOT a boolean).
|
||||
|
||||
[Fact]
|
||||
public void FromMxStatus_NullStatus_IsGood()
|
||||
{
|
||||
@@ -53,16 +60,26 @@ public sealed class StatusCodeMapTests
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void FromMxStatus_SuccessNonZero_IsGood()
|
||||
public void FromMxStatus_SuccessNonZeroAndCategoryOk_IsGood()
|
||||
{
|
||||
var s = new MxStatusProxy { Success = 1 };
|
||||
// Both conditions required — this is the canonical OK path.
|
||||
var s = new MxStatusProxy { Success = 1, Category = MxStatusCategory.Ok };
|
||||
StatusCodeMap.FromMxStatus(s).ShouldBe(StatusCodeMap.Good);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void FromMxStatus_SuccessZero_DetailKnown_MapsToSpecificCode()
|
||||
public void FromMxStatus_SuccessNonZeroButCategoryNotOk_IsNotGood()
|
||||
{
|
||||
var s = new MxStatusProxy { Success = 0, Detail = 8 /* Bad_NotConnected */ };
|
||||
// Bug fixed by Driver.Galaxy-003: success != 0 alone used to return Good even when
|
||||
// category indicates an error. The proto says success is NOT a boolean — category wins.
|
||||
var s = new MxStatusProxy { Success = 1, Category = MxStatusCategory.CommunicationError };
|
||||
StatusCodeMap.FromMxStatus(s).ShouldNotBe(StatusCodeMap.Good);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void FromMxStatus_SuccessZeroAndCategoryNotOk_DetailKnown_MapsToSpecificCode()
|
||||
{
|
||||
var s = new MxStatusProxy { Success = 0, Category = MxStatusCategory.OperationalError, Detail = 8 /* Bad_NotConnected */ };
|
||||
StatusCodeMap.FromMxStatus(s).ShouldBe(StatusCodeMap.BadNotConnected);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user