github.com/samuelkuklis/utils@v1.0.0/path/file_test.go (about)

     1  /*
     2  Copyright 2017 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package path
    18  
    19  import (
    20  	"os"
    21  	"path/filepath"
    22  	"reflect"
    23  	"sort"
    24  	"testing"
    25  )
    26  
    27  func TestFileUtils(t *testing.T) {
    28  	// Create tmp dir
    29  	tmpDir, err := os.MkdirTemp(os.TempDir(), "util_file_test_")
    30  	if err != nil {
    31  		t.Fatal("Failed to test: failed to create temp dir.")
    32  	}
    33  
    34  	// create tmp file
    35  	tmpFile, err := os.CreateTemp(tmpDir, "test_file_exists_")
    36  	if err != nil {
    37  		t.Fatal("Failed to test: failed to create temp file.")
    38  	}
    39  
    40  	// create tmp sym link
    41  	tmpSymlinkName := filepath.Join(tmpDir, "test_file_exists_sym_link")
    42  	err = os.Symlink(tmpFile.Name(), tmpSymlinkName)
    43  	if err != nil {
    44  		t.Fatal("Failed to test: failed to create sym link.")
    45  	}
    46  
    47  	// create tmp sub dir
    48  	tmpSubDir, err := os.MkdirTemp(tmpDir, "sub_")
    49  	if err != nil {
    50  		t.Fatal("Failed to test: failed to create temp sub dir.")
    51  	}
    52  
    53  	// record the current dir
    54  	currentDir, err := os.Getwd()
    55  	if err != nil {
    56  		t.Fatal("Failed to test: failed to get current dir.")
    57  	}
    58  
    59  	// change the work dir to temp dir
    60  	err = os.Chdir(tmpDir)
    61  	if err != nil {
    62  		t.Fatal("Failed to test: failed to change work dir.")
    63  	}
    64  
    65  	// recover test environment
    66  	defer func() {
    67  		os.Chdir(currentDir)
    68  		os.RemoveAll(tmpDir)
    69  	}()
    70  
    71  	t.Run("TestExists", func(t *testing.T) {
    72  		tests := []struct {
    73  			name          string
    74  			fileName      string
    75  			expectedError bool
    76  			expectedValue bool
    77  		}{
    78  			{"file_not_exists", filepath.Join(tmpDir, "file_not_exist_case"), false, false},
    79  			{"file_exists", tmpFile.Name(), false, true},
    80  		}
    81  
    82  		for _, test := range tests {
    83  			realValued, realError := Exists(CheckFollowSymlink, test.fileName)
    84  			if test.expectedError {
    85  				if realError == nil {
    86  					t.Fatalf("Expected error, got none, failed to test with '%s': %s", test.fileName, test.name)
    87  				}
    88  			} else if test.expectedValue != realValued {
    89  				t.Fatalf("Expected %#v==%#v, failed to test with '%s': %s", test.expectedValue, realValued, test.fileName, test.name)
    90  			}
    91  		}
    92  	})
    93  
    94  	t.Run("TestFileOrSymlinkExists", func(t *testing.T) {
    95  		tests := []struct {
    96  			name          string
    97  			fileName      string
    98  			expectedError bool
    99  			expectedValue bool
   100  		}{
   101  			{"file_not_exists", filepath.Join(tmpDir, "file_not_exist_case"), false, false},
   102  			{"file_exists", tmpFile.Name(), false, true},
   103  			{"symlink_exists", tmpSymlinkName, false, true},
   104  		}
   105  
   106  		for _, test := range tests {
   107  			realValued, realError := Exists(CheckSymlinkOnly, test.fileName)
   108  			if test.expectedError {
   109  				if realError == nil {
   110  					t.Fatalf("Expected error, got none, failed to test with '%s': %s", test.fileName, test.name)
   111  				}
   112  			} else if test.expectedValue != realValued {
   113  				t.Fatalf("Expected %#v==%#v, failed to test with '%s': %s", test.expectedValue, realValued, test.fileName, test.name)
   114  			}
   115  		}
   116  	})
   117  
   118  	t.Run("TestReadDirNoStat", func(t *testing.T) {
   119  		_, tmpFileSimpleName := filepath.Split(tmpFile.Name())
   120  		_, tmpSymlinkSimpleName := filepath.Split(tmpSymlinkName)
   121  		_, tmpSubDirSimpleName := filepath.Split(tmpSubDir)
   122  
   123  		tests := []struct {
   124  			name          string
   125  			dirName       string
   126  			expectedError bool
   127  			expectedValue []string
   128  		}{
   129  			{"dir_not_exists", filepath.Join(tmpDir, "file_not_exist_case"), true, []string{}},
   130  			{"dir_is_empty", "", false, []string{tmpFileSimpleName, tmpSymlinkSimpleName, tmpSubDirSimpleName}},
   131  			{"dir_exists", tmpDir, false, []string{tmpFileSimpleName, tmpSymlinkSimpleName, tmpSubDirSimpleName}},
   132  		}
   133  
   134  		for _, test := range tests {
   135  			realValued, realError := ReadDirNoStat(test.dirName)
   136  
   137  			// execute sort action before compare
   138  			sort.Strings(realValued)
   139  			sort.Strings(test.expectedValue)
   140  
   141  			if test.expectedError {
   142  				if realError == nil {
   143  					t.Fatalf("Expected error, got none, failed to test with '%s': %s", test.dirName, test.name)
   144  				}
   145  			} else if !reflect.DeepEqual(test.expectedValue, realValued) {
   146  				t.Fatalf("Expected %#v==%#v, failed to test with '%s': %s", test.expectedValue, realValued, test.dirName, test.name)
   147  			}
   148  		}
   149  	})
   150  }