xref: /aosp_15_r20/art/test/118-noimage-dex2oat/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1 /*
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 
17 import java.lang.reflect.InvocationTargetException;
18 import java.lang.reflect.Method;
19 
20 public class Main {
main(String[] args)21     public static void main(String[] args) throws Exception {
22         System.loadLibrary(args[0]);
23         boolean hasImage = hasImage();
24         String instructionSet = VMRuntime.getCurrentInstructionSet();
25         boolean isBootClassPathOnDisk = VMRuntime.isBootClassPathOnDisk(instructionSet);
26         System.out.println(
27                 "Has image is " + hasImage + ", is image dex2oat enabled is "
28                 + isImageDex2OatEnabled() + ", is BOOTCLASSPATH on disk is "
29                 + isBootClassPathOnDisk + ".");
30 
31         if (hasImage && !isImageDex2OatEnabled()) {
32             throw new Error("Image with dex2oat disabled runs with an oat file");
33         } else if (!hasImage && isImageDex2OatEnabled()) {
34             throw new Error("Image with dex2oat enabled runs without an oat file");
35         }
36         if (hasImage && !isBootClassPathOnDisk) {
37             throw new Error("Image with dex2oat disabled runs with an image file");
38         } else if (!hasImage && isBootClassPathOnDisk) {
39             throw new Error("Image with dex2oat enabled runs without an image file");
40         }
41 
42         testB18485243();
43     }
44 
hasImage()45     private native static boolean hasImage();
46 
isImageDex2OatEnabled()47     private native static boolean isImageDex2OatEnabled();
48 
49     private static class VMRuntime {
50         private static final Method getCurrentInstructionSetMethod;
51         private static final Method isBootClassPathOnDiskMethod;
52         static {
53             try {
54                 Class<?> c = Class.forName("dalvik.system.VMRuntime");
55                 getCurrentInstructionSetMethod = c.getDeclaredMethod("getCurrentInstructionSet");
56                 isBootClassPathOnDiskMethod =
57                         c.getDeclaredMethod("isBootClassPathOnDisk", String.class);
58             } catch (Exception e) {
59                 throw new RuntimeException(e);
60             }
61         }
62 
getCurrentInstructionSet()63         public static String getCurrentInstructionSet() throws Exception {
64             return (String) getCurrentInstructionSetMethod.invoke(null);
65         }
isBootClassPathOnDisk(String instructionSet)66         public static boolean isBootClassPathOnDisk(String instructionSet) throws Exception {
67             return (boolean) isBootClassPathOnDiskMethod.invoke(null, instructionSet);
68         }
69     }
70 
testB18485243()71     private static void testB18485243() throws Exception {
72         Class<?> k = Class.forName("B18485243");
73         Object o = k.newInstance();
74         Method m = k.getDeclaredMethod("run");
75         try {
76             m.invoke(o);
77         } catch (InvocationTargetException e) {
78             Throwable actual = e.getTargetException();
79             if (!(actual instanceof IncompatibleClassChangeError)) {
80                 throw new AssertionError("Expected IncompatibleClassChangeError", actual);
81             }
82         }
83         System.out.println("testB18485243 PASS");
84     }
85 }
86