github.com/goreleaser/goreleaser@v1.25.1/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.Lessf(t, info.Size(), int64(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 if next.Name == "sub1/executable" { 90 ex := next.FileInfo().Mode()&0o111 != 0 91 require.True(t, ex, "expected executable permissions, got %s", next.FileInfo().Mode()) 92 } 93 if next.Name == "link.txt" { 94 require.Equal(t, "regular.txt", next.Linkname) 95 } 96 } 97 require.Equal(t, []string{ 98 "foo.txt", 99 "sub1", 100 "sub1/bar.txt", 101 "sub1/executable", 102 "sub1/sub2", 103 "sub1/sub2/subfoo.txt", 104 "regular.txt", 105 "link.txt", 106 }, paths) 107 } 108 109 func TestTarXzFileInfo(t *testing.T) { 110 now := time.Now().Truncate(time.Second) 111 f, err := os.Create(filepath.Join(t.TempDir(), "test.tar.gz")) 112 require.NoError(t, err) 113 defer f.Close() // nolint: errcheck 114 archive := New(f) 115 defer archive.Close() // nolint: errcheck 116 117 require.NoError(t, archive.Add(config.File{ 118 Source: "../testdata/foo.txt", 119 Destination: "nope.txt", 120 Info: config.FileInfo{ 121 Mode: 0o755, 122 Owner: "carlos", 123 Group: "root", 124 ParsedMTime: now, 125 }, 126 })) 127 128 require.NoError(t, archive.Close()) 129 require.NoError(t, f.Close()) 130 131 f, err = os.Open(f.Name()) 132 require.NoError(t, err) 133 defer f.Close() // nolint: errcheck 134 135 xzf, err := xz.NewReader(f) 136 require.NoError(t, err) 137 138 var found int 139 r := tar.NewReader(xzf) 140 for { 141 next, err := r.Next() 142 if err == io.EOF { 143 break 144 } 145 require.NoError(t, err) 146 147 found++ 148 require.Equal(t, "nope.txt", next.Name) 149 require.Equal(t, now, next.ModTime) 150 require.Equal(t, fs.FileMode(0o755), next.FileInfo().Mode()) 151 require.Equal(t, "carlos", next.Uname) 152 require.Equal(t, 0, next.Uid) 153 require.Equal(t, "root", next.Gname) 154 require.Equal(t, 0, next.Gid) 155 } 156 require.Equal(t, 1, found) 157 }