| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- // Copyright 2023 The Gitea Authors. All rights reserved.
- // SPDX-License-Identifier: MIT
-
- package arch
-
- import (
- "archive/tar"
- "bytes"
- "compress/gzip"
- "io"
- "testing"
-
- "github.com/klauspost/compress/zstd"
- "github.com/stretchr/testify/assert"
- "github.com/ulikunitz/xz"
- )
-
- const (
- packageName = "gitea"
- packageVersion = "1.0.1"
- packageDescription = "Package Description"
- packageProjectURL = "https://gitea.com"
- packagePackager = "KN4CK3R <packager@gitea.com>"
- )
-
- func createPKGINFOContent(name, version string) []byte {
- return []byte(`pkgname = ` + name + `
- pkgbase = ` + name + `
- pkgver = ` + version + `
- pkgdesc = ` + packageDescription + `
- url = ` + packageProjectURL + `
- # comment
- group=group
- builddate = 1678834800
- size = 123456
- arch = x86_64
- license = MIT
- packager = ` + packagePackager + `
- depend = common
- xdata = value
- depend = gitea
- provides = common
- provides = gitea
- optdepend = hex
- replaces = gogs
- checkdepend = common
- makedepend = cmake
- conflict = ninja
- backup = usr/bin/paket1`)
- }
-
- func TestParsePackage(t *testing.T) {
- createPackage := func(compression string, files map[string][]byte) io.Reader {
- var buf bytes.Buffer
- var cw io.WriteCloser
- switch compression {
- case "zst":
- cw, _ = zstd.NewWriter(&buf)
- case "xz":
- cw, _ = xz.NewWriter(&buf)
- case "gz":
- cw = gzip.NewWriter(&buf)
- }
- tw := tar.NewWriter(cw)
-
- for name, content := range files {
- hdr := &tar.Header{
- Name: name,
- Mode: 0o600,
- Size: int64(len(content)),
- }
- tw.WriteHeader(hdr)
- tw.Write(content)
- }
-
- tw.Close()
- cw.Close()
-
- return &buf
- }
-
- for _, c := range []string{"gz", "xz", "zst"} {
- t.Run(c, func(t *testing.T) {
- t.Run("MissingPKGINFOFile", func(t *testing.T) {
- data := createPackage(c, map[string][]byte{"dummy.txt": {}})
-
- pp, err := ParsePackage(data)
- assert.Nil(t, pp)
- assert.ErrorIs(t, err, ErrMissingPKGINFOFile)
- })
-
- t.Run("InvalidPKGINFOFile", func(t *testing.T) {
- data := createPackage(c, map[string][]byte{".PKGINFO": {}})
-
- pp, err := ParsePackage(data)
- assert.Nil(t, pp)
- assert.ErrorIs(t, err, ErrInvalidName)
- })
-
- t.Run("Valid", func(t *testing.T) {
- data := createPackage(c, map[string][]byte{
- ".PKGINFO": createPKGINFOContent(packageName, packageVersion),
- "/test/dummy.txt": {},
- })
-
- p, err := ParsePackage(data)
- assert.NoError(t, err)
- assert.NotNil(t, p)
-
- assert.ElementsMatch(t, []string{"/test/dummy.txt"}, p.FileMetadata.Files)
- })
- })
- }
- }
-
- func TestParsePackageInfo(t *testing.T) {
- t.Run("InvalidName", func(t *testing.T) {
- data := createPKGINFOContent("", packageVersion)
-
- p, err := ParsePackageInfo(bytes.NewReader(data))
- assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidName)
- })
-
- t.Run("Regexp", func(t *testing.T) {
- assert.Regexp(t, versionPattern, "1.2_3~4+5")
- assert.Regexp(t, versionPattern, "1:2_3~4+5")
- assert.NotRegexp(t, versionPattern, "a:1.0.0-1")
- assert.NotRegexp(t, versionPattern, "0.0.1/1-1")
- assert.NotRegexp(t, versionPattern, "1.0.0 -1")
- })
-
- t.Run("InvalidVersion", func(t *testing.T) {
- data := createPKGINFOContent(packageName, "")
-
- p, err := ParsePackageInfo(bytes.NewReader(data))
- assert.Nil(t, p)
- assert.ErrorIs(t, err, ErrInvalidVersion)
- })
-
- t.Run("Valid", func(t *testing.T) {
- data := createPKGINFOContent(packageName, packageVersion)
-
- p, err := ParsePackageInfo(bytes.NewReader(data))
- assert.NoError(t, err)
- assert.NotNil(t, p)
-
- assert.Equal(t, packageName, p.Name)
- assert.Equal(t, packageName, p.FileMetadata.Base)
- assert.Equal(t, packageVersion, p.Version)
- assert.Equal(t, packageDescription, p.VersionMetadata.Description)
- assert.Equal(t, packagePackager, p.FileMetadata.Packager)
- assert.Equal(t, packageProjectURL, p.VersionMetadata.ProjectURL)
- assert.ElementsMatch(t, []string{"MIT"}, p.VersionMetadata.Licenses)
- assert.EqualValues(t, 1678834800, p.FileMetadata.BuildDate)
- assert.EqualValues(t, 123456, p.FileMetadata.InstalledSize)
- assert.Equal(t, "x86_64", p.FileMetadata.Architecture)
- assert.ElementsMatch(t, []string{"value"}, p.FileMetadata.XData)
- assert.ElementsMatch(t, []string{"group"}, p.FileMetadata.Groups)
- assert.ElementsMatch(t, []string{"common", "gitea"}, p.FileMetadata.Provides)
- assert.ElementsMatch(t, []string{"common", "gitea"}, p.FileMetadata.Depends)
- assert.ElementsMatch(t, []string{"gogs"}, p.FileMetadata.Replaces)
- assert.ElementsMatch(t, []string{"hex"}, p.FileMetadata.OptDepends)
- assert.ElementsMatch(t, []string{"common"}, p.FileMetadata.CheckDepends)
- assert.ElementsMatch(t, []string{"ninja"}, p.FileMetadata.Conflicts)
- assert.ElementsMatch(t, []string{"cmake"}, p.FileMetadata.MakeDepends)
- assert.ElementsMatch(t, []string{"usr/bin/paket1"}, p.FileMetadata.Backup)
- })
- }
|