1
1
mirror of https://github.com/goreleaser/nfpm synced 2025-04-11 20:23:38 +02:00
nfpm/ipk/tar_test.go
Weston Schmidt bc5c3bd876
feat: support for ipk packages (#818)
Implements #507.

* Adds ipk support for keywords used by OpenWRT and Yocto.
* MD5sum is explicitly excluded due to insecurity.
* SHA256Sum excluded due packages not being individually signed,
  instead, the feed of packages is checksummed and signed externally.
* Adds code to nfpm package to automatically enumerate the supported
  packaging types where possible.
2024-05-08 16:02:39 -03:00

168 lines
3.1 KiB
Go

package ipk
import (
"archive/tar"
"bytes"
"compress/gzip"
"errors"
"io"
"path"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func Test_newTGZ(t *testing.T) {
unknownErr := errors.New("unknown error")
tests := []struct {
description string
name string
populate func(*tar.Writer) error
file string
expectedErr error
}{
{
description: "simple",
name: "simple.tar",
populate: func(tw *tar.Writer) error {
return writeToFile(tw, "simple.txt", []byte("hello, world"), time.Now())
},
file: "./simple.txt",
},
}
for _, tc := range tests {
t.Run(tc.description, func(t *testing.T) {
assert := assert.New(t)
require := require.New(t)
got, err := newTGZ(tc.name, tc.populate)
if tc.expectedErr == nil {
require.NoError(err)
require.NotNil(got)
gz, err := gzip.NewReader(bytes.NewReader(got))
require.NoError(err)
require.NotNil(gz)
defer gz.Close() // nolint: errcheck
assert.True(tarContains(t, gz, tc.file))
return
}
require.Error(err)
if !errors.Is(tc.expectedErr, unknownErr) {
assert.ErrorIs(err, tc.expectedErr)
}
})
}
}
func extractFileFromTar(tb testing.TB, tarFile []byte, filename string) []byte {
tb.Helper()
tr := tar.NewReader(bytes.NewReader(tarFile))
for {
hdr, err := tr.Next()
if errors.Is(err, io.EOF) {
break // End of archive
}
require.NoError(tb, err)
if path.Join("/", hdr.Name) != path.Join("/", filename) {
continue
}
fileContents, err := io.ReadAll(tr)
require.NoError(tb, err)
return fileContents
}
tb.Fatalf("file %q does not exist in tar", filename)
return nil
}
func tarContains(tb testing.TB, r io.Reader, filename string) bool {
tb.Helper()
tr := tar.NewReader(r)
for {
hdr, err := tr.Next()
if errors.Is(err, io.EOF) {
break // End of archive
}
require.NoError(tb, err)
if path.Join("/", hdr.Name) == path.Join("/", filename) { // nolint:gosec
return true
}
}
return false
}
func tarContents(tb testing.TB, tarFile []byte) []string {
tb.Helper()
contents := []string{}
tr := tar.NewReader(bytes.NewReader(tarFile))
for {
hdr, err := tr.Next()
if errors.Is(err, io.EOF) {
break // End of archive
}
require.NoError(tb, err)
contents = append(contents, hdr.Name)
}
return contents
}
func getTree(tb testing.TB, tarFile []byte) []string {
tb.Helper()
var result []string
tr := tar.NewReader(bytes.NewReader(tarFile))
for {
hdr, err := tr.Next()
if errors.Is(err, io.EOF) {
break // End of archive
}
require.NoError(tb, err)
result = append(result, hdr.Name)
}
return result
}
func extractFileHeaderFromTar(tb testing.TB, tarFile []byte, filename string) *tar.Header {
tb.Helper()
tr := tar.NewReader(bytes.NewReader(tarFile))
for {
hdr, err := tr.Next()
if errors.Is(err, io.EOF) {
break // End of archive
}
require.NoError(tb, err)
if path.Join("/", hdr.Name) != path.Join("/", filename) { // nolint:gosec
continue
}
return hdr
}
tb.Fatalf("file %q does not exist in tar", filename)
return nil
}