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) } }