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