Files
kustomize/kyaml/filesys/fsondisk_test.go
2022-08-26 13:26:23 -05:00

262 lines
5.4 KiB
Go

// Copyright 2019 The Kubernetes Authors.
// SPDX-License-Identifier: Apache-2.0
package filesys
import (
"os"
"path/filepath"
"reflect"
"sort"
"testing"
"github.com/stretchr/testify/require"
)
const dirMsg = "expected '%s' to be a dir"
func makeTestDir(t *testing.T) (FileSystem, string) {
t.Helper()
req := require.New(t)
fSys := MakeFsOnDisk()
td := t.TempDir()
testDir, err := filepath.EvalSymlinks(td)
req.NoError(err)
req.Truef(fSys.Exists(testDir), existMsg, testDir)
req.Truef(fSys.IsDir(testDir), dirMsg, testDir)
return fSys, testDir
}
func cleanWd(t *testing.T) string {
t.Helper()
wd, err := os.Getwd()
require.NoError(t, err)
cleanedWd, err := filepath.EvalSymlinks(wd)
require.NoError(t, err)
return cleanedWd
}
func TestCleanedAbs_1(t *testing.T) {
req := require.New(t)
fSys, _ := makeTestDir(t)
d, f, err := fSys.CleanedAbs("")
req.NoError(err)
wd := cleanWd(t)
req.Equal(wd, d.String())
req.Empty(f)
}
func TestCleanedAbs_2(t *testing.T) {
req := require.New(t)
fSys, _ := makeTestDir(t)
root, err := getOSRoot()
req.NoError(err)
d, f, err := fSys.CleanedAbs(root)
req.NoError(err)
req.Equal(root, d.String())
req.Empty(f)
}
func TestCleanedAbs_3(t *testing.T) {
req := require.New(t)
fSys, testDir := makeTestDir(t)
err := fSys.WriteFile(
filepath.Join(testDir, "foo"), []byte(`foo`))
req.NoError(err)
d, f, err := fSys.CleanedAbs(filepath.Join(testDir, "foo"))
req.NoError(err)
req.Equal(testDir, d.String())
req.Equal("foo", f)
}
func TestCleanedAbs_4(t *testing.T) {
req := require.New(t)
fSys, testDir := makeTestDir(t)
err := fSys.MkdirAll(filepath.Join(testDir, "d1", "d2"))
req.NoError(err)
err = fSys.WriteFile(
filepath.Join(testDir, "d1", "d2", "bar"),
[]byte(`bar`))
req.NoError(err)
d, f, err := fSys.CleanedAbs(
filepath.Join(testDir, "d1", "d2"))
req.NoError(err)
req.Equal(filepath.Join(testDir, "d1", "d2"), d.String())
req.Empty(f)
d, f, err = fSys.CleanedAbs(
filepath.Join(testDir, "d1", "d2", "bar"))
req.NoError(err)
req.Equal(filepath.Join(testDir, "d1", "d2"), d.String())
req.Equal("bar", f)
}
func TestConfirmDirDisk(t *testing.T) {
req := require.New(t)
fSys, testDir := makeTestDir(t)
wd := cleanWd(t)
relDir := "actual_foo_431432"
err := fSys.Mkdir(relDir)
t.Cleanup(func() {
err := fSys.RemoveAll(relDir)
req.NoError(err)
})
req.NoError(err)
req.Truef(fSys.Exists(relDir), existMsg, relDir)
linkDir := filepath.Join(testDir, "pointer")
err = os.Symlink(filepath.Join(wd, relDir), linkDir)
req.NoError(err)
root, err := getOSRoot()
req.NoError(err)
tests := map[string]*struct {
path string
expected string
}{
"root": {
root,
root,
},
"non-selfdir relative path": {
relDir,
filepath.Join(wd, relDir),
},
"symlink": {
linkDir,
filepath.Join(wd, relDir),
},
}
for name, test := range tests {
test := test
t.Run(name, func(t *testing.T) {
actualPath, err := ConfirmDir(fSys, test.path)
require.NoError(t, err)
require.Equal(t, test.expected, actualPath.String())
})
}
}
func TestReadFilesRealFS(t *testing.T) {
req := require.New(t)
fSys, testDir := makeTestDir(t)
dir := filepath.Join(testDir, "dir")
nestedDir := filepath.Join(dir, "nestedDir")
hiddenDir := filepath.Join(testDir, ".hiddenDir")
dirs := []string{
testDir,
dir,
nestedDir,
hiddenDir,
}
// all directories will have all these files
files := []string{
"bar",
"foo",
"file-1.xtn",
".file-2.xtn",
".some-file-3.xtn",
".some-file-4.xtn",
}
err := fSys.MkdirAll(nestedDir)
req.NoError(err)
err = fSys.MkdirAll(hiddenDir)
req.NoError(err)
// adding all files in every directory that we had defined
for _, d := range dirs {
req.Truef(fSys.IsDir(d), dirMsg, d)
for _, f := range files {
fPath := filepath.Join(d, f)
err = fSys.WriteFile(fPath, []byte(f))
req.NoError(err)
req.Truef(fSys.Exists(fPath), existMsg, fPath)
}
}
tests := map[string]struct {
globPattern string
expectedFiles []string
expectedDirs map[string][]string // glob returns directories as well, so we need to add those to expected files
}{
"AllVisibleFiles": {
globPattern: "*",
expectedFiles: []string{
"bar",
"foo",
"file-1.xtn",
},
expectedDirs: map[string][]string{
testDir: {dir},
dir: {nestedDir},
},
},
"AllHiddenFiles": {
globPattern: ".*",
expectedFiles: []string{
".file-2.xtn",
".some-file-3.xtn",
".some-file-4.xtn",
},
expectedDirs: map[string][]string{
testDir: {hiddenDir},
},
},
"foo_File": {
globPattern: "foo",
expectedFiles: []string{
"foo",
},
},
"dotsome-file_PrefixedFiles": {
globPattern: ".some-file*",
expectedFiles: []string{
".some-file-3.xtn",
".some-file-4.xtn",
},
},
}
for n, c := range tests {
t.Run(n, func(t *testing.T) {
for _, d := range dirs {
var expectedPaths []string
for _, f := range c.expectedFiles {
expectedPaths = append(expectedPaths, filepath.Join(d, f))
}
if c.expectedDirs != nil {
expectedPaths = append(expectedPaths, c.expectedDirs[d]...)
}
actualPaths, globErr := fSys.Glob(filepath.Join(d, c.globPattern))
require.NoError(t, globErr)
sort.Strings(actualPaths)
sort.Strings(expectedPaths)
if !reflect.DeepEqual(actualPaths, expectedPaths) {
t.Fatalf("incorrect files found by glob: expected=%v, actual=%v", expectedPaths, actualPaths)
}
}
})
}
}