-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlock_test.go
More file actions
93 lines (80 loc) · 1.87 KB
/
lock_test.go
File metadata and controls
93 lines (80 loc) · 1.87 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//go:build unix
package main
import (
"testing"
)
func TestAcquireLock(t *testing.T) {
t.Run("basic acquire and release", func(t *testing.T) {
dir := t.TempDir()
f, err := acquireLock(dir)
if err != nil {
t.Fatalf("acquireLock failed: %v", err)
}
if f == nil {
t.Fatal("acquireLock returned nil file")
}
releaseLock(f)
})
t.Run("double lock same root fails", func(t *testing.T) {
dir := t.TempDir()
f1, err := acquireLock(dir)
if err != nil {
t.Fatalf("first acquireLock failed: %v", err)
}
defer releaseLock(f1)
f2, err := acquireLock(dir)
if err == nil {
releaseLock(f2)
t.Fatal("second acquireLock on same root should fail")
}
})
t.Run("different roots lock independently", func(t *testing.T) {
d1 := t.TempDir()
d2 := t.TempDir()
f1, err := acquireLock(d1)
if err != nil {
t.Fatalf("acquireLock d1 failed: %v", err)
}
defer releaseLock(f1)
f2, err := acquireLock(d2)
if err != nil {
t.Fatalf("acquireLock d2 failed: %v", err)
}
defer releaseLock(f2)
})
t.Run("release then reacquire", func(t *testing.T) {
dir := t.TempDir()
f1, err := acquireLock(dir)
if err != nil {
t.Fatalf("first acquireLock failed: %v", err)
}
releaseLock(f1)
f2, err := acquireLock(dir)
if err != nil {
t.Fatalf("reacquire after release failed: %v", err)
}
releaseLock(f2)
})
t.Run("release nil is safe", func(t *testing.T) {
releaseLock(nil) // should not panic
})
t.Run("deterministic lock path", func(t *testing.T) {
// Same root should always use the same lock file.
dir := t.TempDir()
f1, err := acquireLock(dir)
if err != nil {
t.Fatal(err)
}
name1 := f1.Name()
releaseLock(f1)
f2, err := acquireLock(dir)
if err != nil {
t.Fatal(err)
}
name2 := f2.Name()
releaseLock(f2)
if name1 != name2 {
t.Errorf("lock paths differ for same root: %q vs %q", name1, name2)
}
})
}