diff --git a/schema/manifest_test.go b/schema/manifest_test.go index f1cb51d02..5b57b09de 100644 --- a/schema/manifest_test.go +++ b/schema/manifest_test.go @@ -23,11 +23,13 @@ import ( func TestManifest(t *testing.T) { for i, tt := range []struct { + strict bool manifest string fail bool }{ // expected failure: mediaType does not match pattern { + strict: false, manifest: ` { "schemaVersion": 2, @@ -39,6 +41,7 @@ func TestManifest(t *testing.T) { // expected failure: config.size is a string, expected integer { + strict: false, manifest: ` { "schemaVersion": 2, @@ -56,6 +59,7 @@ func TestManifest(t *testing.T) { // expected failure: layers.size is string, expected integer { + strict: false, manifest: ` { "schemaVersion": 2, @@ -79,6 +83,7 @@ func TestManifest(t *testing.T) { // valid manifest { + strict: true, manifest: ` { "schemaVersion": 2, @@ -113,9 +118,81 @@ func TestManifest(t *testing.T) { `, fail: false, }, + + // valid manifest accepts customized config media types + { + strict: false, + manifest: ` +{ + "schemaVersion": 2, + "mediaType": "application/vnd.oci.image.manifest.v1+json", + "config": { + "mediaType": "application/vnd.customized.config+json", + "size": 1470, + "digest": "sha256:c86f7763873b6c0aae22d963bab59b4f5debbed6685761b5951584f6efb0633b" + }, + "layers": [ + { + "mediaType": "application/vnd.customized.layer.tar+gzip", + "size": 148, + "digest": "sha256:c57089565e894899735d458f0fd4bb17a0f1e0df8d72da392b85c9b35ee777cd" + } + ] +} +`, + fail: false, + }, + + // expected failure strictly: unknown config.mediaType + { + strict: true, + manifest: ` +{ + "schemaVersion": 2, + "mediaType": "application/vnd.oci.image.manifest.v1+json", + "config": { + "mediaType": "application/vnd.customized.config+json", + "size": 1470, + "digest": "sha256:c86f7763873b6c0aae22d963bab59b4f5debbed6685761b5951584f6efb0633b" + }, + "layers": [ + { + "mediaType": "application/vnd.customized.layer.tar+gzip", + "size": 148, + "digest": "sha256:c57089565e894899735d458f0fd4bb17a0f1e0df8d72da392b85c9b35ee777cd" + } + ] +} +`, + fail: true, + }, + + // expected failure strictly: unknown layers[].mediaType + { + strict: true, + manifest: ` +{ + "schemaVersion": 2, + "mediaType": "application/vnd.oci.image.manifest.v1+json", + "config": { + "mediaType": "application/vnd.oci.image.config.v1+json", + "size": 1470, + "digest": "sha256:c86f7763873b6c0aae22d963bab59b4f5debbed6685761b5951584f6efb0633b" + }, + "layers": [ + { + "mediaType": "application/vnd.customized.layer.tar+gzip", + "size": 148, + "digest": "sha256:c57089565e894899735d458f0fd4bb17a0f1e0df8d72da392b85c9b35ee777cd" + } + ] +} +`, + fail: true, + }, } { r := strings.NewReader(tt.manifest) - err := schema.MediaTypeManifest.Validate(r) + err := schema.MediaTypeManifest.Validate(r, tt.strict) if got := err != nil; tt.fail != got { t.Errorf("test %d: expected validation failure %t but got %t, err %v", i, tt.fail, got, err) diff --git a/schema/manifestlist_test.go b/schema/manifestlist_test.go new file mode 100644 index 000000000..716fa6fee --- /dev/null +++ b/schema/manifestlist_test.go @@ -0,0 +1,83 @@ +// Copyright 2016 The Linux Foundation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package schema_test + +import ( + "strings" + "testing" + + "github.com/opencontainers/image-spec/schema" +) + +func TestManifestList(t *testing.T) { + for i, tt := range []struct { + strict bool + manifestList string + fail bool + }{ + // valid manifest list accepting customized media types + { + strict: false, + manifestList: ` +{ + "schemaVersion": 2, + "mediaType": "application/vnd.oci.image.manifest.list.v1+json", + "manifests": [ + { + "mediaType": "application/customized+json", + "size": 7143, + "digest": "sha256:e692418e4cbaf90ca69d05a66403747baa33ee08806650b51fab815ad7fc331f", + "platform": { + "architecture": "ppc64le", + "os": "linux" + } + } + ] +} +`, + fail: false, + }, + + // expected failure strictly: manifests[].mediaType is unknown + { + strict: true, + manifestList: ` +{ + "schemaVersion": 2, + "mediaType": "application/vnd.oci.image.manifest.list.v1+json", + "manifests": [ + { + "mediaType": "application/customized+json", + "size": 7143, + "digest": "sha256:e692418e4cbaf90ca69d05a66403747baa33ee08806650b51fab815ad7fc331f", + "platform": { + "architecture": "ppc64le", + "os": "linux" + } + } + ] +} +`, + fail: true, + }, + } { + r := strings.NewReader(tt.manifestList) + err := schema.MediaTypeManifestList.Validate(r, tt.strict) + + if got := err != nil; tt.fail != got { + t.Errorf("test %d: expected validation failure %t but got %t, err %v", i, tt.fail, got, err) + } + } +}