iop/packages/go/agentruntime/failure_test.go

67 lines
1.9 KiB
Go

package agentruntime
import (
"context"
"errors"
"testing"
)
func TestFailureCodecRoundTrip(t *testing.T) {
input := &Failure{
Code: FailureCodeQuotaExhausted,
Message: "weekly quota exhausted",
Retryable: true,
Metadata: map[string]string{"target": "codex"},
}
payload, err := EncodeFailure(input)
if err != nil {
t.Fatalf("EncodeFailure() error = %v", err)
}
output, err := DecodeFailure(payload)
if err != nil {
t.Fatalf("DecodeFailure() error = %v", err)
}
if output.Code != input.Code || output.Message != input.Message || output.Retryable != input.Retryable {
t.Fatalf("round trip = %#v, want %#v", output, input)
}
if output.Metadata["target"] != "codex" {
t.Fatalf("metadata = %#v", output.Metadata)
}
}
func TestFailureCodecNormalizesUnknownCode(t *testing.T) {
output, err := DecodeFailure(`{"schema_version":1,"failure":{"code":"future_code","message":"future"}}`)
if err != nil {
t.Fatalf("DecodeFailure() error = %v", err)
}
if output.Code != FailureCodeUnknown {
t.Fatalf("Code = %q, want %q", output.Code, FailureCodeUnknown)
}
if output.Metadata["original_code"] != "future_code" {
t.Fatalf("metadata = %#v", output.Metadata)
}
}
func TestFailureFromErrorCancellationBoundary(t *testing.T) {
tests := []struct {
name string
err error
code FailureCode
retryable bool
}{
{name: "runtime cancellation", err: ErrRunCancelled, code: FailureCodeCancelled},
{name: "context cancellation", err: context.Canceled, code: FailureCodeCancelled},
{name: "deadline", err: context.DeadlineExceeded, code: FailureCodeDeadlineExceeded, retryable: true},
{name: "unknown", err: errors.New("provider failed"), code: FailureCodeUnknown},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
failure := FailureFromError(test.err)
if failure.Code != test.code || failure.Retryable != test.retryable {
t.Fatalf("FailureFromError() = %#v", failure)
}
})
}
}