返回 DeepSeek-Reasonix
observation_test.go
根目录 / internal / fileops / observation_test.go
1 package fileops
2
3 import (
4 "os"
5 "path/filepath"
6 "runtime"
7 "testing"
8 )
9
10 func TestStoreTransitions(t *testing.T) {
11 s := NewStore()
12 target := OverlayTarget("a.txt")
13 if got := s.Get(target); got.Kind != Unseen {
14 t.Fatalf("initial kind = %v", got.Kind)
15 }
16 s.ObserveAbsent(target)
17 if got := s.Get(target); got.Kind != Absent {
18 t.Fatalf("absent kind = %v", got.Kind)
19 }
20 s.ObservePresent(target, "v1")
21 if got := s.Get(target); got.Kind != Present || got.Version != "v1" {
22 t.Fatalf("present = %#v", got)
23 }
24 s.Forget(target)
25 if got := s.Get(target); got.Kind != Unseen {
26 t.Fatalf("forgotten kind = %v", got.Kind)
27 }
28 }
29
30 func TestDiskVersionDetectsMetadataChanges(t *testing.T) {
31 if runtime.GOOS == "windows" {
32 t.Skip("Windows permission freshness is covered with a native ACL change")
33 }
34 path := filepath.Join(t.TempDir(), "file.txt")
35 if err := os.WriteFile(path, []byte("one"), 0o644); err != nil {
36 t.Fatal(err)
37 }
38 before, err := os.Stat(path)
39 if err != nil {
40 t.Fatal(err)
41 }
42 if err := os.Chmod(path, 0o600); err != nil {
43 t.Fatal(err)
44 }
45 after, err := os.Stat(path)
46 if err != nil {
47 t.Fatal(err)
48 }
49 if DiskVersion(before) == DiskVersion(after) {
50 t.Fatal("permission change did not change version")
51 }
52 }
53
54 func TestHardLinksShareTarget(t *testing.T) {
55 dir := t.TempDir()
56 a := filepath.Join(dir, "a")
57 b := filepath.Join(dir, "b")
58 if err := os.WriteFile(a, []byte("x"), 0o644); err != nil {
59 t.Fatal(err)
60 }
61 if err := os.Link(a, b); err != nil {
62 t.Skipf("hard links unavailable: %v", err)
63 }
64 ai, _ := os.Stat(a)
65 bi, _ := os.Stat(b)
66 if DiskTarget(a, ai).Key != DiskTarget(b, bi).Key {
67 t.Fatalf("targets differ: %#v %#v", DiskTarget(a, ai), DiskTarget(b, bi))
68 }
69 }
70
71 func TestOverlayProviderIdentitiesDoNotShareObservations(t *testing.T) {
72 store := NewStore()
73 first := OverlayTargetWithIdentity("buffer.txt", "connection-a")
74 second := OverlayTargetWithIdentity("buffer.txt", "connection-b")
75 store.ObservePresent(first, OverlayVersion("same content"))
76 if got := store.Get(second); got.Kind != Unseen {
77 t.Fatalf("observation crossed overlay providers: %+v", got)
78 }
79 }
80
80 lines GO