Mercurial > paraspace
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 |