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;
256186821cb13f4ac7ff50950c813394367e021eaeJesse Wilsonimport libcore.io.Streams;
2644401c99f407517a16f8bf75a942a1461a6feceeDan Bornsteinimport junit.framework.TestCase;
2744401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein
2844401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein/**
2944401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein * Tests for the class {@link DexClassLoader}.
3044401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein */
3144401c99f407517a16f8bf75a942a1461a6feceeDan Bornsteinpublic class DexClassLoaderTest extends TestCase {
3230daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein    private static final File TMP_DIR =
3330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        new File(System.getProperty("java.io.tmpdir"), "loading-test");
3444401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein    private static final String PACKAGE_PATH = "dalvik/system/";
3544401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein    private static final String JAR_NAME = "loading-test.jar";
368c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    private static final String DEX_NAME = "loading-test.dex";
3730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein    private static final String JAR2_NAME = "loading-test2.jar";
3830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein    private static final String DEX2_NAME = "loading-test2.dex";
3951d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein    private static final File JAR_FILE = new File(TMP_DIR, JAR_NAME);
4051d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein    private static final File DEX_FILE = new File(TMP_DIR, DEX_NAME);
4151d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein    private static final File JAR2_FILE = new File(TMP_DIR, JAR2_NAME);
4251d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein    private static final File DEX2_FILE = new File(TMP_DIR, DEX2_NAME);
43ec80ed70b9790785bd70b9482ec94e7dea09fd48Dan Bornstein    private static final File OPTIMIZED_DIR = new File(TMP_DIR, "optimized");
4430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein
4530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein    private static enum Configuration {
4630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        /** just one classpath element, a raw dex file */
476f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein        ONE_DEX(1),
4830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein
4930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        /** just one classpath element, a jar file */
506f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein        ONE_JAR(1),
5130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein
5230daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        /** two classpath elements, both raw dex files */
536f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein        TWO_DEX(2),
5430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein
5530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        /** two classpath elements, both jar files */
566f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein        TWO_JAR(2);
576f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein
586f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein        public final int expectedFiles;
596f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein
606f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein        Configuration(int expectedFiles) {
616f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein            this.expectedFiles = expectedFiles;
626f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein        }
6330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein    }
6444401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein
6544401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein    protected void setUp() throws IOException {
6644401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein        TMP_DIR.mkdirs();
6744401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein
6844401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein        ClassLoader cl = DexClassLoaderTest.class.getClassLoader();
6951d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein        copyResource(cl, JAR_NAME, JAR_FILE);
7051d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein        copyResource(cl, DEX_NAME, DEX_FILE);
7151d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein        copyResource(cl, JAR2_NAME, JAR2_FILE);
7251d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein        copyResource(cl, DEX2_NAME, DEX2_FILE);
73d8bf30013b7e67f2f5d4b182827c86f8687569cdBrian Carlstrom
74d8bf30013b7e67f2f5d4b182827c86f8687569cdBrian Carlstrom        OPTIMIZED_DIR.mkdirs();
75d8bf30013b7e67f2f5d4b182827c86f8687569cdBrian Carlstrom        File[] files = OPTIMIZED_DIR.listFiles();
76d8bf30013b7e67f2f5d4b182827c86f8687569cdBrian Carlstrom        for (File file : files) {
77d8bf30013b7e67f2f5d4b182827c86f8687569cdBrian Carlstrom            file.delete();
78d8bf30013b7e67f2f5d4b182827c86f8687569cdBrian Carlstrom        }
790ec98177a2b2ea242a9ca9e0fb5aee39bba0c007Dan Bornstein    }
808c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
810ec98177a2b2ea242a9ca9e0fb5aee39bba0c007Dan Bornstein    /**
821a6e00246281eb49b7b48b1b55cf9077e10c1cfeDan Bornstein     * Copy a resource in the package directory to the indicated
831a6e00246281eb49b7b48b1b55cf9077e10c1cfeDan Bornstein     * target file, but only if the target file doesn't exist.
840ec98177a2b2ea242a9ca9e0fb5aee39bba0c007Dan Bornstein     */
850ec98177a2b2ea242a9ca9e0fb5aee39bba0c007Dan Bornstein    private static void copyResource(ClassLoader loader, String resourceName,
860ec98177a2b2ea242a9ca9e0fb5aee39bba0c007Dan Bornstein            File destination) throws IOException {
871a6e00246281eb49b7b48b1b55cf9077e10c1cfeDan Bornstein        if (destination.exists()) {
881a6e00246281eb49b7b48b1b55cf9077e10c1cfeDan Bornstein            return;
891a6e00246281eb49b7b48b1b55cf9077e10c1cfeDan Bornstein        }
901a6e00246281eb49b7b48b1b55cf9077e10c1cfeDan Bornstein
910ec98177a2b2ea242a9ca9e0fb5aee39bba0c007Dan Bornstein        InputStream in =
920ec98177a2b2ea242a9ca9e0fb5aee39bba0c007Dan Bornstein            loader.getResourceAsStream(PACKAGE_PATH + resourceName);
930ec98177a2b2ea242a9ca9e0fb5aee39bba0c007Dan Bornstein        FileOutputStream out = new FileOutputStream(destination);
9444401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein        Streams.copy(in, out);
9544401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein        in.close();
9644401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein        out.close();
9744401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein    }
9844401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein
9944401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein    /**
1000097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein     * Helper to construct an instance to test.
1018c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     *
10230daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein     * @param config how to configure the classpath
1030097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein     */
10430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein    private static DexClassLoader createInstance(Configuration config) {
10530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        File file1;
10630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        File file2;
10730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein
10830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        switch (config) {
10951d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein            case ONE_DEX: file1 = DEX_FILE; file2 = null;      break;
11051d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein            case ONE_JAR: file1 = JAR_FILE; file2 = null;      break;
11151d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein            case TWO_DEX: file1 = DEX_FILE; file2 = DEX2_FILE; break;
11251d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein            case TWO_JAR: file1 = JAR_FILE; file2 = JAR2_FILE; break;
11330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein            default: throw new AssertionError("shouldn't happen");
11430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        }
11530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein
11630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        String path = file1.getAbsolutePath();
11730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        if (file2 != null) {
11830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein            path += File.pathSeparator + file2.getAbsolutePath();
11930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        }
12030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein
12130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        return new DexClassLoader(
122ec80ed70b9790785bd70b9482ec94e7dea09fd48Dan Bornstein            path, OPTIMIZED_DIR.getAbsolutePath(), null,
12330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein            ClassLoader.getSystemClassLoader());
1240097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein    }
1250097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein
1260097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein    /**
1278c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     * Helper to construct an instance to test, using the jar file as
1288c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     * the source, and call a named no-argument static method on a
1298c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     * named class.
1308c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     *
13130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein     * @param config how to configure the classpath
1328c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     */
13330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein    public static Object createInstanceAndCallStaticMethod(
13430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein            Configuration config, String className, String methodName)
1358c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein            throws ClassNotFoundException, NoSuchMethodException,
1368c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein            IllegalAccessException, InvocationTargetException {
13730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        DexClassLoader dcl = createInstance(config);
1388c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        Class c = dcl.loadClass(className);
1398c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        Method m = c.getMethod(methodName, (Class[]) null);
1408c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        return m.invoke(null, (Object[]) null);
1418c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
1428c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1438c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    /*
1448c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     * Tests that are parametric with respect to whether to use a jar
1458c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     * file or a dex file as the source of the code
1468c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     */
1478c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1488c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    /**
1490097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein     * Just a trivial test of construction. This one merely makes
1506f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein     * sure that a valid construction doesn't fail. It doesn't try
1516f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein     * to verify anything about the constructed instance, other than
1526f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein     * checking for the existence of optimized dex files.
15344401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein     */
1546f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein    private static void test_init(Configuration config) {
15530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        createInstance(config);
1566f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein
1576f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein        int expectedFiles = config.expectedFiles;
1586f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein        int actualFiles = OPTIMIZED_DIR.listFiles().length;
1596f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein
160a186c233345c9cc0c7864dc5bd466c4d8413de6cDan Bornstein        assertEquals(expectedFiles, actualFiles);
1610097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein    }
1620097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein
1630097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein    /**
1641c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     * Check that a class in the jar/dex file may be used successfully. In this
1650097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein     * case, a trivial static method is called.
1660097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein     */
1676f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein    private static void test_simpleUse(Configuration config) throws Exception {
1688c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        String result = (String)
16930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein            createInstanceAndCallStaticMethod(config, "test.Test1", "test");
1700097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein
1710097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein        assertSame("blort", result);
17244401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein    }
17392c92f5f5306c7bed2c34b8382dad32445f5ef85Dan Bornstein
1748c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    /*
1758c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     * All the following tests are just pass-throughs to test code
1768c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     * that lives inside the loading-test dex/jar file.
1778c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     */
1788c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1796f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein    private static void test_constructor(Configuration config)
1806bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein            throws Exception {
1816bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        createInstanceAndCallStaticMethod(
1826bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein            config, "test.TestMethods", "test_constructor");
1836bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
1846bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
1856f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein    private static void test_callStaticMethod(Configuration config)
1868c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein            throws Exception {
1878c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        createInstanceAndCallStaticMethod(
18851d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein            config, "test.TestMethods", "test_callStaticMethod");
1898c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
1908c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1916f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein    private static void test_getStaticVariable(Configuration config)
1928c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein            throws Exception {
1938c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        createInstanceAndCallStaticMethod(
19451d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein            config, "test.TestMethods", "test_getStaticVariable");
1958c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
1968c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1976f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein    private static void test_callInstanceMethod(Configuration config)
1988c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein            throws Exception {
1998c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        createInstanceAndCallStaticMethod(
20051d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein            config, "test.TestMethods", "test_callInstanceMethod");
2018c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
2028c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
2036f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein    private static void test_getInstanceVariable(Configuration config)
2048c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein            throws Exception {
2058c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        createInstanceAndCallStaticMethod(
20651d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein            config, "test.TestMethods", "test_getInstanceVariable");
2078c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
2088c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
2096f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein    private static void test_diff_constructor(Configuration config)
2106bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein            throws Exception {
2116bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        createInstanceAndCallStaticMethod(
2126bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein            config, "test.TestMethods", "test_diff_constructor");
2136bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
2146bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
2156f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein    private static void test_diff_callStaticMethod(Configuration config)
2166bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein            throws Exception {
2176bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        createInstanceAndCallStaticMethod(
2186bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein            config, "test.TestMethods", "test_diff_callStaticMethod");
2196bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
2206bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
2216f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein    private static void test_diff_getStaticVariable(Configuration config)
2226bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein            throws Exception {
2236bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        createInstanceAndCallStaticMethod(
2246bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein            config, "test.TestMethods", "test_diff_getStaticVariable");
2256bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
2266bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
2276f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein    private static void test_diff_callInstanceMethod(Configuration config)
2286bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein            throws Exception {
2296bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        createInstanceAndCallStaticMethod(
2306bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein            config, "test.TestMethods", "test_diff_callInstanceMethod");
2316bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
2326bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
2336f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein    private static void test_diff_getInstanceVariable(Configuration config)
2346bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein            throws Exception {
2356bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        createInstanceAndCallStaticMethod(
2366bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein            config, "test.TestMethods", "test_diff_getInstanceVariable");
2376bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
2386bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
2398c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    /*
2401c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     * These methods are all essentially just calls to the
2416bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein     * parametrically-defined tests above.
2428c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     */
2438c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
2446bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    // ONE_JAR
2456bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
2466bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_oneJar_init() throws Exception {
24730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        test_init(Configuration.ONE_JAR);
2488c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
2498c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
2506bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_oneJar_simpleUse() throws Exception {
25130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        test_simpleUse(Configuration.ONE_JAR);
2528c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
2538c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
2546bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_oneJar_constructor() throws Exception {
2556bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_constructor(Configuration.ONE_JAR);
2566bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
2576bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
2586bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_oneJar_callStaticMethod() throws Exception {
25930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        test_callStaticMethod(Configuration.ONE_JAR);
2608c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
2618c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
2626bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_oneJar_getStaticVariable() throws Exception {
26330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        test_getStaticVariable(Configuration.ONE_JAR);
2648c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
2658c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
2666bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_oneJar_callInstanceMethod() throws Exception {
26730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        test_callInstanceMethod(Configuration.ONE_JAR);
2688c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
2698c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
2706bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_oneJar_getInstanceVariable() throws Exception {
27130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        test_getInstanceVariable(Configuration.ONE_JAR);
2728c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
2738c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
2746bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    // ONE_DEX
2756bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
2766bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_oneDex_init() throws Exception {
27730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        test_init(Configuration.ONE_DEX);
2788c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
2798c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
2806bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_oneDex_simpleUse() throws Exception {
28130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        test_simpleUse(Configuration.ONE_DEX);
2828c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
2838c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
2846bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_oneDex_constructor() throws Exception {
2856bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_constructor(Configuration.ONE_DEX);
2866bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
2876bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
2886bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_oneDex_callStaticMethod() throws Exception {
28930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        test_callStaticMethod(Configuration.ONE_DEX);
2908c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
2918c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
2926bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_oneDex_getStaticVariable() throws Exception {
29330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        test_getStaticVariable(Configuration.ONE_DEX);
2948c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
2958c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
2966bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_oneDex_callInstanceMethod() throws Exception {
29730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        test_callInstanceMethod(Configuration.ONE_DEX);
2988c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
2998c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
3006bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_oneDex_getInstanceVariable() throws Exception {
30130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        test_getInstanceVariable(Configuration.ONE_DEX);
3028c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
3031c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein
3046bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    // TWO_JAR
3056bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3066bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_twoJar_init() throws Exception {
3076bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_init(Configuration.TWO_JAR);
3086bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3096bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3106bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_twoJar_simpleUse() throws Exception {
3116bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_simpleUse(Configuration.TWO_JAR);
3126bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3136bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3146bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_twoJar_constructor() throws Exception {
3156bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_constructor(Configuration.TWO_JAR);
3166bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3176bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3186bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_twoJar_callStaticMethod() throws Exception {
3196bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_callStaticMethod(Configuration.TWO_JAR);
3206bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3216bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3226bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_twoJar_getStaticVariable() throws Exception {
3236bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_getStaticVariable(Configuration.TWO_JAR);
3246bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3256bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3266bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_twoJar_callInstanceMethod() throws Exception {
3276bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_callInstanceMethod(Configuration.TWO_JAR);
3286bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3296bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3306bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_twoJar_getInstanceVariable() throws Exception {
3316bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_getInstanceVariable(Configuration.TWO_JAR);
3326bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3336bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3346bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public static void test_twoJar_diff_constructor() throws Exception {
3356bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_diff_constructor(Configuration.TWO_JAR);
3366bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3376bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3386bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public static void test_twoJar_diff_callStaticMethod() throws Exception {
3396bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_diff_callStaticMethod(Configuration.TWO_JAR);
3406bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3416bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3426bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public static void test_twoJar_diff_getStaticVariable() throws Exception {
3436bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_diff_getStaticVariable(Configuration.TWO_JAR);
3446bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3456bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3466bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public static void test_twoJar_diff_callInstanceMethod()
3476bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein            throws Exception {
3486bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_diff_callInstanceMethod(Configuration.TWO_JAR);
3496bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3506bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3516bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public static void test_twoJar_diff_getInstanceVariable()
3526bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein            throws Exception {
3536bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_diff_getInstanceVariable(Configuration.TWO_JAR);
3546bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3556bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3566bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    // TWO_DEX
3576bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3586bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_twoDex_init() throws Exception {
3596bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_init(Configuration.TWO_DEX);
3606bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3616bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3626bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_twoDex_simpleUse() throws Exception {
3636bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_simpleUse(Configuration.TWO_DEX);
3646bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3656bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3666bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_twoDex_constructor() throws Exception {
3676bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_constructor(Configuration.TWO_DEX);
3686bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3696bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3706bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_twoDex_callStaticMethod() throws Exception {
3716bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_callStaticMethod(Configuration.TWO_DEX);
3726bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3736bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3746bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_twoDex_getStaticVariable() throws Exception {
3756bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_getStaticVariable(Configuration.TWO_DEX);
3766bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3776bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3786bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_twoDex_callInstanceMethod() throws Exception {
3796bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_callInstanceMethod(Configuration.TWO_DEX);
3806bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3816bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3826bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_twoDex_getInstanceVariable() throws Exception {
3836bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_getInstanceVariable(Configuration.TWO_DEX);
3846bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3856bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3866bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public static void test_twoDex_diff_constructor() throws Exception {
3876bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_diff_constructor(Configuration.TWO_DEX);
3886bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3896bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3906bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public static void test_twoDex_diff_callStaticMethod() throws Exception {
3916bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_diff_callStaticMethod(Configuration.TWO_DEX);
3926bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3936bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3946bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public static void test_twoDex_diff_getStaticVariable() throws Exception {
3956bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_diff_getStaticVariable(Configuration.TWO_DEX);
3966bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
3976bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
3986bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public static void test_twoDex_diff_callInstanceMethod()
3996bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein            throws Exception {
4006bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_diff_callInstanceMethod(Configuration.TWO_DEX);
4016bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
4026bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
4036bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public static void test_twoDex_diff_getInstanceVariable()
4046bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein            throws Exception {
4056bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein        test_diff_getInstanceVariable(Configuration.TWO_DEX);
4066bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    }
4076bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein
4081c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein    /*
4091c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     * Tests specifically for resource-related functionality.  Since
4101c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     * raw dex files don't contain resources, these test only work
41130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein     * with jar files. The first couple methods here are helpers,
41230daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein     * and they are followed by the tests per se.
4131c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     */
4141c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein
4151c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein    /**
41630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein     * Check that a given resource (by name) is retrievable and contains
41730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein     * the given expected contents.
4181c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     */
4196f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein    private static void test_directGetResourceAsStream(Configuration config,
42030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein            String resourceName, String expectedContents)
42130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein            throws Exception {
42230daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        DexClassLoader dcl = createInstance(config);
42330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        InputStream in = dcl.getResourceAsStream(resourceName);
4241c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein        byte[] contents = Streams.readFully(in);
4251c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein        String s = new String(contents, "UTF-8");
4261c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein
42730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        assertEquals(expectedContents, s);
42830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein    }
42930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein
43030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein    /**
43130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein     * Check that a resource in the jar file is retrievable and contains
43230daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein     * the expected contents.
43330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein     */
4346f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein    private static void test_directGetResourceAsStream(Configuration config)
43530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein            throws Exception {
43630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        test_directGetResourceAsStream(
43730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein            config, "test/Resource1.txt", "Muffins are tasty!\n");
4381c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein    }
4391c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein
4401c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein    /**
4411c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     * Check that a resource in the jar file can be retrieved from
4421c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     * a class within that jar file.
4431c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     */
4446f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein    private static void test_getResourceAsStream(Configuration config)
44530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein            throws Exception {
44630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        createInstanceAndCallStaticMethod(
44751d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein            config, "test.TestMethods", "test_getResourceAsStream");
44830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein    }
44930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein
4506bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_oneJar_directGetResourceAsStream() throws Exception {
45130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        test_directGetResourceAsStream(Configuration.ONE_JAR);
45230daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein    }
45330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein
4546bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_oneJar_getResourceAsStream() throws Exception {
45530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        test_getResourceAsStream(Configuration.ONE_JAR);
45630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein    }
45730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein
4586bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_twoJar_directGetResourceAsStream() throws Exception {
45930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        test_directGetResourceAsStream(Configuration.TWO_JAR);
46030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein    }
46130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein
4626bfc6b199a14f8eb893426b7d48bcf06a3a32015Dan Bornstein    public void test_twoJar_getResourceAsStream() throws Exception {
46330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        test_getResourceAsStream(Configuration.TWO_JAR);
46430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein    }
46530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein
46630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein    /**
46730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein     * Check that a resource in the second jar file is retrievable and
46830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein     * contains the expected contents.
46930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein     */
4706f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein    public void test_twoJar_diff_directGetResourceAsStream()
47130daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein            throws Exception {
47230daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein        test_directGetResourceAsStream(
47330daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein            Configuration.TWO_JAR, "test2/Resource2.txt",
47430daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein            "Who doesn't like a good biscuit?\n");
47530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein    }
47630daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein
47730daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein    /**
47830daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein     * Check that a resource in a jar file can be retrieved from
47930daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein     * a class within the other jar file.
48030daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein     */
4816f42688fdc1389ed10d611c51aabc6034174db5aDan Bornstein    public void test_twoJar_diff_getResourceAsStream()
48230daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein            throws Exception {
4831c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein        createInstanceAndCallStaticMethod(
48451d35175d7cce2afc5c9cdd1ef939d60481cd398Dan Bornstein            Configuration.TWO_JAR, "test.TestMethods",
48530daad6ce1e6f4a94d1c01672df26d2d35eafacaDan Bornstein            "test_diff_getResourceAsStream");
4861c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein    }
48744401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein}
488