blob: abb53de66451cfb7fe5643775755b9ea3b40af05 [file] [log] [blame]
Andreas Gampe8fda9f22014-10-03 16:15:37 -07001/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Vladimir Marko920506d2014-11-18 14:47:31 +000017import java.lang.reflect.InvocationTargetException;
Andreas Gampe8fda9f22014-10-03 16:15:37 -070018import java.lang.reflect.Method;
Ian Rogers8e1f4f82014-11-05 11:07:30 -080019import java.lang.reflect.Modifier;
Andreas Gampe8fda9f22014-10-03 16:15:37 -070020import java.util.LinkedList;
21import java.util.List;
22
23/**
24 * Smali excercise.
25 */
26public class Main {
27
28 private static class TestCase {
29 public TestCase(String testName, String testClass, String testMethodName, Object[] values,
30 Throwable expectedException, Object expectedReturn) {
31 this.testName = testName;
32 this.testClass = testClass;
33 this.testMethodName = testMethodName;
34 this.values = values;
35 this.expectedException = expectedException;
36 this.expectedReturn = expectedReturn;
37 }
38
39 String testName;
40 String testClass;
41 String testMethodName;
42 Object[] values;
43 Throwable expectedException;
44 Object expectedReturn;
45 }
46
47 private List<TestCase> testCases;
48
49 public Main() {
50 // Create the test cases.
51 testCases = new LinkedList<TestCase>();
buzbee6489d222014-11-25 10:52:19 -080052 testCases.add(new TestCase("PackedSwitch", "PackedSwitch", "packedSwitch",
53 new Object[]{123}, null, 123));
Andreas Gampe8fda9f22014-10-03 16:15:37 -070054
55 testCases.add(new TestCase("b/17790197", "B17790197", "getInt", null, null, 100));
Ian Rogers8e1f4f82014-11-05 11:07:30 -080056 testCases.add(new TestCase("b/17978759", "B17978759", "test", null, new VerifyError(), null));
Stephen Kyle8fe0e352014-10-16 15:02:42 +010057 testCases.add(new TestCase("FloatBadArgReg", "FloatBadArgReg", "getInt",
58 new Object[]{100}, null, 100));
nikolay serdjukd24c9342014-11-10 16:53:27 +070059 testCases.add(new TestCase("negLong", "negLong", "negLong", null, null, 122142L));
Vladimir Marko7a7c1db2014-11-17 15:13:34 +000060 testCases.add(new TestCase("sameFieldNames", "sameFieldNames", "getInt", null, null, 7));
Vladimir Marko920506d2014-11-18 14:47:31 +000061 testCases.add(new TestCase("b/18380491", "B18380491ConcreteClass", "foo",
62 new Object[]{42}, null, 42));
63 testCases.add(new TestCase("invoke-super abstract", "B18380491ConcreteClass", "foo",
64 new Object[]{0}, new AbstractMethodError(), null));
Pavel Vyssotski4ee71b22014-11-18 11:51:24 +060065 testCases.add(new TestCase("BadCaseInOpRegRegReg", "BadCaseInOpRegRegReg", "getInt", null, null, 2));
Andreas Gampe8fda9f22014-10-03 16:15:37 -070066 }
67
68 public void runTests() {
69 for (TestCase tc : testCases) {
70 System.out.println(tc.testName);
71 try {
72 runTest(tc);
73 } catch (Exception exc) {
74 exc.printStackTrace(System.out);
75 }
76 }
77 }
78
79 private void runTest(TestCase tc) throws Exception {
Andreas Gampe8fda9f22014-10-03 16:15:37 -070080 Exception errorReturn = null;
81 try {
Ian Rogers8e1f4f82014-11-05 11:07:30 -080082 Class<?> c = Class.forName(tc.testClass);
83
84 Method[] methods = c.getDeclaredMethods();
85
86 // For simplicity we assume that test methods are not overloaded. So searching by name
87 // will give us the method we need to run.
88 Method method = null;
89 for (Method m : methods) {
90 if (m.getName().equals(tc.testMethodName)) {
91 method = m;
92 break;
93 }
Andreas Gampe8fda9f22014-10-03 16:15:37 -070094 }
Ian Rogers8e1f4f82014-11-05 11:07:30 -080095
96 if (method == null) {
97 errorReturn = new IllegalArgumentException("Could not find test method " +
98 tc.testMethodName + " in class " +
99 tc.testClass + " for test " +
100 tc.testName);
101 } else {
102 Object retValue;
103 if (Modifier.isStatic(method.getModifiers())) {
104 retValue = method.invoke(null, tc.values);
105 } else {
106 retValue = method.invoke(method.getDeclaringClass().newInstance(), tc.values);
107 }
108 if (tc.expectedException != null) {
109 errorReturn = new IllegalStateException("Expected an exception in test " +
110 tc.testName);
111 }
112 if (tc.expectedReturn == null && retValue != null) {
113 errorReturn = new IllegalStateException("Expected a null result in test " +
114 tc.testName);
115 } else if (tc.expectedReturn != null &&
116 (retValue == null || !tc.expectedReturn.equals(retValue))) {
117 errorReturn = new IllegalStateException("Expected return " +
118 tc.expectedReturn +
119 ", but got " + retValue);
120 } else {
121 // Expected result, do nothing.
122 }
Andreas Gampe8fda9f22014-10-03 16:15:37 -0700123 }
Ian Rogers8e1f4f82014-11-05 11:07:30 -0800124 } catch (Throwable exc) {
Andreas Gampe8fda9f22014-10-03 16:15:37 -0700125 if (tc.expectedException == null) {
126 errorReturn = new IllegalStateException("Did not expect exception", exc);
Vladimir Marko920506d2014-11-18 14:47:31 +0000127 } else if (exc instanceof InvocationTargetException && exc.getCause() != null &&
128 exc.getCause().getClass().equals(tc.expectedException.getClass())) {
129 // Expected exception is wrapped in InvocationTargetException.
Andreas Gampe8fda9f22014-10-03 16:15:37 -0700130 } else if (!tc.expectedException.getClass().equals(exc.getClass())) {
131 errorReturn = new IllegalStateException("Expected " +
Ian Rogers8e1f4f82014-11-05 11:07:30 -0800132 tc.expectedException.getClass().getName() +
133 ", but got " + exc.getClass(), exc);
134 } else {
135 // Expected exception, do nothing.
Andreas Gampe8fda9f22014-10-03 16:15:37 -0700136 }
137 } finally {
138 if (errorReturn != null) {
139 throw errorReturn;
140 }
141 }
142 }
143
144 public static void main(String[] args) throws Exception {
145 Main main = new Main();
146
147 main.runTests();
148
149 System.out.println("Done!");
150 }
151}