52 lines
2.1 KiB
Go
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)
|
|
}
|
|
}
|