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