...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package fileutil
16
17 import (
18 "io/ioutil"
19 "os"
20 "testing"
21 "time"
22 )
23
24 func TestLockAndUnlock(t *testing.T) {
25 f, err := ioutil.TempFile("", "lock")
26 if err != nil {
27 t.Fatal(err)
28 }
29 f.Close()
30 defer func() {
31 err = os.Remove(f.Name())
32 if err != nil {
33 t.Fatal(err)
34 }
35 }()
36
37
38 l, err := LockFile(f.Name(), os.O_WRONLY, PrivateFileMode)
39 if err != nil {
40 t.Fatal(err)
41 }
42
43
44 if _, err = TryLockFile(f.Name(), os.O_WRONLY, PrivateFileMode); err != ErrLocked {
45 t.Fatal(err)
46 }
47
48
49 if err = l.Close(); err != nil {
50 t.Fatal(err)
51 }
52
53
54 dupl, err := TryLockFile(f.Name(), os.O_WRONLY, PrivateFileMode)
55 if err != nil {
56 t.Errorf("err = %v, want %v", err, nil)
57 }
58
59
60 locked := make(chan struct{}, 1)
61 go func() {
62 bl, blerr := LockFile(f.Name(), os.O_WRONLY, PrivateFileMode)
63 if blerr != nil {
64 t.Error(blerr)
65 }
66 locked <- struct{}{}
67 if blerr = bl.Close(); blerr != nil {
68 t.Error(blerr)
69 }
70 }()
71
72 select {
73 case <-locked:
74 t.Error("unexpected unblocking")
75 case <-time.After(100 * time.Millisecond):
76 }
77
78
79 if err = dupl.Close(); err != nil {
80 t.Fatal(err)
81 }
82
83
84 select {
85 case <-locked:
86 case <-time.After(1 * time.Second):
87 t.Error("unexpected blocking")
88 }
89 }
90
View as plain text