github.com/goreleaser/goreleaser@v1.25.1/pkg/archive/zip/zip_test.go (about) 1 package zip 2 3 import ( 4 "archive/zip" 5 "bytes" 6 "io" 7 "io/fs" 8 "os" 9 "path/filepath" 10 "testing" 11 "time" 12 13 "github.com/goreleaser/goreleaser/pkg/config" 14 "github.com/stretchr/testify/require" 15 ) 16 17 func TestZipFile(t *testing.T) { 18 tmp := t.TempDir() 19 f, err := os.Create(filepath.Join(tmp, "test.zip")) 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(1000), "archived file should be smaller than %d", info.Size()) 81 82 r, err := zip.NewReader(f, info.Size()) 83 require.NoError(t, err) 84 85 paths := make([]string, len(r.File)) 86 for i, zf := range r.File { 87 paths[i] = zf.Name 88 if zf.Name == "sub1/executable" { 89 ex := zf.Mode()&0o111 != 0 90 require.True(t, ex, "expected executable permissions, got %s", zf.Mode()) 91 } 92 if zf.Name == "link.txt" { 93 require.NotEqual(t, 0, zf.FileInfo().Mode()&os.ModeSymlink) 94 rc, err := zf.Open() 95 require.NoError(t, err) 96 var link bytes.Buffer 97 _, err = io.Copy(&link, rc) 98 require.NoError(t, err) 99 rc.Close() 100 require.Equal(t, "regular.txt", link.String()) 101 } 102 } 103 require.Equal(t, []string{ 104 "foo.txt", 105 "sub1/bar.txt", 106 "sub1/executable", 107 "sub1/sub2/subfoo.txt", 108 "regular.txt", 109 "link.txt", 110 }, paths) 111 } 112 113 func TestZipFileInfo(t *testing.T) { 114 now := time.Now().Truncate(time.Second) 115 f, err := os.Create(filepath.Join(t.TempDir(), "test.zip")) 116 require.NoError(t, err) 117 defer f.Close() // nolint: errcheck 118 archive := New(f) 119 defer archive.Close() // nolint: errcheck 120 121 require.NoError(t, archive.Add(config.File{ 122 Source: "../testdata/foo.txt", 123 Destination: "nope.txt", 124 Info: config.FileInfo{ 125 Mode: 0o755, 126 Owner: "carlos", 127 Group: "root", 128 ParsedMTime: now, 129 }, 130 })) 131 132 require.NoError(t, archive.Close()) 133 require.NoError(t, f.Close()) 134 135 f, err = os.Open(f.Name()) 136 require.NoError(t, err) 137 defer f.Close() // nolint: errcheck 138 139 info, err := f.Stat() 140 require.NoError(t, err) 141 142 r, err := zip.NewReader(f, info.Size()) 143 require.NoError(t, err) 144 145 require.Len(t, r.File, 1) 146 for _, next := range r.File { 147 require.Equal(t, "nope.txt", next.Name) 148 require.Equal(t, now.Unix(), next.Modified.Unix()) 149 require.Equal(t, fs.FileMode(0o755), next.FileInfo().Mode()) 150 } 151 } 152 153 func TestTarInvalidLink(t *testing.T) { 154 archive := New(io.Discard) 155 defer archive.Close() // nolint: errcheck 156 157 require.NoError(t, archive.Add(config.File{ 158 Source: "../testdata/badlink.txt", 159 Destination: "badlink.txt", 160 })) 161 } 162 163 // TODO: add copying test