/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package test; import test2.Target2; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; /** * Class used as part of the class loading tests. This class uses * other classes, some of which should have come from the same jar/dex * file and others of which should have come from a different jar/dex * file. Each test method in this class is called from the same-named * method in {@code DexClassLoaderTest}. */ public class TestMethods { /* * The following are all simple utility methods which, under * normal circumstances, would be part of other libraries * (specifically, JUnit and the Android libcore support library). * * However, this file gets compiled as an independent unit without * any dependencies. We could theoretically add dependencies on other * libraries, but that would make things much more complicated and * fragile, and for very little benefit. */ /** * Simple sameness assertion checker. */ public static void assertSame(Object expected, Object actual) { if (expected != actual) { throw new RuntimeException( "EXPECTED: " + expected + "; ACTUAL: " + actual); } } /** * Simple sameness assertion checker. */ public static void assertSame(int expected, int actual) { if (expected != actual) { throw new RuntimeException( "EXPECTED: " + expected + "; ACTUAL: " + actual); } } /** * Fully read the contents of the given stream. */ public static byte[] readFully(InputStream in) throws IOException { // This is a copy of the same-named method in libcore.io.Streams. byte[] buffer = new byte[1024]; ByteArrayOutputStream bytes = new ByteArrayOutputStream(); while (true) { int byteCount = in.read(buffer); if (byteCount == -1) { return bytes.toByteArray(); } bytes.write(buffer, 0, byteCount); } } /* * Test methods that use another class from the same dex/jar file */ /** * Test that an instance of a sibling class can be constructed. */ public static void test_constructor() { new Target(); } /** * Test calling a static method on a sibling class. */ public static void test_callStaticMethod() { assertSame("blort", Target.blort()); } /** * Test getting a static variable of a sibling class. */ public static void test_getStaticVariable() { Target.setStaticVariable(22); assertSame(22, Target.staticVariable); } /** * Test calling an instance method on a sibling class. */ public static void test_callInstanceMethod() { Target target = new Target(); assertSame("zorch", target.zorch()); } /** * Test getting an instance variable of a sibling class. */ public static void test_getInstanceVariable() { Target target = new Target(); target.setInstanceVariable(10098); assertSame(10098, target.instanceVariable); } /** * Test getting a resource which should be in the same jar * file as this class. */ public static void test_getResourceAsStream() throws IOException { ClassLoader cl = TestMethods.class.getClassLoader(); InputStream in = cl.getResourceAsStream("test/Resource1.txt"); byte[] contents = readFully(in); String s = new String(contents, "UTF-8"); assertSame("Muffins are tasty!\n", s.intern()); } /* * Test methods that use a class from a different dex/jar file */ /** * Test that an instance of a cousin class can be constructed. */ public static void test_diff_constructor() { new Target2(); } /** * Test calling a static method on a cousin class. */ public static void test_diff_callStaticMethod() { assertSame("frotz", Target2.frotz()); } /** * Test getting a static variable of a cousin class. */ public static void test_diff_getStaticVariable() { Target2.setStaticIgram(220); assertSame(220, Target2.staticIgram); } /** * Test calling an instance method on a cousin class. */ public static void test_diff_callInstanceMethod() { Target2 target = new Target2(); assertSame("fizmo", target.fizmo()); } /** * Test getting an instance variable of a cousin class. */ public static void test_diff_getInstanceVariable() { Target2 target = new Target2(); target.setInstanceMagri(10098); assertSame(10098, target.instanceMagri); } /** * Test getting a resource which should be in a different jar * file as this class. */ public static void test_diff_getResourceAsStream() throws IOException { ClassLoader cl = TestMethods.class.getClassLoader(); InputStream in = cl.getResourceAsStream("test2/Resource2.txt"); byte[] contents = readFully(in); String s = new String(contents, "UTF-8"); assertSame("Who doesn't like a good biscuit?\n", s.intern()); } }