github.com/ahmet2mir/goreleaser@v0.180.3-0.20210927151101-8e5ee5a9b8c5/pkg/archive/tarxz/tarxz_test.go (about)

     1  package tarxz
     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/pkg/config"
    13  	"github.com/stretchr/testify/require"
    14  	"github.com/ulikunitz/xz"
    15  )
    16  
    17  func TestTarXzFile(t *testing.T) {
    18  	tmp := t.TempDir()
    19  	f, err := os.Create(filepath.Join(tmp, "test.tar.xz"))
    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.NoError(t, archive.Close())
    63  	require.Error(t, archive.Add(config.File{
    64  		Source:      "tar.go",
    65  		Destination: "tar.go",
    66  	}))
    67  	require.NoError(t, f.Close())
    68  
    69  	f, err = os.Open(f.Name())
    70  	require.NoError(t, err)
    71  	defer f.Close() // nolint: errcheck
    72  
    73  	info, err := f.Stat()
    74  	require.NoError(t, err)
    75  	require.Truef(t, info.Size() < 500, "archived file should be smaller than %d", info.Size())
    76  
    77  	xzf, err := xz.NewReader(f)
    78  	require.NoError(t, err)
    79  
    80  	var paths []string
    81  	r := tar.NewReader(xzf)
    82  	for {
    83  		next, err := r.Next()
    84  		if err == io.EOF {
    85  			break
    86  		}
    87  		require.NoError(t, err)
    88  		paths = append(paths, next.Name)
    89  		t.Logf("%s: %v", next.Name, next.FileInfo().Mode())
    90  		if next.Name == "sub1/executable" {
    91  			ex := next.FileInfo().Mode() | 0o111
    92  			require.Equal(t, next.FileInfo().Mode().String(), ex.String())
    93  		}
    94  		if next.Name == "link.txt" {
    95  			require.Equal(t, next.Linkname, "regular.txt")
    96  		}
    97  	}
    98  	require.Equal(t, []string{
    99  		"foo.txt",
   100  		"sub1",
   101  		"sub1/bar.txt",
   102  		"sub1/executable",
   103  		"sub1/sub2",
   104  		"sub1/sub2/subfoo.txt",
   105  		"regular.txt",
   106  		"link.txt",
   107  	}, paths)
   108  }
   109  
   110  func TestTarXzFileInfo(t *testing.T) {
   111  	now := time.Now().Truncate(time.Second)
   112  	f, err := os.Create(filepath.Join(t.TempDir(), "test.tar.gz"))
   113  	require.NoError(t, err)
   114  	defer f.Close() // nolint: errcheck
   115  	archive := New(f)
   116  	defer archive.Close() // nolint: errcheck
   117  
   118  	require.NoError(t, archive.Add(config.File{
   119  		Source:      "../testdata/foo.txt",
   120  		Destination: "nope.txt",
   121  		Info: config.FileInfo{
   122  			Mode:  0o755,
   123  			Owner: "carlos",
   124  			Group: "root",
   125  			MTime: now,
   126  		},
   127  	}))
   128  
   129  	require.NoError(t, archive.Close())
   130  	require.NoError(t, f.Close())
   131  
   132  	f, err = os.Open(f.Name())
   133  	require.NoError(t, err)
   134  	defer f.Close() // nolint: errcheck
   135  
   136  	xzf, err := xz.NewReader(f)
   137  	require.NoError(t, err)
   138  
   139  	var found int
   140  	r := tar.NewReader(xzf)
   141  	for {
   142  		next, err := r.Next()
   143  		if err == io.EOF {
   144  			break
   145  		}
   146  		require.NoError(t, err)
   147  
   148  		found++
   149  		require.Equal(t, "nope.txt", next.Name)
   150  		require.Equal(t, now, next.ModTime)
   151  		require.Equal(t, fs.FileMode(0o755), next.FileInfo().Mode())
   152  		require.Equal(t, "carlos", next.Uname)
   153  		require.Equal(t, 0, next.Uid)
   154  		require.Equal(t, "root", next.Gname)
   155  		require.Equal(t, 0, next.Gid)
   156  	}
   157  	require.Equal(t, 1, found)
   158  }