返回 DeepSeek-Reasonix
discovery_diagnostics_test.go
根目录 / internal / sessioncatalog / discovery_diagnostics_test.go
1 package sessioncatalog
2
3 import (
4 "context"
5 "path/filepath"
6 "strings"
7 "sync"
8 "testing"
9 )
10
11 func TestDiscoveryDiagnosticsIdentifyPathOverflowCaller(t *testing.T) {
12 var events []DiscoveryEvent
13 c := &Catalog{
14 opts: Options{OnDiscovery: func(event DiscoveryEvent) { events = append(events, event) }},
15 pathCh: make(chan sessionPathRequest), reconcileCh: make(chan DirectoryTarget, 1),
16 reconcileDirty: map[string]DirectoryTarget{}, stop: make(chan struct{}),
17 }
18 root := t.TempDir()
19 if c.RequestIndexSession(DirectoryTarget{Path: root}, filepath.Join(root, "old.jsonl")) {
20 t.Fatal("unbuffered path queue unexpectedly accepted a request")
21 }
22 if len(events) != 1 || !strings.HasSuffix(events[0].Origin, ".TestDiscoveryDiagnosticsIdentifyPathOverflowCaller") {
23 t.Fatalf("overflow diagnostic hid the request owner: %+v", events)
24 }
25 }
26
27 func TestDiscoveryDiagnosticsCorrelateRequestAndDispatch(t *testing.T) {
28 root := t.TempDir()
29 var mu sync.Mutex
30 var events []DiscoveryEvent
31 c, err := Open(t.Context(), Options{InMemory: true, MetadataOnly: true, StartPaused: true,
32 OnDiscovery: func(event DiscoveryEvent) {
33 mu.Lock()
34 events = append(events, event)
35 mu.Unlock()
36 }})
37 if err != nil {
38 t.Fatal(err)
39 }
40 t.Cleanup(func() { _ = c.Close(context.Background()) })
41 target := DirectoryTarget{Path: root, Scope: "global"}
42 done, ok := c.ScheduleReconcile(target)
43 if !ok {
44 t.Fatal("request rejected")
45 }
46 if _, ok := c.ScheduleReconcile(target); !ok {
47 t.Fatal("coalesced request rejected")
48 }
49 c.ResumeDiscovery()
50 // The directory is empty, so the first iterator completes quickly. The
51 // completion signal is the deterministic barrier for the event sequence.
52 select {
53 case <-done:
54 case <-t.Context().Done():
55 t.Fatal("discovery did not settle")
56 }
57 mu.Lock()
58 defer mu.Unlock()
59 if len(events) < 3 {
60 t.Fatalf("events=%+v", events)
61 }
62 rootID := events[0].Root
63 started, completed := 0, 0
64 for _, event := range events {
65 if event.Root != rootID || event.Sequence == 0 {
66 t.Fatalf("unrelated discovery identity: %+v", events)
67 }
68 switch event.Phase {
69 case "started":
70 started++
71 case "completed":
72 completed++
73 }
74 }
75 if started != 1 || completed != 1 {
76 t.Fatalf("pre-dispatch requests must share one scan: started=%d completed=%d events=%+v", started, completed, events)
77 }
78 }
79
79 lines GO