github.com/goreleaser/nfpm/v2@v2.44.0/ipk/tar_test.go (about) 1 package ipk 2 3 import ( 4 "archive/tar" 5 "bytes" 6 "compress/gzip" 7 "errors" 8 "io" 9 "path" 10 "testing" 11 "time" 12 13 "github.com/stretchr/testify/assert" 14 "github.com/stretchr/testify/require" 15 ) 16 17 func Test_newTGZ(t *testing.T) { 18 unknownErr := errors.New("unknown error") 19 20 tests := []struct { 21 description string 22 name string 23 populate func(*tar.Writer) error 24 file string 25 expectedErr error 26 }{ 27 { 28 description: "simple", 29 name: "simple.tar", 30 populate: func(tw *tar.Writer) error { 31 return writeToFile(tw, "simple.txt", []byte("hello, world"), time.Now()) 32 }, 33 file: "./simple.txt", 34 }, 35 } 36 for _, tc := range tests { 37 t.Run(tc.description, func(t *testing.T) { 38 assert := assert.New(t) 39 require := require.New(t) 40 41 got, err := newTGZ(tc.name, tc.populate) 42 43 if tc.expectedErr == nil { 44 require.NoError(err) 45 require.NotNil(got) 46 47 gz, err := gzip.NewReader(bytes.NewReader(got)) 48 require.NoError(err) 49 require.NotNil(gz) 50 defer gz.Close() // nolint: errcheck 51 52 assert.True(tarContains(t, gz, tc.file)) 53 return 54 } 55 56 require.Error(err) 57 if !errors.Is(tc.expectedErr, unknownErr) { 58 assert.ErrorIs(err, tc.expectedErr) 59 } 60 }) 61 } 62 } 63 64 func extractFileFromTar(tb testing.TB, tarFile []byte, filename string) []byte { 65 tb.Helper() 66 67 tr := tar.NewReader(bytes.NewReader(tarFile)) 68 for { 69 hdr, err := tr.Next() 70 if errors.Is(err, io.EOF) { 71 break // End of archive 72 } 73 require.NoError(tb, err) 74 75 if path.Join("/", hdr.Name) != path.Join("/", filename) { 76 continue 77 } 78 79 fileContents, err := io.ReadAll(tr) 80 require.NoError(tb, err) 81 82 return fileContents 83 } 84 85 tb.Fatalf("file %q does not exist in tar", filename) 86 87 return nil 88 } 89 90 func tarContains(tb testing.TB, r io.Reader, filename string) bool { 91 tb.Helper() 92 93 tr := tar.NewReader(r) 94 for { 95 hdr, err := tr.Next() 96 if errors.Is(err, io.EOF) { 97 break // End of archive 98 } 99 require.NoError(tb, err) 100 101 if path.Join("/", hdr.Name) == path.Join("/", filename) { // nolint:gosec 102 return true 103 } 104 } 105 106 return false 107 } 108 109 func tarContents(tb testing.TB, tarFile []byte) []string { 110 tb.Helper() 111 112 contents := []string{} 113 114 tr := tar.NewReader(bytes.NewReader(tarFile)) 115 for { 116 hdr, err := tr.Next() 117 if errors.Is(err, io.EOF) { 118 break // End of archive 119 } 120 require.NoError(tb, err) 121 122 contents = append(contents, hdr.Name) 123 } 124 125 return contents 126 } 127 128 func getTree(tb testing.TB, tarFile []byte) []string { 129 tb.Helper() 130 131 var result []string 132 tr := tar.NewReader(bytes.NewReader(tarFile)) 133 for { 134 hdr, err := tr.Next() 135 if errors.Is(err, io.EOF) { 136 break // End of archive 137 } 138 require.NoError(tb, err) 139 140 result = append(result, hdr.Name) 141 } 142 143 return result 144 } 145 146 func extractFileHeaderFromTar(tb testing.TB, tarFile []byte, filename string) *tar.Header { 147 tb.Helper() 148 149 tr := tar.NewReader(bytes.NewReader(tarFile)) 150 for { 151 hdr, err := tr.Next() 152 if errors.Is(err, io.EOF) { 153 break // End of archive 154 } 155 require.NoError(tb, err) 156 157 if path.Join("/", hdr.Name) != path.Join("/", filename) { // nolint:gosec 158 continue 159 } 160 161 return hdr 162 } 163 164 tb.Fatalf("file %q does not exist in tar", filename) 165 166 return nil 167 }