Mercurial > paraspace
comparison paraspace/tests/injection_test.py @ 115:d112c27f657a
Add inject_classdefs() for injecting classdef to DEX
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Thu, 04 Aug 2011 15:55:01 +0800 |
parents | 867184e01852 |
children | c5f59bdbc916 |
comparison
equal
deleted
inserted
replaced
114:867184e01852 | 115:d112c27f657a |
---|---|
105 | 105 |
106 def redirect_types_test(): | 106 def redirect_types_test(): |
107 from paraspace.dex_deptracker import prepare_dep_decls | 107 from paraspace.dex_deptracker import prepare_dep_decls |
108 from paraspace.injection import dexfile_insert_class | 108 from paraspace.injection import dexfile_insert_class |
109 from paraspace.injection import dexfile_redirect_types | 109 from paraspace.injection import dexfile_redirect_types |
110 from paraspace.injection import make_methods_redir_for_types_redir | 110 from paraspace.injection import make_methodidxs_redir_map |
111 from paraspace import dalvik_opcodes | 111 from paraspace import dalvik_opcodes |
112 | 112 |
113 _install_dexfile_4_deptracker() | 113 _install_dexfile_4_deptracker() |
114 | 114 |
115 all_dep_decls = prepare_dep_decls() | 115 all_dep_decls = prepare_dep_decls() |
155 | 155 |
156 fakefile_data = clone.classDataOffRef.value | 156 fakefile_data = clone.classDataOffRef.value |
157 fakefile_methods = fakefile_data.directMethods.items | 157 fakefile_methods = fakefile_data.directMethods.items |
158 fakefile_codes = [method.codeOffRef.value for method in fakefile_methods] | 158 fakefile_codes = [method.codeOffRef.value for method in fakefile_methods] |
159 | 159 |
160 methods_redir = make_methods_redir_for_types_redir(helloworld_linked, | 160 methods_redir = make_methodidxs_redir_map(helloworld_linked, |
161 helloworld_linked, | 161 helloworld_linked, |
162 types_redir) | 162 types_redir) |
163 dexfile_redirect_types(helloworld_linked, types_redir, | 163 dexfile_redirect_types(helloworld_linked, types_redir, |
164 methods_redir, excludes) | 164 methods_redir, excludes) |
165 | 165 |
166 for code in helloworld_linked.codeItems.items: | 166 for code in helloworld_linked.codeItems.items: |
167 op_vectors = dalvik_opcodes.decode_insn_blk(code.insns.data) | 167 op_vectors = dalvik_opcodes.decode_insn_blk(code.insns.data) |
259 assert len(fakefile_data.virtualMethods.items) == 0 | 259 assert len(fakefile_data.virtualMethods.items) == 0 |
260 fakefile_dataheader = fakefile_data.header | 260 fakefile_dataheader = fakefile_data.header |
261 assert fakefile_dataheader.directMethodsSize == 1 | 261 assert fakefile_dataheader.directMethodsSize == 1 |
262 assert fakefile_dataheader.virtualMethodsSize == 0 | 262 assert fakefile_dataheader.virtualMethodsSize == 0 |
263 | 263 |
264 clones = dexfile_insert_classdefs_relative(helloworld_linked, | 264 classdefs, typeids = dexfile_insert_classdefs_relative(helloworld_linked, |
265 fakefile_linked, | 265 fakefile_linked, |
266 [fakefile_def]) | 266 [fakefile_def]) |
267 assert clones | 267 assert classdefs |
268 assert len(clones) == 1 | 268 assert len(classdefs) == 1 |
269 assert clones[0] != fakefile_def | 269 assert classdefs[0] != fakefile_def |
270 | 270 |
271 helloworld_unlinked = helloworld_linked.get_unlinked() | 271 helloworld_unlinked = helloworld_linked.get_unlinked() |
272 assert helloworld_unlinked | 272 assert helloworld_unlinked |
273 | 273 |
274 # map size for classdef must be increased by 1 | 274 # map size for classdef must be increased by 1 |
291 | 291 |
292 # Check Code item List | 292 # Check Code item List |
293 codeitems_map = _find_map(helloworld_unlinked, 0x2001) | 293 codeitems_map = _find_map(helloworld_unlinked, 0x2001) |
294 assert codeitems_map.size == saved_codeitems_sz + 1 | 294 assert codeitems_map.size == saved_codeitems_sz + 1 |
295 pass | 295 pass |
296 | |
297 | |
298 def inject_classdefs_test(): | |
299 from paraspace.dex_deptracker import prepare_dep_decls | |
300 from paraspace.injection import inject_classdefs | |
301 from paraspace import dalvik_opcodes | |
302 | |
303 _install_dexfile_4_deptracker() | |
304 | |
305 all_dep_decls = prepare_dep_decls() | |
306 | |
307 srcdir = os.path.dirname(__file__) | |
308 srcroot = os.path.join(srcdir, '..', '..') | |
309 | |
310 helloworld_fn = os.path.join(srcroot, 'data', 'helloworld.dex') | |
311 helloworld_dex = dexfile.DEXFile.open(helloworld_fn) | |
312 | |
313 classdef_map = _find_map(helloworld_dex, 0x0006) | |
314 saved_classdef_map_sz = classdef_map.size | |
315 saved_methodids_sz = len(helloworld_dex.methodIds.items) | |
316 | |
317 codeitems_map = _find_map(helloworld_dex, 0x2001) | |
318 saved_codeitems_sz = codeitems_map.size | |
319 | |
320 helloworld_linked = \ | |
321 dexfile.DEXFile_linked.build_dependencies(helloworld_dex, | |
322 all_dep_decls) | |
323 | |
324 fakefile_fn = os.path.join(srcroot, 'data', 'fakefile.dex') | |
325 fakefile_dex = dexfile.DEXFile.open(fakefile_fn) | |
326 fakefile_linked = \ | |
327 dexfile.DEXFile_linked. \ | |
328 build_dependencies(fakefile_dex, all_dep_decls) | |
329 | |
330 fakefile_def = \ | |
331 fakefile_linked.find_class_name('Lcom/codemud/fakefile/fakefile;') | |
332 clonings = inject_classdefs(helloworld_linked, fakefile_linked, | |
333 [fakefile_def]) | |
334 assert clonings | |
335 assert len(clonings) == 1 | |
336 pass |