Make sure to decode manifests into utf-8 when necessary
This fixes a decoding error
This commit is contained in:
parent
6cc7102ec8
commit
48e584905a
15 changed files with 268 additions and 32 deletions
|
|
@ -1,5 +1,8 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
import json
|
||||
import pytest
|
||||
import os
|
||||
|
||||
from app import docker_v2_signing_key
|
||||
from image.docker.schema1 import (DockerSchema1ManifestBuilder,
|
||||
|
|
@ -7,6 +10,7 @@ from image.docker.schema1 import (DockerSchema1ManifestBuilder,
|
|||
DOCKER_SCHEMA1_MANIFEST_CONTENT_TYPE)
|
||||
from image.docker.schema2.manifest import (MalformedSchema2Manifest, DockerSchema2Manifest,
|
||||
DockerSchema2ManifestBuilder, EMPTY_LAYER_BLOB_DIGEST)
|
||||
from image.docker.schema2.config import DockerSchema2Config
|
||||
from image.docker.schema2.test.test_config import CONFIG_BYTES
|
||||
from image.docker.schemautil import ContentRetrieverForTesting
|
||||
|
||||
|
|
@ -351,3 +355,67 @@ def test_remote_layer_manifest():
|
|||
|
||||
assert set(manifest.blob_digests) == {'sha256:adef', 'sha256:abcd', 'sha256:1352', 'sha256:1353'}
|
||||
assert set(manifest.local_blob_digests) == {'sha256:abcd', 'sha256:1352', 'sha256:1353'}
|
||||
|
||||
|
||||
def test_unencoded_unicode_manifest():
|
||||
builder = DockerSchema2ManifestBuilder()
|
||||
builder.add_layer('sha256:abc123', 123)
|
||||
builder.set_config_digest('sha256:def456', 2000)
|
||||
manifest = builder.build()
|
||||
|
||||
retriever = ContentRetrieverForTesting.for_config({
|
||||
"config": {
|
||||
"author": u"Sômé guy",
|
||||
},
|
||||
"rootfs": {"type": "layers", "diff_ids": []},
|
||||
"history": [
|
||||
{
|
||||
"created": "2018-04-03T18:37:09.284840891Z",
|
||||
"created_by": "base",
|
||||
"author": u"Sômé guy",
|
||||
},
|
||||
],
|
||||
}, 'sha256:def456', 2000, ensure_ascii=False)
|
||||
|
||||
layers = list(manifest.get_layers(retriever))
|
||||
assert layers[0].author == u"Sômé guy"
|
||||
|
||||
|
||||
def test_build_unencoded_unicode_manifest():
|
||||
config_json = json.dumps({
|
||||
"config": {
|
||||
"author": u"Sômé guy",
|
||||
},
|
||||
"rootfs": {"type": "layers", "diff_ids": []},
|
||||
"history": [
|
||||
{
|
||||
"created": "2018-04-03T18:37:09.284840891Z",
|
||||
"created_by": "base",
|
||||
"author": u"Sômé guy",
|
||||
},
|
||||
],
|
||||
}, ensure_ascii=False)
|
||||
|
||||
schema2_config = DockerSchema2Config(config_json)
|
||||
|
||||
builder = DockerSchema2ManifestBuilder()
|
||||
builder.set_config(schema2_config)
|
||||
builder.add_layer('sha256:abc123', 123)
|
||||
builder.build()
|
||||
|
||||
|
||||
def test_load_unicode_manifest():
|
||||
test_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
with open(os.path.join(test_dir, 'unicode_manifest_config.json'), 'r') as f:
|
||||
retriever = ContentRetrieverForTesting()
|
||||
retriever.add_digest('sha256:5bdd65cdd055c7f3bbaecdc9fd6c75f155322520f85953aa0e2724cab006d407',
|
||||
f.read())
|
||||
|
||||
with open(os.path.join(test_dir, 'unicode_manifest.json'), 'r') as f:
|
||||
manifest_bytes = f.read()
|
||||
|
||||
manifest = DockerSchema2Manifest(manifest_bytes)
|
||||
assert manifest.digest == 'sha256:97556fa8c553395bd9d8e19a04acef4716ca287ffbf6bde14dd9966053912613'
|
||||
|
||||
layers = list(manifest.get_layers(retriever))
|
||||
assert layers[-1].author == u"Sômé guy"
|
||||
|
|
|
|||
Reference in a new issue