github.com/goreleaser/goreleaser@v1.25.1/pkg/archive/tar/tar_test.go (about)

     1  package tar
     2  
     3  import (
     4  	"archive/tar"
     5  	"io"
     6  	"io/fs"
     7  	"os"
     8  	"path/filepath"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/goreleaser/goreleaser/internal/testlib"
    13  	"github.com/goreleaser/goreleaser/pkg/config"
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  func TestTarFile(t *testing.T) {
    18  	tmp := t.TempDir()
    19  	f, err := os.Create(filepath.Join(tmp, "test.tar"))
    20  	require.NoError(t, err)
    21  	defer f.Close() // nolint: errcheck
    22  	archive := New(f)
    23  	defer archive.Close() // nolint: errcheck
    24  
    25  	require.Error(t, archive.Add(config.File{
    26  		Source:      "../testdata/nope.txt",
    27  		Destination: "nope.txt",
    28  	}))
    29  	require.NoError(t, archive.Add(config.File{
    30  		Source:      "../testdata/foo.txt",
    31  		Destination: "foo.txt",
    32  	}))
    33  	require.NoError(t, archive.Add(config.File{
    34  		Source:      "../testdata/sub1",
    35  		Destination: "sub1",
    36  	}))
    37  	require.NoError(t, archive.Add(config.File{
    38  		Source:      "../testdata/sub1/bar.txt",
    39  		Destination: "sub1/bar.txt",
    40  	}))
    41  	require.NoError(t, archive.Add(config.File{
    42  		Source:      "../testdata/sub1/executable",
    43  		Destination: "sub1/executable",
    44  	}))
    45  	require.NoError(t, archive.Add(config.File{
    46  		Source:      "../testdata/sub1/sub2",
    47  		Destination: "sub1/sub2",
    48  	}))
    49  	require.NoError(t, archive.Add(config.File{
    50  		Source:      "../testdata/sub1/sub2/subfoo.txt",
    51  		Destination: "sub1/sub2/subfoo.txt",
    52  	}))
    53  	require.NoError(t, archive.Add(config.File{
    54  		Source:      "../testdata/regular.txt",
    55  		Destination: "regular.txt",
    56  	}))
    57  	require.NoError(t, archive.Add(config.File{
    58  		Source:      "../testdata/link.txt",
    59  		Destination: "link.txt",
    60  	}))
    61  
    62  	require.ErrorIs(t, archive.Add(config.File{
    63  		Source:      "../testdata/regular.txt",
    64  		Destination: "link.txt",
    65  	}), fs.ErrExist)
    66  
    67  	require.NoError(t, archive.Close())
    68  	require.Error(t, archive.Add(config.File{
    69  		Source:      "tar.go",
    70  		Destination: "tar.go",
    71  	}))
    72  	require.NoError(t, f.Close())
    73  
    74  	f, err = os.Open(f.Name())
    75  	require.NoError(t, err)
    76  	defer f.Close() // nolint: errcheck
    77  
    78  	info, err := f.Stat()
    79  	require.NoError(t, err)
    80  	require.Lessf(t, info.Size(), int64(10000), "archived file should be smaller than %d", info.Size())
    81  
    82  	var paths []string
    83  	r := tar.NewReader(f)
    84  	for {
    85  		next, err := r.Next()
    86  		if err == io.EOF {
    87  			break
    88  		}
    89  		require.NoError(t, err)
    90  		paths = append(paths, next.Name)
    91  		if next.Name == "sub1/executable" {
    92  			ex := next.FileInfo().Mode()&0o111 != 0
    93  			require.True(t, ex, "expected executable permissions, got %s", next.FileInfo().Mode())
    94  		}
    95  		if next.Name == "link.txt" {
    96  			require.Equal(t, "regular.txt", next.Linkname)
    97  		}
    98  	}
    99  	require.Equal(t, []string{
   100  		"foo.txt",
   101  		"sub1",
   102  		"sub1/bar.txt",
   103  		"sub1/executable",
   104  		"sub1/sub2",
   105  		"sub1/sub2/subfoo.txt",
   106  		"regular.txt",
   107  		"link.txt",
   108  	}, paths)
   109  }
   110  
   111  func TestTarFileInfo(t *testing.T) {
   112  	now := time.Now().Truncate(time.Second)
   113  	f, err := os.Create(filepath.Join(t.TempDir(), "test.tar"))
   114  	require.NoError(t, err)
   115  	defer f.Close() // nolint: errcheck
   116  	archive := New(f)
   117  	defer archive.Close() // nolint: errcheck
   118  
   119  	require.NoError(t, archive.Add(config.File{
   120  		Source:      "../testdata/foo.txt",
   121  		Destination: "nope.txt",
   122  		Info: config.FileInfo{
   123  			Mode:        0o755,
   124  			Owner:       "carlos",
   125  			Group:       "root",
   126  			ParsedMTime: now,
   127  		},
   128  	}))
   129  
   130  	require.NoError(t, archive.Close())
   131  	require.NoError(t, f.Close())
   132  
   133  	f, err = os.Open(f.Name())
   134  	require.NoError(t, err)
   135  	defer f.Close() // nolint: errcheck
   136  
   137  	var found int
   138  	r := tar.NewReader(f)
   139  	for {
   140  		next, err := r.Next()
   141  		if err == io.EOF {
   142  			break
   143  		}
   144  		require.NoError(t, err)
   145  
   146  		found++
   147  		require.Equal(t, "nope.txt", next.Name)
   148  		require.Equal(t, now, next.ModTime)
   149  		require.Equal(t, fs.FileMode(0o755), next.FileInfo().Mode())
   150  		require.Equal(t, "carlos", next.Uname)
   151  		require.Equal(t, 0, next.Uid)
   152  		require.Equal(t, "root", next.Gname)
   153  		require.Equal(t, 0, next.Gid)
   154  	}
   155  	require.Equal(t, 1, found)
   156  }
   157  
   158  func TestTarInvalidLink(t *testing.T) {
   159  	archive := New(io.Discard)
   160  	defer archive.Close() // nolint: errcheck
   161  
   162  	require.NoError(t, archive.Add(config.File{
   163  		Source:      "../testdata/badlink.txt",
   164  		Destination: "badlink.txt",
   165  	}))
   166  }
   167  
   168  func TestCopying(t *testing.T) {
   169  	f1, err := os.Create(filepath.Join(t.TempDir(), "1.tar"))
   170  	require.NoError(t, err)
   171  	f2, err := os.Create(filepath.Join(t.TempDir(), "2.tar"))
   172  	require.NoError(t, err)
   173  
   174  	t1 := New(f1)
   175  	require.NoError(t, t1.Add(config.File{
   176  		Source:      "../testdata/foo.txt",
   177  		Destination: "foo.txt",
   178  	}))
   179  	require.NoError(t, t1.Add(config.File{
   180  		Source:      "../testdata/foo.txt",
   181  		Destination: "ملف.txt",
   182  	}))
   183  	require.NoError(t, t1.Close())
   184  	require.NoError(t, f1.Close())
   185  
   186  	f1, err = os.Open(f1.Name())
   187  	require.NoError(t, err)
   188  
   189  	t2, err := Copying(f1, f2)
   190  	require.NoError(t, err)
   191  	require.NoError(t, t2.Add(config.File{
   192  		Source:      "../testdata/sub1/executable",
   193  		Destination: "executable",
   194  	}))
   195  	require.NoError(t, t2.Add(config.File{
   196  		Source:      "../testdata/sub1/executable",
   197  		Destination: "ملف.exe",
   198  	}))
   199  	require.NoError(t, t2.Close())
   200  	require.NoError(t, f2.Close())
   201  	require.NoError(t, f1.Close())
   202  
   203  	require.Equal(t, []string{"foo.txt", "ملف.txt"}, testlib.LsArchive(t, f1.Name(), "tar"))
   204  	require.Equal(t, []string{"foo.txt", "ملف.txt", "executable", "ملف.exe"}, testlib.LsArchive(t, f2.Name(), "tar"))
   205  }