From 4bd70eab3c8b9196435965be9d3651f08e52338a Mon Sep 17 00:00:00 2001 From: Joseph Schorr Date: Mon, 16 Apr 2018 12:32:35 +0300 Subject: [PATCH] Add basic tests for schema1 --- image/docker/schema1.py | 2 +- image/docker/test/test_schema1.py | 82 +++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 image/docker/test/test_schema1.py diff --git a/image/docker/schema1.py b/image/docker/schema1.py index 462554960..38edc4616 100644 --- a/image/docker/schema1.py +++ b/image/docker/schema1.py @@ -114,7 +114,7 @@ class DockerSchema1Manifest(object): }, }, 'required': [DOCKER_SCHEMA1_PROTECTED_KEY, DOCKER_SCHEMA1_HEADER_KEY, - DOCKER_SCHEMA1_SIGNATURE_KEY], + DOCKER_SCHEMA1_SIGNATURE_KEY], }, }, DOCKER_SCHEMA1_REPO_TAG_KEY: { diff --git a/image/docker/test/test_schema1.py b/image/docker/test/test_schema1.py new file mode 100644 index 000000000..509709318 --- /dev/null +++ b/image/docker/test/test_schema1.py @@ -0,0 +1,82 @@ +import json +import pytest + +from image.docker.schema1 import MalformedSchema1Manifest, DockerSchema1Manifest + +@pytest.mark.parametrize('json_data', [ + '', + '{}', + """ + { + "unknown": "key" + } + """, +]) +def test_malformed_manifests(json_data): + with pytest.raises(MalformedSchema1Manifest): + DockerSchema1Manifest(json_data) + + +@pytest.mark.parametrize('namespace', [ + '', + 'somenamespace', +]) +def test_valid_manifest(namespace): + manifest_bytes = json.dumps({ + "name": namespace + "/hello-world" if namespace else 'hello-world', + "tag": "latest", + "architecture": "amd64", + "fsLayers": [ + { + "blobSum": "sha256:cc8567d70002e957612902a8e985ea129d831ebe04057d88fb644857caa45d11" + }, + { + "blobSum": "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef" + } + ], + "history": [ + { + "v1Compatibility": "{\"id\":\"someid\", \"parent\": \"anotherid\"}" + }, + { + "v1Compatibility": "{\"id\":\"anotherid\"}" + }, + ], + "schemaVersion": 1, + "signatures": [ + { + "header": { + "jwk": { + "crv": "P-256", + "kid": "OD6I:6DRK:JXEJ:KBM4:255X:NSAA:MUSF:E4VM:ZI6W:CUN2:L4Z6:LSF4", + "kty": "EC", + "x": "3gAwX48IQ5oaYQAYSxor6rYYc_6yjuLCjtQ9LUakg4A", + "y": "t72ge6kIA1XOjqjVoEOiPPAURltJFBMGDSQvEGVB010" + }, + "alg": "ES256" + }, + "signature": "XREm0L8WNn27Ga_iE_vRnTxVMhhYY0Zst_FfkKopg6gWSoTOZTuW4rK0fg_IqnKkEKlbD83tD46LKEGi5aIVFg", + "protected": "eyJmb3JtYXRMZW5ndGgiOjY2MjgsImZvcm1hdFRhaWwiOiJDbjAiLCJ0aW1lIjoiMjAxNS0wNC0wOFQxODo1Mjo1OVoifQ" + } + ] + }) + + manifest = DockerSchema1Manifest(manifest_bytes, validate=False) + assert len(manifest.signatures) == 1 + assert manifest.namespace == namespace + assert manifest.repo_name == 'hello-world' + assert manifest.tag == 'latest' + assert manifest.image_ids == {'someid', 'anotherid'} + assert manifest.parent_image_ids == {'anotherid'} + + assert len(manifest.layers) == 2 + + assert manifest.layers[0].v1_metadata.image_id == 'anotherid' + assert manifest.layers[0].v1_metadata.parent_image_id is None + + assert manifest.layers[1].v1_metadata.image_id == 'someid' + assert manifest.layers[1].v1_metadata.parent_image_id == 'anotherid' + + assert manifest.leaf_layer == manifest.layers[1] + + assert manifest.digest