blob: 30c1b142b12d6e0a7bc4a9648bf4d97969607e43 [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",
Sebastien Hertz270a0e12015-01-16 19:49:09 +010053 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));
Sebastien Hertz270a0e12015-01-16 19:49:09 +010056 testCases.add(new TestCase("b/17978759", "B17978759", "test", null, new VerifyError(),
57 null));
Stephen Kyle8fe0e352014-10-16 15:02:42 +010058 testCases.add(new TestCase("FloatBadArgReg", "FloatBadArgReg", "getInt",
Sebastien Hertz270a0e12015-01-16 19:49:09 +010059 new Object[]{100}, null, 100));
nikolay serdjukd24c9342014-11-10 16:53:27 +070060 testCases.add(new TestCase("negLong", "negLong", "negLong", null, null, 122142L));
Vladimir Marko7a7c1db2014-11-17 15:13:34 +000061 testCases.add(new TestCase("sameFieldNames", "sameFieldNames", "getInt", null, null, 7));
Vladimir Marko920506d2014-11-18 14:47:31 +000062 testCases.add(new TestCase("b/18380491", "B18380491ConcreteClass", "foo",
Sebastien Hertz270a0e12015-01-16 19:49:09 +010063 new Object[]{42}, null, 42));
Vladimir Marko920506d2014-11-18 14:47:31 +000064 testCases.add(new TestCase("invoke-super abstract", "B18380491ConcreteClass", "foo",
Sebastien Hertz270a0e12015-01-16 19:49:09 +010065 new Object[]{0}, new AbstractMethodError(), null));
66 testCases.add(new TestCase("BadCaseInOpRegRegReg", "BadCaseInOpRegRegReg", "getInt", null,
67 null, 2));
Nicolas Geoffray32b2a522014-11-27 14:54:18 +000068 testCases.add(new TestCase("CmpLong", "CmpLong", "run", null, null, 0));
Sebastien Hertz270a0e12015-01-16 19:49:09 +010069 testCases.add(new TestCase("FloatIntConstPassing", "FloatIntConstPassing", "run", null,
70 null, 2));
Vladimir Marko341e4252014-12-19 10:29:51 +000071 testCases.add(new TestCase("b/18718277", "B18718277", "getInt", null, null, 0));
Sebastien Hertz270a0e12015-01-16 19:49:09 +010072 testCases.add(new TestCase("b/18800943 (1)", "B18800943_1", "n_a", null, new VerifyError(),
73 0));
74 testCases.add(new TestCase("b/18800943 (2)", "B18800943_2", "n_a", null, new VerifyError(),
75 0));
76 testCases.add(new TestCase("MoveExc", "MoveExc", "run", null, new ArithmeticException(),
77 null));
78 testCases.add(new TestCase("MoveExceptionOnEntry", "MoveExceptionOnEntry",
79 "moveExceptionOnEntry", new Object[]{0}, new VerifyError(), null));
Jeff Hao9ccd1512015-03-20 18:11:45 -070080 testCases.add(new TestCase("EmptySparseSwitch", "EmptySparseSwitch", "run", null, null,
81 null));
Andreas Gampeb588f4c2015-05-26 13:35:39 -070082 testCases.add(new TestCase("b/20224106", "B20224106", "run", null, new VerifyError(),
83 0));
Andreas Gampeda9badb2015-06-05 20:22:12 -070084 testCases.add(new TestCase("b/17410612", "B17410612", "run", null, new VerifyError(),
85 0));
Nicolas Geoffrayea9ef4d2015-06-19 10:05:50 +010086 testCases.add(new TestCase("b/21863767", "B21863767", "run", null, null,
Nicolas Geoffray69505f82015-06-18 18:04:12 +010087 null));
Vladimir Marko2d1a0a42015-06-18 17:40:00 +010088 testCases.add(new TestCase("b/21873167", "B21873167", "test", null, null, null));
Vladimir Markof11c4202015-06-19 12:58:22 +010089 testCases.add(new TestCase("b/21614284", "B21614284", "test", new Object[] { null },
Andreas Gamped12e7822015-06-25 10:26:40 -070090 new NullPointerException(), null));
Jeff Haodde98272015-06-17 16:04:26 -070091 testCases.add(new TestCase("b/21902684", "B21902684", "test", null, null, null));
Andreas Gampea32210c2015-06-24 10:26:13 -070092 testCases.add(new TestCase("b/22045582", "B22045582", "run", null, new VerifyError(),
93 0));
94 testCases.add(new TestCase("b/22045582 (int)", "B22045582Int", "run", null,
95 new VerifyError(), 0));
96 testCases.add(new TestCase("b/22045582 (wide)", "B22045582Wide", "run", null,
97 new VerifyError(), 0));
Vladimir Marko414000e2015-06-23 17:45:21 +010098 testCases.add(new TestCase("b/21886894", "B21886894", "test", null, new VerifyError(),
Andreas Gamped12e7822015-06-25 10:26:40 -070099 null));
100 testCases.add(new TestCase("b/22080519", "B22080519", "run", null,
101 new NullPointerException(), null));
Andreas Gamped5ad72f2015-06-26 17:33:47 -0700102 testCases.add(new TestCase("b/21645819", "B21645819", "run", new Object[] { null },
103 null, null));
Andreas Gampe8fda9f22014-10-03 16:15:37 -0700104 }
105
106 public void runTests() {
107 for (TestCase tc : testCases) {
108 System.out.println(tc.testName);
109 try {
110 runTest(tc);
111 } catch (Exception exc) {
112 exc.printStackTrace(System.out);
113 }
114 }
115 }
116
117 private void runTest(TestCase tc) throws Exception {
Andreas Gampe8fda9f22014-10-03 16:15:37 -0700118 Exception errorReturn = null;
119 try {
Ian Rogers8e1f4f82014-11-05 11:07:30 -0800120 Class<?> c = Class.forName(tc.testClass);
121
122 Method[] methods = c.getDeclaredMethods();
123
124 // For simplicity we assume that test methods are not overloaded. So searching by name
125 // will give us the method we need to run.
126 Method method = null;
127 for (Method m : methods) {
128 if (m.getName().equals(tc.testMethodName)) {
129 method = m;
130 break;
131 }
Andreas Gampe8fda9f22014-10-03 16:15:37 -0700132 }
Ian Rogers8e1f4f82014-11-05 11:07:30 -0800133
134 if (method == null) {
135 errorReturn = new IllegalArgumentException("Could not find test method " +
136 tc.testMethodName + " in class " +
137 tc.testClass + " for test " +
138 tc.testName);
139 } else {
140 Object retValue;
141 if (Modifier.isStatic(method.getModifiers())) {
142 retValue = method.invoke(null, tc.values);
143 } else {
144 retValue = method.invoke(method.getDeclaringClass().newInstance(), tc.values);
145 }
146 if (tc.expectedException != null) {
147 errorReturn = new IllegalStateException("Expected an exception in test " +
148 tc.testName);
149 }
150 if (tc.expectedReturn == null && retValue != null) {
151 errorReturn = new IllegalStateException("Expected a null result in test " +
152 tc.testName);
153 } else if (tc.expectedReturn != null &&
154 (retValue == null || !tc.expectedReturn.equals(retValue))) {
155 errorReturn = new IllegalStateException("Expected return " +
156 tc.expectedReturn +
157 ", but got " + retValue);
158 } else {
159 // Expected result, do nothing.
160 }
Andreas Gampe8fda9f22014-10-03 16:15:37 -0700161 }
Ian Rogers8e1f4f82014-11-05 11:07:30 -0800162 } catch (Throwable exc) {
Andreas Gampe8fda9f22014-10-03 16:15:37 -0700163 if (tc.expectedException == null) {
164 errorReturn = new IllegalStateException("Did not expect exception", exc);
Vladimir Marko920506d2014-11-18 14:47:31 +0000165 } else if (exc instanceof InvocationTargetException && exc.getCause() != null &&
166 exc.getCause().getClass().equals(tc.expectedException.getClass())) {
167 // Expected exception is wrapped in InvocationTargetException.
Andreas Gampe8fda9f22014-10-03 16:15:37 -0700168 } else if (!tc.expectedException.getClass().equals(exc.getClass())) {
169 errorReturn = new IllegalStateException("Expected " +
Ian Rogers8e1f4f82014-11-05 11:07:30 -0800170 tc.expectedException.getClass().getName() +
171 ", but got " + exc.getClass(), exc);
172 } else {
173 // Expected exception, do nothing.
Andreas Gampe8fda9f22014-10-03 16:15:37 -0700174 }
175 } finally {
176 if (errorReturn != null) {
177 throw errorReturn;
178 }
179 }
180 }
181
182 public static void main(String[] args) throws Exception {
183 Main main = new Main();
184
185 main.runTests();
186
187 System.out.println("Done!");
188 }
189}