Mercurial > paraspace
view paraspace/tests/injection_test.py @ 98:c0c127c7b37e
Check and fix issues of map sizes
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Mon, 25 Jul 2011 20:37:32 +0800 |
parents | 00cd331f8aa8 |
children | 3898711adb2c |
line wrap: on
line source
from paraspace import dexfile import os def _install_dexfile_4_deptracker(): global dexfile import imp, sys from paraspace import dex_deptracker try: new_dexfile = imp.load_compiled('dexfile', dexfile.__file__) except ImportError: new_dexfile = imp.load_source('dexfile', dexfile.__file__) pass dex_deptracker.dexfile = new_dexfile dexfile = new_dexfile dex_deptracker._nest_types = (dexfile.array, dexfile.cond, dexfile.switch) sys.modules['paraspace.dexfile'] = new_dexfile pass def _find_map(dex, map_type): for map in dex.maps.items.items: if map.type == map_type: return map pass pass def inject_fakefile_to_helloworld_test(): from paraspace.dex_deptracker import prepare_dep_decls from paraspace.injection import dexfile_insert_class _install_dexfile_4_deptracker() all_dep_decls = prepare_dep_decls() srcdir = os.path.dirname(__file__) srcroot = os.path.join(srcdir, '..', '..') helloworld_fn = os.path.join(srcroot, 'data', 'helloworld.dex') helloworld_dex = dexfile.DEXFile.open(helloworld_fn) classdef_map = _find_map(helloworld_dex, 0x0006) saved_classdef_map_sz = classdef_map.size helloworld_linked = \ dexfile.DEXFile_linked.build_dependencies(helloworld_dex, all_dep_decls) fakefile_fn = os.path.join(srcroot, 'data', 'fakefile.dex') fakefile_dex = dexfile.DEXFile.open(fakefile_fn) fakefile_linked = \ dexfile.DEXFile_linked. \ build_dependencies(fakefile_dex, all_dep_decls) fakefile_def = fakefile_linked. \ find_class_name('Lcom/codemud/fakefile/fakefile;') clone = dexfile_insert_class(helloworld_linked, fakefile_def) assert clone assert clone != fakefile_def helloworld_unlinked = helloworld_linked.get_unlinked() assert helloworld_unlinked # map size for classdef must be increased by 1 classdef_map = _find_map(helloworld_unlinked, 0x0006) assert classdef_map.size == saved_classdef_map_sz + 1 classdata_map = _find_map(helloworld_unlinked, 0x2000) assert classdata_map.size == classdef_map.size pass