github.com/vchain-us/vcn@v0.9.11-0.20210921212052-a2484d23c0b3/pkg/bundle/manifest_test.go (about)

     1  /*
     2   * Copyright (c) 2018-2020 vChain, Inc. All Rights Reserved.
     3   * This software is released under GPL3.
     4   * The full license information can be found under:
     5   * https://www.gnu.org/licenses/gpl-3.0.en.html
     6   *
     7   */
     8  
     9  package bundle
    10  
    11  import (
    12  	"encoding/json"
    13  	"io"
    14  	"io/ioutil"
    15  	"log"
    16  	"os"
    17  	"strings"
    18  
    19  	"github.com/opencontainers/go-digest"
    20  
    21  	"github.com/stretchr/testify/assert"
    22  
    23  	"testing"
    24  )
    25  
    26  func getTestManifest(t *testing.T) *Manifest {
    27  	items := make([]Descriptor, 0)
    28  	for path, src := range map[string]io.Reader{
    29  		"digits.txt":     strings.NewReader("1234567890"),
    30  		"dup-digits.txt": strings.NewReader("1234567890"),
    31  		"letters.txt":    strings.NewReader("abcdef"),
    32  	} {
    33  		d, err := NewDescriptor(path, src)
    34  		assert.NoError(t, err)
    35  		items = append(items, *d)
    36  	}
    37  
    38  	return NewManifest(items...)
    39  }
    40  
    41  func TestManifest(t *testing.T) {
    42  
    43  	m := getTestManifest(t)
    44  
    45  	assert.NotNil(t, m)
    46  
    47  	d, err := m.Digest()
    48  	assert.NoError(t, err)
    49  	assert.Equal(t, "sha256:2cc48ce16beff9987ad31f32a7623bda48317d9232dbb75ba9a83f6d85ed073e", d.String())
    50  
    51  	j, err := json.Marshal(m)
    52  	assert.NoError(t, err)
    53  	assert.Equal(
    54  		t,
    55  		`{"schemaVersion":1,"items":[{"digest":"sha256:bef57ec7f53a6d40beb640a780a639c83bc29ac8a9816f1fc6c5c6dcd93c4721","size":6,"paths":["letters.txt"]},{"digest":"sha256:c775e7b757ede630cd0aa1113bd102661ab38829ca52a6422ab782862f268646","size":10,"paths":["digits.txt","dup-digits.txt"]}]}`,
    56  		string(j),
    57  	)
    58  
    59  }
    60  
    61  func TestWriteReadManifest(t *testing.T) {
    62  	tmpfile, err := ioutil.TempFile("", "vcn-manifest")
    63  	if err != nil {
    64  		log.Fatal(err)
    65  	}
    66  	filename := tmpfile.Name()
    67  	defer os.Remove(filename) // clean up
    68  	m := getTestManifest(t)
    69  
    70  	assert.NoError(t, WriteManifest(*m, filename))
    71  
    72  	assert.NoError(t, m.Normalize())
    73  
    74  	mm, err := ReadManifest(filename)
    75  	assert.NoError(t, err)
    76  	assert.Equal(t, m, mm)
    77  }
    78  
    79  func TestManifestWrongVersion(t *testing.T) {
    80  	m := Manifest{
    81  		SchemaVersion: 11,
    82  	}
    83  	err := m.Normalize()
    84  	assert.Error(t, err)
    85  }
    86  
    87  func TestManifestWrongAlgo(t *testing.T) {
    88  	m := Manifest{
    89  		SchemaVersion: 1,
    90  		Items: []Descriptor{
    91  			{
    92  				Digest: digest.Digest("sha512:cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e"),
    93  				Size:   0,
    94  				Paths:  []string{"file"},
    95  			},
    96  		},
    97  	}
    98  	assert.Error(t, m.Normalize())
    99  
   100  	m.Items[0].Digest = digest.Digest("sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")
   101  	assert.NoError(t, m.Normalize())
   102  }
   103  
   104  func TestManifestSameDigestMultipleSizes(t *testing.T) {
   105  	m := Manifest{
   106  		SchemaVersion: 1,
   107  		Items: []Descriptor{
   108  			{
   109  				Digest: digest.Digest("sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"),
   110  				Size:   0,
   111  				Paths:  []string{"file"},
   112  			},
   113  			{
   114  				Digest: digest.Digest("sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"),
   115  				Size:   1,
   116  				Paths:  []string{"file1"},
   117  			},
   118  		},
   119  	}
   120  	assert.Error(t, m.Normalize())
   121  }