You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

metadata_test.go 4.5KB

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