proxy-pool/internal/domain/workerruntime/outcome_test.go
youfak 6766097ea7
Some checks are pending
ci / proto (push) Waiting to run
ci / test (ubuntu-latest) (push) Waiting to run
ci / test (windows-latest) (push) Waiting to run
ci / race (push) Waiting to run
ci / integration (push) Waiting to run
feat: report gateway proxy outcomes
2026-07-31 17:36:17 +08:00

52 lines
2.1 KiB
Go

package workerruntime
import (
"context"
"crypto/sha256"
"errors"
"testing"
"time"
)
func TestMemoryStoreFencesOutcomeSequenceBySessionAndDigest(t *testing.T) {
now := time.Date(2026, 7, 31, 12, 0, 0, 0, time.UTC)
store := newRuntimeStore(t, &now)
openControlSession(t, store, "session-a", time.Minute)
first := OutcomeReference{
WorkerID: "worker-a", SessionID: "session-a", Sequence: 1, Digest: sha256.Sum256([]byte("batch-1")),
}
accepted, err := store.RecordOutcomes(context.Background(), first)
if err != nil || accepted != 1 {
t.Fatalf("RecordOutcomes(first) = %d, %v; want 1, nil", accepted, err)
}
accepted, err = store.RecordOutcomes(context.Background(), first)
if err != nil || accepted != 1 {
t.Fatalf("RecordOutcomes(replay) = %d, %v; want 1, nil", accepted, err)
}
conflicting := first
conflicting.Digest = sha256.Sum256([]byte("different"))
if _, err := store.RecordOutcomes(context.Background(), conflicting); !errors.Is(err, ErrConflictingOutcome) {
t.Fatalf("RecordOutcomes(conflicting replay) error = %v, want ErrConflictingOutcome", err)
}
if _, err := store.RecordOutcomes(context.Background(), OutcomeReference{
WorkerID: "worker-a", SessionID: "session-a", Sequence: 0, Digest: first.Digest,
}); !errors.Is(err, ErrInvalidOutcome) {
t.Fatalf("RecordOutcomes(zero sequence) error = %v, want ErrInvalidOutcome", err)
}
if _, err := store.RecordOutcomes(context.Background(), OutcomeReference{
WorkerID: "worker-a", SessionID: "session-a", Sequence: 2, Digest: sha256.Sum256([]byte("batch-2")),
}); err != nil {
t.Fatalf("RecordOutcomes(next) error = %v", err)
}
if _, err := store.RecordOutcomes(context.Background(), OutcomeReference{
WorkerID: "worker-a", SessionID: "session-a", Sequence: 1, Digest: first.Digest,
}); !errors.Is(err, ErrStaleOutcome) {
t.Fatalf("RecordOutcomes(stale) error = %v, want ErrStaleOutcome", err)
}
openControlSession(t, store, "session-b", time.Minute)
if _, err := store.RecordOutcomes(context.Background(), first); !errors.Is(err, ErrStaleSession) {
t.Fatalf("RecordOutcomes(old session) error = %v, want ErrStaleSession", err)
}
}