Files
kustomize/kyaml/copyutil/copyutil_test.go
Karl Isenberg 43868688d5 Use require for Error and NoError
Assert keeps going after failure, but require immediately fails
the tests, making it easier to find the output related to the test
failure, rather than having to comb through a bunch of subsequent
assertion failures. For equality tests, we may or may not want to
continue, but for error checks we almost always want to immediately
fail the test. Exceptions can be changed as-needed.
2024-03-20 13:19:18 -07:00

369 lines
9.9 KiB
Go

// Copyright 2019 The Kubernetes Authors.
// SPDX-License-Identifier: Apache-2.0
package copyutil_test
import (
"fmt"
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
. "sigs.k8s.io/kustomize/kyaml/copyutil"
"sigs.k8s.io/kustomize/kyaml/filesys"
)
// TestDiff_identical verifies identical directories return an empty set
func TestDiff_identical(t *testing.T) {
s := t.TempDir()
d := t.TempDir()
err := os.Mkdir(filepath.Join(s, "a1"), 0700)
require.NoError(t, err)
err = os.WriteFile(
filepath.Join(s, "a1", "f.yaml"), []byte(`a`), 0600)
require.NoError(t, err)
err = os.Mkdir(filepath.Join(d, "a1"), 0700)
require.NoError(t, err)
err = os.WriteFile(
filepath.Join(d, "a1", "f.yaml"), []byte(`a`), 0600)
require.NoError(t, err)
diff, err := Diff(s, d)
require.NoError(t, err)
assert.Empty(t, diff.List())
}
// TestDiff_additionalSourceFiles verifies if there are additional files
// in the source, the diff will contain them
func TestDiff_additionalSourceFiles(t *testing.T) {
s := t.TempDir()
d := t.TempDir()
err := os.Mkdir(filepath.Join(s, "a1"), 0700)
require.NoError(t, err)
err = os.Mkdir(filepath.Join(s, "a2"), 0700)
require.NoError(t, err)
err = os.Mkdir(filepath.Join(d, "a1"), 0700)
require.NoError(t, err)
diff, err := Diff(s, d)
require.NoError(t, err)
assert.ElementsMatch(t, diff.List(), []string{"a2"})
}
// TestDiff_additionalDestFiles verifies if there are additional files
// in the dest, the diff will contain them
func TestDiff_additionalDestFiles(t *testing.T) {
s := t.TempDir()
d := t.TempDir()
err := os.Mkdir(filepath.Join(s, "a1"), 0700)
require.NoError(t, err)
err = os.Mkdir(filepath.Join(d, "a1"), 0700)
require.NoError(t, err)
err = os.Mkdir(filepath.Join(d, "a2"), 0700)
require.NoError(t, err)
diff, err := Diff(s, d)
require.NoError(t, err)
assert.ElementsMatch(t, diff.List(), []string{"a2"})
}
// TestDiff_srcDestContentsDiffer verifies if the file contents
// differ between the source and destination, the diff
// contains the differing files
func TestDiff_srcDestContentsDiffer(t *testing.T) {
s := t.TempDir()
d := t.TempDir()
err := os.Mkdir(filepath.Join(s, "a1"), 0700)
require.NoError(t, err)
err = os.WriteFile(
filepath.Join(s, "a1", "f.yaml"), []byte(`a`), 0600)
require.NoError(t, err)
err = os.Mkdir(filepath.Join(d, "a1"), 0700)
require.NoError(t, err)
err = os.WriteFile(
filepath.Join(d, "a1", "f.yaml"), []byte(`b`), 0600)
require.NoError(t, err)
diff, err := Diff(s, d)
require.NoError(t, err)
assert.ElementsMatch(t, diff.List(), []string{
fmt.Sprintf("a1%sf.yaml", string(filepath.Separator)),
})
}
// TestDiff_srcDestContentsDifferInDirs verifies if identical files
// exist in different directories, they are included in the diff
func TestDiff_srcDestContentsDifferInDirs(t *testing.T) {
s := t.TempDir()
d := t.TempDir()
err := os.Mkdir(filepath.Join(s, "a1"), 0700)
require.NoError(t, err)
err = os.WriteFile(
filepath.Join(s, "a1", "f.yaml"), []byte(`a`), 0600)
require.NoError(t, err)
err = os.Mkdir(filepath.Join(d, "b1"), 0700)
require.NoError(t, err)
err = os.WriteFile(
filepath.Join(d, "b1", "f.yaml"), []byte(`a`), 0600)
require.NoError(t, err)
diff, err := Diff(s, d)
require.NoError(t, err)
assert.ElementsMatch(t, diff.List(), []string{
"a1",
fmt.Sprintf("a1%sf.yaml", string(filepath.Separator)),
fmt.Sprintf("b1%sf.yaml", string(filepath.Separator)),
"b1",
})
}
// TestDiff_skipGitSrc verifies that .git directories in the source
// are not looked at
func TestDiff_skipGitSrc(t *testing.T) {
s := t.TempDir()
d := t.TempDir()
err := os.Mkdir(filepath.Join(s, "a1"), 0700)
require.NoError(t, err)
err = os.WriteFile(
filepath.Join(s, "a1", "f.yaml"), []byte(`a`), 0600)
require.NoError(t, err)
// files that just happen to start with .git should not be ignored.
err = os.WriteFile(
filepath.Join(s, ".gitlab-ci.yml"), []byte(`a`), 0600)
require.NoError(t, err)
// git should be ignored
err = os.Mkdir(filepath.Join(s, ".git"), 0700)
require.NoError(t, err)
err = os.WriteFile(
filepath.Join(s, ".git", "f.yaml"), []byte(`a`), 0600)
require.NoError(t, err)
err = os.Mkdir(filepath.Join(d, "a1"), 0700)
require.NoError(t, err)
err = os.WriteFile(
filepath.Join(d, "a1", "f.yaml"), []byte(`a`), 0600)
require.NoError(t, err)
err = os.WriteFile(
filepath.Join(d, ".gitlab-ci.yml"), []byte(`a`), 0600)
require.NoError(t, err)
diff, err := Diff(s, d)
require.NoError(t, err)
assert.Empty(t, diff.List())
}
// TestDiff_skipGitDest verifies that .git directories in the destination
// are not looked at
func TestDiff_skipGitDest(t *testing.T) {
s := t.TempDir()
d := t.TempDir()
err := os.Mkdir(filepath.Join(s, "a1"), 0700)
require.NoError(t, err)
err = os.WriteFile(
filepath.Join(s, "a1", "f.yaml"), []byte(`a`), 0600)
require.NoError(t, err)
err = os.Mkdir(filepath.Join(d, "a1"), 0700)
require.NoError(t, err)
err = os.WriteFile(
filepath.Join(d, "a1", "f.yaml"), []byte(`a`), 0600)
require.NoError(t, err)
// git should be ignored
err = os.Mkdir(filepath.Join(d, ".git"), 0700)
require.NoError(t, err)
err = os.WriteFile(
filepath.Join(d, ".git", "f.yaml"), []byte(`a`), 0600)
require.NoError(t, err)
diff, err := Diff(s, d)
require.NoError(t, err)
assert.Empty(t, diff.List())
}
// TestSyncFile tests if destination file is replaced by source file content
func TestSyncFile(t *testing.T) {
d1 := t.TempDir()
d2 := t.TempDir()
f1Name := d1 + "/temp.txt"
f2Name := d2 + "/temp.txt"
err := os.WriteFile(f1Name, []byte("abc"), 0600)
require.NoError(t, err)
err = os.WriteFile(f2Name, []byte("def"), 0644)
expectedFileInfo, _ := os.Stat(f2Name)
require.NoError(t, err)
err = SyncFile(f1Name, f2Name)
require.NoError(t, err)
actual, err := os.ReadFile(f2Name)
require.NoError(t, err)
assert.Equal(t, "abc", string(actual))
dstFileInfo, _ := os.Stat(f2Name)
assert.Equal(t, expectedFileInfo.Mode().String(), dstFileInfo.Mode().String())
}
// TestSyncFileNoDestFile tests if new file is created at destination with source file content
func TestSyncFileNoDestFile(t *testing.T) {
d1 := t.TempDir()
d2 := t.TempDir()
f1Name := d1 + "/temp.txt"
f2Name := d2 + "/temp.txt"
err := os.WriteFile(f1Name, []byte("abc"), 0644)
require.NoError(t, err)
err = SyncFile(f1Name, f2Name)
require.NoError(t, err)
actual, err := os.ReadFile(f2Name)
require.NoError(t, err)
assert.Equal(t, "abc", string(actual))
dstFileInfo, _ := os.Stat(f2Name)
srcFileInfo, _ := os.Stat(f1Name)
assert.Equal(t, srcFileInfo.Mode().String(), dstFileInfo.Mode().String())
}
// TestSyncFileNoSrcFile tests if destination file is deleted if source file doesn't exist
func TestSyncFileNoSrcFile(t *testing.T) {
d1 := t.TempDir()
d2 := t.TempDir()
f1Name := d1 + "/temp.txt"
f2Name := d2 + "/temp.txt"
err := os.WriteFile(f2Name, []byte("abc"), 0644)
require.NoError(t, err)
err = SyncFile(f1Name, f2Name)
require.NoError(t, err)
_, err = os.ReadFile(f2Name)
require.Error(t, err)
}
func TestPrettyFileDiff(t *testing.T) {
s1 := `apiVersion: someversion/v1alpha2
kind: ContainerCluster
metadata:
clusterName: "some_cluster"
name: asm-cluster
namespace: "PROJECT_ID" # {"$ref":"#/definitions/io.k8s.cli.setters.gcloud.core.project"}`
s2 := `apiVersion: someversion/v1alpha2
kind: ContainerCluster
metadata:
clusterName: "some_cluster"
name: asm-cluster
namespace: "some_project" # {"$ref":"#/definitions/io.k8s.cli.setters.gcloud.core.project"}`
expectedLine1 := `[31m namespace: "PROJECT_ID" # {"$ref":"#/definitions/io.k8s.cli.setters.gcloud.core.project"}`
expectedLine2 := `[32m namespace: "some_project" # {"$ref":"#/definitions/io.k8s.cli.setters.gcloud.core.project"}`
assert.Contains(t, PrettyFileDiff(s1, s2), expectedLine1)
assert.Contains(t, PrettyFileDiff(s1, s2), expectedLine2)
}
func TestCopyDir(t *testing.T) {
s := t.TempDir()
v := t.TempDir()
err := os.Mkdir(filepath.Join(s, "a1"), 0700)
require.NoError(t, err)
err = os.WriteFile(
filepath.Join(s, "a1", "f.yaml"), []byte(`a`), 0600)
require.NoError(t, err)
// files that just happen to start with .git should not be ignored.
err = os.WriteFile(
filepath.Join(s, ".gitlab-ci.yml"), []byte(`a`), 0600)
require.NoError(t, err)
// git should be ignored
err = os.Mkdir(filepath.Join(s, ".git"), 0700)
require.NoError(t, err)
err = os.WriteFile(
filepath.Join(s, ".git", "f.yaml"), []byte(`a`), 0600)
require.NoError(t, err)
err = os.Mkdir(filepath.Join(v, "a1"), 0700)
require.NoError(t, err)
err = os.WriteFile(
filepath.Join(v, "a1", "f.yaml"), []byte(`a`), 0600)
require.NoError(t, err)
err = os.WriteFile(
filepath.Join(v, ".gitlab-ci.yml"), []byte(`a`), 0600)
require.NoError(t, err)
d := t.TempDir()
err = CopyDir(filesys.MakeFsOnDisk(), s, d)
require.NoError(t, err)
diff, err := Diff(d, v)
require.NoError(t, err)
assert.Empty(t, diff.List())
}
func TestIsDotGitFolder(t *testing.T) {
testCases := []struct {
name string
path string
isDotGitFolder bool
}{
{
name: ".git folder",
path: "/foo/bar/.git",
isDotGitFolder: true,
},
{
name: "subfolder of .git folder",
path: "/foo/.git/bar/zoo",
isDotGitFolder: true,
},
{
name: "subfolder of .gitignore folder",
path: "/foo/.gitignore/bar",
isDotGitFolder: false,
},
{
name: ".gitignore file",
path: "foo/bar/.gitignore",
isDotGitFolder: false,
},
{
name: ".gitlab-ci.yml under .git folder",
path: "/foo/.git/bar/.gitignore",
isDotGitFolder: true,
},
{
name: "windows path with .git folder",
path: "c:/foo/.git/bar",
isDotGitFolder: true,
},
{
name: "windows path with .gitignore file",
path: "d:/foo/bar/.gitignore",
isDotGitFolder: false,
},
}
for i := range testCases {
test := testCases[i]
t.Run(test.name, func(t *testing.T) {
assert.Equal(t, test.isDotGitFolder, IsDotGitFolder(test.path))
})
}
}