|  | # Copyright 2015 The Bazel Authors. All rights reserved. | 
|  | # | 
|  | # 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. | 
|  | """Testing for rewrite_json.""" | 
|  |  | 
|  | import unittest | 
|  |  | 
|  | from tools.build_defs.docker.rewrite_json import _DOCKER_VERSION | 
|  | from tools.build_defs.docker.rewrite_json import _OPERATING_SYSTEM | 
|  | from tools.build_defs.docker.rewrite_json import _PROCESSOR_ARCHITECTURE | 
|  | from tools.build_defs.docker.rewrite_json import MetadataOptions | 
|  | from tools.build_defs.docker.rewrite_json import RewriteMetadata | 
|  |  | 
|  |  | 
|  | class RewriteJsonTest(unittest.TestCase): | 
|  | """Testing for rewrite_json.""" | 
|  |  | 
|  | def testNewEntrypoint(self): | 
|  | in_data = { | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor' | 
|  | } | 
|  | } | 
|  | name = 'deadbeef' | 
|  | parent = 'blah' | 
|  | entrypoint = ['/bin/bash'] | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'Entrypoint': entrypoint | 
|  | }, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, entrypoint=entrypoint, parent=parent)) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testOverrideEntrypoint(self): | 
|  | in_data = { | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'Entrypoint': ['/bin/sh', 'does', 'not', 'matter'], | 
|  | } | 
|  | } | 
|  | name = 'deadbeef' | 
|  | parent = 'blah' | 
|  | entrypoint = ['/bin/bash'] | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'Entrypoint': entrypoint | 
|  | }, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, entrypoint=entrypoint, parent=parent)) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testNewCmd(self): | 
|  | in_data = { | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'Entrypoint': ['/bin/bash'], | 
|  | } | 
|  | } | 
|  | name = 'deadbeef' | 
|  | parent = 'blah' | 
|  | cmd = ['/bin/bash'] | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'Entrypoint': ['/bin/bash'], | 
|  | 'Cmd': cmd | 
|  | }, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, cmd=cmd, parent=parent)) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testOverrideCmd(self): | 
|  | in_data = { | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'Entrypoint': ['/bin/bash'], | 
|  | 'Cmd': ['does', 'not', 'matter'], | 
|  | } | 
|  | } | 
|  | name = 'deadbeef' | 
|  | parent = 'blah' | 
|  | cmd = ['does', 'matter'] | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'Entrypoint': ['/bin/bash'], | 
|  | 'Cmd': cmd | 
|  | }, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, cmd=cmd, parent=parent)) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testOverrideBoth(self): | 
|  | in_data = { | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'Entrypoint': ['/bin/sh'], | 
|  | 'Cmd': ['does', 'not', 'matter'], | 
|  | } | 
|  | } | 
|  | name = 'deadbeef' | 
|  | parent = 'blah' | 
|  | entrypoint = ['/bin/bash', '-c'] | 
|  | cmd = ['my-command', 'my-arg1', 'my-arg2'] | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'Entrypoint': entrypoint, | 
|  | 'Cmd': cmd | 
|  | }, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, entrypoint=entrypoint, cmd=cmd, parent=parent)) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testOverrideParent(self): | 
|  | name = 'me!' | 
|  | parent = 'parent' | 
|  | # In the typical case, we expect the parent to | 
|  | # come in as the 'id', and our grandparent to | 
|  | # be its 'parent'. | 
|  | in_data = { | 
|  | 'id': parent, | 
|  | 'parent': 'grandparent', | 
|  | } | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': {}, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, parent=parent)) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testNewSize(self): | 
|  | # Size is one of the few fields that, when omitted, | 
|  | # should be removed. | 
|  | in_data = { | 
|  | 'id': 'you', | 
|  | 'Size': '124', | 
|  | } | 
|  | name = 'me' | 
|  | parent = 'blah' | 
|  | size = '4321' | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'Size': size, | 
|  | 'config': {}, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, size=size, parent=parent)) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testOmitSize(self): | 
|  | # Size is one of the few fields that, when omitted, | 
|  | # should be removed. | 
|  | in_data = { | 
|  | 'id': 'you', | 
|  | 'Size': '124', | 
|  | } | 
|  | name = 'me' | 
|  | parent = 'blah' | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': {}, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, parent=parent)) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testOmitName(self): | 
|  | # Name is required. | 
|  | with self.assertRaises(Exception): | 
|  | RewriteMetadata({}, MetadataOptions(name=None)) | 
|  |  | 
|  | def testStripContainerConfig(self): | 
|  | # Size is one of the few fields that, when omitted, | 
|  | # should be removed. | 
|  | in_data = { | 
|  | 'id': 'you', | 
|  | 'container_config': {}, | 
|  | } | 
|  | name = 'me' | 
|  | parent = 'blah' | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': {}, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, parent=parent)) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testEmptyBase(self): | 
|  | in_data = {} | 
|  | name = 'deadbeef' | 
|  | entrypoint = ['/bin/bash', '-c'] | 
|  | cmd = ['my-command', 'my-arg1', 'my-arg2'] | 
|  | size = '999' | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'config': { | 
|  | 'Entrypoint': entrypoint, | 
|  | 'Cmd': cmd, | 
|  | 'ExposedPorts': { | 
|  | '80/tcp': {} | 
|  | } | 
|  | }, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | 'Size': size, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, entrypoint=entrypoint, cmd=cmd, size=size, | 
|  | ports=['80'])) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testOmitParentWithBase(self): | 
|  | # Our input data should be empty when parent is omitted | 
|  | in_data = { | 
|  | 'id': 'you', | 
|  | } | 
|  | with self.assertRaises(Exception): | 
|  | RewriteMetadata(in_data, MetadataOptions(name='me')) | 
|  |  | 
|  | def testNewPort(self): | 
|  | in_data = { | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor' | 
|  | } | 
|  | } | 
|  | name = 'deadbeef' | 
|  | parent = 'blah' | 
|  | port = '80' | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'ExposedPorts': { | 
|  | port + '/tcp': {} | 
|  | } | 
|  | }, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, parent=parent, ports=[port])) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testAugmentPort(self): | 
|  | in_data = { | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'ExposedPorts': { | 
|  | '443/tcp': {} | 
|  | } | 
|  | } | 
|  | } | 
|  | name = 'deadbeef' | 
|  | parent = 'blah' | 
|  | port = '80' | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'ExposedPorts': { | 
|  | '443/tcp': {}, | 
|  | port + '/tcp': {} | 
|  | } | 
|  | }, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, parent=parent, ports=[port])) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testMultiplePorts(self): | 
|  | in_data = { | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor' | 
|  | } | 
|  | } | 
|  | name = 'deadbeef' | 
|  | parent = 'blah' | 
|  | port1 = '80' | 
|  | port2 = '8080' | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'ExposedPorts': { | 
|  | port1 + '/tcp': {}, | 
|  | port2 + '/tcp': {} | 
|  | } | 
|  | }, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, parent=parent, ports=[port1, port2])) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testPortCollision(self): | 
|  | port = '80' | 
|  | in_data = { | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'ExposedPorts': { | 
|  | port + '/tcp': {} | 
|  | } | 
|  | } | 
|  | } | 
|  | name = 'deadbeef' | 
|  | parent = 'blah' | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'ExposedPorts': { | 
|  | port + '/tcp': {} | 
|  | } | 
|  | }, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, parent=parent, ports=[port])) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testPortWithProtocol(self): | 
|  | in_data = { | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor' | 
|  | } | 
|  | } | 
|  | name = 'deadbeef' | 
|  | parent = 'blah' | 
|  | port = '80/tcp' | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'ExposedPorts': { | 
|  | port: {} | 
|  | } | 
|  | }, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, parent=parent, ports=[port])) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testNewVolume(self): | 
|  | in_data = { | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor' | 
|  | } | 
|  | } | 
|  | name = 'deadbeef' | 
|  | parent = 'blah' | 
|  | volume = '/logs' | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'Volumes': { | 
|  | volume: {} | 
|  | } | 
|  | }, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, parent=parent, volumes=[volume])) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testAugmentVolume(self): | 
|  | in_data = { | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'Volumes': { | 
|  | '/original': {} | 
|  | } | 
|  | } | 
|  | } | 
|  | name = 'deadbeef' | 
|  | parent = 'blah' | 
|  | volume = '/data' | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'Volumes': { | 
|  | '/original': {}, | 
|  | volume: {} | 
|  | } | 
|  | }, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, parent=parent, volumes=[volume])) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testMultipleVolumes(self): | 
|  | in_data = { | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor' | 
|  | } | 
|  | } | 
|  | name = 'deadbeef' | 
|  | parent = 'blah' | 
|  | volume1 = '/input' | 
|  | volume2 = '/output' | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'Volumes': { | 
|  | volume1: {}, | 
|  | volume2: {} | 
|  | } | 
|  | }, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, parent=parent, volumes=[volume1, volume2])) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testEnv(self): | 
|  | in_data = { | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor' | 
|  | } | 
|  | } | 
|  | name = 'deadbeef' | 
|  | parent = 'blah' | 
|  | env = {'baz': 'blah', 'foo': 'bar',} | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'Env': [ | 
|  | 'baz=blah', | 
|  | 'foo=bar', | 
|  | ], | 
|  | }, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, env=env, parent=parent)) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testEnvResolveReplace(self): | 
|  | in_data = { | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'Env': [ | 
|  | 'foo=bar', | 
|  | 'baz=blah', | 
|  | 'blah=still around', | 
|  | ], | 
|  | } | 
|  | } | 
|  | name = 'deadbeef' | 
|  | parent = 'blah' | 
|  | env = {'baz': 'replacement', 'foo': '$foo:asdf',} | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'Env': [ | 
|  | 'baz=replacement', | 
|  | 'blah=still around', | 
|  | 'foo=bar:asdf', | 
|  | ], | 
|  | }, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, env=env, parent=parent)) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testLabel(self): | 
|  | in_data = { | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor' | 
|  | } | 
|  | } | 
|  | name = 'deadbeef' | 
|  | parent = 'blah' | 
|  | labels = {'baz': 'blah', 'foo': 'bar',} | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'Label': [ | 
|  | 'baz=blah', | 
|  | 'foo=bar', | 
|  | ], | 
|  | }, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, | 
|  | MetadataOptions(name=name, | 
|  | labels=labels, | 
|  | parent=parent)) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testAugmentLabel(self): | 
|  | in_data = { | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'Label': [ | 
|  | 'baz=blah', | 
|  | 'blah=still around', | 
|  | ], | 
|  | } | 
|  | } | 
|  | name = 'deadbeef' | 
|  | parent = 'blah' | 
|  | labels = {'baz': 'replacement', 'foo': 'bar',} | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'Label': [ | 
|  | 'baz=replacement', | 
|  | 'blah=still around', | 
|  | 'foo=bar', | 
|  | ], | 
|  | }, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, | 
|  | MetadataOptions(name=name, | 
|  | labels=labels, | 
|  | parent=parent)) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testAugmentVolumeWithNullInput(self): | 
|  | in_data = { | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'Volumes': None, | 
|  | } | 
|  | } | 
|  | name = 'deadbeef' | 
|  | parent = 'blah' | 
|  | volume = '/data' | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': { | 
|  | 'User': 'mattmoor', | 
|  | 'WorkingDir': '/usr/home/mattmoor', | 
|  | 'Volumes': { | 
|  | volume: {} | 
|  | } | 
|  | }, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, parent=parent, volumes=[volume])) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | def testSetWorkingDir(self): | 
|  | in_data = { | 
|  | 'config': { | 
|  | 'User': 'bleh', | 
|  | 'WorkingDir': '/home/bleh', | 
|  | 'Volumes': { | 
|  | } | 
|  | } | 
|  | } | 
|  | name = 'deadbeef' | 
|  | parent = 'blah' | 
|  | workdir = '/some/path' | 
|  | expected = { | 
|  | 'id': name, | 
|  | 'parent': parent, | 
|  | 'config': { | 
|  | 'User': 'bleh', | 
|  | 'WorkingDir': '/some/path', | 
|  | 'Volumes': { | 
|  | } | 
|  | }, | 
|  | 'docker_version': _DOCKER_VERSION, | 
|  | 'architecture': _PROCESSOR_ARCHITECTURE, | 
|  | 'os': _OPERATING_SYSTEM, | 
|  | } | 
|  |  | 
|  | actual = RewriteMetadata(in_data, MetadataOptions( | 
|  | name=name, parent=parent, workdir=workdir)) | 
|  | self.assertEquals(expected, actual) | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | unittest.main() |