53 lines
2.4 KiB
Go
53 lines
2.4 KiB
Go
package outcome
|
|
|
|
import (
|
|
"errors"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestNormalizeBatchCanonicalizesAndDigestsOutcomes(t *testing.T) {
|
|
observedAt := time.Date(2026, 7, 31, 12, 0, 0, 0, time.FixedZone("UTC+8", 8*60*60))
|
|
normalized, digest, err := NormalizeBatch(Batch{
|
|
WorkerID: "worker-a", SessionID: "session-a", Sequence: 7,
|
|
Events: []Event{{
|
|
ProxyID: "proxy-a", RoutingName: "gateway-default", Stage: StageResponseHeaders,
|
|
Success: false, ErrorClass: ErrorClassTimeout, Latency: 25 * time.Millisecond, ObservedAt: observedAt,
|
|
}},
|
|
}, 4)
|
|
if err != nil {
|
|
t.Fatalf("NormalizeBatch(): %v", err)
|
|
}
|
|
if normalized.Events[0].ObservedAt.Location() != time.UTC || digest == [32]byte{} {
|
|
t.Fatalf("normalized outcome = %+v, digest = %x", normalized.Events[0], digest)
|
|
}
|
|
_, repeated, err := NormalizeBatch(normalized, 4)
|
|
if err != nil || digest != repeated {
|
|
t.Fatalf("repeated NormalizeBatch() digest = %x, %v; want %x", repeated, err, digest)
|
|
}
|
|
}
|
|
|
|
func TestNormalizeBatchRejectsUnboundedOrUnsafeInput(t *testing.T) {
|
|
now := time.Now()
|
|
valid := Event{ProxyID: "proxy-a", Stage: StageDial, Success: false, ErrorClass: ErrorClassDial, ObservedAt: now}
|
|
tests := []struct {
|
|
name string
|
|
batch Batch
|
|
limit int
|
|
}{
|
|
{name: "missing worker", batch: Batch{SessionID: "session-a", Sequence: 1, Events: []Event{valid}}, limit: 1},
|
|
{name: "zero sequence", batch: Batch{WorkerID: "worker-a", SessionID: "session-a", Events: []Event{valid}}, limit: 1},
|
|
{name: "empty batch", batch: Batch{WorkerID: "worker-a", SessionID: "session-a", Sequence: 1}, limit: 1},
|
|
{name: "exceeds limit", batch: Batch{WorkerID: "worker-a", SessionID: "session-a", Sequence: 1, Events: []Event{valid, valid}}, limit: 1},
|
|
{name: "success with error", batch: Batch{WorkerID: "worker-a", SessionID: "session-a", Sequence: 1, Events: []Event{{ProxyID: "proxy-a", Stage: StageDial, Success: true, ErrorClass: ErrorClassDial, ObservedAt: now}}}, limit: 1},
|
|
{name: "unknown error class", batch: Batch{WorkerID: "worker-a", SessionID: "session-a", Sequence: 1, Events: []Event{{ProxyID: "proxy-a", Stage: StageDial, ErrorClass: "raw network failure", ObservedAt: now}}}, limit: 1},
|
|
}
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
if _, _, err := NormalizeBatch(test.batch, test.limit); !errors.Is(err, ErrInvalidBatch) {
|
|
t.Fatalf("NormalizeBatch() error = %v, want ErrInvalidBatch", err)
|
|
}
|
|
})
|
|
}
|
|
}
|