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 }