code.gitea.io/gitea@v1.22.3/modules/packages/alpine/metadata_test.go (about)

     1  // Copyright 2023 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package alpine
     5  
     6  import (
     7  	"archive/tar"
     8  	"bytes"
     9  	"compress/gzip"
    10  	"io"
    11  	"testing"
    12  
    13  	"github.com/stretchr/testify/assert"
    14  )
    15  
    16  const (
    17  	packageName        = "gitea"
    18  	packageVersion     = "1.0.1"
    19  	packageDescription = "Package Description"
    20  	packageProjectURL  = "https://gitea.io"
    21  	packageMaintainer  = "KN4CK3R <dummy@gitea.io>"
    22  )
    23  
    24  func createPKGINFOContent(name, version string) []byte {
    25  	return []byte(`pkgname = ` + name + `
    26  pkgver = ` + version + `
    27  pkgdesc = ` + packageDescription + `
    28  url = ` + packageProjectURL + `
    29  # comment
    30  builddate = 1678834800
    31  packager = Gitea <pack@ag.er>
    32  size = 123456
    33  arch = aarch64
    34  origin = origin
    35  commit = 1111e709613fbc979651b09ac2bc27c6591a9999
    36  maintainer = ` + packageMaintainer + `
    37  license = MIT
    38  depend = common
    39  install_if = value
    40  depend = gitea
    41  provides = common
    42  provides = gitea`)
    43  }
    44  
    45  func TestParsePackage(t *testing.T) {
    46  	createPackage := func(name string, content []byte) io.Reader {
    47  		names := []string{"first.stream", name}
    48  		contents := [][]byte{{0}, content}
    49  
    50  		var buf bytes.Buffer
    51  		zw := gzip.NewWriter(&buf)
    52  
    53  		for i := range names {
    54  			if i != 0 {
    55  				zw.Close()
    56  				zw.Reset(&buf)
    57  			}
    58  
    59  			tw := tar.NewWriter(zw)
    60  			hdr := &tar.Header{
    61  				Name: names[i],
    62  				Mode: 0o600,
    63  				Size: int64(len(contents[i])),
    64  			}
    65  			tw.WriteHeader(hdr)
    66  			tw.Write(contents[i])
    67  			tw.Close()
    68  		}
    69  
    70  		zw.Close()
    71  
    72  		return &buf
    73  	}
    74  
    75  	t.Run("MissingPKGINFOFile", func(t *testing.T) {
    76  		data := createPackage("dummy.txt", []byte{})
    77  
    78  		pp, err := ParsePackage(data)
    79  		assert.Nil(t, pp)
    80  		assert.ErrorIs(t, err, ErrMissingPKGINFOFile)
    81  	})
    82  
    83  	t.Run("InvalidPKGINFOFile", func(t *testing.T) {
    84  		data := createPackage(".PKGINFO", []byte{})
    85  
    86  		pp, err := ParsePackage(data)
    87  		assert.Nil(t, pp)
    88  		assert.ErrorIs(t, err, ErrInvalidName)
    89  	})
    90  
    91  	t.Run("Valid", func(t *testing.T) {
    92  		data := createPackage(".PKGINFO", createPKGINFOContent(packageName, packageVersion))
    93  
    94  		p, err := ParsePackage(data)
    95  		assert.NoError(t, err)
    96  		assert.NotNil(t, p)
    97  
    98  		assert.Equal(t, "Q1SRYURM5+uQDqfHSwTnNIOIuuDVQ=", p.FileMetadata.Checksum)
    99  	})
   100  }
   101  
   102  func TestParsePackageInfo(t *testing.T) {
   103  	t.Run("InvalidName", func(t *testing.T) {
   104  		data := createPKGINFOContent("", packageVersion)
   105  
   106  		p, err := ParsePackageInfo(bytes.NewReader(data))
   107  		assert.Nil(t, p)
   108  		assert.ErrorIs(t, err, ErrInvalidName)
   109  	})
   110  
   111  	t.Run("InvalidVersion", func(t *testing.T) {
   112  		data := createPKGINFOContent(packageName, "")
   113  
   114  		p, err := ParsePackageInfo(bytes.NewReader(data))
   115  		assert.Nil(t, p)
   116  		assert.ErrorIs(t, err, ErrInvalidVersion)
   117  	})
   118  
   119  	t.Run("Valid", func(t *testing.T) {
   120  		data := createPKGINFOContent(packageName, packageVersion)
   121  
   122  		p, err := ParsePackageInfo(bytes.NewReader(data))
   123  		assert.NoError(t, err)
   124  		assert.NotNil(t, p)
   125  
   126  		assert.Equal(t, packageName, p.Name)
   127  		assert.Equal(t, packageVersion, p.Version)
   128  		assert.Equal(t, packageDescription, p.VersionMetadata.Description)
   129  		assert.Equal(t, packageMaintainer, p.VersionMetadata.Maintainer)
   130  		assert.Equal(t, packageProjectURL, p.VersionMetadata.ProjectURL)
   131  		assert.Equal(t, "MIT", p.VersionMetadata.License)
   132  		assert.Empty(t, p.FileMetadata.Checksum)
   133  		assert.Equal(t, "Gitea <pack@ag.er>", p.FileMetadata.Packager)
   134  		assert.EqualValues(t, 1678834800, p.FileMetadata.BuildDate)
   135  		assert.EqualValues(t, 123456, p.FileMetadata.Size)
   136  		assert.Equal(t, "aarch64", p.FileMetadata.Architecture)
   137  		assert.Equal(t, "origin", p.FileMetadata.Origin)
   138  		assert.Equal(t, "1111e709613fbc979651b09ac2bc27c6591a9999", p.FileMetadata.CommitHash)
   139  		assert.Equal(t, "value", p.FileMetadata.InstallIf)
   140  		assert.ElementsMatch(t, []string{"common", "gitea"}, p.FileMetadata.Provides)
   141  		assert.ElementsMatch(t, []string{"common", "gitea"}, p.FileMetadata.Dependencies)
   142  	})
   143  }