DexClassLoaderTest.java revision 51d35175d7cce2afc5c9cdd1ef939d60481cd398
144401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein/* 244401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein * Copyright (C) 2011 The Android Open Source Project 344401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein * 444401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein * Licensed under the Apache License, Version 2.0 (the "License"); 544401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein * you may not use this file except in compliance with the License. 644401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein * You may obtain a copy of the License at 744401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein * 844401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein * http://www.apache.org/licenses/LICENSE-2.0 944401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein * 1044401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein * Unless required by applicable law or agreed to in writing, software 1144401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein * distributed under the License is distributed on an "AS IS" BASIS, 1244401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1344401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein * See the License for the specific language governing permissions and 1444401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein * limitations under the License. 1544401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein */ 1644401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein 1744401c99f407517a16f8bf75a942a1461a6feceeDan Bornsteinpackage dalvik.system; 1844401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein 190097708dae398465c3da40cc7f9a2dfde5571364Dan Bornsteinimport java.lang.reflect.InvocationTargetException; 200097708dae398465c3da40cc7f9a2dfde5571364Dan Bornsteinimport java.lang.reflect.Method; 2144401c99f407517a16f8bf75a942a1461a6feceeDan Bornsteinimport java.io.File; 2244401c99f407517a16f8bf75a942a1461a6feceeDan Bornsteinimport java.io.FileOutputStream; 2344401c99f407517a16f8bf75a942a1461a6feceeDan Bornsteinimport java.io.IOException; 2444401c99f407517a16f8bf75a942a1461a6feceeDan Bornsteinimport java.io.InputStream; 2592c92f5f5306c7bed2c34b8382dad32445f5ef85Dan Bornsteinimport java.io.UnsupportedEncodingException; 2644401c99f407517a16f8bf75a942a1461a6feceeDan Bornsteinimport libcore.base.Streams; 2744401c99f407517a16f8bf75a942a1461a6feceeDan Bornsteinimport junit.framework.TestCase; 2844401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein 2944401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein/** 3044401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein * Tests for the class {@link DexClassLoader}. 3144401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein */ 3244401c99f407517a16f8bf75a942a1461a6feceeDan Bornsteinpublic class DexClassLoaderTest extends TestCase { 3330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein private static final File TMP_DIR = 3430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein new File(System.getProperty("java.io.tmpdir"), "loading-test"); 3544401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein private static final String PACKAGE_PATH = "dalvik/system/"; 3644401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein private static final String JAR_NAME = "loading-test.jar"; 378c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein private static final String DEX_NAME = "loading-test.dex"; 3830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein private static final String JAR2_NAME = "loading-test2.jar"; 3930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein private static final String DEX2_NAME = "loading-test2.dex"; 4051d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein private static final File JAR_FILE = new File(TMP_DIR, JAR_NAME); 4151d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein private static final File DEX_FILE = new File(TMP_DIR, DEX_NAME); 4251d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein private static final File JAR2_FILE = new File(TMP_DIR, JAR2_NAME); 4351d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein private static final File DEX2_FILE = new File(TMP_DIR, DEX2_NAME); 4430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein 4530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein private static enum Configuration { 4630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein /** just one classpath element, a raw dex file */ 4730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein ONE_DEX, 4830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein 4930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein /** just one classpath element, a jar file */ 5030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein ONE_JAR, 5130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein 5230daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein /** two classpath elements, both raw dex files */ 5330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein TWO_DEX, 5430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein 5530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein /** two classpath elements, both jar files */ 5630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein TWO_JAR; 5730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein } 5844401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein 5944401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein protected void setUp() throws IOException { 6044401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein TMP_DIR.mkdirs(); 6144401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein 6244401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein ClassLoader cl = DexClassLoaderTest.class.getClassLoader(); 6351d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein copyResource(cl, JAR_NAME, JAR_FILE); 6451d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein copyResource(cl, DEX_NAME, DEX_FILE); 6551d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein copyResource(cl, JAR2_NAME, JAR2_FILE); 6651d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein copyResource(cl, DEX2_NAME, DEX2_FILE); 670ec98177a2b2ea242a9ca9e0fb5aee39bba0c007Dan Bornstein } 688c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 690ec98177a2b2ea242a9ca9e0fb5aee39bba0c007Dan Bornstein /** 700ec98177a2b2ea242a9ca9e0fb5aee39bba0c007Dan Bornstein * Copy a resource in the package directory to the indicated file. 710ec98177a2b2ea242a9ca9e0fb5aee39bba0c007Dan Bornstein */ 720ec98177a2b2ea242a9ca9e0fb5aee39bba0c007Dan Bornstein private static void copyResource(ClassLoader loader, String resourceName, 730ec98177a2b2ea242a9ca9e0fb5aee39bba0c007Dan Bornstein File destination) throws IOException { 740ec98177a2b2ea242a9ca9e0fb5aee39bba0c007Dan Bornstein InputStream in = 750ec98177a2b2ea242a9ca9e0fb5aee39bba0c007Dan Bornstein loader.getResourceAsStream(PACKAGE_PATH + resourceName); 760ec98177a2b2ea242a9ca9e0fb5aee39bba0c007Dan Bornstein FileOutputStream out = new FileOutputStream(destination); 7744401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein Streams.copy(in, out); 7844401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein in.close(); 7944401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein out.close(); 8044401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein } 8144401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein 8244401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein /** 830097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein * Helper to construct an instance to test. 848c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein * 8530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * @param config how to configure the classpath 860097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein */ 8730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein private static DexClassLoader createInstance(Configuration config) { 8830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein File file1; 8930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein File file2; 9030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein 9130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein switch (config) { 9251d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein case ONE_DEX: file1 = DEX_FILE; file2 = null; break; 9351d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein case ONE_JAR: file1 = JAR_FILE; file2 = null; break; 9451d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein case TWO_DEX: file1 = DEX_FILE; file2 = DEX2_FILE; break; 9551d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein case TWO_JAR: file1 = JAR_FILE; file2 = JAR2_FILE; break; 9630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein default: throw new AssertionError("shouldn't happen"); 9730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein } 9830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein 9930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein String path = file1.getAbsolutePath(); 10030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein if (file2 != null) { 10130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein path += File.pathSeparator + file2.getAbsolutePath(); 10230daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein } 10330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein 10430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein return new DexClassLoader( 10530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein path, TMP_DIR.getAbsolutePath(), null, 10630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein ClassLoader.getSystemClassLoader()); 1070097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein } 1080097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein 1090097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein /** 1108c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein * Helper to construct an instance to test, using the jar file as 1118c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein * the source, and call a named no-argument static method on a 1128c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein * named class. 1138c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein * 11430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * @param config how to configure the classpath 1158c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein */ 11630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein public static Object createInstanceAndCallStaticMethod( 11730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein Configuration config, String className, String methodName) 1188c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein throws ClassNotFoundException, NoSuchMethodException, 1198c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein IllegalAccessException, InvocationTargetException { 12030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein DexClassLoader dcl = createInstance(config); 1218c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein Class c = dcl.loadClass(className); 1228c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein Method m = c.getMethod(methodName, (Class[]) null); 1238c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein return m.invoke(null, (Object[]) null); 1248c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 1258c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 1268c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein /* 1278c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein * Tests that are parametric with respect to whether to use a jar 1288c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein * file or a dex file as the source of the code 1298c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein */ 1308c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 1318c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein /** 1320097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein * Just a trivial test of construction. This one merely makes 1330097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein * sure that a valid construction doesn't fail; it doesn't try 1340097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein * to verify anything about the constructed instance. (Other 1350097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein * tests will do that.) 13644401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein */ 13730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein public static void test_init(Configuration config) { 13830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein createInstance(config); 1390097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein } 1400097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein 1410097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein /** 1421c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein * Check that a class in the jar/dex file may be used successfully. In this 1430097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein * case, a trivial static method is called. 1440097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein */ 14530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein public static void test_simpleUse(Configuration config) throws Exception { 1468c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein String result = (String) 14730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein createInstanceAndCallStaticMethod(config, "test.Test1", "test"); 1480097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein 1490097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein assertSame("blort", result); 15044401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein } 15192c92f5f5306c7bed2c34b8382dad32445f5ef85Dan Bornstein 1528c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein /* 1538c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein * All the following tests are just pass-throughs to test code 1548c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein * that lives inside the loading-test dex/jar file. 1558c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein */ 1568c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 15730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein public static void test_callStaticMethod(Configuration config) 1588c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein throws Exception { 1598c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein createInstanceAndCallStaticMethod( 16051d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein config, "test.TestMethods", "test_callStaticMethod"); 1618c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 1628c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 16330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein public static void test_getStaticVariable(Configuration config) 1648c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein throws Exception { 1658c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein createInstanceAndCallStaticMethod( 16651d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein config, "test.TestMethods", "test_getStaticVariable"); 1678c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 1688c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 16930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein public static void test_callInstanceMethod(Configuration config) 1708c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein throws Exception { 1718c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein createInstanceAndCallStaticMethod( 17251d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein config, "test.TestMethods", "test_callInstanceMethod"); 1738c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 1748c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 17530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein public static void test_getInstanceVariable(Configuration config) 1768c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein throws Exception { 1778c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein createInstanceAndCallStaticMethod( 17851d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein config, "test.TestMethods", "test_getInstanceVariable"); 1798c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 1808c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 1818c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein /* 1821c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein * These methods are all essentially just calls to the 18330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * parametrically-defined tests above. As a mnemonic name 18430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * differentiator, all the tests that use a two-element classpath 18530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * have a "2" suffix in their name (even though some such tests 18630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * don't have an equivalent single-element version). 1878c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein */ 1888c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 1898c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein public void test_jar_init() throws Exception { 19030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein test_init(Configuration.ONE_JAR); 1918c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 1928c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 1938c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein public void test_jar_simpleUse() throws Exception { 19430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein test_simpleUse(Configuration.ONE_JAR); 1958c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 1968c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 1978c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein public void test_jar_callStaticMethod() throws Exception { 19830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein test_callStaticMethod(Configuration.ONE_JAR); 1998c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 2008c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 2018c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein public void test_jar_getStaticVariable() throws Exception { 20230daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein test_getStaticVariable(Configuration.ONE_JAR); 2038c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 2048c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 2058c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein public void test_jar_callInstanceMethod() throws Exception { 20630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein test_callInstanceMethod(Configuration.ONE_JAR); 2078c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 2088c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 2098c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein public void test_jar_getInstanceVariable() throws Exception { 21030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein test_getInstanceVariable(Configuration.ONE_JAR); 2118c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 2128c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 2138c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein public void test_dex_init() throws Exception { 21430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein test_init(Configuration.ONE_DEX); 2158c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 2168c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 2178c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein public void test_dex_simpleUse() throws Exception { 21830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein test_simpleUse(Configuration.ONE_DEX); 2198c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 2208c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 2218c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein public void test_dex_callStaticMethod() throws Exception { 22230daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein test_callStaticMethod(Configuration.ONE_DEX); 2238c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 2248c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 2258c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein public void test_dex_getStaticVariable() throws Exception { 22630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein test_getStaticVariable(Configuration.ONE_DEX); 2278c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 2288c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 2298c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein public void test_dex_callInstanceMethod() throws Exception { 23030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein test_callInstanceMethod(Configuration.ONE_DEX); 2318c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 2328c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 2338c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein public void test_dex_getInstanceVariable() throws Exception { 23430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein test_getInstanceVariable(Configuration.ONE_DEX); 2358c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 2361c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein 2371c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein /* 2381c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein * Tests specifically for resource-related functionality. Since 2391c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein * raw dex files don't contain resources, these test only work 24030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * with jar files. The first couple methods here are helpers, 24130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * and they are followed by the tests per se. 2421c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein */ 2431c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein 2441c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein /** 24530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * Check that a given resource (by name) is retrievable and contains 24630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * the given expected contents. 2471c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein */ 24830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein public static void test_directGetResourceAsStream(Configuration config, 24930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein String resourceName, String expectedContents) 25030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein throws Exception { 25130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein DexClassLoader dcl = createInstance(config); 25230daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein InputStream in = dcl.getResourceAsStream(resourceName); 2531c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein byte[] contents = Streams.readFully(in); 2541c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein String s = new String(contents, "UTF-8"); 2551c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein 25630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein assertEquals(expectedContents, s); 25730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein } 25830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein 25930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein /** 26030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * Check that a resource in the jar file is retrievable and contains 26130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * the expected contents. 26230daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein */ 26330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein public static void test_directGetResourceAsStream(Configuration config) 26430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein throws Exception { 26530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein test_directGetResourceAsStream( 26630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein config, "test/Resource1.txt", "Muffins are tasty!\n"); 2671c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein } 2681c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein 2691c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein /** 2701c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein * Check that a resource in the jar file can be retrieved from 2711c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein * a class within that jar file. 2721c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein */ 27330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein public static void test_getResourceAsStream(Configuration config) 27430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein throws Exception { 27530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein createInstanceAndCallStaticMethod( 27651d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein config, "test.TestMethods", "test_getResourceAsStream"); 27730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein } 27830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein 27930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein public void test_directGetResourceAsStream() throws Exception { 28030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein test_directGetResourceAsStream(Configuration.ONE_JAR); 28130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein } 28230daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein 2831c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein public void test_getResourceAsStream() throws Exception { 28430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein test_getResourceAsStream(Configuration.ONE_JAR); 28530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein } 28630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein 28730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein public void test_directGetResourceAsStream2() throws Exception { 28830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein test_directGetResourceAsStream(Configuration.TWO_JAR); 28930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein } 29030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein 29130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein public void test_getResourceAsStream2() throws Exception { 29230daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein test_getResourceAsStream(Configuration.TWO_JAR); 29330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein } 29430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein 29530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein /** 29630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * Check that a resource in the second jar file is retrievable and 29730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * contains the expected contents. 29830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein */ 29930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein public static void test_diff_directGetResourceAsStream2() 30030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein throws Exception { 30130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein test_directGetResourceAsStream( 30230daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein Configuration.TWO_JAR, "test2/Resource2.txt", 30330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein "Who doesn't like a good biscuit?\n"); 30430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein } 30530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein 30630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein /** 30730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * Check that a resource in a jar file can be retrieved from 30830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * a class within the other jar file. 30930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein */ 31030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein public static void test_diff_getResourceAsStream2() 31130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein throws Exception { 3121c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein createInstanceAndCallStaticMethod( 31351d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein Configuration.TWO_JAR, "test.TestMethods", 31430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein "test_diff_getResourceAsStream"); 3151c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein } 31644401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein} 317