返回 DeepSeek-Reasonix
shared_rebuild_test.go
根目录 / internal / taskcatalog / shared_rebuild_test.go
1 package taskcatalog
2
3 import (
4 "context"
5 "path/filepath"
6 "testing"
7 "time"
8 )
9
10 func TestSharedManagerRebuildRestartsWithRegisteredProjects(t *testing.T) {
11 manager := &sharedManager{}
12 databasePath := filepath.Join(t.TempDir(), "tasks.sqlite")
13 manager.open = func(ctx context.Context, _ string) (*Catalog, error) {
14 return Open(ctx, databasePath)
15 }
16 rebuildCalls := 0
17 manager.rebuild = func(context.Context, string, []Project) (Status, error) {
18 rebuildCalls++
19 return Status{}, nil
20 }
21 manager.start()
22 waitSharedManagerOpen(t, manager)
23 project := Project{Root: t.TempDir(), Label: "Current"}
24 if err := manager.rebuildShared(context.Background(), []Project{project}); err != nil {
25 t.Fatal(err)
26 }
27 waitSharedManagerOpen(t, manager)
28 if rebuildCalls != 1 {
29 t.Fatalf("rebuild calls = %d, want 1", rebuildCalls)
30 }
31 manager.mu.RLock()
32 restarted := manager.catalog
33 manager.mu.RUnlock()
34 if restarted == nil {
35 t.Fatal("manager did not publish a fresh catalog after rebuild")
36 }
37 normalized := normalizeProject(project)
38 if _, ok, err := restarted.Project(context.Background(), normalized.Key); err != nil || !ok {
39 t.Fatalf("registered project missing after rebuild: ok=%v err=%v", ok, err)
40 }
41 ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
42 defer cancel()
43 if err := manager.close(ctx); err != nil {
44 t.Fatal(err)
45 }
46 }
47
48 func TestSharedManagerRetainsRegistrationsWhileClosingForRebuild(t *testing.T) {
49 manager := &sharedManager{closing: true, rebuilding: true}
50 registeredRoot := t.TempDir()
51 notifiedRoot := t.TempDir()
52 manager.registerProject(registeredRoot, "Registered")
53 if catalog := manager.catalogForNotification(notifiedRoot); catalog != nil {
54 t.Fatal("notification unexpectedly reached a catalog during rebuild")
55 }
56 manager.mu.RLock()
57 defer manager.mu.RUnlock()
58 if manager.pending[registeredRoot] != "Registered" {
59 t.Fatalf("registered project was not retained: %#v", manager.pending)
60 }
61 if manager.pending[notifiedRoot] != filepath.Base(notifiedRoot) {
62 t.Fatalf("notified project was not retained: %#v", manager.pending)
63 }
64 }
65
66 func waitSharedManagerOpen(t *testing.T, manager *sharedManager) {
67 t.Helper()
68 manager.mu.RLock()
69 done := manager.openDone
70 manager.mu.RUnlock()
71 if done != nil {
72 <-done
73 }
74 }
75
75 lines GO