1 // Copyright ©2015 Steve Francia <spf@spf13.com>
2 // Portions Copyright ©2015 The Hugo Authors
5 // Licensed under the Apache License, Version 2.0 (the "License");
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
9 // http://www.apache.org/licenses/LICENSE-2.0
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an "AS IS" BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
30 var testFS = new(MemMapFs)
32 func TestDirExists(t *testing.T) {
38 // First create a couple directories so there is something in the filesystem
39 //testFS := new(MemMapFs)
40 testFS.MkdirAll("/foo/bar", 0777)
54 {"/some-really-random-directory-name", false},
55 {"/some/really/random/directory/name", false},
56 {"./some-really-random-local-directory-name", false},
57 {"./some/really/random/local/directory/name", false},
60 for i, d := range data {
61 exists, _ := DirExists(testFS, filepath.FromSlash(d.input))
62 if d.expected != exists {
63 t.Errorf("Test %d %q failed. Expected %t got %t", i, d.input, d.expected, exists)
68 func TestIsDir(t *testing.T) {
69 testFS = new(MemMapFs)
78 {"./this-directory-does-not-existi", false},
79 {"/this-absolute-directory/does-not-exist", false},
82 for i, d := range data {
84 exists, _ := IsDir(testFS, d.input)
85 if d.expected != exists {
86 t.Errorf("Test %d failed. Expected %t got %t", i, d.expected, exists)
91 func TestIsEmpty(t *testing.T) {
92 testFS = new(MemMapFs)
94 zeroSizedFile, _ := createZeroSizedFileInTempDir()
95 defer deleteFileInTempDir(zeroSizedFile)
96 nonZeroSizedFile, _ := createNonZeroSizedFileInTempDir()
97 defer deleteFileInTempDir(nonZeroSizedFile)
98 emptyDirectory, _ := createEmptyTempDir()
99 defer deleteTempDir(emptyDirectory)
100 nonEmptyZeroLengthFilesDirectory, _ := createTempDirWithZeroLengthFiles()
101 defer deleteTempDir(nonEmptyZeroLengthFilesDirectory)
102 nonEmptyNonZeroLengthFilesDirectory, _ := createTempDirWithNonZeroLengthFiles()
103 defer deleteTempDir(nonEmptyNonZeroLengthFilesDirectory)
104 nonExistentFile := os.TempDir() + "/this-file-does-not-exist.txt"
105 nonExistentDir := os.TempDir() + "/this/direcotry/does/not/exist/"
107 fileDoesNotExist := fmt.Errorf("%q path does not exist", nonExistentFile)
108 dirDoesNotExist := fmt.Errorf("%q path does not exist", nonExistentDir)
117 {zeroSizedFile.Name(), true, nil},
118 {nonZeroSizedFile.Name(), false, nil},
119 {emptyDirectory, true, nil},
120 {nonEmptyZeroLengthFilesDirectory, false, nil},
121 {nonEmptyNonZeroLengthFilesDirectory, false, nil},
122 {nonExistentFile, false, fileDoesNotExist},
123 {nonExistentDir, false, dirDoesNotExist},
125 for i, d := range data {
126 exists, err := IsEmpty(testFS, d.input)
127 if d.expectedResult != exists {
128 t.Errorf("Test %d %q failed exists. Expected result %t got %t", i, d.input, d.expectedResult, exists)
130 if d.expectedErr != nil {
131 if d.expectedErr.Error() != err.Error() {
132 t.Errorf("Test %d failed with err. Expected %q(%#v) got %q(%#v)", i, d.expectedErr, d.expectedErr, err, err)
135 if d.expectedErr != err {
136 t.Errorf("Test %d failed. Expected error %q(%#v) got %q(%#v)", i, d.expectedErr, d.expectedErr, err, err)
142 func TestReaderContains(t *testing.T) {
143 for i, this := range []struct {
148 {"abc", [][]byte{[]byte("a")}, true},
149 {"abc", [][]byte{[]byte("b")}, true},
150 {"abcdefg", [][]byte{[]byte("efg")}, true},
151 {"abc", [][]byte{[]byte("d")}, false},
152 {"abc", [][]byte{[]byte("d"), []byte("e")}, false},
153 {"abc", [][]byte{[]byte("d"), []byte("a")}, true},
154 {"abc", [][]byte{[]byte("b"), []byte("e")}, true},
156 {"", [][]byte{[]byte("a")}, false},
157 {"a", [][]byte{[]byte("")}, false},
158 {"", [][]byte{[]byte("")}, false}} {
159 result := readerContainsAny(strings.NewReader(this.v1), this.v2...)
160 if result != this.expect {
161 t.Errorf("[%d] readerContains: got %t but expected %t", i, result, this.expect)
165 if readerContainsAny(nil, []byte("a")) {
166 t.Error("readerContains with nil reader")
169 if readerContainsAny(nil, nil) {
170 t.Error("readerContains with nil arguments")
174 func createZeroSizedFileInTempDir() (File, error) {
175 filePrefix := "_path_test_"
176 f, e := TempFile(testFS, "", filePrefix) // dir is os.TempDir()
178 // if there was an error no file was created.
179 // => no requirement to delete the file
185 func createNonZeroSizedFileInTempDir() (File, error) {
186 f, err := createZeroSizedFileInTempDir()
190 byteString := []byte("byteString")
191 err = WriteFile(testFS, f.Name(), byteString, 0644)
194 deleteFileInTempDir(f)
200 func deleteFileInTempDir(f File) {
201 err := testFS.Remove(f.Name())
207 func createEmptyTempDir() (string, error) {
208 dirPrefix := "_dir_prefix_"
209 d, e := TempDir(testFS, "", dirPrefix) // will be in os.TempDir()
211 // no directory to delete - it was never created
217 func createTempDirWithZeroLengthFiles() (string, error) {
218 d, dirErr := createEmptyTempDir()
222 filePrefix := "_path_test_"
223 _, fileErr := TempFile(testFS, d, filePrefix) // dir is os.TempDir()
225 // if there was an error no file was created.
226 // but we need to remove the directory to clean-up
230 // the dir now has one, zero length file in it
235 func createTempDirWithNonZeroLengthFiles() (string, error) {
236 d, dirErr := createEmptyTempDir()
240 filePrefix := "_path_test_"
241 f, fileErr := TempFile(testFS, d, filePrefix) // dir is os.TempDir()
243 // if there was an error no file was created.
244 // but we need to remove the directory to clean-up
248 byteString := []byte("byteString")
249 fileErr = WriteFile(testFS, f.Name(), byteString, 0644)
252 deleteFileInTempDir(f)
253 // also delete the directory
258 // the dir now has one, zero length file in it
263 func TestExists(t *testing.T) {
264 zeroSizedFile, _ := createZeroSizedFileInTempDir()
265 defer deleteFileInTempDir(zeroSizedFile)
266 nonZeroSizedFile, _ := createNonZeroSizedFileInTempDir()
267 defer deleteFileInTempDir(nonZeroSizedFile)
268 emptyDirectory, _ := createEmptyTempDir()
269 defer deleteTempDir(emptyDirectory)
270 nonExistentFile := os.TempDir() + "/this-file-does-not-exist.txt"
271 nonExistentDir := os.TempDir() + "/this/direcotry/does/not/exist/"
280 {zeroSizedFile.Name(), true, nil},
281 {nonZeroSizedFile.Name(), true, nil},
282 {emptyDirectory, true, nil},
283 {nonExistentFile, false, nil},
284 {nonExistentDir, false, nil},
286 for i, d := range data {
287 exists, err := Exists(testFS, d.input)
288 if d.expectedResult != exists {
289 t.Errorf("Test %d failed. Expected result %t got %t", i, d.expectedResult, exists)
291 if d.expectedErr != err {
292 t.Errorf("Test %d failed. Expected %q got %q", i, d.expectedErr, err)
298 func TestSafeWriteToDisk(t *testing.T) {
299 emptyFile, _ := createZeroSizedFileInTempDir()
300 defer deleteFileInTempDir(emptyFile)
301 tmpDir, _ := createEmptyTempDir()
302 defer deleteTempDir(tmpDir)
304 randomString := "This is a random string!"
305 reader := strings.NewReader(randomString)
307 fileExists := fmt.Errorf("%v already exists", emptyFile.Name())
314 now := time.Now().Unix()
315 nowStr := strconv.FormatInt(now, 10)
317 {emptyFile.Name(), fileExists},
318 {tmpDir + "/" + nowStr, nil},
321 for i, d := range data {
322 e := SafeWriteReader(testFS, d.filename, reader)
323 if d.expectedErr != nil {
324 if d.expectedErr.Error() != e.Error() {
325 t.Errorf("Test %d failed. Expected error %q but got %q", i, d.expectedErr.Error(), e.Error())
328 if d.expectedErr != e {
329 t.Errorf("Test %d failed. Expected %q but got %q", i, d.expectedErr, e)
331 contents, _ := ReadFile(testFS, d.filename)
332 if randomString != string(contents) {
333 t.Errorf("Test %d failed. Expected contents %q but got %q", i, randomString, string(contents))
340 func TestWriteToDisk(t *testing.T) {
341 emptyFile, _ := createZeroSizedFileInTempDir()
342 defer deleteFileInTempDir(emptyFile)
343 tmpDir, _ := createEmptyTempDir()
344 defer deleteTempDir(tmpDir)
346 randomString := "This is a random string!"
347 reader := strings.NewReader(randomString)
354 now := time.Now().Unix()
355 nowStr := strconv.FormatInt(now, 10)
357 {emptyFile.Name(), nil},
358 {tmpDir + "/" + nowStr, nil},
361 for i, d := range data {
362 e := WriteReader(testFS, d.filename, reader)
363 if d.expectedErr != e {
364 t.Errorf("Test %d failed. WriteToDisk Error Expected %q but got %q", i, d.expectedErr, e)
366 contents, e := ReadFile(testFS, d.filename)
368 t.Errorf("Test %d failed. Could not read file %s. Reason: %s\n", i, d.filename, e)
370 if randomString != string(contents) {
371 t.Errorf("Test %d failed. Expected contents %q but got %q", i, randomString, string(contents))
377 func TestGetTempDir(t *testing.T) {
379 if FilePathSeparator != dir[len(dir)-1:] {
380 dir = dir + FilePathSeparator
382 testDir := "hugoTestFolder" + FilePathSeparator
388 {testDir + " Foo bar ", dir + testDir + " Foo bar " + FilePathSeparator},
389 {testDir + "Foo.Bar/foo_Bar-Foo", dir + testDir + "Foo.Bar/foo_Bar-Foo" + FilePathSeparator},
390 {testDir + "fOO,bar:foo%bAR", dir + testDir + "fOObarfoo%bAR" + FilePathSeparator},
391 {testDir + "FOo/BaR.html", dir + testDir + "FOo/BaR.html" + FilePathSeparator},
392 {testDir + "трям/трям", dir + testDir + "трям/трям" + FilePathSeparator},
393 {testDir + "은행", dir + testDir + "은행" + FilePathSeparator},
394 {testDir + "Банковский кассир", dir + testDir + "Банковский кассир" + FilePathSeparator},
397 for _, test := range tests {
398 output := GetTempDir(new(MemMapFs), test.input)
399 if output != test.expected {
400 t.Errorf("Expected %#v, got %#v\n", test.expected, output)
405 // This function is very dangerous. Don't use it.
406 func deleteTempDir(d string) {
407 err := os.RemoveAll(d)
413 func TestFullBaseFsPath(t *testing.T) {
414 type dirSpec struct {
415 Dir1, Dir2, Dir3 string
417 dirSpecs := []dirSpec{
418 dirSpec{Dir1: "/", Dir2: "/", Dir3: "/"},
419 dirSpec{Dir1: "/", Dir2: "/path2", Dir3: "/"},
420 dirSpec{Dir1: "/path1/dir", Dir2: "/path2/dir/", Dir3: "/path3/dir"},
421 dirSpec{Dir1: "C:/path1", Dir2: "path2/dir", Dir3: "/path3/dir/"},
424 for _, ds := range dirSpecs {
425 memFs := NewMemMapFs()
426 level1Fs := NewBasePathFs(memFs, ds.Dir1)
427 level2Fs := NewBasePathFs(level1Fs, ds.Dir2)
428 level3Fs := NewBasePathFs(level2Fs, ds.Dir3)
436 spec{BaseFs: level3Fs, FileName: "f.txt", ExpectedPath: filepath.Join(ds.Dir1, ds.Dir2, ds.Dir3, "f.txt")},
437 spec{BaseFs: level3Fs, FileName: "", ExpectedPath: filepath.Join(ds.Dir1, ds.Dir2, ds.Dir3, "")},
438 spec{BaseFs: level2Fs, FileName: "f.txt", ExpectedPath: filepath.Join(ds.Dir1, ds.Dir2, "f.txt")},
439 spec{BaseFs: level2Fs, FileName: "", ExpectedPath: filepath.Join(ds.Dir1, ds.Dir2, "")},
440 spec{BaseFs: level1Fs, FileName: "f.txt", ExpectedPath: filepath.Join(ds.Dir1, "f.txt")},
441 spec{BaseFs: level1Fs, FileName: "", ExpectedPath: filepath.Join(ds.Dir1, "")},
444 for _, s := range specs {
445 if actualPath := FullBaseFsPath(s.BaseFs.(*BasePathFs), s.FileName); actualPath != s.ExpectedPath {
446 t.Errorf("Expected \n%s got \n%s", s.ExpectedPath, actualPath)