code.gitea.io/gitea@v1.19.3/modules/packages/conda/metadata_test.go (about) 1 // Copyright 2022 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package conda 5 6 import ( 7 "archive/tar" 8 "archive/zip" 9 "bytes" 10 "io" 11 "testing" 12 13 "github.com/dsnet/compress/bzip2" 14 "github.com/klauspost/compress/zstd" 15 "github.com/stretchr/testify/assert" 16 ) 17 18 const ( 19 packageName = "gitea" 20 packageVersion = "1.0.1" 21 description = "Package Description" 22 projectURL = "https://gitea.io" 23 repositoryURL = "https://gitea.io/gitea/gitea" 24 documentationURL = "https://docs.gitea.io" 25 ) 26 27 func TestParsePackage(t *testing.T) { 28 createArchive := func(files map[string][]byte) *bytes.Buffer { 29 var buf bytes.Buffer 30 tw := tar.NewWriter(&buf) 31 for filename, content := range files { 32 hdr := &tar.Header{ 33 Name: filename, 34 Mode: 0o600, 35 Size: int64(len(content)), 36 } 37 tw.WriteHeader(hdr) 38 tw.Write(content) 39 } 40 tw.Close() 41 return &buf 42 } 43 44 t.Run("MissingIndexFile", func(t *testing.T) { 45 buf := createArchive(map[string][]byte{"dummy.txt": {}}) 46 47 p, err := parsePackageTar(buf) 48 assert.Nil(t, p) 49 assert.ErrorIs(t, err, ErrInvalidStructure) 50 }) 51 52 t.Run("MissingAboutFile", func(t *testing.T) { 53 buf := createArchive(map[string][]byte{"info/index.json": []byte(`{"name":"name","version":"1.0"}`)}) 54 55 p, err := parsePackageTar(buf) 56 assert.NotNil(t, p) 57 assert.NoError(t, err) 58 59 assert.Equal(t, "name", p.Name) 60 assert.Equal(t, "1.0", p.Version) 61 assert.Empty(t, p.VersionMetadata.ProjectURL) 62 }) 63 64 t.Run("InvalidName", func(t *testing.T) { 65 for _, name := range []string{"", "name!", "nAMe"} { 66 buf := createArchive(map[string][]byte{"info/index.json": []byte(`{"name":"` + name + `","version":"1.0"}`)}) 67 68 p, err := parsePackageTar(buf) 69 assert.Nil(t, p) 70 assert.ErrorIs(t, err, ErrInvalidName) 71 } 72 }) 73 74 t.Run("InvalidVersion", func(t *testing.T) { 75 for _, version := range []string{"", "1.0-2"} { 76 buf := createArchive(map[string][]byte{"info/index.json": []byte(`{"name":"name","version":"` + version + `"}`)}) 77 78 p, err := parsePackageTar(buf) 79 assert.Nil(t, p) 80 assert.ErrorIs(t, err, ErrInvalidVersion) 81 } 82 }) 83 84 t.Run("Valid", func(t *testing.T) { 85 buf := createArchive(map[string][]byte{ 86 "info/index.json": []byte(`{"name":"` + packageName + `","version":"` + packageVersion + `","subdir":"linux-64"}`), 87 "info/about.json": []byte(`{"description":"` + description + `","dev_url":"` + repositoryURL + `","doc_url":"` + documentationURL + `","home":"` + projectURL + `"}`), 88 }) 89 90 p, err := parsePackageTar(buf) 91 assert.NotNil(t, p) 92 assert.NoError(t, err) 93 94 assert.Equal(t, packageName, p.Name) 95 assert.Equal(t, packageVersion, p.Version) 96 assert.Equal(t, "linux-64", p.Subdir) 97 assert.Equal(t, description, p.VersionMetadata.Description) 98 assert.Equal(t, projectURL, p.VersionMetadata.ProjectURL) 99 assert.Equal(t, repositoryURL, p.VersionMetadata.RepositoryURL) 100 assert.Equal(t, documentationURL, p.VersionMetadata.DocumentationURL) 101 }) 102 103 t.Run(".tar.bz2", func(t *testing.T) { 104 tarArchive := createArchive(map[string][]byte{ 105 "info/index.json": []byte(`{"name":"` + packageName + `","version":"` + packageVersion + `"}`), 106 }) 107 108 var buf bytes.Buffer 109 bw, _ := bzip2.NewWriter(&buf, nil) 110 io.Copy(bw, tarArchive) 111 bw.Close() 112 113 br := bytes.NewReader(buf.Bytes()) 114 115 p, err := ParsePackageBZ2(br) 116 assert.NotNil(t, p) 117 assert.NoError(t, err) 118 119 assert.Equal(t, packageName, p.Name) 120 assert.Equal(t, packageVersion, p.Version) 121 assert.False(t, p.FileMetadata.IsCondaPackage) 122 }) 123 124 t.Run(".conda", func(t *testing.T) { 125 tarArchive := createArchive(map[string][]byte{ 126 "info/index.json": []byte(`{"name":"` + packageName + `","version":"` + packageVersion + `"}`), 127 }) 128 129 var infoBuf bytes.Buffer 130 zsw, _ := zstd.NewWriter(&infoBuf) 131 io.Copy(zsw, tarArchive) 132 zsw.Close() 133 134 var buf bytes.Buffer 135 zpw := zip.NewWriter(&buf) 136 w, _ := zpw.Create("info-x.tar.zst") 137 w.Write(infoBuf.Bytes()) 138 zpw.Close() 139 140 br := bytes.NewReader(buf.Bytes()) 141 142 p, err := ParsePackageConda(br, int64(br.Len())) 143 assert.NotNil(t, p) 144 assert.NoError(t, err) 145 146 assert.Equal(t, packageName, p.Name) 147 assert.Equal(t, packageVersion, p.Version) 148 assert.True(t, p.FileMetadata.IsCondaPackage) 149 }) 150 }