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 }