返回 DeepSeek-Reasonix
darwin_compat_test.go
根目录 / internal / workspacelease / darwin_compat_test.go
1 //go:build darwin
2
3 package workspacelease
4
5 import (
6 "context"
7 "errors"
8 "os"
9 "path/filepath"
10 "testing"
11 "time"
12
13 "reasonix/internal/filelock"
14 )
15
16 func TestDarwinCaseAliasKeepsLegacyExactRootLock(t *testing.T) {
17 base := t.TempDir()
18 root := filepath.Join(base, "MixedCaseRepo")
19 if err := os.MkdirAll(filepath.Join(root, ".git"), 0o700); err != nil {
20 t.Fatal(err)
21 }
22 alias := filepath.Join(base, "mixedcaserepo")
23 actualIdentity, err := CanonicalWorkspace(root)
24 if err != nil {
25 t.Fatal(err)
26 }
27 aliasIdentity, err := CanonicalWorkspace(alias)
28 if err != nil {
29 t.Fatal(err)
30 }
31 if actualIdentity != aliasIdentity {
32 t.Fatalf("workspace identities = %q / %q, want one folded identity", actualIdentity, aliasIdentity)
33 }
34
35 locks := t.TempDir()
36 _, exactIdentity, err := workspaceIdentities(root)
37 if err != nil {
38 t.Fatal(err)
39 }
40 if filepath.Base(exactIdentity) != "MixedCaseRepo" || exactIdentity == actualIdentity {
41 t.Fatalf("exact/new identities = %q / %q, want distinct legacy case", exactIdentity, actualIdentity)
42 }
43 legacyRelease, err := filelock.TryAcquire(workspaceLockPath(locks, exactIdentity))
44 if err != nil {
45 t.Fatal(err)
46 }
47 contender, err := New(root, locks, nil)
48 if err != nil {
49 t.Fatal(err)
50 }
51 ctx, cancel := context.WithTimeout(context.Background(), 80*time.Millisecond)
52 defer cancel()
53 release, err := contender.HoldWrite(ctx)
54 if release != nil {
55 release()
56 }
57 if !errors.Is(err, context.DeadlineExceeded) {
58 legacyRelease()
59 t.Fatalf("new owner bypassed old exact-root lock: %v", err)
60 }
61 legacyRelease()
62
63 first, err := New(root, locks, nil)
64 if err != nil {
65 t.Fatal(err)
66 }
67 second, err := New(alias, locks, nil)
68 if err != nil {
69 t.Fatal(err)
70 }
71 firstRelease, err := first.HoldWrite(context.Background())
72 if err != nil {
73 t.Fatal(err)
74 }
75 defer firstRelease()
76 aliasCtx, aliasCancel := context.WithTimeout(context.Background(), 80*time.Millisecond)
77 defer aliasCancel()
78 aliasRelease, err := second.HoldWrite(aliasCtx)
79 if aliasRelease != nil {
80 aliasRelease()
81 }
82 if !errors.Is(err, context.DeadlineExceeded) {
83 t.Fatalf("case-alias owner bypassed folded workspace lock: %v", err)
84 }
85 }
86
87 func TestDarwinParentPathHonorsLegacyNestedRootCase(t *testing.T) {
88 parent, locks := t.TempDir(), t.TempDir()
89 nested := filepath.Join(parent, "NestedRepo")
90 if err := os.MkdirAll(filepath.Join(nested, ".git"), 0o700); err != nil {
91 t.Fatal(err)
92 }
93 exactNested, err := CanonicalWorkspace(nested)
94 if err != nil {
95 t.Fatal(err)
96 }
97 legacyRelease, err := filelock.TryAcquire(workspaceLockPath(locks, exactNested))
98 if err != nil {
99 t.Fatal(err)
100 }
101 defer legacyRelease()
102
103 owner, err := New(parent, locks, nil)
104 if err != nil {
105 t.Fatal(err)
106 }
107 ctx, cancel := context.WithTimeout(context.Background(), 80*time.Millisecond)
108 defer cancel()
109 release, err := owner.HoldWriteForPath(ctx, filepath.Join(nested, "new.go"))
110 if release != nil {
111 release()
112 }
113 if !errors.Is(err, context.DeadlineExceeded) {
114 t.Fatalf("parent path bypassed old nested exact-root lock: %v", err)
115 }
116 }
117
117 lines GO