1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
package manifest
import (
"os"
"path/filepath"
"testing"
compressionTypes "github.com/containers/image/v5/pkg/compression/types"
"github.com/opencontainers/go-digest"
imgspecv1 "github.com/opencontainers/image-spec/specs-go/v1"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestSchema2ListPublicFromManifest(t *testing.T) {
validManifest, err := os.ReadFile(filepath.Join("testdata", "v2list.manifest.json"))
require.NoError(t, err)
parser := func(m []byte) error {
_, err := Schema2ListPublicFromManifest(m)
return err
}
// Schema mismatch is rejected
testManifestFixturesAreRejected(t, parser, []string{
"schema2-to-schema1-by-docker.json",
"v2s2.manifest.json",
"ociv1.manifest.json",
// Not "ociv1.image.index.json" yet, without validating mediaType the two are too similar to tell the difference.
})
// Extra fields are rejected
testValidManifestWithExtraFieldsIsRejected(t, parser, validManifest, []string{"config", "fsLayers", "history", "layers"})
}
func TestSchema2ListEditInstances(t *testing.T) {
validManifest, err := os.ReadFile(filepath.Join("testdata", "v2list.manifest.json"))
require.NoError(t, err)
list, err := ListFromBlob(validManifest, GuessMIMEType(validManifest))
require.NoError(t, err)
expectedDigests := list.Instances()
editInstances := []ListEdit{}
editInstances = append(editInstances, ListEdit{
UpdateOldDigest: list.Instances()[0],
UpdateDigest: "sha256:bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
UpdateSize: 32,
UpdateMediaType: "something",
ListOperation: ListOpUpdate})
err = list.EditInstances(editInstances)
require.NoError(t, err)
expectedDigests[0] = editInstances[0].UpdateDigest
// order of old elements must remain same.
assert.Equal(t, list.Instances(), expectedDigests)
instance, err := list.Instance(list.Instances()[0])
require.NoError(t, err)
assert.Equal(t, "something", instance.MediaType)
assert.Equal(t, int64(32), instance.Size)
// platform must match with instance platform set in `v2list.manifest.json` for the first instance
assert.Equal(t, &imgspecv1.Platform{Architecture: "ppc64le", OS: "linux", OSVersion: "", OSFeatures: []string(nil), Variant: ""}, instance.ReadOnly.Platform)
assert.Equal(t, []string{compressionTypes.GzipAlgorithmName}, instance.ReadOnly.CompressionAlgorithmNames)
// Create a fresh list
list, err = ListFromBlob(validManifest, GuessMIMEType(validManifest))
require.NoError(t, err)
originalListOrder := list.Instances()
editInstances = []ListEdit{}
editInstances = append(editInstances, ListEdit{
AddDigest: "sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
AddSize: 32,
AddMediaType: "application/vnd.oci.image.manifest.v1+json",
AddPlatform: &imgspecv1.Platform{Architecture: "amd64", OS: "linux", OSFeatures: []string{"sse4"}},
ListOperation: ListOpAdd})
editInstances = append(editInstances, ListEdit{
AddDigest: "sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
AddSize: 32,
AddMediaType: "application/vnd.oci.image.manifest.v1+json",
AddPlatform: &imgspecv1.Platform{Architecture: "amd64", OS: "linux", OSFeatures: []string{"sse4"}},
ListOperation: ListOpAdd})
err = list.EditInstances(editInstances)
require.NoError(t, err)
// Add new elements to the end of old list to maintain order
originalListOrder = append(originalListOrder, digest.Digest("sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"))
originalListOrder = append(originalListOrder, digest.Digest("sha256:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc"))
// Verify order
assert.Equal(t, list.Instances(), originalListOrder)
}
func TestSchema2ListFromManifest(t *testing.T) {
validManifest, err := os.ReadFile(filepath.Join("testdata", "v2list.manifest.json"))
require.NoError(t, err)
parser := func(m []byte) error {
_, err := Schema2ListFromManifest(m)
return err
}
// Schema mismatch is rejected
testManifestFixturesAreRejected(t, parser, []string{
"schema2-to-schema1-by-docker.json",
"v2s2.manifest.json",
"ociv1.manifest.json",
// Not "ociv1.image.index.json" yet, without validating mediaType the two are too similar to tell the difference.
})
// Extra fields are rejected
testValidManifestWithExtraFieldsIsRejected(t, parser, validManifest, []string{"config", "fsLayers", "history", "layers"})
}
|