from shutil import copyfile import os from blender_asset_tracer import blendfile from abstract_test import AbstractBlendFileTest class ModifyUncompressedTest(AbstractBlendFileTest): def setUp(self): self.orig = self.blendfiles / 'linked_cube.blend' self.to_modify = self.orig.with_name('linked_cube_modified.blend') copyfile(str(self.orig), str(self.to_modify)) # TODO: when requiring Python 3.6+, remove str() self.bf = blendfile.BlendFile(self.to_modify, mode='r+b') self.assertFalse(self.bf.is_compressed) def tearDown(self): super().tearDown() if self.to_modify.exists(): self.to_modify.unlink() def test_change_path(self): library = self.bf.code_index[b'LI'][0] # Change it from absolute to relative. library[b'filepath'] = b'//basic_file.blend' library[b'name'] = b'//basic_file.blend' self.reload() library = self.bf.code_index[b'LI'][0] self.assertEqual(b'//basic_file.blend', library[b'filepath']) self.assertEqual(b'//basic_file.blend', library[b'name']) def test_block_hash(self): scene = self.bf.code_index[b'SC'][0] assert isinstance(scene, blendfile.BlendFileBlock) pre_hash = scene.hash() self.assertIsInstance(pre_hash, int) # Change the 'ed' pointer to some arbitrary value by hacking the blend file. psize = self.bf.header.pointer_size field, field_offset = scene.dna_type.field_from_path(psize, b'ed') self.bf.fileobj.seek(scene.file_offset + field_offset, os.SEEK_SET) self.bf.fileobj.write(b'12345678'[:psize]) self.reload() scene = self.bf.code_index[b'SC'][0] post_hash = scene.hash() self.assertEqual(pre_hash, post_hash) def reload(self): self.bf.close() self.bf = blendfile.BlendFile(self.to_modify, mode='r+b') class ModifyCompressedTest(AbstractBlendFileTest): def setUp(self): self.orig = self.blendfiles / 'linked_cube_compressed.blend' self.to_modify = self.orig.with_name('linked_cube_modified.blend') copyfile(str(self.orig), str(self.to_modify)) # TODO: when requiring Python 3.6+, remove str() self.bf = blendfile.BlendFile(self.to_modify, mode='r+b') self.assertTrue(self.bf.is_compressed) def tearDown(self): if self.to_modify.exists(): self.to_modify.unlink() def test_change_path(self): library = self.bf.code_index[b'LI'][0] # Change it from absolute to relative. library[b'filepath'] = b'//basic_file.blend' library[b'name'] = b'//basic_file.blend' # Reload the blend file to inspect that it was written properly. self.bf.close() self.bf = blendfile.BlendFile(self.to_modify, mode='r+b') library = self.bf.code_index[b'LI'][0] self.assertEqual(b'//basic_file.blend', library[b'filepath']) self.assertEqual(b'//basic_file.blend', library[b'name'])