gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package arch
  4. import (
  5. "archive/tar"
  6. "bytes"
  7. "compress/gzip"
  8. "io"
  9. "testing"
  10. "github.com/klauspost/compress/zstd"
  11. "github.com/stretchr/testify/assert"
  12. "github.com/ulikunitz/xz"
  13. )
  14. const (
  15. packageName = "gitea"
  16. packageVersion = "1.0.1"
  17. packageDescription = "Package Description"
  18. packageProjectURL = "https://gitea.com"
  19. packagePackager = "KN4CK3R <packager@gitea.com>"
  20. )
  21. func createPKGINFOContent(name, version string) []byte {
  22. return []byte(`pkgname = ` + name + `
  23. pkgbase = ` + name + `
  24. pkgver = ` + version + `
  25. pkgdesc = ` + packageDescription + `
  26. url = ` + packageProjectURL + `
  27. # comment
  28. group=group
  29. builddate = 1678834800
  30. size = 123456
  31. arch = x86_64
  32. license = MIT
  33. packager = ` + packagePackager + `
  34. depend = common
  35. xdata = value
  36. depend = gitea
  37. provides = common
  38. provides = gitea
  39. optdepend = hex
  40. replaces = gogs
  41. checkdepend = common
  42. makedepend = cmake
  43. conflict = ninja
  44. backup = usr/bin/paket1`)
  45. }
  46. func TestParsePackage(t *testing.T) {
  47. createPackage := func(compression string, files map[string][]byte) io.Reader {
  48. var buf bytes.Buffer
  49. var cw io.WriteCloser
  50. switch compression {
  51. case "zst":
  52. cw, _ = zstd.NewWriter(&buf)
  53. case "xz":
  54. cw, _ = xz.NewWriter(&buf)
  55. case "gz":
  56. cw = gzip.NewWriter(&buf)
  57. }
  58. tw := tar.NewWriter(cw)
  59. for name, content := range files {
  60. hdr := &tar.Header{
  61. Name: name,
  62. Mode: 0o600,
  63. Size: int64(len(content)),
  64. }
  65. tw.WriteHeader(hdr)
  66. tw.Write(content)
  67. }
  68. tw.Close()
  69. cw.Close()
  70. return &buf
  71. }
  72. for _, c := range []string{"gz", "xz", "zst"} {
  73. t.Run(c, func(t *testing.T) {
  74. t.Run("MissingPKGINFOFile", func(t *testing.T) {
  75. data := createPackage(c, map[string][]byte{"dummy.txt": {}})
  76. pp, err := ParsePackage(data)
  77. assert.Nil(t, pp)
  78. assert.ErrorIs(t, err, ErrMissingPKGINFOFile)
  79. })
  80. t.Run("InvalidPKGINFOFile", func(t *testing.T) {
  81. data := createPackage(c, map[string][]byte{".PKGINFO": {}})
  82. pp, err := ParsePackage(data)
  83. assert.Nil(t, pp)
  84. assert.ErrorIs(t, err, ErrInvalidName)
  85. })
  86. t.Run("Valid", func(t *testing.T) {
  87. data := createPackage(c, map[string][]byte{
  88. ".PKGINFO": createPKGINFOContent(packageName, packageVersion),
  89. "/test/dummy.txt": {},
  90. })
  91. p, err := ParsePackage(data)
  92. assert.NoError(t, err)
  93. assert.NotNil(t, p)
  94. assert.ElementsMatch(t, []string{"/test/dummy.txt"}, p.FileMetadata.Files)
  95. })
  96. })
  97. }
  98. }
  99. func TestParsePackageInfo(t *testing.T) {
  100. t.Run("InvalidName", func(t *testing.T) {
  101. data := createPKGINFOContent("", packageVersion)
  102. p, err := ParsePackageInfo(bytes.NewReader(data))
  103. assert.Nil(t, p)
  104. assert.ErrorIs(t, err, ErrInvalidName)
  105. })
  106. t.Run("Regexp", func(t *testing.T) {
  107. assert.Regexp(t, versionPattern, "1.2_3~4+5")
  108. assert.Regexp(t, versionPattern, "1:2_3~4+5")
  109. assert.NotRegexp(t, versionPattern, "a:1.0.0-1")
  110. assert.NotRegexp(t, versionPattern, "0.0.1/1-1")
  111. assert.NotRegexp(t, versionPattern, "1.0.0 -1")
  112. })
  113. t.Run("InvalidVersion", func(t *testing.T) {
  114. data := createPKGINFOContent(packageName, "")
  115. p, err := ParsePackageInfo(bytes.NewReader(data))
  116. assert.Nil(t, p)
  117. assert.ErrorIs(t, err, ErrInvalidVersion)
  118. })
  119. t.Run("Valid", func(t *testing.T) {
  120. data := createPKGINFOContent(packageName, packageVersion)
  121. p, err := ParsePackageInfo(bytes.NewReader(data))
  122. assert.NoError(t, err)
  123. assert.NotNil(t, p)
  124. assert.Equal(t, packageName, p.Name)
  125. assert.Equal(t, packageName, p.FileMetadata.Base)
  126. assert.Equal(t, packageVersion, p.Version)
  127. assert.Equal(t, packageDescription, p.VersionMetadata.Description)
  128. assert.Equal(t, packagePackager, p.FileMetadata.Packager)
  129. assert.Equal(t, packageProjectURL, p.VersionMetadata.ProjectURL)
  130. assert.ElementsMatch(t, []string{"MIT"}, p.VersionMetadata.Licenses)
  131. assert.EqualValues(t, 1678834800, p.FileMetadata.BuildDate)
  132. assert.EqualValues(t, 123456, p.FileMetadata.InstalledSize)
  133. assert.Equal(t, "x86_64", p.FileMetadata.Architecture)
  134. assert.ElementsMatch(t, []string{"value"}, p.FileMetadata.XData)
  135. assert.ElementsMatch(t, []string{"group"}, p.FileMetadata.Groups)
  136. assert.ElementsMatch(t, []string{"common", "gitea"}, p.FileMetadata.Provides)
  137. assert.ElementsMatch(t, []string{"common", "gitea"}, p.FileMetadata.Depends)
  138. assert.ElementsMatch(t, []string{"gogs"}, p.FileMetadata.Replaces)
  139. assert.ElementsMatch(t, []string{"hex"}, p.FileMetadata.OptDepends)
  140. assert.ElementsMatch(t, []string{"common"}, p.FileMetadata.CheckDepends)
  141. assert.ElementsMatch(t, []string{"ninja"}, p.FileMetadata.Conflicts)
  142. assert.ElementsMatch(t, []string{"cmake"}, p.FileMetadata.MakeDepends)
  143. assert.ElementsMatch(t, []string{"usr/bin/paket1"}, p.FileMetadata.Backup)
  144. })
  145. }