fix(opcuaclient): review — UTC-kind the missing-time sentinel + test hardening
Code-review I2: CoerceDateTime's missing-field sentinel was DateTime.MinValue (Kind=Unspecified) — a downstream .ToUniversalTime() could shift it; now UTC-kinded. M4: assert BrowsePath namespace==0 + the sentinel's UTC Kind.
This commit is contained in:
@@ -1751,8 +1751,12 @@ public sealed class OpcUaClientDriver : IDriver, ITagDiscovery, IReadable, IWrit
|
|||||||
_ => value.ToString(),
|
_ => value.ToString(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Missing-field sentinel is UTC-kinded so a downstream .ToUniversalTime() can't shift it.
|
||||||
|
private static readonly DateTime MissingTimeSentinel =
|
||||||
|
DateTime.SpecifyKind(DateTime.MinValue, DateTimeKind.Utc);
|
||||||
|
|
||||||
private static DateTime CoerceDateTime(object? value)
|
private static DateTime CoerceDateTime(object? value)
|
||||||
=> value is DateTime dt ? dt : DateTime.MinValue;
|
=> value is DateTime dt ? dt : MissingTimeSentinel;
|
||||||
|
|
||||||
private static ushort CoerceSeverity(object? value)
|
private static ushort CoerceSeverity(object? value)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -112,6 +112,7 @@ public sealed class OpcUaClientHistoryTests
|
|||||||
clause.AttributeId.ShouldBe(Attributes.Value);
|
clause.AttributeId.ShouldBe(Attributes.Value);
|
||||||
clause.BrowsePath.Count.ShouldBe(1);
|
clause.BrowsePath.Count.ShouldBe(1);
|
||||||
clause.BrowsePath[0].Name.ShouldBe(expected[i]);
|
clause.BrowsePath[0].Name.ShouldBe(expected[i]);
|
||||||
|
clause.BrowsePath[0].NamespaceIndex.ShouldBe((ushort)0); // BaseEventType fields live in ns 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,6 +166,7 @@ public sealed class OpcUaClientHistoryTests
|
|||||||
mapped[0].EventId.ShouldBe(Convert.ToBase64String(new byte[] { 9 }));
|
mapped[0].EventId.ShouldBe(Convert.ToBase64String(new byte[] { 9 }));
|
||||||
mapped[0].SourceName.ShouldBeNull();
|
mapped[0].SourceName.ShouldBeNull();
|
||||||
mapped[0].EventTimeUtc.ShouldBe(DateTime.MinValue);
|
mapped[0].EventTimeUtc.ShouldBe(DateTime.MinValue);
|
||||||
|
mapped[0].EventTimeUtc.Kind.ShouldBe(DateTimeKind.Utc); // sentinel is UTC-kinded, not Unspecified
|
||||||
mapped[0].Severity.ShouldBe((ushort)0);
|
mapped[0].Severity.ShouldBe((ushort)0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user