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 19af13f698a348ab33fb37df20fb9a7fd45e07edfeNarayan Kamathimport java.io.FilenameFilter; 200097708dae398465c3da40cc7f9a2dfde5571364Dan Bornsteinimport java.lang.reflect.InvocationTargetException; 210097708dae398465c3da40cc7f9a2dfde5571364Dan Bornsteinimport java.lang.reflect.Method; 2244401c99f407517a16f8bf75a942a1461a6feceeDan Bornsteinimport java.io.File; 2344401c99f407517a16f8bf75a942a1461a6feceeDan Bornsteinimport java.io.FileOutputStream; 2444401c99f407517a16f8bf75a942a1461a6feceeDan Bornsteinimport java.io.IOException; 2544401c99f407517a16f8bf75a942a1461a6feceeDan Bornsteinimport java.io.InputStream; 266186821cb13f4ac7ff50950c813394367e021eaeJesse Wilsonimport libcore.io.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 { 3344401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein private static final String PACKAGE_PATH = "dalvik/system/"; 346f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein 355f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler private File srcDir; 365f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler private File dex1; 375f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler private File dex2; 385f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler private File jar1; 395f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler private File jar2; 405f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler private File optimizedDir; 4144401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein 422e12088d4dc23d472312f4b06f7230479108fce2jeffhao protected void setUp() throws Exception { 435f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler srcDir = File.createTempFile("src", ""); 445f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler assertTrue(srcDir.delete()); 455f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler assertTrue(srcDir.mkdirs()); 465f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler 475f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler dex1 = new File(srcDir, "loading-test.dex"); 485f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler dex2 = new File(srcDir, "loading-test2.dex"); 495f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler jar1 = new File(srcDir, "loading-test.jar"); 505f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler jar2 = new File(srcDir, "loading-test2.jar"); 515f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler 525f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler copyResource("loading-test.dex", dex1); 535f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler copyResource("loading-test2.dex", dex2); 545f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler copyResource("loading-test.jar", jar1); 555f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler copyResource("loading-test2.jar", jar2); 5644401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein 575f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler optimizedDir = File.createTempFile("optimized", ""); 585f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler assertTrue(optimizedDir.delete()); 595f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler assertTrue(optimizedDir.mkdirs()); 6058c130c1eb99cc72998150d813b3e31896e3bfafCalin Juravle } 6158c130c1eb99cc72998150d813b3e31896e3bfafCalin Juravle 6258c130c1eb99cc72998150d813b3e31896e3bfafCalin Juravle protected void tearDown() { 635f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler cleanUpDir(srcDir); 645f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler cleanUpDir(optimizedDir); 6558c130c1eb99cc72998150d813b3e31896e3bfafCalin Juravle } 66d8bf30013b7e67f2f5d4b182827c86f8687569cdBrian Carlstrom 675f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler private static void cleanUpDir(File dir) { 6858c130c1eb99cc72998150d813b3e31896e3bfafCalin Juravle if (!dir.isDirectory()) { 6958c130c1eb99cc72998150d813b3e31896e3bfafCalin Juravle return; 7058c130c1eb99cc72998150d813b3e31896e3bfafCalin Juravle } 7158c130c1eb99cc72998150d813b3e31896e3bfafCalin Juravle File[] files = dir.listFiles(); 72d8bf30013b7e67f2f5d4b182827c86f8687569cdBrian Carlstrom for (File file : files) { 7358c130c1eb99cc72998150d813b3e31896e3bfafCalin Juravle assertTrue(file.delete()); 74d8bf30013b7e67f2f5d4b182827c86f8687569cdBrian Carlstrom } 750ec98177a2b2ea242a9ca9e0fb5aee39bba0c007Dan Bornstein } 768c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 770ec98177a2b2ea242a9ca9e0fb5aee39bba0c007Dan Bornstein /** 781a6e00246281eb49b7b48b1b55cf9077e10c1cfeDan Bornstein * Copy a resource in the package directory to the indicated 795f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler * target file. 800ec98177a2b2ea242a9ca9e0fb5aee39bba0c007Dan Bornstein */ 815f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler private static void copyResource(String resourceName, 820ec98177a2b2ea242a9ca9e0fb5aee39bba0c007Dan Bornstein File destination) throws IOException { 835f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler ClassLoader loader = DexClassLoaderTest.class.getClassLoader(); 845f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler assertFalse(destination.exists()); 85af13f698a348ab33fb37df20fb9a7fd45e07edfeNarayan Kamath InputStream in = loader.getResourceAsStream(PACKAGE_PATH + resourceName); 86af13f698a348ab33fb37df20fb9a7fd45e07edfeNarayan Kamath if (in == null) { 875f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler throw new IllegalStateException("Resource not found: " + PACKAGE_PATH + resourceName); 88af13f698a348ab33fb37df20fb9a7fd45e07edfeNarayan Kamath } 89af13f698a348ab33fb37df20fb9a7fd45e07edfeNarayan Kamath 90af13f698a348ab33fb37df20fb9a7fd45e07edfeNarayan Kamath try (FileOutputStream out = new FileOutputStream(destination)) { 91af13f698a348ab33fb37df20fb9a7fd45e07edfeNarayan Kamath Streams.copy(in, out); 92af13f698a348ab33fb37df20fb9a7fd45e07edfeNarayan Kamath } finally { 93af13f698a348ab33fb37df20fb9a7fd45e07edfeNarayan Kamath in.close(); 94af13f698a348ab33fb37df20fb9a7fd45e07edfeNarayan Kamath } 9544401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein } 9644401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein 975f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler static final FilenameFilter DEX_FILE_NAME_FILTER = new FilenameFilter() { 985f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler @Override 995f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler public boolean accept(File file, String s) { 1005f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler return s.endsWith(".dex"); 1015f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler } 1025f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler }; 1035f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler 10444401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein /** 1055f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler * Helper to construct a DexClassLoader instance to test. 1068c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein * 1075f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler * @param files The .dex or .jar files to use for the class path. 1080097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein */ 1095f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler private ClassLoader createLoader(File... files) { 1105f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler assertNotNull(files); 1115f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler assertTrue(files.length > 0); 1125f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler String path = files[0].getAbsolutePath(); 1135f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler for (int i = 1; i < files.length; i++) { 1145f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler path += File.pathSeparator + files[i].getAbsolutePath(); 1155f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler } 1165f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler return new DexClassLoader(path, optimizedDir.getAbsolutePath(), null, 11730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein ClassLoader.getSystemClassLoader()); 1180097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein } 1190097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein 1200097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein /** 1215f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler * Helper to construct a new DexClassLoader instance to test, using the 1225f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler * given files as the class path, and call a named no-argument static 1235f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler * method on a named class. 1248c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein * 1255f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler * @param className The name of the class of the method to call. 1265f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler * @param methodName The name of the method to call. 1275f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler * @param files The .dex or .jar files to use for the class path. 1288c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein */ 1295f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler public Object createLoaderAndCallMethod( 1305f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler String className, String methodName, File... files) 1315f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler throws ReflectiveOperationException { 1325f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler ClassLoader cl = createLoader(files); 1335f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler Class c = cl.loadClass(className); 1348c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein Method m = c.getMethod(methodName, (Class[]) null); 1358c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein return m.invoke(null, (Object[]) null); 1368c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 1378c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 1385f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler /** 1395f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler * Helper to construct a new DexClassLoader instance to test, using the 1405f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler * given files as the class path, and read the contents of the named 1415f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler * resource as a String. 1425f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler * 1435f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler * @param resourceName The name of the resource to get. 1445f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler * @param files The .dex or .jar files to use for the class path. 1458c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein */ 1465f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler private String createLoaderAndGetResource(String resourceName, File... files) throws Exception { 1475f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler ClassLoader cl = createLoader(files); 1485f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler InputStream in = cl.getResourceAsStream(resourceName); 1495f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler if (in == null) { 1505f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler throw new IllegalStateException("Resource not found: " + resourceName); 151af13f698a348ab33fb37df20fb9a7fd45e07edfeNarayan Kamath } 1525f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler 1535f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler byte[] contents = Streams.readFully(in); 1545f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler return new String(contents, "UTF-8"); 1555f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler } 1565f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler 1575f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler // ONE_JAR 158af13f698a348ab33fb37df20fb9a7fd45e07edfeNarayan Kamath 1598c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein /** 1600097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein * Just a trivial test of construction. This one merely makes 1616f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein * sure that a valid construction doesn't fail. It doesn't try 1626f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein * to verify anything about the constructed instance, other than 1636f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein * checking for the existence of optimized dex files. 16444401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein */ 1655f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler public void test_oneJar_init() throws Exception { 1665f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler ClassLoader cl = createLoader(jar1); 1675f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler File[] files = optimizedDir.listFiles(DEX_FILE_NAME_FILTER); 1685f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler assertNotNull(files); 1695f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler assertEquals(1, files.length); 1700097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein } 1710097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein 1720097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein /** 1731c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein * Check that a class in the jar/dex file may be used successfully. In this 1740097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein * case, a trivial static method is called. 1750097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein */ 1765f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler public void test_oneJar_simpleUse() throws Exception { 1775f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler String result = (String) createLoaderAndCallMethod("test.Test1", "test", jar1); 1780097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein assertSame("blort", result); 17944401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein } 18092c92f5f5306c7bed2c34b8382dad32445f5ef85Dan Bornstein 1818c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein /* 1828c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein * All the following tests are just pass-throughs to test code 1838c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein * that lives inside the loading-test dex/jar file. 1848c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein */ 1858c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 1866bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_oneJar_constructor() throws Exception { 1875f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_constructor", jar1); 1886bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 1896bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 1906bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_oneJar_callStaticMethod() throws Exception { 1915f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_callStaticMethod", jar1); 1928c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 1938c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 1946bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_oneJar_getStaticVariable() throws Exception { 1955f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_getStaticVariable", jar1); 1968c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 1978c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 1986bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_oneJar_callInstanceMethod() throws Exception { 1995f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_callInstanceMethod", jar1); 2008c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 2018c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 2026bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_oneJar_getInstanceVariable() throws Exception { 2035f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_getInstanceVariable", jar1); 2048c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 2058c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 2066bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein // ONE_DEX 2076bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 2086bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_oneDex_init() throws Exception { 2095f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler ClassLoader cl = createLoader(dex1); 2105f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler File[] files = optimizedDir.listFiles(DEX_FILE_NAME_FILTER); 2115f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler assertNotNull(files); 2125f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler assertEquals(1, files.length); 2138c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 2148c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 2156bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_oneDex_simpleUse() throws Exception { 2165f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler String result = (String) createLoaderAndCallMethod("test.Test1", "test", dex1); 2175f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler assertSame("blort", result); 2188c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 2198c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 2206bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_oneDex_constructor() throws Exception { 2215f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_constructor", dex1); 2226bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 2236bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 2246bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_oneDex_callStaticMethod() throws Exception { 2255f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_callStaticMethod", dex1); 2268c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 2278c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 2286bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_oneDex_getStaticVariable() throws Exception { 2295f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_getStaticVariable", dex1); 2308c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 2318c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 2326bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_oneDex_callInstanceMethod() throws Exception { 2335f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_callInstanceMethod", dex1); 2348c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 2358c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein 2366bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_oneDex_getInstanceVariable() throws Exception { 2375f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_getInstanceVariable", dex1); 2388c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein } 2391c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein 2406bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein // TWO_JAR 2416bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 2426bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_twoJar_init() throws Exception { 2435f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler ClassLoader cl = createLoader(jar1, jar2); 2445f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler File[] files = optimizedDir.listFiles(DEX_FILE_NAME_FILTER); 2455f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler assertNotNull(files); 2465f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler assertEquals(2, files.length); 2476bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 2486bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 2496bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_twoJar_simpleUse() throws Exception { 2505f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler String result = (String) createLoaderAndCallMethod("test.Test1", "test", jar1, jar2); 2515f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler assertSame("blort", result); 2526bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 2536bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 2546bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_twoJar_constructor() throws Exception { 2555f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_constructor", jar1, jar2); 2566bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 2576bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 2586bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_twoJar_callStaticMethod() throws Exception { 2595f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_callStaticMethod", jar1, jar2); 2606bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 2616bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 2626bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_twoJar_getStaticVariable() throws Exception { 2635f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_getStaticVariable", jar1, jar2); 2646bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 2656bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 2666bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_twoJar_callInstanceMethod() throws Exception { 2675f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_callInstanceMethod", jar1, jar2); 2686bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 2696bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 2706bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_twoJar_getInstanceVariable() throws Exception { 2715f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_getInstanceVariable", jar1, jar2); 2726bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 2736bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 2745f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler public void test_twoJar_diff_constructor() throws Exception { 2755f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_diff_constructor", jar1, jar2); 2766bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 2776bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 2785f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler public void test_twoJar_diff_callStaticMethod() throws Exception { 2795f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_diff_callStaticMethod", jar1, jar2); 2806bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 2816bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 2825f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler public void test_twoJar_diff_getStaticVariable() throws Exception { 2835f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_diff_getStaticVariable", jar1, jar2); 2846bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 2856bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 2865f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler public void test_twoJar_diff_callInstanceMethod() throws Exception { 2875f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_diff_callInstanceMethod", jar1, jar2); 2886bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 2896bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 2905f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler public void test_twoJar_diff_getInstanceVariable() throws Exception { 2915f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_diff_getInstanceVariable", jar1, jar2); 2926bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 2936bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 2946bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein // TWO_DEX 2956bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 2966bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_twoDex_init() throws Exception { 2975f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler ClassLoader cl = createLoader(dex1, dex2); 2985f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler File[] files = optimizedDir.listFiles(DEX_FILE_NAME_FILTER); 2995f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler assertNotNull(files); 3005f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler assertEquals(2, files.length); 3016bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 3026bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 3036bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_twoDex_simpleUse() throws Exception { 3045f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler String result = (String) createLoaderAndCallMethod("test.Test1", "test", dex1, dex2); 3055f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler assertSame("blort", result); 3066bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 3076bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 3086bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_twoDex_constructor() throws Exception { 3095f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_constructor", dex1, dex2); 3106bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 3116bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 3126bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_twoDex_callStaticMethod() throws Exception { 3135f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_callStaticMethod", dex1, dex2); 3146bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 3156bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 3166bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_twoDex_getStaticVariable() throws Exception { 3175f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_getStaticVariable", dex1, dex2); 3186bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 3196bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 3206bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_twoDex_callInstanceMethod() throws Exception { 3215f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_callInstanceMethod", dex1, dex2); 3226bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 3236bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 3246bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_twoDex_getInstanceVariable() throws Exception { 3255f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_getInstanceVariable", dex1, dex2); 3266bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 3276bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 3285f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler public void test_twoDex_diff_constructor() throws Exception { 3295f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_diff_constructor", dex1, dex2); 3306bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 3316bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 3325f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler public void test_twoDex_diff_callStaticMethod() throws Exception { 3335f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_diff_callStaticMethod", dex1, dex2); 3346bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 3356bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 3365f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler public void test_twoDex_diff_getStaticVariable() throws Exception { 3375f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_diff_getStaticVariable", dex1, dex2); 3386bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 3396bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 3405f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler public void test_twoDex_diff_callInstanceMethod() throws Exception { 3415f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_diff_callInstanceMethod", dex1, dex2); 3426bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 3436bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 3445f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler public void test_twoDex_diff_getInstanceVariable() throws Exception { 3455f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_diff_getInstanceVariable", dex1, dex2); 3466bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein } 3476bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein 3481c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein /* 3491c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein * Tests specifically for resource-related functionality. Since 3501c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein * raw dex files don't contain resources, these test only work 3515f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler * with jar files. 3521c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein */ 3531c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein 3541c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein /** 35530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * Check that a resource in the jar file is retrievable and contains 35630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * the expected contents. 35730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein */ 3585f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler public void test_oneJar_directGetResourceAsStream() throws Exception { 3595f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler String result = createLoaderAndGetResource("test/Resource1.txt", jar1); 3605f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler assertEquals("Muffins are tasty!\n", result); 3611c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein } 3621c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein 3631c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein /** 3641c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein * Check that a resource in the jar file can be retrieved from 3651c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein * a class within that jar file. 3661c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein */ 3676bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_oneJar_getResourceAsStream() throws Exception { 3685f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_getResourceAsStream", jar1); 36930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein } 37030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein 3716bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_twoJar_directGetResourceAsStream() throws Exception { 3725f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler String result = createLoaderAndGetResource("test/Resource1.txt", jar1, jar2); 3735f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler assertEquals("Muffins are tasty!\n", result); 37430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein } 37530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein 3766bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein public void test_twoJar_getResourceAsStream() throws Exception { 3775f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_getResourceAsStream", jar1, jar2); 37830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein } 37930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein 38030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein /** 38130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * Check that a resource in the second jar file is retrievable and 38230daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * contains the expected contents. 38330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein */ 3845f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler public void test_twoJar_diff_directGetResourceAsStream() throws Exception { 3855f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler String result = createLoaderAndGetResource("test2/Resource2.txt", jar1, jar2); 3865f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler assertEquals("Who doesn't like a good biscuit?\n", result); 38730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein } 38830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein 38930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein /** 39030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * Check that a resource in a jar file can be retrieved from 39130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein * a class within the other jar file. 39230daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein */ 3935f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler public void test_twoJar_diff_getResourceAsStream() throws Exception { 3945f81ff794e9e4f480bd0011a870afc2b08060e42Richard Uhler createLoaderAndCallMethod("test.TestMethods", "test_diff_getResourceAsStream", jar1, jar2); 3951c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein } 39644401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein} 397