DexClassLoaderTest.java revision 92c92f5f5306c7bed2c34b8382dad32445f5ef85
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"; 3544401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein private static final File TMP_DIR = 3644401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein new File(System.getProperty("java.io.tmpdir"), "loading-test"); 3744401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein private static final File TMP_JAR = new File(TMP_DIR, JAR_NAME); 3844401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein 3944401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein protected void setUp() throws IOException { 4044401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein TMP_DIR.mkdirs(); 4144401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein 4244401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein ClassLoader cl = DexClassLoaderTest.class.getClassLoader(); 4344401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein InputStream in = cl.getResourceAsStream(PACKAGE_PATH + JAR_NAME); 4444401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein FileOutputStream out = new FileOutputStream(TMP_JAR); 4544401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein 4644401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein Streams.copy(in, out); 4744401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein in.close(); 4844401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein out.close(); 4944401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein } 5044401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein 5144401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein /** 520097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein * Helper to construct an instance to test. 530097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein */ 540097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein static private DexClassLoader createInstance() { 550097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein return new DexClassLoader(TMP_JAR.getAbsolutePath(), 560097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein TMP_DIR.getAbsolutePath(), 570097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein null, 580097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein ClassLoader.getSystemClassLoader()); 590097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein } 600097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein 610097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein /** 620097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein * Just a trivial test of construction. This one merely makes 630097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein * sure that a valid construction doesn't fail; it doesn't try 640097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein * to verify anything about the constructed instance. (Other 650097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein * tests will do that.) 6644401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein */ 6744401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein public void test_init() { 680097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein createInstance(); 690097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein } 700097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein 710097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein /** 720097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein * Check that a class in the jar file may be used successfully. In this 730097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein * case, a trivial static method is called. 740097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein */ 750097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein public void test_simpleUse() 760097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein throws ClassNotFoundException, NoSuchMethodException, 770097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein IllegalAccessException, InvocationTargetException { 780097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein DexClassLoader dcl = createInstance(); 790097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein Class c = dcl.loadClass("test.Test1"); 800097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein Method m = c.getMethod("test", (Class[]) null); 810097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein String result = (String) m.invoke(null, (Object[]) null); 820097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein 830097708dae398465c3da40cc7f9a2dfde5571364Dan Bornstein assertSame("blort", result); 8444401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein } 8592c92f5f5306c7bed2c34b8382dad32445f5ef85Dan Bornstein 8692c92f5f5306c7bed2c34b8382dad32445f5ef85Dan Bornstein /** 8792c92f5f5306c7bed2c34b8382dad32445f5ef85Dan Bornstein * Check that a resource in the jar file is retrievable and contains 8892c92f5f5306c7bed2c34b8382dad32445f5ef85Dan Bornstein * the expected contents. 8992c92f5f5306c7bed2c34b8382dad32445f5ef85Dan Bornstein */ 9092c92f5f5306c7bed2c34b8382dad32445f5ef85Dan Bornstein public void test_getResourceAsStream() 9192c92f5f5306c7bed2c34b8382dad32445f5ef85Dan Bornstein throws IOException, UnsupportedEncodingException { 9292c92f5f5306c7bed2c34b8382dad32445f5ef85Dan Bornstein DexClassLoader dcl = createInstance(); 9392c92f5f5306c7bed2c34b8382dad32445f5ef85Dan Bornstein InputStream in = dcl.getResourceAsStream("test/Resource1.txt"); 9492c92f5f5306c7bed2c34b8382dad32445f5ef85Dan Bornstein byte[] contents = Streams.readFully(in); 9592c92f5f5306c7bed2c34b8382dad32445f5ef85Dan Bornstein String s = new String(contents, "UTF-8"); 9692c92f5f5306c7bed2c34b8382dad32445f5ef85Dan Bornstein 9792c92f5f5306c7bed2c34b8382dad32445f5ef85Dan Bornstein assertEquals("Muffins are tasty!\n", s); 9892c92f5f5306c7bed2c34b8382dad32445f5ef85Dan Bornstein } 9944401c99f407517a16f8bf75a942a1461a6feceeDan Bornstein} 100