master
go 130 lines 2.87 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 package filelock
4
5 import (
6 "os"
7 "testing"
8
9 "github.com/stretchr/testify/assert"
10 "github.com/stretchr/testify/require"
11 )
12
13 func TestNew(t *testing.T) {
14 assert.NotNil(t, New(""))
15 }
16
17 func TestLocker_Lock(t *testing.T) {
18 tests := map[string]func(t *testing.T, dir string){
19 "register a lock": func(t *testing.T, dir string) {
20 reg := New(dir)
21
22 ok, err := reg.Lock("name")
23 assert.True(t, ok)
24 assert.NoError(t, err)
25 },
26 "register the same lock twice": func(t *testing.T, dir string) {
27 reg := New(dir)
28
29 ok, err := reg.Lock("name")
30 require.True(t, ok)
31 require.NoError(t, err)
32
33 ok, err = reg.Lock("name")
34 assert.True(t, ok)
35 assert.NoError(t, err)
36 },
37 "failed to register locked by other process lock": func(t *testing.T, dir string) {
38 reg1 := New(dir)
39 reg2 := New(dir)
40
41 ok, err := reg1.Lock("name")
42 require.True(t, ok)
43 require.NoError(t, err)
44
45 ok, err = reg2.Lock("name")
46 assert.False(t, ok)
47 assert.NoError(t, err)
48 },
49 "failed to register because a directory doesnt exist": func(t *testing.T, dir string) {
50 reg := New(dir + dir)
51
52 ok, err := reg.Lock("name")
53 assert.False(t, ok)
54 assert.Error(t, err)
55 },
56 }
57
58 for name, test := range tests {
59 t.Run(name, func(t *testing.T) {
60 dir, err := os.MkdirTemp(os.TempDir(), "netdata-go-test-file-lock-registry")
61 require.NoError(t, err)
62 defer func() { require.NoError(t, os.RemoveAll(dir)) }()
63
64 test(t, dir)
65 })
66 }
67 }
68
69 func TestLocker_Unlock(t *testing.T) {
70 tests := map[string]func(t *testing.T, dir string){
71 "unregister a lock": func(t *testing.T, dir string) {
72 reg := New(dir)
73
74 ok, err := reg.Lock("name")
75 require.True(t, ok)
76 require.NoError(t, err)
77 reg.Unlock("name")
78
79 assert.False(t, reg.isLocked("name"))
80 },
81 "unregister not registered lock": func(t *testing.T, dir string) {
82 reg := New(dir)
83
84 reg.Unlock("name")
85
86 assert.False(t, reg.isLocked("name"))
87 },
88 }
89
90 for name, test := range tests {
91 t.Run(name, func(t *testing.T) {
92 dir, err := os.MkdirTemp(os.TempDir(), "netdata-go-test-file-lock-registry")
93 require.NoError(t, err)
94 defer func() { require.NoError(t, os.RemoveAll(dir)) }()
95
96 test(t, dir)
97 })
98 }
99 }
100
101 func TestLocker_UnlockAll(t *testing.T) {
102 tests := map[string]func(t *testing.T, dir string){
103 "unlock all": func(t *testing.T, dir string) {
104 reg := New(dir)
105
106 ok, err := reg.Lock("name1")
107 require.True(t, ok)
108 require.NoError(t, err)
109
110 ok, err = reg.Lock("name2")
111 require.True(t, ok)
112 require.NoError(t, err)
113
114 reg.UnlockAll()
115
116 assert.False(t, reg.isLocked("name1"))
117 assert.False(t, reg.isLocked("name2"))
118 },
119 }
120
121 for name, test := range tests {
122 t.Run(name, func(t *testing.T) {
123 dir, err := os.MkdirTemp(os.TempDir(), "netdata-go-test-file-lock-registry")
124 require.NoError(t, err)
125 defer func() { require.NoError(t, os.RemoveAll(dir)) }()
126
127 test(t, dir)
128 })
129 }
130 }