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