返回 DeepSeek-Reasonix
session_write_authority_admission_test.go
根目录 / internal / control / session_write_authority_admission_test.go
1 package control
2
3 import (
4 "context"
5 "errors"
6 "path/filepath"
7 "strings"
8 "testing"
9
10 "reasonix/internal/agent"
11 "reasonix/internal/event"
12 )
13
14 func TestStaleWriteAuthorityBlocksAsyncAdmission(t *testing.T) {
15 path := filepath.Join(t.TempDir(), "session.jsonl")
16 sess := agent.NewSession("sys")
17 exec := agent.New(nil, nil, sess, agent.Options{}, event.Discard)
18 events := make(chan event.Event, 1)
19 c := newOwnedTestController(t, Options{
20 Executor: exec,
21 SessionPath: path,
22 Sink: event.FuncSink(func(e event.Event) {
23 select {
24 case events <- e:
25 default:
26 }
27 }),
28 })
29 lease, err := agent.TryAcquireSessionLease(path)
30 if err != nil {
31 t.Fatal(err)
32 }
33 defer lease.Release()
34 if err := c.BindSessionWriteAuthority(lease); err != nil {
35 t.Fatal(err)
36 }
37 if _, err := lease.IssueWriteAuthority(agent.NextSessionWriteGeneration()); err != nil {
38 t.Fatal(err)
39 }
40 ran := false
41 if got := c.runGuarded(func(context.Context) error { ran = true; return nil }); got != turnDroppedWriteAuthority {
42 t.Fatalf("admission = %v, want turnDroppedWriteAuthority", got)
43 }
44 if ran {
45 t.Fatal("turn body ran with stale authority")
46 }
47 e := <-events
48 if e.Kind != event.Notice || e.Level != event.LevelWarn || !strings.Contains(e.Text, "reopen") {
49 t.Fatalf("notice = %+v", e)
50 }
51 }
52
53 func TestStaleWriteAuthorityBlocksSynchronousRun(t *testing.T) {
54 path := filepath.Join(t.TempDir(), "session.jsonl")
55 sess := agent.NewSession("sys")
56 exec := agent.New(nil, nil, sess, agent.Options{}, event.Discard)
57 c := newOwnedTestController(t, Options{Executor: exec, SessionPath: path, Sink: event.Discard})
58 lease, err := agent.TryAcquireSessionLease(path)
59 if err != nil {
60 t.Fatal(err)
61 }
62 defer lease.Release()
63 if err := c.BindSessionWriteAuthority(lease); err != nil {
64 t.Fatal(err)
65 }
66 if _, err := lease.IssueWriteAuthority(agent.NextSessionWriteGeneration()); err != nil {
67 t.Fatal(err)
68 }
69 if err := c.Run(context.Background(), "must not run"); !errors.Is(err, agent.ErrSessionWriteAuthorityStale) {
70 t.Fatalf("Run error = %v, want stale authority", err)
71 }
72 }
73
73 lines GO