mirror of
https://github.com/goreleaser/nfpm
synced 2025-04-11 20:23:38 +02:00
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.
168 lines
3.1 KiB
Go
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
|
|
}
|