gitea源码

metadata_test.go 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package debian
  4. import (
  5. "archive/tar"
  6. "bytes"
  7. "compress/gzip"
  8. "io"
  9. "testing"
  10. "code.gitea.io/gitea/modules/util"
  11. "code.gitea.io/gitea/modules/zstd"
  12. "github.com/blakesmith/ar"
  13. "github.com/stretchr/testify/assert"
  14. "github.com/ulikunitz/xz"
  15. )
  16. const (
  17. packageName = "gitea"
  18. packageVersion = "0:1.0.1-te~st"
  19. packageArchitecture = "amd64"
  20. packageAuthor = "KN4CK3R"
  21. description = "Description with multiple lines."
  22. projectURL = "https://gitea.io"
  23. )
  24. func TestParsePackage(t *testing.T) {
  25. createArchive := func(files map[string][]byte) io.Reader {
  26. var buf bytes.Buffer
  27. aw := ar.NewWriter(&buf)
  28. aw.WriteGlobalHeader()
  29. for filename, content := range files {
  30. hdr := &ar.Header{
  31. Name: filename,
  32. Mode: 0o600,
  33. Size: int64(len(content)),
  34. }
  35. aw.WriteHeader(hdr)
  36. aw.Write(content)
  37. }
  38. return &buf
  39. }
  40. t.Run("MissingControlFile", func(t *testing.T) {
  41. data := createArchive(map[string][]byte{"dummy.txt": {}})
  42. p, err := ParsePackage(data)
  43. assert.Nil(t, p)
  44. assert.ErrorIs(t, err, ErrMissingControlFile)
  45. })
  46. t.Run("Compression", func(t *testing.T) {
  47. t.Run("Unsupported", func(t *testing.T) {
  48. data := createArchive(map[string][]byte{"control.tar.foo": {}})
  49. p, err := ParsePackage(data)
  50. assert.Nil(t, p)
  51. assert.ErrorIs(t, err, ErrUnsupportedCompression)
  52. })
  53. var buf bytes.Buffer
  54. tw := tar.NewWriter(&buf)
  55. tw.WriteHeader(&tar.Header{
  56. Name: "control",
  57. Mode: 0o600,
  58. Size: 50,
  59. })
  60. tw.Write([]byte("Package: gitea\nVersion: 1.0.0\nArchitecture: amd64\n"))
  61. tw.Close()
  62. cases := []struct {
  63. Extension string
  64. WriterFactory func(io.Writer) io.WriteCloser
  65. }{
  66. {
  67. Extension: "",
  68. WriterFactory: func(w io.Writer) io.WriteCloser {
  69. return util.NopCloser{Writer: w}
  70. },
  71. },
  72. {
  73. Extension: ".gz",
  74. WriterFactory: func(w io.Writer) io.WriteCloser {
  75. return gzip.NewWriter(w)
  76. },
  77. },
  78. {
  79. Extension: ".xz",
  80. WriterFactory: func(w io.Writer) io.WriteCloser {
  81. xw, _ := xz.NewWriter(w)
  82. return xw
  83. },
  84. },
  85. {
  86. Extension: ".zst",
  87. WriterFactory: func(w io.Writer) io.WriteCloser {
  88. zw, _ := zstd.NewWriter(w)
  89. return zw
  90. },
  91. },
  92. }
  93. for _, c := range cases {
  94. t.Run(c.Extension, func(t *testing.T) {
  95. var cbuf bytes.Buffer
  96. w := c.WriterFactory(&cbuf)
  97. w.Write(buf.Bytes())
  98. w.Close()
  99. data := createArchive(map[string][]byte{"control.tar" + c.Extension: cbuf.Bytes()})
  100. p, err := ParsePackage(data)
  101. assert.NotNil(t, p)
  102. assert.NoError(t, err)
  103. assert.Equal(t, "gitea", p.Name)
  104. t.Run("TrailingSlash", func(t *testing.T) {
  105. data := createArchive(map[string][]byte{"control.tar" + c.Extension + "/": cbuf.Bytes()})
  106. p, err := ParsePackage(data)
  107. assert.NotNil(t, p)
  108. assert.NoError(t, err)
  109. assert.Equal(t, "gitea", p.Name)
  110. })
  111. })
  112. }
  113. })
  114. }
  115. func TestParseControlFile(t *testing.T) {
  116. buildContent := func(name, version, architecture string) *bytes.Buffer {
  117. var buf bytes.Buffer
  118. buf.WriteString("Package: " + name + "\nVersion: " + version + "\nArchitecture: " + architecture + "\nMaintainer: " + packageAuthor + " <kn4ck3r@gitea.io>\nHomepage: " + projectURL + "\nDepends: a,\n b\nDescription: Description\n with multiple\n lines.")
  119. return &buf
  120. }
  121. t.Run("InvalidName", func(t *testing.T) {
  122. for _, name := range []string{"", "-cd"} {
  123. p, err := ParseControlFile(buildContent(name, packageVersion, packageArchitecture))
  124. assert.Nil(t, p)
  125. assert.ErrorIs(t, err, ErrInvalidName)
  126. }
  127. })
  128. t.Run("InvalidVersion", func(t *testing.T) {
  129. for _, version := range []string{"", "1-", ":1.0", "1_0"} {
  130. p, err := ParseControlFile(buildContent(packageName, version, packageArchitecture))
  131. assert.Nil(t, p)
  132. assert.ErrorIs(t, err, ErrInvalidVersion)
  133. }
  134. })
  135. t.Run("InvalidArchitecture", func(t *testing.T) {
  136. p, err := ParseControlFile(buildContent(packageName, packageVersion, ""))
  137. assert.Nil(t, p)
  138. assert.ErrorIs(t, err, ErrInvalidArchitecture)
  139. })
  140. t.Run("Valid", func(t *testing.T) {
  141. content := buildContent(packageName, packageVersion, packageArchitecture)
  142. full := content.String()
  143. p, err := ParseControlFile(content)
  144. assert.NoError(t, err)
  145. assert.NotNil(t, p)
  146. assert.Equal(t, packageName, p.Name)
  147. assert.Equal(t, packageVersion, p.Version)
  148. assert.Equal(t, packageArchitecture, p.Architecture)
  149. assert.Equal(t, description, p.Metadata.Description)
  150. assert.Equal(t, projectURL, p.Metadata.ProjectURL)
  151. assert.Equal(t, packageAuthor, p.Metadata.Maintainer)
  152. assert.Equal(t, []string{"a", "b"}, p.Metadata.Dependencies)
  153. assert.Equal(t, full, p.Control)
  154. })
  155. }