Skip to content

Commit e7dab76

Browse files
committed
Add lockutil test
Verify that the lock works for threads in the same process. The test fails on windows: === RUN TestWithDirLock lockutil_test.go:54: Expected one writer, got [writer 19 writer 0] (Keeping as separate commit to make it easy to reproduce) Signed-off-by: Nir Soffer <[email protected]>
1 parent 11eb750 commit e7dab76

File tree

1 file changed

+56
-0
lines changed

1 file changed

+56
-0
lines changed

pkg/lockutil/lockutil_test.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package lockutil
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"os"
7+
"path/filepath"
8+
"strings"
9+
"testing"
10+
)
11+
12+
const parallel = 20
13+
14+
func TestWithDirLock(t *testing.T) {
15+
dir := t.TempDir()
16+
log := filepath.Join(dir, "log")
17+
18+
errc := make(chan error, 10)
19+
for i := 0; i < parallel; i++ {
20+
go func() {
21+
err := WithDirLock(dir, func() error {
22+
if _, err := os.Stat(log); err == nil {
23+
return nil
24+
} else if !errors.Is(err, os.ErrNotExist) {
25+
return err
26+
}
27+
logFile, err := os.OpenFile(log, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0o640)
28+
if err != nil {
29+
return err
30+
}
31+
defer logFile.Close()
32+
if _, err := fmt.Fprintf(logFile, "writer %d\n", i); err != nil {
33+
return err
34+
}
35+
return logFile.Close()
36+
})
37+
errc <- err
38+
}()
39+
}
40+
41+
for i := 0; i < parallel; i++ {
42+
err := <-errc
43+
if err != nil {
44+
t.Error(err)
45+
}
46+
}
47+
48+
data, err := os.ReadFile(log)
49+
if err != nil {
50+
t.Fatal(err)
51+
}
52+
lines := strings.Split(strings.Trim(string(data), "\n"), "\n")
53+
if len(lines) != 1 {
54+
t.Errorf("Expected one writer, got %v", lines)
55+
}
56+
}

0 commit comments

Comments
 (0)