github.com/ahmet2mir/goreleaser@v0.180.3-0.20210927151101-8e5ee5a9b8c5/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/pkg/config" 13 "github.com/stretchr/testify/require" 14 ) 15 16 func TestTarFile(t *testing.T) { 17 tmp := t.TempDir() 18 f, err := os.Create(filepath.Join(tmp, "test.tar")) 19 require.NoError(t, err) 20 defer f.Close() // nolint: errcheck 21 archive := New(f) 22 defer archive.Close() // nolint: errcheck 23 24 require.Error(t, archive.Add(config.File{ 25 Source: "../testdata/nope.txt", 26 Destination: "nope.txt", 27 })) 28 require.NoError(t, archive.Add(config.File{ 29 Source: "../testdata/foo.txt", 30 Destination: "foo.txt", 31 })) 32 require.NoError(t, archive.Add(config.File{ 33 Source: "../testdata/sub1", 34 Destination: "sub1", 35 })) 36 require.NoError(t, archive.Add(config.File{ 37 Source: "../testdata/sub1/bar.txt", 38 Destination: "sub1/bar.txt", 39 })) 40 require.NoError(t, archive.Add(config.File{ 41 Source: "../testdata/sub1/executable", 42 Destination: "sub1/executable", 43 })) 44 require.NoError(t, archive.Add(config.File{ 45 Source: "../testdata/sub1/sub2", 46 Destination: "sub1/sub2", 47 })) 48 require.NoError(t, archive.Add(config.File{ 49 Source: "../testdata/sub1/sub2/subfoo.txt", 50 Destination: "sub1/sub2/subfoo.txt", 51 })) 52 require.NoError(t, archive.Add(config.File{ 53 Source: "../testdata/regular.txt", 54 Destination: "regular.txt", 55 })) 56 require.NoError(t, archive.Add(config.File{ 57 Source: "../testdata/link.txt", 58 Destination: "link.txt", 59 })) 60 61 require.NoError(t, archive.Close()) 62 require.Error(t, archive.Add(config.File{ 63 Source: "tar.go", 64 Destination: "tar.go", 65 })) 66 require.NoError(t, f.Close()) 67 68 f, err = os.Open(f.Name()) 69 require.NoError(t, err) 70 defer f.Close() // nolint: errcheck 71 72 info, err := f.Stat() 73 require.NoError(t, err) 74 require.Truef(t, info.Size() < 10000, "archived file should be smaller than %d", info.Size()) 75 76 var paths []string 77 r := tar.NewReader(f) 78 for { 79 next, err := r.Next() 80 if err == io.EOF { 81 break 82 } 83 require.NoError(t, err) 84 paths = append(paths, next.Name) 85 t.Logf("%s: %v", next.Name, next.FileInfo().Mode()) 86 if next.Name == "sub1/executable" { 87 ex := next.FileInfo().Mode() | 0o111 88 require.Equal(t, next.FileInfo().Mode().String(), ex.String()) 89 } 90 if next.Name == "link.txt" { 91 require.Equal(t, next.Linkname, "regular.txt") 92 } 93 } 94 require.Equal(t, []string{ 95 "foo.txt", 96 "sub1", 97 "sub1/bar.txt", 98 "sub1/executable", 99 "sub1/sub2", 100 "sub1/sub2/subfoo.txt", 101 "regular.txt", 102 "link.txt", 103 }, paths) 104 } 105 106 func TestTarFileInfo(t *testing.T) { 107 now := time.Now().Truncate(time.Second) 108 f, err := os.Create(filepath.Join(t.TempDir(), "test.tar")) 109 require.NoError(t, err) 110 defer f.Close() // nolint: errcheck 111 archive := New(f) 112 defer archive.Close() // nolint: errcheck 113 114 require.NoError(t, archive.Add(config.File{ 115 Source: "../testdata/foo.txt", 116 Destination: "nope.txt", 117 Info: config.FileInfo{ 118 Mode: 0o755, 119 Owner: "carlos", 120 Group: "root", 121 MTime: now, 122 }, 123 })) 124 125 require.NoError(t, archive.Close()) 126 require.NoError(t, f.Close()) 127 128 f, err = os.Open(f.Name()) 129 require.NoError(t, err) 130 defer f.Close() // nolint: errcheck 131 132 var found int 133 r := tar.NewReader(f) 134 for { 135 next, err := r.Next() 136 if err == io.EOF { 137 break 138 } 139 require.NoError(t, err) 140 141 found++ 142 require.Equal(t, "nope.txt", next.Name) 143 require.Equal(t, now, next.ModTime) 144 require.Equal(t, fs.FileMode(0o755), next.FileInfo().Mode()) 145 require.Equal(t, "carlos", next.Uname) 146 require.Equal(t, 0, next.Uid) 147 require.Equal(t, "root", next.Gname) 148 require.Equal(t, 0, next.Gid) 149 } 150 require.Equal(t, 1, found) 151 } 152 153 func TestTarInvalidLink(t *testing.T) { 154 tmp := t.TempDir() 155 f, err := os.Create(filepath.Join(tmp, "test.tar")) 156 require.NoError(t, err) 157 defer f.Close() // nolint: errcheck 158 archive := New(f) 159 defer archive.Close() // nolint: errcheck 160 161 require.EqualError(t, archive.Add(config.File{ 162 Source: "../testdata/badlink.txt", 163 Destination: "badlink.txt", 164 }), "open ../testdata/badlink.txt: no such file or directory") 165 }