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