Files
kustomize/kyaml/filesys/filesystem_test.go

141 lines
3.7 KiB
Go

// Copyright 2021 The Kubernetes Authors.
// SPDX-License-Identifier: Apache-2.0
package filesys
import (
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"sigs.k8s.io/kustomize/kyaml/errors"
)
const (
disk = "MakeFsOnDisk"
memoryAbs = "MakeFsInMemory"
memoryEmpty = "MakeEmptyDirInMemory"
existMsg = "expected '%s' to exist"
)
var filesysBuilders = map[string]func() FileSystem{
memoryAbs: MakeFsInMemory,
disk: MakeFsOnDisk,
memoryEmpty: func() FileSystem { return MakeEmptyDirInMemory() },
}
func TestNotExistErr(t *testing.T) {
for name, builder := range filesysBuilders {
t.Run(name, func(t *testing.T) {
testNotExistErr(t, builder())
})
}
}
func testNotExistErr(t *testing.T, fs FileSystem) {
t.Helper()
const path = "bad-dir/file.txt"
err := fs.RemoveAll(path)
assert.Falsef(t, errors.Is(err, os.ErrNotExist), "RemoveAll should not return ErrNotExist, got %v", err)
_, err = fs.Open(path)
assert.Truef(t, errors.Is(err, os.ErrNotExist), "Open should return ErrNotExist, got %v", err)
_, err = fs.ReadDir(path)
assert.Truef(t, errors.Is(err, os.ErrNotExist), "ReadDir should return ErrNotExist, got %v", err)
_, _, err = fs.CleanedAbs(path)
assert.Truef(t, errors.Is(err, os.ErrNotExist), "CleanedAbs should return ErrNotExist, got %v", err)
_, err = fs.ReadFile(path)
assert.Truef(t, errors.Is(err, os.ErrNotExist), "ReadFile should return ErrNotExist, got %v", err)
err = fs.Walk(path, func(_ string, _ os.FileInfo, err error) error { return err })
assert.Truef(t, errors.Is(err, os.ErrNotExist), "Walk should return ErrNotExist, got %v", err)
}
// setupFileSys returns file system, default directory to test in, and working directory
func setupFileSys(t *testing.T, name string) (FileSystem, string, string) {
t.Helper()
switch name {
case disk:
fSys, testDir := makeTestDir(t)
return fSys, testDir, cleanWd(t)
case memoryAbs:
return filesysBuilders[name](), Separator, Separator
case memoryEmpty:
return filesysBuilders[name](), "", ""
default:
t.Fatalf("unexpected FileSystem implementation '%s'", name)
panic("unreachable point of execution")
}
}
func TestConfirmDir(t *testing.T) {
for name := range filesysBuilders {
name := name
t.Run(name, func(t *testing.T) {
fSys, prefixPath, wd := setupFileSys(t, name)
d1Path := filepath.Join(prefixPath, "d1")
d2Path := filepath.Join(d1Path, ".d2")
err := fSys.MkdirAll(d2Path)
require.NoError(t, err)
require.Truef(t, fSys.Exists(d2Path), existMsg, d2Path)
tests := map[string]*struct {
dir string
expected string
}{
"Simple": {
d1Path,
d1Path,
},
"Hidden": {
d2Path,
d2Path,
},
"Relative": {
SelfDir,
wd,
},
}
for subName, test := range tests {
test := test
t.Run(subName, func(t *testing.T) {
cleanDir, err := ConfirmDir(fSys, test.dir)
require.NoError(t, err)
require.Equal(t, test.expected, cleanDir.String())
})
}
})
}
}
func TestConfirmDirErr(t *testing.T) {
for name := range filesysBuilders {
thisName := name
t.Run(thisName, func(t *testing.T) {
fSys, prefixPath, _ := setupFileSys(t, thisName)
fPath := filepath.Join(prefixPath, "foo")
err := fSys.WriteFile(fPath, []byte(`foo`))
require.NoError(t, err)
require.Truef(t, fSys.Exists(fPath), existMsg, fPath)
tests := map[string]string{
"Empty": "",
"File": fPath,
"Non-existent": filepath.Join(prefixPath, "bar"),
}
for subName, invalidPath := range tests {
invalidPath := invalidPath
t.Run(subName, func(t *testing.T) {
_, err := ConfirmDir(fSys, invalidPath)
require.Error(t, err)
})
}
})
}
}