1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package fileutil
16
17 import (
18 "fmt"
19 "io"
20 "io/ioutil"
21 "math/rand"
22 "os"
23 "os/user"
24 "path/filepath"
25 "runtime"
26 "strings"
27 "testing"
28 "time"
29
30 "go.uber.org/zap/zaptest"
31 )
32
33 func TestIsDirWriteable(t *testing.T) {
34 tmpdir, err := ioutil.TempDir("", "")
35 if err != nil {
36 t.Fatalf("unexpected ioutil.TempDir error: %v", err)
37 }
38 defer os.RemoveAll(tmpdir)
39 if err = IsDirWriteable(tmpdir); err != nil {
40 t.Fatalf("unexpected IsDirWriteable error: %v", err)
41 }
42 if err = os.Chmod(tmpdir, 0444); err != nil {
43 t.Fatalf("unexpected os.Chmod error: %v", err)
44 }
45 me, err := user.Current()
46 if err != nil {
47
48
49 t.Skipf("failed to get current user: %v", err)
50 }
51 if me.Name == "root" || runtime.GOOS == "windows" {
52
53
54
55 t.Skipf("running as a superuser or in windows")
56 }
57 if err := IsDirWriteable(tmpdir); err == nil {
58 t.Fatalf("expected IsDirWriteable to error")
59 }
60 }
61
62 func TestCreateDirAll(t *testing.T) {
63 tmpdir, err := ioutil.TempDir(os.TempDir(), "foo")
64 if err != nil {
65 t.Fatal(err)
66 }
67 defer os.RemoveAll(tmpdir)
68
69 tmpdir2 := filepath.Join(tmpdir, "testdir")
70 if err = CreateDirAll(zaptest.NewLogger(t), tmpdir2); err != nil {
71 t.Fatal(err)
72 }
73
74 if err = ioutil.WriteFile(filepath.Join(tmpdir2, "text.txt"), []byte("test text"), PrivateFileMode); err != nil {
75 t.Fatal(err)
76 }
77
78 if err = CreateDirAll(zaptest.NewLogger(t), tmpdir2); err == nil || !strings.Contains(err.Error(), "to be empty, got") {
79 t.Fatalf("unexpected error %v", err)
80 }
81 }
82
83 func TestExist(t *testing.T) {
84 fdir := filepath.Join(os.TempDir(), fmt.Sprint(time.Now().UnixNano()+rand.Int63n(1000)))
85 os.RemoveAll(fdir)
86 if err := os.Mkdir(fdir, 0666); err != nil {
87 t.Skip(err)
88 }
89 defer os.RemoveAll(fdir)
90 if !Exist(fdir) {
91 t.Fatalf("expected Exist true, got %v", Exist(fdir))
92 }
93
94 f, err := ioutil.TempFile(os.TempDir(), "fileutil")
95 if err != nil {
96 t.Fatal(err)
97 }
98 f.Close()
99
100 if g := Exist(f.Name()); !g {
101 t.Errorf("exist = %v, want true", g)
102 }
103
104 os.Remove(f.Name())
105 if g := Exist(f.Name()); g {
106 t.Errorf("exist = %v, want false", g)
107 }
108 }
109
110 func TestDirEmpty(t *testing.T) {
111 dir, err := ioutil.TempDir(os.TempDir(), "empty_dir")
112 if err != nil {
113 t.Fatal(err)
114 }
115 defer os.RemoveAll(dir)
116
117 if !DirEmpty(dir) {
118 t.Fatalf("expected DirEmpty true, got %v", DirEmpty(dir))
119 }
120
121 file, err := ioutil.TempFile(dir, "new_file")
122 if err != nil {
123 t.Fatal(err)
124 }
125 file.Close()
126
127 if DirEmpty(dir) {
128 t.Fatalf("expected DirEmpty false, got %v", DirEmpty(dir))
129 }
130 if DirEmpty(file.Name()) {
131 t.Fatalf("expected DirEmpty false, got %v", DirEmpty(file.Name()))
132 }
133 }
134
135 func TestZeroToEnd(t *testing.T) {
136 f, err := ioutil.TempFile(os.TempDir(), "fileutil")
137 if err != nil {
138 t.Fatal(err)
139 }
140 defer os.Remove(f.Name())
141 defer f.Close()
142
143
144 if err = ZeroToEnd(f); err != nil {
145 t.Fatal(err)
146 }
147
148 b := make([]byte, 1024)
149 for i := range b {
150 b[i] = 12
151 }
152 if _, err = f.Write(b); err != nil {
153 t.Fatal(err)
154 }
155 if _, err = f.Seek(512, io.SeekStart); err != nil {
156 t.Fatal(err)
157 }
158 if err = ZeroToEnd(f); err != nil {
159 t.Fatal(err)
160 }
161 off, serr := f.Seek(0, io.SeekCurrent)
162 if serr != nil {
163 t.Fatal(serr)
164 }
165 if off != 512 {
166 t.Fatalf("expected offset 512, got %d", off)
167 }
168
169 b = make([]byte, 512)
170 if _, err = f.Read(b); err != nil {
171 t.Fatal(err)
172 }
173 for i := range b {
174 if b[i] != 0 {
175 t.Errorf("expected b[%d] = 0, got %d", i, b[i])
176 }
177 }
178 }
179
180 func TestDirPermission(t *testing.T) {
181 tmpdir, err := ioutil.TempDir(os.TempDir(), "foo")
182 if err != nil {
183 t.Fatal(err)
184 }
185 defer os.RemoveAll(tmpdir)
186
187 tmpdir2 := filepath.Join(tmpdir, "testpermission")
188
189 if err = CreateDirAll(zaptest.NewLogger(t), tmpdir2); err != nil {
190 t.Fatal(err)
191 }
192
193 if err = CheckDirPermission(tmpdir2, 0600); err == nil {
194 t.Errorf("expected error, got nil")
195 }
196 }
197
198 func TestRemoveMatchFile(t *testing.T) {
199 tmpdir := t.TempDir()
200 defer os.RemoveAll(tmpdir)
201 f, err := ioutil.TempFile(tmpdir, "tmp")
202 if err != nil {
203 t.Fatal(err)
204 }
205 f.Close()
206 f, err = ioutil.TempFile(tmpdir, "foo.tmp")
207 if err != nil {
208 t.Fatal(err)
209 }
210 f.Close()
211
212 err = RemoveMatchFile(zaptest.NewLogger(t), tmpdir, func(fileName string) bool {
213 return strings.HasPrefix(fileName, "tmp")
214 })
215 if err != nil {
216 t.Errorf("expected nil, got error")
217 }
218 fnames, err := ReadDir(tmpdir)
219 if err != nil {
220 t.Fatal(err)
221 }
222 if len(fnames) != 1 {
223 t.Errorf("expected exist 1 files, got %d", len(fnames))
224 }
225
226 f, err = ioutil.TempFile(tmpdir, "tmp")
227 if err != nil {
228 t.Fatal(err)
229 }
230 f.Close()
231 err = RemoveMatchFile(zaptest.NewLogger(t), tmpdir, func(fileName string) bool {
232 os.Remove(filepath.Join(tmpdir, fileName))
233 return strings.HasPrefix(fileName, "tmp")
234 })
235 if err == nil {
236 t.Errorf("expected error, got nil")
237 }
238 }
239
View as plain text