github.com/ahmet2mir/goreleaser@v0.180.3-0.20210927151101-8e5ee5a9b8c5/pkg/archive/targz/targz_test.go (about) 1 package targz 2 3 import ( 4 "archive/tar" 5 "compress/gzip" 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 TestTarGzFile(t *testing.T) { 18 tmp := t.TempDir() 19 f, err := os.Create(filepath.Join(tmp, "test.tar.gz")) 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 gzf, err := gzip.NewReader(f) 78 require.NoError(t, err) 79 defer gzf.Close() // nolint: errcheck 80 81 var paths []string 82 r := tar.NewReader(gzf) 83 for { 84 next, err := r.Next() 85 if err == io.EOF { 86 break 87 } 88 require.NoError(t, err) 89 paths = append(paths, next.Name) 90 t.Logf("%s: %v", next.Name, next.FileInfo().Mode()) 91 if next.Name == "sub1/executable" { 92 ex := next.FileInfo().Mode() | 0o111 93 require.Equal(t, next.FileInfo().Mode().String(), ex.String()) 94 } 95 if next.Name == "link.txt" { 96 require.Equal(t, next.Linkname, "regular.txt") 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 TestTarGzFileInfo(t *testing.T) { 112 now := time.Now().Truncate(time.Second) 113 f, err := os.Create(filepath.Join(t.TempDir(), "test.tar.gz")) 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 MTime: 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 gzf, err := gzip.NewReader(f) 138 require.NoError(t, err) 139 defer gzf.Close() // nolint: errcheck 140 141 var found int 142 r := tar.NewReader(gzf) 143 for { 144 next, err := r.Next() 145 if err == io.EOF { 146 break 147 } 148 require.NoError(t, err) 149 150 found++ 151 require.Equal(t, "nope.txt", next.Name) 152 require.Equal(t, now, next.ModTime) 153 require.Equal(t, fs.FileMode(0o755), next.FileInfo().Mode()) 154 require.Equal(t, "carlos", next.Uname) 155 require.Equal(t, 0, next.Uid) 156 require.Equal(t, "root", next.Gname) 157 require.Equal(t, 0, next.Gid) 158 } 159 require.Equal(t, 1, found) 160 }