github.com/MRtecno98/afero@v1.9.3/util_test.go (about)

     1  // Copyright ©2015 Steve Francia <spf@spf13.com>
     2  // Portions Copyright ©2015 The Hugo Authors
     3  //
     4  //
     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
     8  //
     9  //     http://www.apache.org/licenses/LICENSE-2.0
    10  //
    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.
    16  //
    17  
    18  package afero
    19  
    20  import (
    21  	"fmt"
    22  	"os"
    23  	"path/filepath"
    24  	"strconv"
    25  	"strings"
    26  	"testing"
    27  	"time"
    28  )
    29  
    30  var testFS = new(MemMapFs)
    31  
    32  func TestDirExists(t *testing.T) {
    33  	type test struct {
    34  		input    string
    35  		expected bool
    36  	}
    37  
    38  	// First create a couple directories so there is something in the filesystem
    39  	//testFS := new(MemMapFs)
    40  	testFS.MkdirAll("/foo/bar", 0777)
    41  
    42  	data := []test{
    43  		{".", true},
    44  		{"./", true},
    45  		{"..", true},
    46  		{"../", true},
    47  		{"./..", true},
    48  		{"./../", true},
    49  		{"/foo/", true},
    50  		{"/foo", true},
    51  		{"/foo/bar", true},
    52  		{"/foo/bar/", true},
    53  		{"/", true},
    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},
    58  	}
    59  
    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)
    64  		}
    65  	}
    66  }
    67  
    68  func TestIsDir(t *testing.T) {
    69  	testFS = new(MemMapFs)
    70  
    71  	type test struct {
    72  		input    string
    73  		expected bool
    74  	}
    75  	data := []test{
    76  		{"./", true},
    77  		{"/", true},
    78  		{"./this-directory-does-not-existi", false},
    79  		{"/this-absolute-directory/does-not-exist", false},
    80  	}
    81  
    82  	for i, d := range data {
    83  
    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)
    87  		}
    88  	}
    89  }
    90  
    91  func TestIsEmpty(t *testing.T) {
    92  	testFS = new(MemMapFs)
    93  
    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/"
   106  
   107  	fileDoesNotExist := fmt.Errorf("%q path does not exist", nonExistentFile)
   108  	dirDoesNotExist := fmt.Errorf("%q path does not exist", nonExistentDir)
   109  
   110  	type test struct {
   111  		input          string
   112  		expectedResult bool
   113  		expectedErr    error
   114  	}
   115  
   116  	data := []test{
   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},
   124  	}
   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)
   129  		}
   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)
   133  			}
   134  		} else {
   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)
   137  			}
   138  		}
   139  	}
   140  }
   141  
   142  func TestReaderContains(t *testing.T) {
   143  	for i, this := range []struct {
   144  		v1     string
   145  		v2     [][]byte
   146  		expect bool
   147  	}{
   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},
   155  		{"", nil, false},
   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)
   162  		}
   163  	}
   164  
   165  	if readerContainsAny(nil, []byte("a")) {
   166  		t.Error("readerContains with nil reader")
   167  	}
   168  
   169  	if readerContainsAny(nil, nil) {
   170  		t.Error("readerContains with nil arguments")
   171  	}
   172  }
   173  
   174  func createZeroSizedFileInTempDir() (File, error) {
   175  	filePrefix := "_path_test_"
   176  	f, e := TempFile(testFS, "", filePrefix) // dir is os.TempDir()
   177  	if e != nil {
   178  		// if there was an error no file was created.
   179  		// => no requirement to delete the file
   180  		return nil, e
   181  	}
   182  	return f, nil
   183  }
   184  
   185  func createNonZeroSizedFileInTempDir() (File, error) {
   186  	f, err := createZeroSizedFileInTempDir()
   187  	if err != nil {
   188  		return nil, err
   189  	}
   190  	byteString := []byte("byteString")
   191  	err = WriteFile(testFS, f.Name(), byteString, 0644)
   192  	if err != nil {
   193  		// delete the file
   194  		deleteFileInTempDir(f)
   195  		return nil, err
   196  	}
   197  	return f, nil
   198  }
   199  
   200  func deleteFileInTempDir(f File) {
   201  	err := testFS.Remove(f.Name())
   202  	if err != nil {
   203  		panic(err)
   204  	}
   205  }
   206  
   207  func createEmptyTempDir() (string, error) {
   208  	dirPrefix := "_dir_prefix_"
   209  	d, e := TempDir(testFS, "", dirPrefix) // will be in os.TempDir()
   210  	if e != nil {
   211  		// no directory to delete - it was never created
   212  		return "", e
   213  	}
   214  	return d, nil
   215  }
   216  
   217  func createTempDirWithZeroLengthFiles() (string, error) {
   218  	d, dirErr := createEmptyTempDir()
   219  	if dirErr != nil {
   220  		return "", dirErr
   221  	}
   222  	filePrefix := "_path_test_"
   223  	_, fileErr := TempFile(testFS, d, filePrefix) // dir is os.TempDir()
   224  	if fileErr != nil {
   225  		// if there was an error no file was created.
   226  		// but we need to remove the directory to clean-up
   227  		deleteTempDir(d)
   228  		return "", fileErr
   229  	}
   230  	// the dir now has one, zero length file in it
   231  	return d, nil
   232  
   233  }
   234  
   235  func createTempDirWithNonZeroLengthFiles() (string, error) {
   236  	d, dirErr := createEmptyTempDir()
   237  	if dirErr != nil {
   238  		return "", dirErr
   239  	}
   240  	filePrefix := "_path_test_"
   241  	f, fileErr := TempFile(testFS, d, filePrefix) // dir is os.TempDir()
   242  	if fileErr != nil {
   243  		// if there was an error no file was created.
   244  		// but we need to remove the directory to clean-up
   245  		deleteTempDir(d)
   246  		return "", fileErr
   247  	}
   248  	byteString := []byte("byteString")
   249  	fileErr = WriteFile(testFS, f.Name(), byteString, 0644)
   250  	if fileErr != nil {
   251  		// delete the file
   252  		deleteFileInTempDir(f)
   253  		// also delete the directory
   254  		deleteTempDir(d)
   255  		return "", fileErr
   256  	}
   257  
   258  	// the dir now has one, zero length file in it
   259  	return d, nil
   260  
   261  }
   262  
   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/"
   272  
   273  	type test struct {
   274  		input          string
   275  		expectedResult bool
   276  		expectedErr    error
   277  	}
   278  
   279  	data := []test{
   280  		{zeroSizedFile.Name(), true, nil},
   281  		{nonZeroSizedFile.Name(), true, nil},
   282  		{emptyDirectory, true, nil},
   283  		{nonExistentFile, false, nil},
   284  		{nonExistentDir, false, nil},
   285  	}
   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)
   290  		}
   291  		if d.expectedErr != err {
   292  			t.Errorf("Test %d failed. Expected %q got %q", i, d.expectedErr, err)
   293  		}
   294  	}
   295  
   296  }
   297  
   298  func TestSafeWriteToDisk(t *testing.T) {
   299  	emptyFile, _ := createZeroSizedFileInTempDir()
   300  	defer deleteFileInTempDir(emptyFile)
   301  	tmpDir, _ := createEmptyTempDir()
   302  	defer deleteTempDir(tmpDir)
   303  
   304  	randomString := "This is a random string!"
   305  	reader := strings.NewReader(randomString)
   306  
   307  	fileExists := fmt.Errorf("%v already exists", emptyFile.Name())
   308  
   309  	type test struct {
   310  		filename    string
   311  		expectedErr error
   312  	}
   313  
   314  	now := time.Now().Unix()
   315  	nowStr := strconv.FormatInt(now, 10)
   316  	data := []test{
   317  		{emptyFile.Name(), fileExists},
   318  		{tmpDir + "/" + nowStr, nil},
   319  	}
   320  
   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())
   326  			}
   327  		} else {
   328  			if d.expectedErr != e {
   329  				t.Errorf("Test %d failed. Expected %q but got %q", i, d.expectedErr, e)
   330  			}
   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))
   334  			}
   335  		}
   336  		reader.Seek(0, 0)
   337  	}
   338  }
   339  
   340  func TestWriteToDisk(t *testing.T) {
   341  	emptyFile, _ := createZeroSizedFileInTempDir()
   342  	defer deleteFileInTempDir(emptyFile)
   343  	tmpDir, _ := createEmptyTempDir()
   344  	defer deleteTempDir(tmpDir)
   345  
   346  	randomString := "This is a random string!"
   347  	reader := strings.NewReader(randomString)
   348  
   349  	type test struct {
   350  		filename    string
   351  		expectedErr error
   352  	}
   353  
   354  	now := time.Now().Unix()
   355  	nowStr := strconv.FormatInt(now, 10)
   356  	data := []test{
   357  		{emptyFile.Name(), nil},
   358  		{tmpDir + "/" + nowStr, nil},
   359  	}
   360  
   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)
   365  		}
   366  		contents, e := ReadFile(testFS, d.filename)
   367  		if e != nil {
   368  			t.Errorf("Test %d failed. Could not read file %s. Reason: %s\n", i, d.filename, e)
   369  		}
   370  		if randomString != string(contents) {
   371  			t.Errorf("Test %d failed. Expected contents %q but got %q", i, randomString, string(contents))
   372  		}
   373  		reader.Seek(0, 0)
   374  	}
   375  }
   376  
   377  func TestGetTempDir(t *testing.T) {
   378  	dir := os.TempDir()
   379  	if FilePathSeparator != dir[len(dir)-1:] {
   380  		dir = dir + FilePathSeparator
   381  	}
   382  	testDir := "hugoTestFolder" + FilePathSeparator
   383  	tests := []struct {
   384  		input    string
   385  		expected string
   386  	}{
   387  		{"", dir},
   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},
   395  	}
   396  
   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)
   401  		}
   402  	}
   403  }
   404  
   405  // This function is very dangerous. Don't use it.
   406  func deleteTempDir(d string) {
   407  	err := os.RemoveAll(d)
   408  	if err != nil {
   409  		panic(err)
   410  	}
   411  }
   412  
   413  func TestFullBaseFsPath(t *testing.T) {
   414  	type dirSpec struct {
   415  		Dir1, Dir2, Dir3 string
   416  	}
   417  	dirSpecs := []dirSpec{
   418  		{Dir1: "/", Dir2: "/", Dir3: "/"},
   419  		{Dir1: "/", Dir2: "/path2", Dir3: "/"},
   420  		{Dir1: "/path1/dir", Dir2: "/path2/dir/", Dir3: "/path3/dir"},
   421  		{Dir1: "C:/path1", Dir2: "path2/dir", Dir3: "/path3/dir/"},
   422  	}
   423  
   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)
   429  
   430  		type spec struct {
   431  			BaseFs       Fs
   432  			FileName     string
   433  			ExpectedPath string
   434  		}
   435  		specs := []spec{
   436  			{BaseFs: level3Fs, FileName: "f.txt", ExpectedPath: filepath.Join(ds.Dir1, ds.Dir2, ds.Dir3, "f.txt")},
   437  			{BaseFs: level3Fs, FileName: "", ExpectedPath: filepath.Join(ds.Dir1, ds.Dir2, ds.Dir3, "")},
   438  			{BaseFs: level2Fs, FileName: "f.txt", ExpectedPath: filepath.Join(ds.Dir1, ds.Dir2, "f.txt")},
   439  			{BaseFs: level2Fs, FileName: "", ExpectedPath: filepath.Join(ds.Dir1, ds.Dir2, "")},
   440  			{BaseFs: level1Fs, FileName: "f.txt", ExpectedPath: filepath.Join(ds.Dir1, "f.txt")},
   441  			{BaseFs: level1Fs, FileName: "", ExpectedPath: filepath.Join(ds.Dir1, "")},
   442  		}
   443  
   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)
   447  			}
   448  		}
   449  	}
   450  }