返回 DeepSeek-Reasonix
session_write_authority_test.go
根目录 / internal / agent / session_write_authority_test.go
1 package agent
2
3 import (
4 "errors"
5 "path/filepath"
6 "sync"
7 "testing"
8 )
9
10 func TestWriteAuthorityStaleAfterRelease(t *testing.T) {
11 path := filepath.Join(t.TempDir(), "s.jsonl")
12 lease, err := TryAcquireSessionLease(path)
13 if err != nil {
14 t.Fatal(err)
15 }
16 auth, err := lease.IssueWriteAuthority(NextSessionWriteGeneration())
17 if err != nil {
18 t.Fatal(err)
19 }
20 if !auth.Valid() || !auth.Covers(path) {
21 t.Fatal("fresh authority should be valid")
22 }
23 lease.Release()
24 if auth.Valid() {
25 t.Fatal("authority must be stale after lease release")
26 }
27 if _, err := auth.BeginSave(path); !errors.Is(err, ErrSessionWriteAuthorityStale) {
28 t.Fatalf("BeginSave = %v, want stale", err)
29 }
30 }
31
32 func TestWriteAuthorityReleaseWaitsForInFlightSave(t *testing.T) {
33 path := filepath.Join(t.TempDir(), "s.jsonl")
34 lease, err := TryAcquireSessionLease(path)
35 if err != nil {
36 t.Fatal(err)
37 }
38 auth, err := lease.IssueWriteAuthority(NextSessionWriteGeneration())
39 if err != nil {
40 t.Fatal(err)
41 }
42 releaseSave, err := auth.BeginSave(path)
43 if err != nil {
44 t.Fatal(err)
45 }
46 releaseWaiting := make(chan struct{})
47 var waitOnce sync.Once
48 lease.beforeReleaseWait = func() { waitOnce.Do(func() { close(releaseWaiting) }) }
49 done := make(chan struct{})
50 go func() {
51 lease.Release()
52 close(done)
53 }()
54 <-releaseWaiting
55 select {
56 case <-done:
57 t.Fatal("Release returned while save still in flight")
58 default:
59 }
60 releaseSave()
61 <-done
62 }
63
64 func TestWriteAuthorityGenerationInvalidatesPriorToken(t *testing.T) {
65 path := filepath.Join(t.TempDir(), "s.jsonl")
66 lease, err := TryAcquireSessionLease(path)
67 if err != nil {
68 t.Fatal(err)
69 }
70 defer lease.Release()
71 oldAuth, err := lease.IssueWriteAuthority(1)
72 if err != nil {
73 t.Fatal(err)
74 }
75 newAuth, err := lease.IssueWriteAuthority(2)
76 if err != nil {
77 t.Fatal(err)
78 }
79 if oldAuth.Valid() {
80 t.Fatal("old generation remained valid after replacement authority")
81 }
82 if _, err := oldAuth.BeginSave(path); !errors.Is(err, ErrSessionWriteAuthorityStale) {
83 t.Fatalf("old BeginSave = %v, want stale", err)
84 }
85 if !newAuth.Valid() {
86 t.Fatal("replacement authority should be valid")
87 }
88 }
89
89 lines GO