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  }