def test_serialize_json(self): manifest = PackageManifest( PackageMetaData("some_package", 42), [ BlobEntry( path="meta/", merkle= "0123456789abcdef0123456789ABCDEF0123456789abcdef0123456789ABCDEF", size=4096, source_path="some/source/path/to/a/file"), BlobEntry( path="a/file", merkle= "123456789abcdef0123456789ABCDEF0123456789abcdef0123456789ABCDEF0", size=8192, source_path="some/other/source/path"), BlobEntry( path="an/empty/file", merkle= "15ec7bf0b50732b49f8228e07d24365338f9e3ab994b00af08e5a3bffe55fd8b", size=0, source_path="source/path/to/an/empty/file"), ], "1", None, "some_repo") serialized_json = serialization.json_dumps(manifest, indent=4) self.maxDiff = None self.assertEqual(serialized_json, raw_package_manifest_json)
def test_serialize_empty_blob(self): blob = BlobEntry( path="an/empty/file", merkle= "15ec7bf0b50732b49f8228e07d24365338f9e3ab994b00af08e5a3bffe55fd8b", size=0, source_path="source/path/to/an/empty/file") self.assertEqual( serialization.json_dumps(blob, indent=4), empty_blob_raw_json)
def fake_blob(self, id: int) -> 'PackageManifestBuilder': """Add a completely faked blob to the package, using a numeric id to provide a way of tracking which package it belongs to. """ self._blobs.append( BlobEntry( path=f"package/path/for/blob_{id}", merkle=self._make_merkle(id), size=id, source_path=f"source/path/for/input_{id}")) return self
def blob( self, path: Optional[str] = None, merkle: Optional[str] = None, size: Optional[int] = None, source: Optional[FilePath] = None) -> 'PackageManifestBuilder': """Add a blob to the package, creating fake data for any fields that aren't given. """ self._blobs.append( BlobEntry( path if path else f"some/path/for/{self._make_blob_name()}", merkle if merkle else self._make_merkle(), size if size else 0, source if source else f"source/path/for/{self._make_blob_name('input_')}")) return self
def validate_rewritten_package_manifest( path: FilePath, expected: PackageManifest): """Parses the PackageManifest at the given path, and compares it with the `expected` one. """ with open(path) as package_manifest_file: parsed_manifest = serialization.json_load( PackageManifest, package_manifest_file) self.assertEqual(parsed_manifest.package, expected.package) self.assertEqual(parsed_manifest.blob_sources_relative, "file") # The expected blobs are the passed-in set, but with the source # path set to be by merkle in the blobs/ dir of the AIB. expected_blobs = [ BlobEntry( blob.path, blob.merkle, blob.size, f"../../blobs/{blob.merkle}") for blob in expected.blobs ] self.assertEqual(parsed_manifest.blobs, expected_blobs)
def test_make_legacy_config(self): self.maxDiff = None # Patch in a mock for the fast_copy() fn fast_copy_mock_fn, copies = mock_fast_copy_in( assembly.assembly_input_bundle) with tempfile.TemporaryDirectory() as temp_dir_path: os.chdir(temp_dir_path) source_dir = "source" os.mkdir(source_dir) # Create an ImageAssembly configuration image_assembly = ImageAssemblyConfig() # Write out package manifests which are part of the package. for package_set in ["base", "cache", "system"]: for suffix in ["a", "b"]: package_name = f"{package_set}_{suffix}" manifest = PackageManifest(PackageMetaData(package_name), []) # Create a few blob entries (that don't need to fully exist) for blob_suffix in ["1", "2", "3"]: blob_name = f"internal/path/file_{suffix}_{blob_suffix}" entry = BlobEntry( blob_name, make_merkle(package_name + blob_name), None, os.path.join(source_dir, package_name, blob_name)) manifest.blobs.append(entry) # Write the manifest out to the temp dir manifest_path = os.path.join(source_dir, f"{package_name}.json") with open(manifest_path, 'w') as manifest_file: serialization.json_dump(manifest, manifest_file, indent=2) # Add to the ImageAssembly in the correct package set. getattr(image_assembly, package_set).add(manifest_path) # Add the rest of the fields we expect to see in an image_assembly # config. image_assembly.boot_args.update(["boot-arg-1", "boot-arg-2"]) image_assembly.kernel.path = os.path.join(source_dir, "kernel.bin") image_assembly.kernel.args.update(["arg1", "arg2"]) image_assembly.kernel.clock_backstop = 123456 image_assembly.bootfs_files.update([ FileEntry(os.path.join(source_dir, "some/file"), "some/file"), FileEntry(os.path.join(source_dir, "another/file"), "another/file"), ]) # Create the outdir path, and perform the "copying" into the # AssemblyInputBundle. outdir = "outdir" aib, assembly_config, deps = make_legacy_config.copy_to_assembly_input_bundle( image_assembly, [], outdir) # Validate the contents of the AssemblyInputBundle itself self.assertEqual( aib.base, set(["packages/base/base_a", "packages/base/base_b"])) self.assertEqual( aib.cache, set(["packages/cache/cache_a", "packages/cache/cache_b"])) self.assertEqual( aib.system, set(["packages/system/system_a", "packages/system/system_b"])) self.assertEqual(aib.boot_args, set(["boot-arg-1", "boot-arg-2"])) self.assertEqual(aib.kernel.path, "kernel/kernel.bin") self.assertEqual(aib.kernel.args, set(["arg1", "arg2"])) self.assertEqual(aib.kernel.clock_backstop, 123456) self.assertEqual( aib.bootfs_files, set([ FileEntry(source="bootfs/some/file", destination="some/file"), FileEntry(source="bootfs/another/file", destination="another/file"), ])) # Make sure all the manifests were created in the correct location. for package_set in ["base", "cache", "system"]: for suffix in ["a", "b"]: package_name = f"{package_set}_{suffix}" with open(f"outdir/packages/{package_set}/{package_name}" ) as manifest_file: manifest = serialization.json_load( PackageManifest, manifest_file) self.assertEqual(manifest.package.name, package_name) self.assertEqual( set(manifest.blobs_by_path().keys()), set([ f'internal/path/file_{suffix}_1', f'internal/path/file_{suffix}_2', f'internal/path/file_{suffix}_3', ])) # Spot-check one of the manifests, that it contains the correct # source paths to the blobs. with open("outdir/packages/base/base_a") as manifest_file: manifest = serialization.json_load(PackageManifest, manifest_file) self.assertEqual(manifest.package.name, "base_a") self.assertEqual(len(manifest.blobs), 3) blobs = manifest.blobs_by_path() self.assertEqual( blobs['internal/path/file_a_1'].source_path, '../../blobs/efac096092f7cf879c72ac51d23d9f142e97405dec7dd9c69aeee81de083f794' ) self.assertEqual( blobs['internal/path/file_a_1'].merkle, 'efac096092f7cf879c72ac51d23d9f142e97405dec7dd9c69aeee81de083f794' ) self.assertEqual( blobs['internal/path/file_a_2'].source_path, '../../blobs/bf0c3ae1356b5863258f73a37d555cf878007b8bfe4fd780d74466ec62fe062d' ) self.assertEqual( blobs['internal/path/file_a_2'].merkle, 'bf0c3ae1356b5863258f73a37d555cf878007b8bfe4fd780d74466ec62fe062d' ) self.assertEqual( blobs['internal/path/file_a_3'].source_path, '../../blobs/a2e574ccd55c815f0a87c4f27e7a3115fe8e46d41a2e0caf2a91096a41421f78' ) self.assertEqual( blobs['internal/path/file_a_3'].merkle, 'a2e574ccd55c815f0a87c4f27e7a3115fe8e46d41a2e0caf2a91096a41421f78' ) # Validate that the deps were correctly identified (all package # manifest paths, the blob source paths, the bootfs source paths, # and the kernel source path) self.assertEqual( deps, set([ 'source/base_a.json', 'source/base_a/internal/path/file_a_1', 'source/base_a/internal/path/file_a_2', 'source/base_a/internal/path/file_a_3', 'source/base_b.json', 'source/base_b/internal/path/file_b_1', 'source/base_b/internal/path/file_b_2', 'source/base_b/internal/path/file_b_3', 'source/cache_a.json', 'source/cache_a/internal/path/file_a_1', 'source/cache_a/internal/path/file_a_2', 'source/cache_a/internal/path/file_a_3', 'source/cache_b.json', 'source/cache_b/internal/path/file_b_1', 'source/cache_b/internal/path/file_b_2', 'source/cache_b/internal/path/file_b_3', 'source/system_a.json', 'source/system_a/internal/path/file_a_1', 'source/system_a/internal/path/file_a_2', 'source/system_a/internal/path/file_a_3', 'source/system_b.json', 'source/system_b/internal/path/file_b_1', 'source/system_b/internal/path/file_b_2', 'source/system_b/internal/path/file_b_3', 'source/kernel.bin', 'source/some/file', 'source/another/file' ])) # Validate that all the files were correctly copied to the # correct paths in the AIB. self.assertEqual( set(copies), set([ FileEntry( source='source/base_a/internal/path/file_a_1', destination= 'outdir/blobs/efac096092f7cf879c72ac51d23d9f142e97405dec7dd9c69aeee81de083f794' ), FileEntry( source='source/base_a/internal/path/file_a_1', destination= 'outdir/blobs/efac096092f7cf879c72ac51d23d9f142e97405dec7dd9c69aeee81de083f794' ), FileEntry( source='source/base_a/internal/path/file_a_2', destination= 'outdir/blobs/bf0c3ae1356b5863258f73a37d555cf878007b8bfe4fd780d74466ec62fe062d' ), FileEntry( source='source/base_a/internal/path/file_a_3', destination= 'outdir/blobs/a2e574ccd55c815f0a87c4f27e7a3115fe8e46d41a2e0caf2a91096a41421f78' ), FileEntry( source='source/base_b/internal/path/file_b_1', destination= 'outdir/blobs/ae9fd81e1c2fd1b084ec2c362737e812c5ef9b3aa8cb0538ec8e2269ea7fbe1a' ), FileEntry( source='source/base_b/internal/path/file_b_2', destination= 'outdir/blobs/d3cd38c4881c3bc31f1e2e397a548d431a6430299785446f28be10cc5b76d92b' ), FileEntry( source='source/base_b/internal/path/file_b_3', destination= 'outdir/blobs/6468d9d6761c8afcc97744dfd9e066f29bb697a9a0c8248b5e6eec989134a048' ), FileEntry( source='source/cache_a/internal/path/file_a_1', destination= 'outdir/blobs/f0601d51be1ec8c11d825b756841937706eb2805ce9b924b67b4b0dc14caba29' ), FileEntry( source='source/cache_a/internal/path/file_a_2', destination= 'outdir/blobs/1834109a42a5ff6501fbe05216475b2b0acc44e0d9c94924469a485d6f45dc86' ), FileEntry( source='source/cache_a/internal/path/file_a_3', destination= 'outdir/blobs/0f32059964674afd810001c76c2a5d783a2ce012c41303685ec1adfdb83290fd' ), FileEntry( source='source/cache_b/internal/path/file_b_1', destination= 'outdir/blobs/301e8584305e63f0b764daf52dcf312eecb6378b201663fcc77d7ad68aab1f23' ), FileEntry( source='source/cache_b/internal/path/file_b_2', destination= 'outdir/blobs/8135016519df51d386efaea9b02f50cb454b6c7afe69c77895c1d4d844c3584d' ), FileEntry( source='source/cache_b/internal/path/file_b_3', destination= 'outdir/blobs/b548948fd2dc40574775308a92a8330e5c5d84ddf31513d1fe69964b458479e7' ), FileEntry( source='source/system_a/internal/path/file_a_1', destination= 'outdir/blobs/8ca898b1389c58b6cd9a6a777e320f2756ab3437b402c61d774dd2758ad9cf06' ), FileEntry( source='source/system_a/internal/path/file_a_2', destination= 'outdir/blobs/ef84c6711eaba482164fe4eb08a6c45f18fe62d493e5a31a631c32937bf7229d' ), FileEntry( source='source/system_a/internal/path/file_a_3', destination= 'outdir/blobs/d66cb673257e25393a319fb2c3e9745ef6e0f1cfa4fb89c5576df73cd3eba586' ), FileEntry( source='source/system_b/internal/path/file_b_1', destination= 'outdir/blobs/fd0891d15ce65d7682f7437e441e917b8ed4bde4db07a11dc100104f25056051' ), FileEntry( source='source/system_b/internal/path/file_b_2', destination= 'outdir/blobs/c244c7c6ebf40a9a4c9d59e7b08a1cf54ae3d60404d1cecb417a7b55cc308d91' ), FileEntry( source='source/system_b/internal/path/file_b_3', destination= 'outdir/blobs/0cdbf3e4f1246ce7522e78c21bcf1c3aef2d41ac2b4de3f0ee98fc6273f62eb9' ), FileEntry(source='source/kernel.bin', destination='outdir/kernel/kernel.bin'), FileEntry(source='source/some/file', destination='outdir/bootfs/some/file'), FileEntry(source='source/another/file', destination='outdir/bootfs/another/file'), ]))