xref: /aosp_15_r20/art/test/845-data-image/src-art/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker import dalvik.system.DexFile;
18*795d594fSAndroid Build Coastguard Worker import dalvik.system.VMRuntime;
19*795d594fSAndroid Build Coastguard Worker import java.io.File;
20*795d594fSAndroid Build Coastguard Worker import java.io.IOException;
21*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Array;
22*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.InvocationHandler;
23*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Method;
24*795d594fSAndroid Build Coastguard Worker import java.math.BigInteger;
25*795d594fSAndroid Build Coastguard Worker import java.util.concurrent.CyclicBarrier;
26*795d594fSAndroid Build Coastguard Worker 
27*795d594fSAndroid Build Coastguard Worker // This class helps testing that we don't mark `InheritsBigInteger` as initialized,
28*795d594fSAndroid Build Coastguard Worker // given we do not expect `BigInteger` to be initialized in the boot image.
29*795d594fSAndroid Build Coastguard Worker class InheritsBigInteger extends BigInteger {
InheritsBigInteger(String value)30*795d594fSAndroid Build Coastguard Worker   InheritsBigInteger(String value) {
31*795d594fSAndroid Build Coastguard Worker     super(value);
32*795d594fSAndroid Build Coastguard Worker   }
33*795d594fSAndroid Build Coastguard Worker }
34*795d594fSAndroid Build Coastguard Worker 
35*795d594fSAndroid Build Coastguard Worker class SuperClass {}
36*795d594fSAndroid Build Coastguard Worker 
37*795d594fSAndroid Build Coastguard Worker class ClassWithStatics extends SuperClass {
38*795d594fSAndroid Build Coastguard Worker   public static final String STATIC_STRING = "foo";
39*795d594fSAndroid Build Coastguard Worker   public static final int STATIC_INT = 42;
40*795d594fSAndroid Build Coastguard Worker }
41*795d594fSAndroid Build Coastguard Worker 
42*795d594fSAndroid Build Coastguard Worker class ClassWithStaticType {
43*795d594fSAndroid Build Coastguard Worker   public static final Class<?> STATIC_TYPE = Object.class;
44*795d594fSAndroid Build Coastguard Worker }
45*795d594fSAndroid Build Coastguard Worker 
46*795d594fSAndroid Build Coastguard Worker // Add an interface for testing generating classes and interfaces.
47*795d594fSAndroid Build Coastguard Worker interface Itf {
someMethod()48*795d594fSAndroid Build Coastguard Worker   public int someMethod();
someDefaultMethod()49*795d594fSAndroid Build Coastguard Worker   public default int someDefaultMethod() { return 42; }
50*795d594fSAndroid Build Coastguard Worker }
51*795d594fSAndroid Build Coastguard Worker 
52*795d594fSAndroid Build Coastguard Worker // Add a second interface with many methods to force a conflict in the IMT. We want a second
53*795d594fSAndroid Build Coastguard Worker // interface to make sure `Itf` gets entries with the imt_unimplemented_method runtime method.
54*795d594fSAndroid Build Coastguard Worker interface Itf2 {
defaultMethod1()55*795d594fSAndroid Build Coastguard Worker   default int defaultMethod1() { return 1; }
defaultMethod2()56*795d594fSAndroid Build Coastguard Worker   default int defaultMethod2() { return 2; }
defaultMethod3()57*795d594fSAndroid Build Coastguard Worker   default int defaultMethod3() { return 3; }
defaultMethod4()58*795d594fSAndroid Build Coastguard Worker   default int defaultMethod4() { return 4; }
defaultMethod5()59*795d594fSAndroid Build Coastguard Worker   default int defaultMethod5() { return 5; }
defaultMethod6()60*795d594fSAndroid Build Coastguard Worker   default int defaultMethod6() { return 6; }
defaultMethod7()61*795d594fSAndroid Build Coastguard Worker   default int defaultMethod7() { return 7; }
defaultMethod8()62*795d594fSAndroid Build Coastguard Worker   default int defaultMethod8() { return 8; }
defaultMethod9()63*795d594fSAndroid Build Coastguard Worker   default int defaultMethod9() { return 9; }
defaultMethod10()64*795d594fSAndroid Build Coastguard Worker   default int defaultMethod10() { return 10; }
defaultMethod11()65*795d594fSAndroid Build Coastguard Worker   default int defaultMethod11() { return 11; }
defaultMethod12()66*795d594fSAndroid Build Coastguard Worker   default int defaultMethod12() { return 12; }
defaultMethod13()67*795d594fSAndroid Build Coastguard Worker   default int defaultMethod13() { return 13; }
defaultMethod14()68*795d594fSAndroid Build Coastguard Worker   default int defaultMethod14() { return 14; }
defaultMethod15()69*795d594fSAndroid Build Coastguard Worker   default int defaultMethod15() { return 15; }
defaultMethod16()70*795d594fSAndroid Build Coastguard Worker   default int defaultMethod16() { return 16; }
defaultMethod17()71*795d594fSAndroid Build Coastguard Worker   default int defaultMethod17() { return 17; }
defaultMethod18()72*795d594fSAndroid Build Coastguard Worker   default int defaultMethod18() { return 18; }
defaultMethod19()73*795d594fSAndroid Build Coastguard Worker   default int defaultMethod19() { return 19; }
defaultMethod20()74*795d594fSAndroid Build Coastguard Worker   default int defaultMethod20() { return 20; }
defaultMethod21()75*795d594fSAndroid Build Coastguard Worker   default int defaultMethod21() { return 21; }
defaultMethod22()76*795d594fSAndroid Build Coastguard Worker   default int defaultMethod22() { return 22; }
defaultMethod23()77*795d594fSAndroid Build Coastguard Worker   default int defaultMethod23() { return 23; }
defaultMethod24()78*795d594fSAndroid Build Coastguard Worker   default int defaultMethod24() { return 24; }
defaultMethod25()79*795d594fSAndroid Build Coastguard Worker   default int defaultMethod25() { return 25; }
defaultMethod26()80*795d594fSAndroid Build Coastguard Worker   default int defaultMethod26() { return 26; }
defaultMethod27()81*795d594fSAndroid Build Coastguard Worker   default int defaultMethod27() { return 27; }
defaultMethod28()82*795d594fSAndroid Build Coastguard Worker   default int defaultMethod28() { return 28; }
defaultMethod29()83*795d594fSAndroid Build Coastguard Worker   default int defaultMethod29() { return 29; }
defaultMethod30()84*795d594fSAndroid Build Coastguard Worker   default int defaultMethod30() { return 30; }
defaultMethod31()85*795d594fSAndroid Build Coastguard Worker   default int defaultMethod31() { return 31; }
defaultMethod32()86*795d594fSAndroid Build Coastguard Worker   default int defaultMethod32() { return 32; }
defaultMethod33()87*795d594fSAndroid Build Coastguard Worker   default int defaultMethod33() { return 33; }
defaultMethod34()88*795d594fSAndroid Build Coastguard Worker   default int defaultMethod34() { return 34; }
defaultMethod35()89*795d594fSAndroid Build Coastguard Worker   default int defaultMethod35() { return 35; }
defaultMethod36()90*795d594fSAndroid Build Coastguard Worker   default int defaultMethod36() { return 36; }
defaultMethod37()91*795d594fSAndroid Build Coastguard Worker   default int defaultMethod37() { return 37; }
defaultMethod38()92*795d594fSAndroid Build Coastguard Worker   default int defaultMethod38() { return 38; }
defaultMethod39()93*795d594fSAndroid Build Coastguard Worker   default int defaultMethod39() { return 39; }
defaultMethod40()94*795d594fSAndroid Build Coastguard Worker   default int defaultMethod40() { return 40; }
defaultMethod41()95*795d594fSAndroid Build Coastguard Worker   default int defaultMethod41() { return 41; }
defaultMethod42()96*795d594fSAndroid Build Coastguard Worker   default int defaultMethod42() { return 42; }
defaultMethod43()97*795d594fSAndroid Build Coastguard Worker   default int defaultMethod43() { return 43; }
defaultMethod44()98*795d594fSAndroid Build Coastguard Worker   default int defaultMethod44() { return 44; }
defaultMethod45()99*795d594fSAndroid Build Coastguard Worker   default int defaultMethod45() { return 45; }
defaultMethod46()100*795d594fSAndroid Build Coastguard Worker   default int defaultMethod46() { return 46; }
defaultMethod47()101*795d594fSAndroid Build Coastguard Worker   default int defaultMethod47() { return 47; }
defaultMethod48()102*795d594fSAndroid Build Coastguard Worker   default int defaultMethod48() { return 48; }
defaultMethod49()103*795d594fSAndroid Build Coastguard Worker   default int defaultMethod49() { return 49; }
defaultMethod50()104*795d594fSAndroid Build Coastguard Worker   default int defaultMethod50() { return 50; }
defaultMethod51()105*795d594fSAndroid Build Coastguard Worker   default int defaultMethod51() { return 51; }
106*795d594fSAndroid Build Coastguard Worker }
107*795d594fSAndroid Build Coastguard Worker 
108*795d594fSAndroid Build Coastguard Worker class Itf2Impl implements Itf2 {
109*795d594fSAndroid Build Coastguard Worker }
110*795d594fSAndroid Build Coastguard Worker 
111*795d594fSAndroid Build Coastguard Worker class ClassWithDefaultConflict implements IfaceWithSayHi, IfaceWithSayHiAtRuntime {
112*795d594fSAndroid Build Coastguard Worker }
113*795d594fSAndroid Build Coastguard Worker 
114*795d594fSAndroid Build Coastguard Worker public class Main implements Itf {
115*795d594fSAndroid Build Coastguard Worker   static String myString = "MyString";
116*795d594fSAndroid Build Coastguard Worker 
117*795d594fSAndroid Build Coastguard Worker   static class MyThread extends Thread {
118*795d594fSAndroid Build Coastguard Worker     CyclicBarrier barrier;
119*795d594fSAndroid Build Coastguard Worker 
MyThread(CyclicBarrier barrier)120*795d594fSAndroid Build Coastguard Worker     public MyThread(CyclicBarrier barrier) {
121*795d594fSAndroid Build Coastguard Worker       this.barrier = barrier;
122*795d594fSAndroid Build Coastguard Worker     }
run()123*795d594fSAndroid Build Coastguard Worker     public void run() {
124*795d594fSAndroid Build Coastguard Worker       try {
125*795d594fSAndroid Build Coastguard Worker         synchronized (Main.myString) {
126*795d594fSAndroid Build Coastguard Worker           barrier.await();
127*795d594fSAndroid Build Coastguard Worker           barrier.reset();
128*795d594fSAndroid Build Coastguard Worker           // Infinite wait.
129*795d594fSAndroid Build Coastguard Worker           barrier.await();
130*795d594fSAndroid Build Coastguard Worker         }
131*795d594fSAndroid Build Coastguard Worker       } catch (Exception e) {
132*795d594fSAndroid Build Coastguard Worker         throw new Error(e);
133*795d594fSAndroid Build Coastguard Worker       }
134*795d594fSAndroid Build Coastguard Worker     }
135*795d594fSAndroid Build Coastguard Worker   }
136*795d594fSAndroid Build Coastguard Worker 
main(String[] args)137*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) throws Exception {
138*795d594fSAndroid Build Coastguard Worker     System.loadLibrary(args[0]);
139*795d594fSAndroid Build Coastguard Worker 
140*795d594fSAndroid Build Coastguard Worker     // Register the dex file so that the runtime can pick up which
141*795d594fSAndroid Build Coastguard Worker     // dex file to compile for the image.
142*795d594fSAndroid Build Coastguard Worker     File file = null;
143*795d594fSAndroid Build Coastguard Worker     try {
144*795d594fSAndroid Build Coastguard Worker       file = createTempFile();
145*795d594fSAndroid Build Coastguard Worker       String codePath = DEX_LOCATION + "/845-data-image.jar";
146*795d594fSAndroid Build Coastguard Worker       VMRuntime.registerAppInfo(
147*795d594fSAndroid Build Coastguard Worker           "test.app",
148*795d594fSAndroid Build Coastguard Worker           file.getPath(),
149*795d594fSAndroid Build Coastguard Worker           file.getPath(),
150*795d594fSAndroid Build Coastguard Worker           new String[] {codePath},
151*795d594fSAndroid Build Coastguard Worker           VMRuntime.CODE_PATH_TYPE_PRIMARY_APK);
152*795d594fSAndroid Build Coastguard Worker     } finally {
153*795d594fSAndroid Build Coastguard Worker       if (file != null) {
154*795d594fSAndroid Build Coastguard Worker         file.delete();
155*795d594fSAndroid Build Coastguard Worker       }
156*795d594fSAndroid Build Coastguard Worker     }
157*795d594fSAndroid Build Coastguard Worker 
158*795d594fSAndroid Build Coastguard Worker     if (!hasOatFile() || !hasImage()) {
159*795d594fSAndroid Build Coastguard Worker       // We only generate an app image if there is at least a vdex file and a boot image.
160*795d594fSAndroid Build Coastguard Worker       return;
161*795d594fSAndroid Build Coastguard Worker     }
162*795d594fSAndroid Build Coastguard Worker 
163*795d594fSAndroid Build Coastguard Worker     if (args.length == 2 && "--second-run".equals(args[1])) {
164*795d594fSAndroid Build Coastguard Worker       DexFile.OptimizationInfo info = VMRuntime.getBaseApkOptimizationInfo();
165*795d594fSAndroid Build Coastguard Worker       if (!info.isOptimized() && !isInImageSpace(Main.class)) {
166*795d594fSAndroid Build Coastguard Worker         throw new Error("Expected image to be loaded");
167*795d594fSAndroid Build Coastguard Worker       }
168*795d594fSAndroid Build Coastguard Worker     }
169*795d594fSAndroid Build Coastguard Worker 
170*795d594fSAndroid Build Coastguard Worker     runClassTests();
171*795d594fSAndroid Build Coastguard Worker 
172*795d594fSAndroid Build Coastguard Worker     // Test that we emit an empty lock word. If we are not, then this synchronized call here would
173*795d594fSAndroid Build Coastguard Worker     // block on a run with the runtime image.
174*795d594fSAndroid Build Coastguard Worker     synchronized (myString) {
175*795d594fSAndroid Build Coastguard Worker     }
176*795d594fSAndroid Build Coastguard Worker 
177*795d594fSAndroid Build Coastguard Worker     // Create a thread that makes sure `myString` is locked while the main thread is generating
178*795d594fSAndroid Build Coastguard Worker     // the runtime image.
179*795d594fSAndroid Build Coastguard Worker     CyclicBarrier barrier = new CyclicBarrier(2);
180*795d594fSAndroid Build Coastguard Worker     Thread t = new MyThread(barrier);
181*795d594fSAndroid Build Coastguard Worker     t.setDaemon(true);
182*795d594fSAndroid Build Coastguard Worker     t.start();
183*795d594fSAndroid Build Coastguard Worker     barrier.await();
184*795d594fSAndroid Build Coastguard Worker 
185*795d594fSAndroid Build Coastguard Worker     VMRuntime runtime = VMRuntime.getRuntime();
186*795d594fSAndroid Build Coastguard Worker     runtime.notifyStartupCompleted();
187*795d594fSAndroid Build Coastguard Worker 
188*795d594fSAndroid Build Coastguard Worker     String filter = getCompilerFilter(Main.class);
189*795d594fSAndroid Build Coastguard Worker     if ("speed-profile".equals(filter) || "speed".equals(filter)) {
190*795d594fSAndroid Build Coastguard Worker       // We only generate an app image for filters that don't compile.
191*795d594fSAndroid Build Coastguard Worker       return;
192*795d594fSAndroid Build Coastguard Worker     }
193*795d594fSAndroid Build Coastguard Worker 
194*795d594fSAndroid Build Coastguard Worker     String instructionSet = VMRuntime.getCurrentInstructionSet();
195*795d594fSAndroid Build Coastguard Worker     // Wait for the file to be generated.
196*795d594fSAndroid Build Coastguard Worker     File image = new File(DEX_LOCATION + "/" + instructionSet + "/845-data-image.art");
197*795d594fSAndroid Build Coastguard Worker     while (!image.exists()) {
198*795d594fSAndroid Build Coastguard Worker       Thread.yield();
199*795d594fSAndroid Build Coastguard Worker     }
200*795d594fSAndroid Build Coastguard Worker   }
201*795d594fSAndroid Build Coastguard Worker 
202*795d594fSAndroid Build Coastguard Worker   static class MyProxy implements InvocationHandler {
203*795d594fSAndroid Build Coastguard Worker 
204*795d594fSAndroid Build Coastguard Worker     private Object obj;
205*795d594fSAndroid Build Coastguard Worker 
newInstance(Object obj)206*795d594fSAndroid Build Coastguard Worker     public static Object newInstance(Object obj) {
207*795d594fSAndroid Build Coastguard Worker         return java.lang.reflect.Proxy.newProxyInstance(
208*795d594fSAndroid Build Coastguard Worker             obj.getClass().getClassLoader(),
209*795d594fSAndroid Build Coastguard Worker             obj.getClass().getInterfaces(),
210*795d594fSAndroid Build Coastguard Worker             new MyProxy(obj));
211*795d594fSAndroid Build Coastguard Worker     }
212*795d594fSAndroid Build Coastguard Worker 
MyProxy(Object obj)213*795d594fSAndroid Build Coastguard Worker     private MyProxy(Object obj) {
214*795d594fSAndroid Build Coastguard Worker         this.obj = obj;
215*795d594fSAndroid Build Coastguard Worker     }
216*795d594fSAndroid Build Coastguard Worker 
invoke(Object proxy, Method m, Object[] args)217*795d594fSAndroid Build Coastguard Worker     public Object invoke(Object proxy, Method m, Object[] args) throws Throwable {
218*795d594fSAndroid Build Coastguard Worker       return m.invoke(obj, args);
219*795d594fSAndroid Build Coastguard Worker     }
220*795d594fSAndroid Build Coastguard Worker   }
221*795d594fSAndroid Build Coastguard Worker 
222*795d594fSAndroid Build Coastguard Worker   public static Itf itf = new Main();
223*795d594fSAndroid Build Coastguard Worker   public static Itf2 itf2 = new Itf2Impl();
224*795d594fSAndroid Build Coastguard Worker   public static ClassWithStatics statics = new ClassWithStatics();
225*795d594fSAndroid Build Coastguard Worker   public static ClassWithStaticType staticType = new ClassWithStaticType();
226*795d594fSAndroid Build Coastguard Worker   public static ClassWithDefaultConflict defaultConflict = new ClassWithDefaultConflict();
227*795d594fSAndroid Build Coastguard Worker 
runClassTests()228*795d594fSAndroid Build Coastguard Worker   public static void runClassTests() {
229*795d594fSAndroid Build Coastguard Worker     // Test Class.getName, app images expect all strings to have hash codes.
230*795d594fSAndroid Build Coastguard Worker     assertEquals("Main", Main.class.getName());
231*795d594fSAndroid Build Coastguard Worker 
232*795d594fSAndroid Build Coastguard Worker     // Basic tests for invokes with a copied method.
233*795d594fSAndroid Build Coastguard Worker     assertEquals(3, new Main().someMethod());
234*795d594fSAndroid Build Coastguard Worker     assertEquals(42, new Main().someDefaultMethod());
235*795d594fSAndroid Build Coastguard Worker 
236*795d594fSAndroid Build Coastguard Worker     assertEquals(3, itf.someMethod());
237*795d594fSAndroid Build Coastguard Worker     assertEquals(42, itf.someDefaultMethod());
238*795d594fSAndroid Build Coastguard Worker 
239*795d594fSAndroid Build Coastguard Worker     // Test with a proxy class.
240*795d594fSAndroid Build Coastguard Worker     Itf foo = (Itf) MyProxy.newInstance(new Main());
241*795d594fSAndroid Build Coastguard Worker     assertEquals(3, foo.someMethod());
242*795d594fSAndroid Build Coastguard Worker     assertEquals(42, foo.someDefaultMethod());
243*795d594fSAndroid Build Coastguard Worker 
244*795d594fSAndroid Build Coastguard Worker     // Test with array classes.
245*795d594fSAndroid Build Coastguard Worker     assertEquals("[LMain;", Main[].class.getName());
246*795d594fSAndroid Build Coastguard Worker     assertEquals("[[LMain;", Main[][].class.getName());
247*795d594fSAndroid Build Coastguard Worker 
248*795d594fSAndroid Build Coastguard Worker     assertEquals("[LMain;", new Main[4].getClass().getName());
249*795d594fSAndroid Build Coastguard Worker     assertEquals("[[LMain;", new Main[1][2].getClass().getName());
250*795d594fSAndroid Build Coastguard Worker 
251*795d594fSAndroid Build Coastguard Worker     Main array[] = new Main[] { new Main() };
252*795d594fSAndroid Build Coastguard Worker     assertEquals("[LMain;", array.getClass().getName());
253*795d594fSAndroid Build Coastguard Worker 
254*795d594fSAndroid Build Coastguard Worker     assertEquals(Object[][][][].class, Array.newInstance(Object.class, 0, 0, 0, 0).getClass());
255*795d594fSAndroid Build Coastguard Worker     assertEquals("int", int.class.getName());
256*795d594fSAndroid Build Coastguard Worker     assertEquals("[I", int[].class.getName());
257*795d594fSAndroid Build Coastguard Worker 
258*795d594fSAndroid Build Coastguard Worker     assertEquals("foo", statics.STATIC_STRING);
259*795d594fSAndroid Build Coastguard Worker     assertEquals(42, statics.STATIC_INT);
260*795d594fSAndroid Build Coastguard Worker 
261*795d594fSAndroid Build Coastguard Worker     assertEquals(Object.class, staticType.STATIC_TYPE);
262*795d594fSAndroid Build Coastguard Worker 
263*795d594fSAndroid Build Coastguard Worker     // Call all interface methods to trigger the creation of a imt conflict method.
264*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod1();
265*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod2();
266*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod3();
267*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod4();
268*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod5();
269*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod6();
270*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod7();
271*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod8();
272*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod9();
273*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod10();
274*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod11();
275*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod12();
276*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod13();
277*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod14();
278*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod15();
279*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod16();
280*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod17();
281*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod18();
282*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod19();
283*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod20();
284*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod21();
285*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod22();
286*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod23();
287*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod24();
288*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod25();
289*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod26();
290*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod27();
291*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod28();
292*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod29();
293*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod30();
294*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod31();
295*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod32();
296*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod33();
297*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod34();
298*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod35();
299*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod36();
300*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod37();
301*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod38();
302*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod39();
303*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod40();
304*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod41();
305*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod42();
306*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod43();
307*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod44();
308*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod45();
309*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod46();
310*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod47();
311*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod48();
312*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod49();
313*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod50();
314*795d594fSAndroid Build Coastguard Worker     itf2.defaultMethod51();
315*795d594fSAndroid Build Coastguard Worker 
316*795d594fSAndroid Build Coastguard Worker     InheritsBigInteger bigInteger = new InheritsBigInteger("42");
317*795d594fSAndroid Build Coastguard Worker     assertEquals("42", bigInteger.toString());
318*795d594fSAndroid Build Coastguard Worker   }
319*795d594fSAndroid Build Coastguard Worker 
assertEquals(int expected, int actual)320*795d594fSAndroid Build Coastguard Worker   private static void assertEquals(int expected, int actual) {
321*795d594fSAndroid Build Coastguard Worker     if (expected != actual) {
322*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected " + expected + ", got " + actual);
323*795d594fSAndroid Build Coastguard Worker     }
324*795d594fSAndroid Build Coastguard Worker   }
325*795d594fSAndroid Build Coastguard Worker 
assertEquals(Object expected, Object actual)326*795d594fSAndroid Build Coastguard Worker   private static void assertEquals(Object expected, Object actual) {
327*795d594fSAndroid Build Coastguard Worker     if (!expected.equals(actual)) {
328*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected \"" + expected + "\", got \"" + actual + "\"");
329*795d594fSAndroid Build Coastguard Worker     }
330*795d594fSAndroid Build Coastguard Worker   }
331*795d594fSAndroid Build Coastguard Worker 
someMethod()332*795d594fSAndroid Build Coastguard Worker   public int someMethod() {
333*795d594fSAndroid Build Coastguard Worker     return 3;
334*795d594fSAndroid Build Coastguard Worker   }
335*795d594fSAndroid Build Coastguard Worker 
hasOatFile()336*795d594fSAndroid Build Coastguard Worker   private static native boolean hasOatFile();
hasImage()337*795d594fSAndroid Build Coastguard Worker   private static native boolean hasImage();
getCompilerFilter(Class<?> cls)338*795d594fSAndroid Build Coastguard Worker   private static native String getCompilerFilter(Class<?> cls);
isInImageSpace(Class<?> cls)339*795d594fSAndroid Build Coastguard Worker   private static native boolean isInImageSpace(Class<?> cls);
340*795d594fSAndroid Build Coastguard Worker 
341*795d594fSAndroid Build Coastguard Worker   private static final String TEMP_FILE_NAME_PREFIX = "temp";
342*795d594fSAndroid Build Coastguard Worker   private static final String TEMP_FILE_NAME_SUFFIX = "-file";
343*795d594fSAndroid Build Coastguard Worker   private static final String DEX_LOCATION = System.getenv("DEX_LOCATION");
344*795d594fSAndroid Build Coastguard Worker 
createTempFile()345*795d594fSAndroid Build Coastguard Worker   private static File createTempFile() throws Exception {
346*795d594fSAndroid Build Coastguard Worker     try {
347*795d594fSAndroid Build Coastguard Worker       return File.createTempFile(TEMP_FILE_NAME_PREFIX, TEMP_FILE_NAME_SUFFIX);
348*795d594fSAndroid Build Coastguard Worker     } catch (IOException e) {
349*795d594fSAndroid Build Coastguard Worker       System.setProperty("java.io.tmpdir", "/data/local/tmp");
350*795d594fSAndroid Build Coastguard Worker       try {
351*795d594fSAndroid Build Coastguard Worker         return File.createTempFile(TEMP_FILE_NAME_PREFIX, TEMP_FILE_NAME_SUFFIX);
352*795d594fSAndroid Build Coastguard Worker       } catch (IOException e2) {
353*795d594fSAndroid Build Coastguard Worker         System.setProperty("java.io.tmpdir", "/sdcard");
354*795d594fSAndroid Build Coastguard Worker         return File.createTempFile(TEMP_FILE_NAME_PREFIX, TEMP_FILE_NAME_SUFFIX);
355*795d594fSAndroid Build Coastguard Worker       }
356*795d594fSAndroid Build Coastguard Worker     }
357*795d594fSAndroid Build Coastguard Worker   }
358*795d594fSAndroid Build Coastguard Worker }
359