From 819e7e1a7fb05003f50d3a63040d5adbbdf60193 Mon Sep 17 00:00:00 2001 From: Sifis Lagouvardos Date: Fri, 14 Sep 2018 13:52:31 +0300 Subject: [PATCH] Added test for the new DexFileModule constructor that supports specific .dex files. --- com.ibm.wala.dalvik.test/META-INF/MANIFEST.MF | 1 + .../test/callGraph/DroidBenchCGTest.java | 23 +++--- .../dalvik/test/cha/MultiDexScopeTest.java | 80 +++++++++++++++++++ 3 files changed, 95 insertions(+), 9 deletions(-) create mode 100644 com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/test/cha/MultiDexScopeTest.java diff --git a/com.ibm.wala.dalvik.test/META-INF/MANIFEST.MF b/com.ibm.wala.dalvik.test/META-INF/MANIFEST.MF index a5c0cbf37..f4148ee09 100644 --- a/com.ibm.wala.dalvik.test/META-INF/MANIFEST.MF +++ b/com.ibm.wala.dalvik.test/META-INF/MANIFEST.MF @@ -21,4 +21,5 @@ Export-Package: com.ibm.wala.dalvik.drivers, com.ibm.wala.dalvik.test.callGraph, com.ibm.wala.dalvik.test.callGraph.droidbench, com.ibm.wala.dalvik.test.ir, + com.ibm.wala.dalvik.test.cha, com.ibm.wala.dalvik.test.util diff --git a/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/test/callGraph/DroidBenchCGTest.java b/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/test/callGraph/DroidBenchCGTest.java index 3f76514c6..88aa13ee0 100644 --- a/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/test/callGraph/DroidBenchCGTest.java +++ b/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/test/callGraph/DroidBenchCGTest.java @@ -144,15 +144,20 @@ public abstract class DroidBenchCGTest extends DalvikCallGraphTestBase { } public static Collection generateData(final URI[] androidLibs, final File androidJavaJar, final String filter) { - String f = walaProperties.getProperty("droidbench.root"); - if (f == null || !new File(f).exists()) { - f = "/tmp/DroidBench"; - } - - System.err.println("Use " + f + " as droid bench root"); - assert new File(f).exists() : "Use " + f + " as droid bench root"; - assert new File(f + "/apk/").exists() : "Use " + f + " as droid bench root"; - return generateData(f, androidLibs, androidJavaJar, filter); + + return generateData(getDroidBenchRoot(), androidLibs, androidJavaJar, filter); + } + + public static String getDroidBenchRoot(){ + String f = walaProperties.getProperty("droidbench.root"); + if (f == null || !new File(f).exists()) { + f = "/tmp/DroidBench"; + } + + System.err.println("Use " + f + " as droid bench root"); + assert new File(f).exists() : "Use " + f + " as droid bench root"; + assert new File(f + "/apk/").exists() : "Use " + f + " as droid bench root"; + return f; } public static Collection generateData(String droidBenchRoot, final URI[] androidLibs, final File androidJavaJar, final String filter) { diff --git a/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/test/cha/MultiDexScopeTest.java b/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/test/cha/MultiDexScopeTest.java new file mode 100644 index 000000000..a92a2c87b --- /dev/null +++ b/com.ibm.wala.dalvik.test/source/com/ibm/wala/dalvik/test/cha/MultiDexScopeTest.java @@ -0,0 +1,80 @@ +package com.ibm.wala.dalvik.test.cha; + +import com.ibm.wala.classLoader.IClass; +import com.ibm.wala.dalvik.classLoader.DexFileModule; +import com.ibm.wala.dalvik.test.callGraph.DroidBenchCGTest; +import com.ibm.wala.dalvik.test.util.Util; +import com.ibm.wala.ipa.callgraph.AnalysisScope; +import com.ibm.wala.ipa.cha.ClassHierarchy; +import com.ibm.wala.ipa.cha.ClassHierarchyException; +import com.ibm.wala.ipa.cha.ClassHierarchyFactory; +import com.ibm.wala.types.ClassLoaderReference; +import com.ibm.wala.util.config.AnalysisScopeReader; +import org.jf.dexlib2.DexFileFactory; +import org.jf.dexlib2.Opcodes; +import org.jf.dexlib2.dexbacked.DexBackedDexFile; +import org.jf.dexlib2.iface.MultiDexContainer; +import org.junit.Assert; +import org.junit.Test; + +import java.io.File; +import java.io.IOException; +import java.util.Iterator; + +public class MultiDexScopeTest { + + private static void addAPKtoScope(ClassLoaderReference loader, AnalysisScope scope, String fileName){ + File apkFile = new File(fileName); + MultiDexContainer multiDex = null; + try { + multiDex = DexFileFactory.loadDexContainer(apkFile, Opcodes.forApi(24)); + } catch (IOException e) { + throw new RuntimeException(e); + } + + try{ + for (String dexEntry : multiDex.getDexEntryNames()) { + System.out.println("Adding dex file: " +dexEntry + " of file:" + fileName); + scope.addToScope(loader, new DexFileModule(apkFile, dexEntry,24)); + } + }catch (IOException e){ + throw new RuntimeException(e); + } + } + + private static AnalysisScope setUpTestScope(String apkName, String exclusions, ClassLoader loader) throws IOException { + AnalysisScope scope; + scope = AnalysisScopeReader.readJavaScope("primordial.txt", new File(exclusions), loader); + scope.setLoaderImpl(ClassLoaderReference.Application, + "com.ibm.wala.dalvik.classLoader.WDexClassLoaderImpl"); + + addAPKtoScope(ClassLoaderReference.Application, scope, apkName); + return scope; + } + + private static int getNumberOfAppClasses(ClassHierarchy cha){ + Iterator classes = cha.iterator(); + int numberOfClasses = 0; + while(classes.hasNext()){ + if(classes.next().getClassLoader().getName().toString().equals("Application")) + numberOfClasses++; + } + return numberOfClasses; + } + + @Test + public void testAPK() throws ClassHierarchyException, IOException { + AnalysisScope scope, scope2; + ClassHierarchy cha, cha2; + String testAPK = DroidBenchCGTest.getDroidBenchRoot() + "/apk/Aliasing/Merge1.apk"; + + scope = setUpTestScope(testAPK,"", MultiDexScopeTest.class.getClassLoader()); + cha = ClassHierarchyFactory.make(scope); + + scope2 = Util.makeDalvikScope(null,null, testAPK); + cha2 = ClassHierarchyFactory.make(scope2); + + Assert.assertEquals(Integer.valueOf(getNumberOfAppClasses(cha)), Integer.valueOf(getNumberOfAppClasses(cha2))); + } + +}