返回 DeepSeek-Reasonix
identitylock_test.go
根目录 / internal / identitylock / identitylock_test.go
1 package identitylock
2
3 import (
4 "context"
5 "errors"
6 "os"
7 "path/filepath"
8 "testing"
9 )
10
11 func TestAliasPathsShareLocalIdentity(t *testing.T) {
12 dir := t.TempDir()
13 realDir := filepath.Join(dir, "real")
14 if err := os.Mkdir(realDir, 0o755); err != nil {
15 t.Fatal(err)
16 }
17 aliasDir := filepath.Join(dir, "alias")
18 if err := os.Symlink(realDir, aliasDir); err != nil {
19 t.Skipf("symlink unavailable: %v", err)
20 }
21 release, err := TryAcquire(filepath.Join(realDir, "state.lock"))
22 if err != nil {
23 t.Fatal(err)
24 }
25 defer release()
26 if aliasRelease, err := TryAcquire(filepath.Join(aliasDir, "state.lock")); !errors.Is(err, ErrHeld) {
27 if aliasRelease != nil {
28 aliasRelease()
29 }
30 t.Fatalf("alias acquire error = %v, want ErrHeld", err)
31 }
32 }
33
34 func TestAcquireRejectsLinkRedirectAfterIdentityResolution(t *testing.T) {
35 dir := t.TempDir()
36 first := filepath.Join(dir, "first")
37 second := filepath.Join(dir, "second")
38 if err := os.Mkdir(first, 0o755); err != nil {
39 t.Fatal(err)
40 }
41 if err := os.Mkdir(second, 0o755); err != nil {
42 t.Fatal(err)
43 }
44 alias := filepath.Join(dir, "alias")
45 if err := os.Symlink(first, alias); err != nil {
46 t.Skipf("symlink unavailable: %v", err)
47 }
48 originalHook := identityLockAfterResolve
49 identityLockAfterResolve = func() {
50 identityLockAfterResolve = originalHook
51 if err := os.Remove(alias); err != nil {
52 t.Fatal(err)
53 }
54 if err := os.Symlink(second, alias); err != nil {
55 t.Fatal(err)
56 }
57 }
58 defer func() { identityLockAfterResolve = originalHook }()
59
60 release, err := Acquire(context.Background(), filepath.Join(alias, "state.lock"))
61 if release != nil {
62 release()
63 }
64 if err == nil || err.Error() != "file lock identity changed while acquiring" {
65 t.Fatalf("Acquire error = %v, want identity change", err)
66 }
67 next, nextErr := TryAcquire(filepath.Join(second, "state.lock"))
68 if nextErr != nil {
69 t.Fatalf("lock remained held after rejected redirect: %v", nextErr)
70 }
71 next()
72 }
73
73 lines GO