| /* |
| * 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()); |
| } |
| } |