comparison paraspace/tests/injection_test.py @ 111:3820379b34e8

Add dexfile_insert_class_relative()
author Thinker K.F. Li <thinker@codemud.net>
date Mon, 01 Aug 2011 22:23:55 +0800
parents 6380730a80b4
children ee13c86d84f2
comparison
equal deleted inserted replaced
110:6380730a80b4 111:3820379b34e8
211 211
212 typeid = fakefile_linked.find_typeid_idx(typeidxs[0]) 212 typeid = fakefile_linked.find_typeid_idx(typeidxs[0])
213 typeid_name = DEXFile_linked.get_typeid_name(typeid) 213 typeid_name = DEXFile_linked.get_typeid_name(typeid)
214 assert typeid_name == 'Ljava/io/File;' 214 assert typeid_name == 'Ljava/io/File;'
215 pass 215 pass
216
217
218 def dexfile_insert_class_relative_test():
219 from paraspace.dex_deptracker import prepare_dep_decls
220 from paraspace.injection import dexfile_insert_class_relative
221
222 _install_dexfile_4_deptracker()
223
224 all_dep_decls = prepare_dep_decls()
225
226 srcdir = os.path.dirname(__file__)
227 srcroot = os.path.join(srcdir, '..', '..')
228
229 helloworld_fn = os.path.join(srcroot, 'data', 'helloworld.dex')
230 helloworld_dex = dexfile.DEXFile.open(helloworld_fn)
231
232 classdef_map = _find_map(helloworld_dex, 0x0006)
233 saved_classdef_map_sz = classdef_map.size
234 saved_methodids_sz = len(helloworld_dex.methodIds.items)
235
236 codeitems_map = _find_map(helloworld_dex, 0x2001)
237 saved_codeitems_sz = codeitems_map.size
238
239 helloworld_linked = \
240 dexfile.DEXFile_linked.build_dependencies(helloworld_dex,
241 all_dep_decls)
242
243 fakefile_fn = os.path.join(srcroot, 'data', 'fakefile.dex')
244 fakefile_dex = dexfile.DEXFile.open(fakefile_fn)
245 fakefile_linked = \
246 dexfile.DEXFile_linked. \
247 build_dependencies(fakefile_dex, all_dep_decls)
248
249 fakefile_def = fakefile_linked. \
250 find_class_name('Lcom/codemud/fakefile/fakefile;')
251
252 fakefile_data = fakefile_def.classDataOffRef.value
253 assert len(fakefile_data.directMethods.items) == 1
254 assert len(fakefile_data.virtualMethods.items) == 0
255 fakefile_dataheader = fakefile_data.header
256 assert fakefile_dataheader.directMethodsSize == 1
257 assert fakefile_dataheader.virtualMethodsSize == 0
258
259 clone = dexfile_insert_class_relative(helloworld_linked,
260 fakefile_linked, fakefile_def)
261 assert clone
262 assert clone != fakefile_def
263
264 helloworld_unlinked = helloworld_linked.get_unlinked()
265 assert helloworld_unlinked
266
267 # map size for classdef must be increased by 1
268 classdef_map = _find_map(helloworld_unlinked, 0x0006)
269 assert classdef_map.size == saved_classdef_map_sz + 1
270
271 classdata_map = _find_map(helloworld_unlinked, 0x2000)
272 assert classdata_map.size == classdef_map.size
273
274 # Check strings
275 strdatas = helloworld_unlinked.stringDataItems.items
276 strs = sorted([strdata.data.data for strdata in strdatas])
277 assert len(strs) == len(set(strs)) # uniquely
278 assert 'Lcom/codemud/fakefile/fakefile;' in strs
279
280 # Check Method List
281 methodids_map = _find_map(helloworld_unlinked, 0x0005) # method ids
282 assert methodids_map.size == len(helloworld_unlinked.methodIds.items)
283 assert methodids_map.size == saved_methodids_sz + 1
284
285 # Check Code item List
286 codeitems_map = _find_map(helloworld_unlinked, 0x2001)
287 assert codeitems_map.size == saved_codeitems_sz + 1
288 pass