| // SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later |
| |
| package utils |
| |
| import ( |
| "testing" |
| ) |
| |
| // ===== Filesystem and hash functionality tests ===== |
| func TestFilesystemCanGetSliceOfFolderContents(t *testing.T) { |
| dirRoot := "../testdata/project1/" |
| |
| filePaths, err := GetAllFilePaths(dirRoot, nil) |
| if err != nil { |
| t.Fatalf("expected filePaths, got error: %v", err) |
| } |
| if filePaths == nil { |
| t.Fatalf("expected non-nil filePaths, got nil") |
| } |
| // should only be 5 files |
| // symbolic link in project1/symbolic-link should be ignored |
| if len(filePaths) != 5 { |
| t.Fatalf("expected %v, got %v", 5, len(filePaths)) |
| } |
| |
| // should be in alphabetical order, with files prefixed with '/' |
| if filePaths[0] != "/emptyfile.testdata.txt" { |
| t.Errorf("expected %v, got %v", "/emptyfile.testdata.txt", filePaths[0]) |
| } |
| if filePaths[1] != "/file1.testdata.txt" { |
| t.Errorf("expected %v, got %v", "/file1.testdata.txt", filePaths[1]) |
| } |
| if filePaths[2] != "/file3.testdata.txt" { |
| t.Errorf("expected %v, got %v", "/file3.testdata.txt", filePaths[2]) |
| } |
| if filePaths[3] != "/folder1/file4.testdata.txt" { |
| t.Errorf("expected %v, got %v", "/folder1/file4.testdata.txt", filePaths[3]) |
| } |
| if filePaths[4] != "/lastfile.testdata.txt" { |
| t.Errorf("expected %v, got %v", "/lastfile.testdata.txt", filePaths[4]) |
| } |
| } |
| |
| func TestFilesystemGetAllFilePathsFailsForNonExistentDirectory(t *testing.T) { |
| dirRoot := "./does/not/exist/" |
| |
| _, err := GetAllFilePaths(dirRoot, nil) |
| if err == nil { |
| t.Errorf("expected non-nil error, got nil") |
| } |
| } |
| |
| func TestFilesystemCanIgnoreFilesWhenGettingFilePaths(t *testing.T) { |
| dirRoot := "../testdata/project3/" |
| pathsIgnored := []string{ |
| "**/ignoredir/", |
| "/excludedir/", |
| "**/ignorefile.txt", |
| "/alsoEXCLUDEthis.txt", |
| } |
| |
| filePaths, err := GetAllFilePaths(dirRoot, pathsIgnored) |
| if err != nil { |
| t.Fatalf("expected filePaths, got error: %v", err) |
| } |
| if filePaths == nil { |
| t.Fatalf("expected non-nil filePaths, got nil") |
| } |
| |
| // should only be 5 files |
| if len(filePaths) != 5 { |
| t.Fatalf("expected %v, got %v", 5, len(filePaths)) |
| } |
| |
| // should be in alphabetical order, with files prefixed with '/' |
| if filePaths[0] != "/dontscan.txt" { |
| t.Errorf("expected %v, got %v", "/dontscan.txt", filePaths[0]) |
| } |
| if filePaths[1] != "/keep/keep.txt" { |
| t.Errorf("expected %v, got %v", "/keep/keep.txt", filePaths[1]) |
| } |
| if filePaths[2] != "/keep.txt" { |
| t.Errorf("expected %v, got %v", "/keep.txt", filePaths[2]) |
| } |
| if filePaths[3] != "/subdir/keep/dontscan.txt" { |
| t.Errorf("expected %v, got %v", "/subdir/keep/dontscan.txt", filePaths[3]) |
| } |
| if filePaths[4] != "/subdir/keep/keep.txt" { |
| t.Errorf("expected %v, got %v", "/subdir/keep/keep.txt", filePaths[4]) |
| } |
| |
| } |
| |
| // FIXME add test to make sure we get an error for a directory without |
| // FIXME appropriate permissions to read its (sub)contents |
| |
| func TestFilesystemGetsHashesForFilePath(t *testing.T) { |
| f := "../testdata/project1/file1.testdata.txt" |
| |
| ssha1, ssha256, smd5, err := GetHashesForFilePath(f) |
| if err != nil { |
| t.Fatalf("expected nil error, got %v", err) |
| } |
| if ssha1 != "024f870eb6323f532515f7a09d5646a97083b819" { |
| t.Errorf("expected %v, got %v", "024f870eb6323f532515f7a09d5646a97083b819", ssha1) |
| } |
| if ssha256 != "b14e44284ca477b4c0db34b15ca4c454b2947cce7883e22321cf2984050e15bf" { |
| t.Errorf("expected %v, got %v", "b14e44284ca477b4c0db34b15ca4c454b2947cce7883e22321cf2984050e15bf", ssha256) |
| } |
| if smd5 != "37c8208479dfe42d2bb29debd6e32d4a" { |
| t.Errorf("expected %v, got %v", "37c8208479dfe42d2bb29debd6e32d4a", smd5) |
| } |
| } |
| |
| func TestFilesystemGetsErrorWhenRequestingHashesForInvalidFilePath(t *testing.T) { |
| f := "./does/not/exist" |
| |
| _, _, _, err := GetHashesForFilePath(f) |
| if err == nil { |
| t.Errorf("expected non-nil error, got nil") |
| } |
| } |
| |
| // FIXME add test to make sure we get an error for hashes for a file without |
| // FIXME appropriate permissions to read its contents |
| |
| func TestFilesystemExcludesForIgnoredPaths(t *testing.T) { |
| // one specific file |
| pathsIgnored := []string{"/file.txt"} |
| fileName := "/file.txt" |
| if !ShouldIgnore(fileName, pathsIgnored) { |
| t.Errorf("incorrect for %v, ignoring %v", fileName, pathsIgnored) |
| } |
| fileName = "/fileNope.txt" |
| if ShouldIgnore(fileName, pathsIgnored) { |
| t.Errorf("incorrect for %v, ignoring %v", fileName, pathsIgnored) |
| } |
| |
| // two specific files |
| pathsIgnored = []string{"/file.txt", "/file2.txt"} |
| fileName = "/file.txt" |
| if !ShouldIgnore(fileName, pathsIgnored) { |
| t.Errorf("incorrect for %v, ignoring %v", fileName, pathsIgnored) |
| } |
| fileName = "/fileNope.txt" |
| if ShouldIgnore(fileName, pathsIgnored) { |
| t.Errorf("incorrect for %v, ignoring %v", fileName, pathsIgnored) |
| } |
| fileName = "/file2.txt" |
| if !ShouldIgnore(fileName, pathsIgnored) { |
| t.Errorf("incorrect for %v, ignoring %v", fileName, pathsIgnored) |
| } |
| |
| // one specific file in specific subdirectory |
| pathsIgnored = []string{"/subdir/file.txt"} |
| fileName = "/subdir/file.txt" |
| if !ShouldIgnore(fileName, pathsIgnored) { |
| t.Errorf("incorrect for %v, ignoring %v", fileName, pathsIgnored) |
| } |
| fileName = "/file.txt" |
| if ShouldIgnore(fileName, pathsIgnored) { |
| t.Errorf("incorrect for %v, ignoring %v", fileName, pathsIgnored) |
| } |
| fileName = "/something/subdir/file.txt" |
| if ShouldIgnore(fileName, pathsIgnored) { |
| t.Errorf("incorrect for %v, ignoring %v", fileName, pathsIgnored) |
| } |
| |
| // one specific file in any directory |
| pathsIgnored = []string{"**/file.txt"} |
| fileName = "/subdir/file.txt" |
| if !ShouldIgnore(fileName, pathsIgnored) { |
| t.Errorf("incorrect for %v, ignoring %v", fileName, pathsIgnored) |
| } |
| fileName = "/file.txt" |
| if !ShouldIgnore(fileName, pathsIgnored) { |
| t.Errorf("incorrect for %v, ignoring %v", fileName, pathsIgnored) |
| } |
| fileName = "/something/subdir/file.txt" |
| if !ShouldIgnore(fileName, pathsIgnored) { |
| t.Errorf("incorrect for %v, ignoring %v", fileName, pathsIgnored) |
| } |
| fileName = "/something/fileNope.txt" |
| if ShouldIgnore(fileName, pathsIgnored) { |
| t.Errorf("incorrect for %v, ignoring %v", fileName, pathsIgnored) |
| } |
| |
| // all files in one specific subdirectory (and its subdirectories) |
| pathsIgnored = []string{"/subdir/"} |
| fileName = "/subdir/file.txt" |
| if !ShouldIgnore(fileName, pathsIgnored) { |
| t.Errorf("incorrect for %v, ignoring %v", fileName, pathsIgnored) |
| } |
| fileName = "/file.txt" |
| if ShouldIgnore(fileName, pathsIgnored) { |
| t.Errorf("incorrect for %v, ignoring %v", fileName, pathsIgnored) |
| } |
| fileName = "/subdir/sub2/file.txt" |
| if !ShouldIgnore(fileName, pathsIgnored) { |
| t.Errorf("incorrect for %v, ignoring %v", fileName, pathsIgnored) |
| } |
| fileName = "/nope/subdir/file.txt" |
| if ShouldIgnore(fileName, pathsIgnored) { |
| t.Errorf("incorrect for %v, ignoring %v", fileName, pathsIgnored) |
| } |
| |
| // all files in subdirectory with this name, wherever it appears |
| pathsIgnored = []string{"**/subdir/"} |
| fileName = "/subdir/file.txt" |
| if !ShouldIgnore(fileName, pathsIgnored) { |
| t.Errorf("incorrect for %v, ignoring %v", fileName, pathsIgnored) |
| } |
| fileName = "/file.txt" |
| if ShouldIgnore(fileName, pathsIgnored) { |
| t.Errorf("incorrect for %v, ignoring %v", fileName, pathsIgnored) |
| } |
| fileName = "/subdir/sub2/file.txt" |
| if !ShouldIgnore(fileName, pathsIgnored) { |
| t.Errorf("incorrect for %v, ignoring %v", fileName, pathsIgnored) |
| } |
| fileName = "/nope/subdir/file.txt" |
| if !ShouldIgnore(fileName, pathsIgnored) { |
| t.Errorf("incorrect for %v, ignoring %v", fileName, pathsIgnored) |
| } |
| |
| } |