fix(mesh-phase5): harden telemetry client onError contract (validate/isolate/defend)
Claude-Session: https://claude.ai/code/session_01GASWkNEi68FSCtvr6rLoEW
This commit is contained in:
+53
@@ -233,6 +233,59 @@ public sealed class TelemetryProtoMapCentralTests
|
||||
TelemetryProtoMapCentral.ToResilience(proto).LastBreakerOpenUtc.ShouldBeNull();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ToAlarm_missing_required_timestamp_throws_clear_InvalidOperation()
|
||||
{
|
||||
var proto = new AlarmTransition
|
||||
{
|
||||
AlarmId = "a", EquipmentPath = "p", AlarmName = "n", TransitionKind = "Activated",
|
||||
Severity = 1, Message = "m", User = "system", AlarmTypeName = "AlarmCondition",
|
||||
// TimestampUtc deliberately unset — an out-of-contract sender.
|
||||
};
|
||||
|
||||
var ex = Should.Throw<InvalidOperationException>(() => TelemetryProtoMapCentral.ToAlarm(proto));
|
||||
ex.Message.ShouldContain("AlarmTransition");
|
||||
ex.Message.ShouldContain("timestamp_utc");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ToScript_missing_required_timestamp_throws_clear_InvalidOperation()
|
||||
{
|
||||
var proto = new ScriptLog { ScriptId = "s", Level = "Information", Message = "m" };
|
||||
|
||||
var ex = Should.Throw<InvalidOperationException>(() => TelemetryProtoMapCentral.ToScript(proto));
|
||||
ex.Message.ShouldContain("ScriptLog");
|
||||
ex.Message.ShouldContain("timestamp_utc");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ToHealth_missing_required_timestamp_throws_clear_InvalidOperation()
|
||||
{
|
||||
var proto = new DriverHealth
|
||||
{
|
||||
ClusterId = "c", DriverInstanceId = "d", State = "Healthy", ErrorCount5Min = 0,
|
||||
// PublishedUtc unset.
|
||||
};
|
||||
|
||||
var ex = Should.Throw<InvalidOperationException>(() => TelemetryProtoMapCentral.ToHealth(proto));
|
||||
ex.Message.ShouldContain("DriverHealth");
|
||||
ex.Message.ShouldContain("published_utc");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ToResilience_missing_required_timestamp_throws_clear_InvalidOperation()
|
||||
{
|
||||
var proto = new DriverResilienceStatus
|
||||
{
|
||||
DriverInstanceId = "d", HostName = "h", BreakerOpen = false,
|
||||
ConsecutiveFailures = 0, CurrentInFlight = 0,
|
||||
// LastSampledUtc + PublishedUtc unset.
|
||||
};
|
||||
|
||||
var ex = Should.Throw<InvalidOperationException>(() => TelemetryProtoMapCentral.ToResilience(proto));
|
||||
ex.Message.ShouldContain("DriverResilienceStatus");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MapEvent_routes_each_case_to_its_record_type()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user