mirror of
https://github.com/go-gitea/gitea
synced 2024-12-23 00:54:28 +00:00
581e52b3e7
It is mentioned in https://man.archlinux.org/man/PKGBUILD.5: 'The variable is not allowed to contain colons, forward slashes, hyphens, or whitespace.' `_` is also an allowed character, and some software in the Arch Linux AUR uses this naming convention. --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
170 lines
4.7 KiB
Go
170 lines
4.7 KiB
Go
// 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)
|
|
})
|
|
}
|