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

     1  package zip
     2  
     3  import (
     4  	"archive/zip"
     5  	"io/fs"
     6  	"os"
     7  	"path/filepath"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/goreleaser/goreleaser/pkg/config"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func TestZipFile(t *testing.T) {
    16  	tmp := t.TempDir()
    17  	f, err := os.Create(filepath.Join(tmp, "test.zip"))
    18  	require.NoError(t, err)
    19  	defer f.Close() // nolint: errcheck
    20  	archive := New(f)
    21  	defer archive.Close() // nolint: errcheck
    22  
    23  	require.Error(t, archive.Add(config.File{
    24  		Source:      "../testdata/nope.txt",
    25  		Destination: "nope.txt",
    26  	}))
    27  	require.NoError(t, archive.Add(config.File{
    28  		Source:      "../testdata/foo.txt",
    29  		Destination: "foo.txt",
    30  	}))
    31  	require.NoError(t, archive.Add(config.File{
    32  		Source:      "../testdata/sub1",
    33  		Destination: "sub1",
    34  	}))
    35  	require.NoError(t, archive.Add(config.File{
    36  		Source:      "../testdata/sub1/bar.txt",
    37  		Destination: "sub1/bar.txt",
    38  	}))
    39  	require.NoError(t, archive.Add(config.File{
    40  		Source:      "../testdata/sub1/executable",
    41  		Destination: "sub1/executable",
    42  	}))
    43  	require.NoError(t, archive.Add(config.File{
    44  		Source:      "../testdata/sub1/sub2",
    45  		Destination: "sub1/sub2",
    46  	}))
    47  	require.NoError(t, archive.Add(config.File{
    48  		Source:      "../testdata/sub1/sub2/subfoo.txt",
    49  		Destination: "sub1/sub2/subfoo.txt",
    50  	}))
    51  	require.NoError(t, archive.Add(config.File{
    52  		Source:      "../testdata/regular.txt",
    53  		Destination: "regular.txt",
    54  	}))
    55  	require.NoError(t, archive.Add(config.File{
    56  		Source:      "../testdata/link.txt",
    57  		Destination: "link.txt",
    58  	}))
    59  
    60  	require.NoError(t, archive.Close())
    61  	require.Error(t, archive.Add(config.File{
    62  		Source:      "tar.go",
    63  		Destination: "tar.go",
    64  	}))
    65  	require.NoError(t, f.Close())
    66  
    67  	f, err = os.Open(f.Name())
    68  	require.NoError(t, err)
    69  	defer f.Close() // nolint: errcheck
    70  
    71  	info, err := f.Stat()
    72  	require.NoError(t, err)
    73  	require.Truef(t, info.Size() < 1000, "archived file should be smaller than %d", info.Size())
    74  
    75  	r, err := zip.NewReader(f, info.Size())
    76  	require.NoError(t, err)
    77  
    78  	paths := make([]string, len(r.File))
    79  	for i, zf := range r.File {
    80  		paths[i] = zf.Name
    81  		t.Logf("%s: %v", zf.Name, zf.Mode())
    82  		if zf.Name == "sub1/executable" {
    83  			ex := zf.Mode() | 0o111
    84  			require.Equal(t, zf.Mode().String(), ex.String())
    85  		}
    86  		if zf.Name == "link.txt" {
    87  			require.True(t, zf.FileInfo().Mode()&os.ModeSymlink != 0)
    88  		}
    89  	}
    90  	require.Equal(t, []string{
    91  		"foo.txt",
    92  		"sub1/bar.txt",
    93  		"sub1/executable",
    94  		"sub1/sub2/subfoo.txt",
    95  		"regular.txt",
    96  		"link.txt",
    97  	}, paths)
    98  }
    99  
   100  func TestZipFileInfo(t *testing.T) {
   101  	now := time.Now().Truncate(time.Second)
   102  	f, err := os.Create(filepath.Join(t.TempDir(), "test.zip"))
   103  	require.NoError(t, err)
   104  	defer f.Close() // nolint: errcheck
   105  	archive := New(f)
   106  	defer archive.Close() // nolint: errcheck
   107  
   108  	require.NoError(t, archive.Add(config.File{
   109  		Source:      "../testdata/foo.txt",
   110  		Destination: "nope.txt",
   111  		Info: config.FileInfo{
   112  			Mode:  0o755,
   113  			Owner: "carlos",
   114  			Group: "root",
   115  			MTime: now,
   116  		},
   117  	}))
   118  
   119  	require.NoError(t, archive.Close())
   120  	require.NoError(t, f.Close())
   121  
   122  	f, err = os.Open(f.Name())
   123  	require.NoError(t, err)
   124  	defer f.Close() // nolint: errcheck
   125  
   126  	info, err := f.Stat()
   127  	require.NoError(t, err)
   128  
   129  	r, err := zip.NewReader(f, info.Size())
   130  	require.NoError(t, err)
   131  
   132  	require.Len(t, r.File, 1)
   133  	for _, next := range r.File {
   134  		require.Equal(t, "nope.txt", next.Name)
   135  		require.Equal(t, now.Unix(), next.Modified.Unix())
   136  		require.Equal(t, fs.FileMode(0o755), next.FileInfo().Mode())
   137  	}
   138  }