DexClassLoaderTest.java revision 1c4757f1439ed6209a7aba6ca2d8e99fd28c9612
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 {
3344401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein    private static final String PACKAGE_PATH = "dalvik/system/";
3444401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein    private static final String JAR_NAME = "loading-test.jar";
358c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    private static final String DEX_NAME = "loading-test.dex";
3644401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein    private static final File TMP_DIR =
3744401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein        new File(System.getProperty("java.io.tmpdir"), "loading-test");
3844401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein    private static final File TMP_JAR = new File(TMP_DIR, JAR_NAME);
398c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    private static final File TMP_DEX = new File(TMP_DIR, DEX_NAME);
4044401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein
4144401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein    protected void setUp() throws IOException {
4244401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein        TMP_DIR.mkdirs();
4344401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein
4444401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein        ClassLoader cl = DexClassLoaderTest.class.getClassLoader();
458c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
4644401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein        InputStream in = cl.getResourceAsStream(PACKAGE_PATH + JAR_NAME);
4744401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein        FileOutputStream out = new FileOutputStream(TMP_JAR);
488c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        Streams.copy(in, out);
498c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        in.close();
508c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        out.close();
5144401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein
528c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        in = cl.getResourceAsStream(PACKAGE_PATH + DEX_NAME);
538c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        out = new FileOutputStream(TMP_DEX);
5444401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein        Streams.copy(in, out);
5544401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein        in.close();
5644401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein        out.close();
5744401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein    }
5844401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein
5944401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein    /**
600097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein     * Helper to construct an instance to test.
618c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     *
628c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     * @param useDex whether to use the raw dex file ({@code true}) or
638c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     * a dex-in-jar file ({@code false})
640097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein     */
658c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    private static DexClassLoader createInstance(boolean useDex) {
668c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        File file = useDex ? TMP_DEX : TMP_JAR;
678c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
688c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        return new DexClassLoader(file.getAbsolutePath(),
690097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein                                  TMP_DIR.getAbsolutePath(),
700097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein                                  null,
710097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein                                  ClassLoader.getSystemClassLoader());
720097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein    }
730097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein
740097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein    /**
758c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     * Helper to construct an instance to test, using the jar file as
768c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     * the source, and call a named no-argument static method on a
778c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     * named class.
788c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     *
798c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     * @param useDex whether to use the raw dex file ({@code true}) or
808c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     * a dex-in-jar file ({@code false})
818c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     */
828c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    public static Object createInstanceAndCallStaticMethod(boolean useDex,
838c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein            String className, String methodName)
848c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein            throws ClassNotFoundException, NoSuchMethodException,
858c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein            IllegalAccessException, InvocationTargetException {
868c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        DexClassLoader dcl = createInstance(useDex);
878c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        Class c = dcl.loadClass(className);
888c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        Method m = c.getMethod(methodName, (Class[]) null);
898c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        return m.invoke(null, (Object[]) null);
908c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
918c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
928c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    /*
938c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     * Tests that are parametric with respect to whether to use a jar
948c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     * file or a dex file as the source of the code
958c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     */
968c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
978c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    /**
980097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein     * Just a trivial test of construction. This one merely makes
990097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein     * sure that a valid construction doesn't fail; it doesn't try
1000097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein     * to verify anything about the constructed instance. (Other
1010097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein     * tests will do that.)
10244401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein     */
1038c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    public static void test_init(boolean useDex) {
1048c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        createInstance(useDex);
1050097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein    }
1060097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein
1070097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein    /**
1081c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     * Check that a class in the jar/dex file may be used successfully. In this
1090097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein     * case, a trivial static method is called.
1100097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein     */
1118c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    public static void test_simpleUse(boolean useDex) throws Exception {
1128c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        String result = (String)
1138c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein            createInstanceAndCallStaticMethod(useDex, "test.Test1", "test");
1140097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein
1150097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein        assertSame("blort", result);
11644401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein    }
11792c92f5f5306c7bed2c34b8382dad32445f5ef85Dan Bornstein
1188c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    /*
1198c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     * All the following tests are just pass-throughs to test code
1208c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     * that lives inside the loading-test dex/jar file.
1218c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     */
1228c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1238c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    public static void test_callStaticMethod(boolean useDex)
1248c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein            throws Exception {
1258c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        createInstanceAndCallStaticMethod(
1268c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein            useDex, "test.Test2", "test_callStaticMethod");
1278c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
1288c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1298c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    public static void test_getStaticVariable(boolean useDex)
1308c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein            throws Exception {
1318c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        createInstanceAndCallStaticMethod(
1328c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein            useDex, "test.Test2", "test_getStaticVariable");
1338c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
1348c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1358c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    public static void test_callInstanceMethod(boolean useDex)
1368c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein            throws Exception {
1378c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        createInstanceAndCallStaticMethod(
1388c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein            useDex, "test.Test2", "test_callInstanceMethod");
1398c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
1408c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1418c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    public static void test_getInstanceVariable(boolean useDex)
1428c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein            throws Exception {
1438c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        createInstanceAndCallStaticMethod(
1448c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein            useDex, "test.Test2", "test_getInstanceVariable");
1458c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
1468c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1478c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    /*
1481c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     * These methods are all essentially just calls to the
1491c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     * parametrically-defined tests above.
1508c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein     */
1518c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1528c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    public void test_jar_init() throws Exception {
1538c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        test_init(false);
1548c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
1558c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1568c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    public void test_jar_simpleUse() throws Exception {
1578c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        test_simpleUse(false);
1588c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
1598c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1608c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    public void test_jar_callStaticMethod() throws Exception {
1618c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        test_callStaticMethod(false);
1628c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
1638c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1648c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    public void test_jar_getStaticVariable() throws Exception {
1658c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        test_getStaticVariable(false);
1668c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
1678c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1688c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    public void test_jar_callInstanceMethod() throws Exception {
1698c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        test_callInstanceMethod(false);
1708c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
1718c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1728c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    public void test_jar_getInstanceVariable() throws Exception {
1738c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        test_getInstanceVariable(false);
1748c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
1758c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1768c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    public void test_dex_init() throws Exception {
1778c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        test_init(true);
1788c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
1798c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1808c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    public void test_dex_simpleUse() throws Exception {
1818c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        test_simpleUse(true);
1828c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
1838c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1848c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    public void test_dex_callStaticMethod() throws Exception {
1858c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        test_callStaticMethod(true);
1868c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
1878c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1888c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    public void test_dex_getStaticVariable() throws Exception {
1898c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        test_getStaticVariable(true);
1908c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
1918c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1928c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    public void test_dex_callInstanceMethod() throws Exception {
1938c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        test_callInstanceMethod(true);
1948c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
1958c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein
1968c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    public void test_dex_getInstanceVariable() throws Exception {
1978c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein        test_getInstanceVariable(true);
1988c47f104820836f6bdacce83e1be6cc71c1cace0Dan Bornstein    }
1991c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein
2001c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein    /*
2011c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     * Tests specifically for resource-related functionality.  Since
2021c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     * raw dex files don't contain resources, these test only work
2031c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     * with jar files.
2041c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     */
2051c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein
2061c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein    /**
2071c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     * Check that a resource in the jar file is retrievable and contains
2081c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     * the expected contents.
2091c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     */
2101c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein    public void test_directGetResourceAsStream() throws Exception {
2111c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein        DexClassLoader dcl = createInstance(false);
2121c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein        InputStream in = dcl.getResourceAsStream("test/Resource1.txt");
2131c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein        byte[] contents = Streams.readFully(in);
2141c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein        String s = new String(contents, "UTF-8");
2151c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein
2161c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein        assertEquals("Muffins are tasty!\n", s);
2171c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein    }
2181c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein
2191c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein    /**
2201c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     * Check that a resource in the jar file can be retrieved from
2211c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     * a class within that jar file.
2221c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein     */
2231c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein    public void test_getResourceAsStream() throws Exception {
2241c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein        createInstanceAndCallStaticMethod(
2251c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein            false, "test.Test2", "test_getResourceAsStream");
2261c4757f1439ed6209a7aba6ca2d8e99fd28c9612Dan Bornstein    }
22744401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein}
228