github.com/triarius/goreleaser@v1.12.5/internal/gio/copy_test.go (about)

     1  package gio
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/require"
     9  )
    10  
    11  func TestCopy(t *testing.T) {
    12  	tmp := t.TempDir()
    13  	a := "testdata/somefile.txt"
    14  	b := tmp + "/somefile.txt"
    15  	require.NoError(t, Copy(a, b))
    16  	requireEqualFiles(t, a, b)
    17  }
    18  
    19  func TestCopySymlink(t *testing.T) {
    20  	tmp := t.TempDir()
    21  	a := "testdata/somefile.txt"
    22  	b := tmp + "/somefile.txt"
    23  	c := tmp + "/somefile2.txt"
    24  	require.NoError(t, os.Symlink(a, b))
    25  	require.NoError(t, Copy(b, c))
    26  
    27  	fi, err := os.Lstat(c)
    28  	require.NoError(t, err)
    29  	require.True(t, fi.Mode()&os.ModeSymlink != 0)
    30  
    31  	l, err := os.Readlink(c)
    32  	require.NoError(t, err)
    33  	require.Equal(t, a, l)
    34  }
    35  
    36  func TestEqualFilesModeChanged(t *testing.T) {
    37  	tmp := t.TempDir()
    38  	a := "testdata/somefile.txt"
    39  	b := tmp + "/somefile.txt"
    40  	require.NoError(t, CopyWithMode(a, b, 0o755))
    41  	requireNotEqualFiles(t, a, b)
    42  }
    43  
    44  func TestEqualFilesContentsChanged(t *testing.T) {
    45  	tmp := t.TempDir()
    46  	a := "testdata/somefile.txt"
    47  	b := tmp + "/somefile.txt"
    48  	require.NoError(t, Copy(a, b))
    49  	require.NoError(t, os.WriteFile(b, []byte("hello world"), 0o644))
    50  	requireNotEqualFiles(t, a, b)
    51  }
    52  
    53  func TestEqualFilesDontExist(t *testing.T) {
    54  	a := "testdata/nope.txt"
    55  	b := "testdata/somefile.txt"
    56  	c := "testdata/notadir/lala"
    57  	require.Error(t, Copy(a, b))
    58  	require.Error(t, CopyWithMode(a, b, 0o644))
    59  	require.Error(t, Copy(b, c))
    60  }
    61  
    62  func TestCopyErrors(t *testing.T) {
    63  	a := "testdata/nope.txt"
    64  	b := "testdata/also-nope.txt"
    65  
    66  	err := copySymlink(a, b)
    67  	require.Error(t, err)
    68  
    69  	err = copyFile(a, b, 0o755)
    70  	require.Error(t, err)
    71  }
    72  
    73  func TestCopyFile(t *testing.T) {
    74  	dir := t.TempDir()
    75  	src, err := os.CreateTemp(dir, "src")
    76  	require.NoError(t, err)
    77  	require.NoError(t, src.Close())
    78  	dst := filepath.Join(dir, "dst")
    79  	require.NoError(t, os.WriteFile(src.Name(), []byte("foo"), 0o644))
    80  	require.NoError(t, Copy(src.Name(), dst))
    81  	requireEqualFiles(t, src.Name(), dst)
    82  }
    83  
    84  func TestCopyDirectory(t *testing.T) {
    85  	srcDir := t.TempDir()
    86  	dstDir := t.TempDir()
    87  	const testFile = "test"
    88  	require.NoError(t, os.WriteFile(filepath.Join(srcDir, testFile), []byte("foo"), 0o644))
    89  	require.NoError(t, Copy(srcDir, dstDir))
    90  	requireEqualFiles(t, filepath.Join(srcDir, testFile), filepath.Join(dstDir, testFile))
    91  }
    92  
    93  func TestCopyTwoLevelDirectory(t *testing.T) {
    94  	srcDir := t.TempDir()
    95  	dstDir := t.TempDir()
    96  	srcLevel2 := filepath.Join(srcDir, "level2")
    97  	const testFile = "test"
    98  
    99  	require.NoError(t, os.Mkdir(srcLevel2, 0o755))
   100  	require.NoError(t, os.WriteFile(filepath.Join(srcDir, testFile), []byte("foo"), 0o644))
   101  	require.NoError(t, os.WriteFile(filepath.Join(srcLevel2, testFile), []byte("foo"), 0o644))
   102  
   103  	require.NoError(t, Copy(srcDir, dstDir))
   104  
   105  	requireEqualFiles(t, filepath.Join(srcDir, testFile), filepath.Join(dstDir, testFile))
   106  	requireEqualFiles(t, filepath.Join(srcLevel2, testFile), filepath.Join(dstDir, "level2", testFile))
   107  }
   108  
   109  func requireEqualFiles(tb testing.TB, a, b string) {
   110  	tb.Helper()
   111  	eq, err := EqualFiles(a, b)
   112  	require.NoError(tb, err)
   113  	require.True(tb, eq, "%s != %s", a, b)
   114  }
   115  
   116  func requireNotEqualFiles(tb testing.TB, a, b string) {
   117  	tb.Helper()
   118  	eq, err := EqualFiles(a, b)
   119  	require.NoError(tb, err)
   120  	require.False(tb, eq, "%s == %s", a, b)
   121  }