...

Source file src/sigs.k8s.io/kustomize/kyaml/copyutil/copyutil_test.go

Documentation: sigs.k8s.io/kustomize/kyaml/copyutil

     1  // Copyright 2019 The Kubernetes Authors.
     2  // SPDX-License-Identifier: Apache-2.0
     3  
     4  package copyutil_test
     5  
     6  import (
     7  	"fmt"
     8  	"os"
     9  	"path/filepath"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/assert"
    13  	"github.com/stretchr/testify/require"
    14  	. "sigs.k8s.io/kustomize/kyaml/copyutil"
    15  	"sigs.k8s.io/kustomize/kyaml/filesys"
    16  )
    17  
    18  // TestDiff_identical verifies identical directories return an empty set
    19  func TestDiff_identical(t *testing.T) {
    20  	s := t.TempDir()
    21  	d := t.TempDir()
    22  
    23  	err := os.Mkdir(filepath.Join(s, "a1"), 0700)
    24  	require.NoError(t, err)
    25  	err = os.WriteFile(
    26  		filepath.Join(s, "a1", "f.yaml"), []byte(`a`), 0600)
    27  	require.NoError(t, err)
    28  
    29  	err = os.Mkdir(filepath.Join(d, "a1"), 0700)
    30  	require.NoError(t, err)
    31  	err = os.WriteFile(
    32  		filepath.Join(d, "a1", "f.yaml"), []byte(`a`), 0600)
    33  	require.NoError(t, err)
    34  
    35  	diff, err := Diff(s, d)
    36  	require.NoError(t, err)
    37  	assert.Empty(t, diff.List())
    38  }
    39  
    40  // TestDiff_additionalSourceFiles verifies if there are additional files
    41  // in the source, the diff will contain them
    42  func TestDiff_additionalSourceFiles(t *testing.T) {
    43  	s := t.TempDir()
    44  	d := t.TempDir()
    45  
    46  	err := os.Mkdir(filepath.Join(s, "a1"), 0700)
    47  	require.NoError(t, err)
    48  
    49  	err = os.Mkdir(filepath.Join(s, "a2"), 0700)
    50  	require.NoError(t, err)
    51  
    52  	err = os.Mkdir(filepath.Join(d, "a1"), 0700)
    53  	require.NoError(t, err)
    54  
    55  	diff, err := Diff(s, d)
    56  	require.NoError(t, err)
    57  	assert.ElementsMatch(t, diff.List(), []string{"a2"})
    58  }
    59  
    60  // TestDiff_additionalDestFiles verifies if there are additional files
    61  // in the dest, the diff will contain them
    62  func TestDiff_additionalDestFiles(t *testing.T) {
    63  	s := t.TempDir()
    64  	d := t.TempDir()
    65  
    66  	err := os.Mkdir(filepath.Join(s, "a1"), 0700)
    67  	require.NoError(t, err)
    68  
    69  	err = os.Mkdir(filepath.Join(d, "a1"), 0700)
    70  	require.NoError(t, err)
    71  
    72  	err = os.Mkdir(filepath.Join(d, "a2"), 0700)
    73  	require.NoError(t, err)
    74  
    75  	diff, err := Diff(s, d)
    76  	require.NoError(t, err)
    77  	assert.ElementsMatch(t, diff.List(), []string{"a2"})
    78  }
    79  
    80  // TestDiff_srcDestContentsDiffer verifies if the file contents
    81  // differ between the source and destination, the diff
    82  // contains the differing files
    83  func TestDiff_srcDestContentsDiffer(t *testing.T) {
    84  	s := t.TempDir()
    85  	d := t.TempDir()
    86  
    87  	err := os.Mkdir(filepath.Join(s, "a1"), 0700)
    88  	require.NoError(t, err)
    89  	err = os.WriteFile(
    90  		filepath.Join(s, "a1", "f.yaml"), []byte(`a`), 0600)
    91  	require.NoError(t, err)
    92  
    93  	err = os.Mkdir(filepath.Join(d, "a1"), 0700)
    94  	require.NoError(t, err)
    95  	err = os.WriteFile(
    96  		filepath.Join(d, "a1", "f.yaml"), []byte(`b`), 0600)
    97  	require.NoError(t, err)
    98  
    99  	diff, err := Diff(s, d)
   100  	require.NoError(t, err)
   101  	assert.ElementsMatch(t, diff.List(), []string{
   102  		fmt.Sprintf("a1%sf.yaml", string(filepath.Separator)),
   103  	})
   104  }
   105  
   106  // TestDiff_srcDestContentsDifferInDirs verifies if identical files
   107  // exist in different directories, they are included in the diff
   108  func TestDiff_srcDestContentsDifferInDirs(t *testing.T) {
   109  	s := t.TempDir()
   110  	d := t.TempDir()
   111  
   112  	err := os.Mkdir(filepath.Join(s, "a1"), 0700)
   113  	require.NoError(t, err)
   114  	err = os.WriteFile(
   115  		filepath.Join(s, "a1", "f.yaml"), []byte(`a`), 0600)
   116  	require.NoError(t, err)
   117  
   118  	err = os.Mkdir(filepath.Join(d, "b1"), 0700)
   119  	require.NoError(t, err)
   120  	err = os.WriteFile(
   121  		filepath.Join(d, "b1", "f.yaml"), []byte(`a`), 0600)
   122  	require.NoError(t, err)
   123  
   124  	diff, err := Diff(s, d)
   125  	require.NoError(t, err)
   126  	assert.ElementsMatch(t, diff.List(), []string{
   127  		"a1",
   128  		fmt.Sprintf("a1%sf.yaml", string(filepath.Separator)),
   129  		fmt.Sprintf("b1%sf.yaml", string(filepath.Separator)),
   130  		"b1",
   131  	})
   132  }
   133  
   134  // TestDiff_skipGitSrc verifies that .git directories in the source
   135  // are not looked at
   136  func TestDiff_skipGitSrc(t *testing.T) {
   137  	s := t.TempDir()
   138  	d := t.TempDir()
   139  
   140  	err := os.Mkdir(filepath.Join(s, "a1"), 0700)
   141  	require.NoError(t, err)
   142  	err = os.WriteFile(
   143  		filepath.Join(s, "a1", "f.yaml"), []byte(`a`), 0600)
   144  	require.NoError(t, err)
   145  
   146  	// files that just happen to start with .git should not be ignored.
   147  	err = os.WriteFile(
   148  		filepath.Join(s, ".gitlab-ci.yml"), []byte(`a`), 0600)
   149  	require.NoError(t, err)
   150  
   151  	// git should be ignored
   152  	err = os.Mkdir(filepath.Join(s, ".git"), 0700)
   153  	require.NoError(t, err)
   154  	err = os.WriteFile(
   155  		filepath.Join(s, ".git", "f.yaml"), []byte(`a`), 0600)
   156  	require.NoError(t, err)
   157  
   158  	err = os.Mkdir(filepath.Join(d, "a1"), 0700)
   159  	require.NoError(t, err)
   160  	err = os.WriteFile(
   161  		filepath.Join(d, "a1", "f.yaml"), []byte(`a`), 0600)
   162  	require.NoError(t, err)
   163  
   164  	err = os.WriteFile(
   165  		filepath.Join(d, ".gitlab-ci.yml"), []byte(`a`), 0600)
   166  	require.NoError(t, err)
   167  
   168  	diff, err := Diff(s, d)
   169  	require.NoError(t, err)
   170  	assert.Empty(t, diff.List())
   171  }
   172  
   173  // TestDiff_skipGitDest verifies that .git directories in the destination
   174  // are not looked at
   175  func TestDiff_skipGitDest(t *testing.T) {
   176  	s := t.TempDir()
   177  	d := t.TempDir()
   178  
   179  	err := os.Mkdir(filepath.Join(s, "a1"), 0700)
   180  	require.NoError(t, err)
   181  	err = os.WriteFile(
   182  		filepath.Join(s, "a1", "f.yaml"), []byte(`a`), 0600)
   183  	require.NoError(t, err)
   184  
   185  	err = os.Mkdir(filepath.Join(d, "a1"), 0700)
   186  	require.NoError(t, err)
   187  	err = os.WriteFile(
   188  		filepath.Join(d, "a1", "f.yaml"), []byte(`a`), 0600)
   189  	require.NoError(t, err)
   190  
   191  	// git should be ignored
   192  	err = os.Mkdir(filepath.Join(d, ".git"), 0700)
   193  	require.NoError(t, err)
   194  	err = os.WriteFile(
   195  		filepath.Join(d, ".git", "f.yaml"), []byte(`a`), 0600)
   196  	require.NoError(t, err)
   197  
   198  	diff, err := Diff(s, d)
   199  	require.NoError(t, err)
   200  	assert.Empty(t, diff.List())
   201  }
   202  
   203  // TestSyncFile tests if destination file is replaced by source file content
   204  func TestSyncFile(t *testing.T) {
   205  	d1 := t.TempDir()
   206  	d2 := t.TempDir()
   207  	f1Name := d1 + "/temp.txt"
   208  	f2Name := d2 + "/temp.txt"
   209  	err := os.WriteFile(f1Name, []byte("abc"), 0600)
   210  	require.NoError(t, err)
   211  	err = os.WriteFile(f2Name, []byte("def"), 0644)
   212  	expectedFileInfo, _ := os.Stat(f2Name)
   213  	require.NoError(t, err)
   214  	err = SyncFile(f1Name, f2Name)
   215  	require.NoError(t, err)
   216  	actual, err := os.ReadFile(f2Name)
   217  	require.NoError(t, err)
   218  	assert.Equal(t, "abc", string(actual))
   219  	dstFileInfo, _ := os.Stat(f2Name)
   220  	assert.Equal(t, expectedFileInfo.Mode().String(), dstFileInfo.Mode().String())
   221  }
   222  
   223  // TestSyncFileNoDestFile tests if new file is created at destination with source file content
   224  func TestSyncFileNoDestFile(t *testing.T) {
   225  	d1 := t.TempDir()
   226  	d2 := t.TempDir()
   227  	f1Name := d1 + "/temp.txt"
   228  	f2Name := d2 + "/temp.txt"
   229  	err := os.WriteFile(f1Name, []byte("abc"), 0644)
   230  	require.NoError(t, err)
   231  	err = SyncFile(f1Name, f2Name)
   232  	require.NoError(t, err)
   233  	actual, err := os.ReadFile(f2Name)
   234  	require.NoError(t, err)
   235  	assert.Equal(t, "abc", string(actual))
   236  	dstFileInfo, _ := os.Stat(f2Name)
   237  	srcFileInfo, _ := os.Stat(f1Name)
   238  	assert.Equal(t, srcFileInfo.Mode().String(), dstFileInfo.Mode().String())
   239  }
   240  
   241  // TestSyncFileNoSrcFile tests if destination file is deleted if source file doesn't exist
   242  func TestSyncFileNoSrcFile(t *testing.T) {
   243  	d1 := t.TempDir()
   244  	d2 := t.TempDir()
   245  	f1Name := d1 + "/temp.txt"
   246  	f2Name := d2 + "/temp.txt"
   247  	err := os.WriteFile(f2Name, []byte("abc"), 0644)
   248  	require.NoError(t, err)
   249  	err = SyncFile(f1Name, f2Name)
   250  	require.NoError(t, err)
   251  	_, err = os.ReadFile(f2Name)
   252  	require.Error(t, err)
   253  }
   254  
   255  func TestPrettyFileDiff(t *testing.T) {
   256  	s1 := `apiVersion: someversion/v1alpha2
   257  kind: ContainerCluster
   258  metadata:
   259    clusterName: "some_cluster"
   260    name: asm-cluster
   261    namespace: "PROJECT_ID" # {"$ref":"#/definitions/io.k8s.cli.setters.gcloud.core.project"}`
   262  
   263  	s2 := `apiVersion: someversion/v1alpha2
   264  kind: ContainerCluster
   265  metadata:
   266    clusterName: "some_cluster"
   267    name: asm-cluster
   268    namespace: "some_project" # {"$ref":"#/definitions/io.k8s.cli.setters.gcloud.core.project"}`
   269  
   270  	expectedLine1 := `[31m  namespace: "PROJECT_ID" # {"$ref":"#/definitions/io.k8s.cli.setters.gcloud.core.project"}`
   271  	expectedLine2 := `[32m  namespace: "some_project" # {"$ref":"#/definitions/io.k8s.cli.setters.gcloud.core.project"}`
   272  
   273  	assert.Contains(t, PrettyFileDiff(s1, s2), expectedLine1)
   274  	assert.Contains(t, PrettyFileDiff(s1, s2), expectedLine2)
   275  }
   276  
   277  func TestCopyDir(t *testing.T) {
   278  	s := t.TempDir()
   279  	v := t.TempDir()
   280  
   281  	err := os.Mkdir(filepath.Join(s, "a1"), 0700)
   282  	require.NoError(t, err)
   283  	err = os.WriteFile(
   284  		filepath.Join(s, "a1", "f.yaml"), []byte(`a`), 0600)
   285  	require.NoError(t, err)
   286  
   287  	// files that just happen to start with .git should not be ignored.
   288  	err = os.WriteFile(
   289  		filepath.Join(s, ".gitlab-ci.yml"), []byte(`a`), 0600)
   290  	require.NoError(t, err)
   291  
   292  	// git should be ignored
   293  	err = os.Mkdir(filepath.Join(s, ".git"), 0700)
   294  	require.NoError(t, err)
   295  	err = os.WriteFile(
   296  		filepath.Join(s, ".git", "f.yaml"), []byte(`a`), 0600)
   297  	require.NoError(t, err)
   298  
   299  	err = os.Mkdir(filepath.Join(v, "a1"), 0700)
   300  	require.NoError(t, err)
   301  	err = os.WriteFile(
   302  		filepath.Join(v, "a1", "f.yaml"), []byte(`a`), 0600)
   303  	require.NoError(t, err)
   304  
   305  	err = os.WriteFile(
   306  		filepath.Join(v, ".gitlab-ci.yml"), []byte(`a`), 0600)
   307  	require.NoError(t, err)
   308  
   309  	d := t.TempDir()
   310  
   311  	err = CopyDir(filesys.MakeFsOnDisk(), s, d)
   312  	require.NoError(t, err)
   313  
   314  	diff, err := Diff(d, v)
   315  	require.NoError(t, err)
   316  	assert.Empty(t, diff.List())
   317  }
   318  
   319  func TestIsDotGitFolder(t *testing.T) {
   320  	testCases := []struct {
   321  		name           string
   322  		path           string
   323  		isDotGitFolder bool
   324  	}{
   325  		{
   326  			name:           ".git folder",
   327  			path:           "/foo/bar/.git",
   328  			isDotGitFolder: true,
   329  		},
   330  		{
   331  			name:           "subfolder of .git folder",
   332  			path:           "/foo/.git/bar/zoo",
   333  			isDotGitFolder: true,
   334  		},
   335  		{
   336  			name:           "subfolder of .gitignore folder",
   337  			path:           "/foo/.gitignore/bar",
   338  			isDotGitFolder: false,
   339  		},
   340  		{
   341  			name:           ".gitignore file",
   342  			path:           "foo/bar/.gitignore",
   343  			isDotGitFolder: false,
   344  		},
   345  		{
   346  			name:           ".gitlab-ci.yml under .git folder",
   347  			path:           "/foo/.git/bar/.gitignore",
   348  			isDotGitFolder: true,
   349  		},
   350  		{
   351  			name:           "windows path with .git folder",
   352  			path:           "c:/foo/.git/bar",
   353  			isDotGitFolder: true,
   354  		},
   355  		{
   356  			name:           "windows path with .gitignore file",
   357  			path:           "d:/foo/bar/.gitignore",
   358  			isDotGitFolder: false,
   359  		},
   360  	}
   361  
   362  	for i := range testCases {
   363  		test := testCases[i]
   364  		t.Run(test.name, func(t *testing.T) {
   365  			assert.Equal(t, test.isDotGitFolder, IsDotGitFolder(test.path))
   366  		})
   367  	}
   368  }
   369  

View as plain text