xref: /aosp_15_r20/art/test/688-shared-library/src-art/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2018 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.DelegateLastClassLoader;
18*795d594fSAndroid Build Coastguard Worker import dalvik.system.PathClassLoader;
19*795d594fSAndroid Build Coastguard Worker 
20*795d594fSAndroid Build Coastguard Worker public class Main {
21*795d594fSAndroid Build Coastguard Worker     static final String TEST_NAME = "688-shared-library";
22*795d594fSAndroid Build Coastguard Worker     static final String MAIN_JAR_FILE = System.getenv("DEX_LOCATION") + "/" + TEST_NAME + ".jar";
23*795d594fSAndroid Build Coastguard Worker     static final String EX_JAR_FILE = System.getenv("DEX_LOCATION") + "/" + TEST_NAME + "-ex.jar";
24*795d594fSAndroid Build Coastguard Worker     static ClassLoader bootLoader = Object.class.getClassLoader();
25*795d594fSAndroid Build Coastguard Worker 
main(String[] args)26*795d594fSAndroid Build Coastguard Worker     public static void main(String[] args) throws Exception {
27*795d594fSAndroid Build Coastguard Worker       testNoLibrary();
28*795d594fSAndroid Build Coastguard Worker       testOneLibrary();
29*795d594fSAndroid Build Coastguard Worker       testTwoLibraries1();
30*795d594fSAndroid Build Coastguard Worker       testTwoLibraries2();
31*795d594fSAndroid Build Coastguard Worker       testTransitive1();
32*795d594fSAndroid Build Coastguard Worker       testTransitive2();
33*795d594fSAndroid Build Coastguard Worker       testTransitive3();
34*795d594fSAndroid Build Coastguard Worker       testTransitive4();
35*795d594fSAndroid Build Coastguard Worker     }
36*795d594fSAndroid Build Coastguard Worker 
assertIdentical(Object expected, Object actual)37*795d594fSAndroid Build Coastguard Worker     public static void assertIdentical(Object expected, Object actual) {
38*795d594fSAndroid Build Coastguard Worker       if (expected != actual) {
39*795d594fSAndroid Build Coastguard Worker         throw new Error("Expected " + expected + ", got " + actual);
40*795d594fSAndroid Build Coastguard Worker       }
41*795d594fSAndroid Build Coastguard Worker     }
42*795d594fSAndroid Build Coastguard Worker 
testNoLibrary()43*795d594fSAndroid Build Coastguard Worker     public static void testNoLibrary() throws Exception {
44*795d594fSAndroid Build Coastguard Worker       ClassLoader loader = new PathClassLoader(MAIN_JAR_FILE, null, bootLoader);
45*795d594fSAndroid Build Coastguard Worker       Class<?> cls = loader.loadClass("Main");
46*795d594fSAndroid Build Coastguard Worker       assertIdentical(loader, cls.getClassLoader());
47*795d594fSAndroid Build Coastguard Worker     }
48*795d594fSAndroid Build Coastguard Worker 
testOneLibrary()49*795d594fSAndroid Build Coastguard Worker     public static void testOneLibrary() throws Exception {
50*795d594fSAndroid Build Coastguard Worker       ClassLoader[] sharedLibraries = {
51*795d594fSAndroid Build Coastguard Worker           new PathClassLoader(EX_JAR_FILE, null, bootLoader),
52*795d594fSAndroid Build Coastguard Worker       };
53*795d594fSAndroid Build Coastguard Worker       ClassLoader delegateFirst =
54*795d594fSAndroid Build Coastguard Worker           new PathClassLoader(MAIN_JAR_FILE, null, bootLoader, sharedLibraries);
55*795d594fSAndroid Build Coastguard Worker       Class<?> cls = delegateFirst.loadClass("Main");
56*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraries[0], cls.getClassLoader());
57*795d594fSAndroid Build Coastguard Worker       cls = delegateFirst.loadClass("SharedLibraryOne");
58*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraries[0], cls.getClassLoader());
59*795d594fSAndroid Build Coastguard Worker 
60*795d594fSAndroid Build Coastguard Worker       ClassLoader delegateLast =
61*795d594fSAndroid Build Coastguard Worker           new DelegateLastClassLoader(MAIN_JAR_FILE, null, bootLoader, sharedLibraries);
62*795d594fSAndroid Build Coastguard Worker       cls = delegateLast.loadClass("Main");
63*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraries[0], cls.getClassLoader());
64*795d594fSAndroid Build Coastguard Worker       cls = delegateLast.loadClass("SharedLibraryOne");
65*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraries[0], cls.getClassLoader());
66*795d594fSAndroid Build Coastguard Worker     }
67*795d594fSAndroid Build Coastguard Worker 
testTwoLibraries1()68*795d594fSAndroid Build Coastguard Worker     public static void testTwoLibraries1() throws Exception {
69*795d594fSAndroid Build Coastguard Worker       ClassLoader[] sharedLibraries = {
70*795d594fSAndroid Build Coastguard Worker           new PathClassLoader(MAIN_JAR_FILE, null, bootLoader),
71*795d594fSAndroid Build Coastguard Worker           new PathClassLoader(EX_JAR_FILE, null, bootLoader),
72*795d594fSAndroid Build Coastguard Worker       };
73*795d594fSAndroid Build Coastguard Worker       ClassLoader delegateFirst = new PathClassLoader("", null, bootLoader, sharedLibraries);
74*795d594fSAndroid Build Coastguard Worker       Class<?> cls = delegateFirst.loadClass("Main");
75*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraries[0], cls.getClassLoader());
76*795d594fSAndroid Build Coastguard Worker       cls = delegateFirst.loadClass("SharedLibraryOne");
77*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraries[1], cls.getClassLoader());
78*795d594fSAndroid Build Coastguard Worker 
79*795d594fSAndroid Build Coastguard Worker       ClassLoader delegateLast =
80*795d594fSAndroid Build Coastguard Worker           new DelegateLastClassLoader(MAIN_JAR_FILE, null, bootLoader, sharedLibraries);
81*795d594fSAndroid Build Coastguard Worker       cls = delegateLast.loadClass("Main");
82*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraries[0], cls.getClassLoader());
83*795d594fSAndroid Build Coastguard Worker       cls = delegateLast.loadClass("SharedLibraryOne");
84*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraries[1], cls.getClassLoader());
85*795d594fSAndroid Build Coastguard Worker     }
86*795d594fSAndroid Build Coastguard Worker 
testTwoLibraries2()87*795d594fSAndroid Build Coastguard Worker     public static void testTwoLibraries2() throws Exception {
88*795d594fSAndroid Build Coastguard Worker       ClassLoader[] sharedLibraries = {
89*795d594fSAndroid Build Coastguard Worker           new PathClassLoader(EX_JAR_FILE, null, bootLoader),
90*795d594fSAndroid Build Coastguard Worker           new PathClassLoader(MAIN_JAR_FILE, null, bootLoader),
91*795d594fSAndroid Build Coastguard Worker       };
92*795d594fSAndroid Build Coastguard Worker       ClassLoader delegateFirst = new PathClassLoader("", null, bootLoader, sharedLibraries);
93*795d594fSAndroid Build Coastguard Worker       Class<?> cls = delegateFirst.loadClass("Main");
94*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraries[0], cls.getClassLoader());
95*795d594fSAndroid Build Coastguard Worker       cls = delegateFirst.loadClass("SharedLibraryOne");
96*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraries[0], cls.getClassLoader());
97*795d594fSAndroid Build Coastguard Worker 
98*795d594fSAndroid Build Coastguard Worker       ClassLoader delegateLast = new DelegateLastClassLoader("", null, bootLoader, sharedLibraries);
99*795d594fSAndroid Build Coastguard Worker       cls = delegateLast.loadClass("Main");
100*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraries[0], cls.getClassLoader());
101*795d594fSAndroid Build Coastguard Worker       cls = delegateLast.loadClass("SharedLibraryOne");
102*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraries[0], cls.getClassLoader());
103*795d594fSAndroid Build Coastguard Worker     }
104*795d594fSAndroid Build Coastguard Worker 
testTransitive1()105*795d594fSAndroid Build Coastguard Worker     public static void testTransitive1() throws Exception {
106*795d594fSAndroid Build Coastguard Worker       ClassLoader[] sharedLibraryLevel2 = {
107*795d594fSAndroid Build Coastguard Worker           new PathClassLoader(EX_JAR_FILE, null, bootLoader),
108*795d594fSAndroid Build Coastguard Worker       };
109*795d594fSAndroid Build Coastguard Worker       ClassLoader[] sharedLibraryLevel1 = {
110*795d594fSAndroid Build Coastguard Worker           new PathClassLoader(MAIN_JAR_FILE, null, bootLoader, sharedLibraryLevel2),
111*795d594fSAndroid Build Coastguard Worker       };
112*795d594fSAndroid Build Coastguard Worker 
113*795d594fSAndroid Build Coastguard Worker       ClassLoader delegateFirst = new PathClassLoader("", null, bootLoader, sharedLibraryLevel1);
114*795d594fSAndroid Build Coastguard Worker       Class<?> cls = delegateFirst.loadClass("Main");
115*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraryLevel2[0], cls.getClassLoader());
116*795d594fSAndroid Build Coastguard Worker       cls = delegateFirst.loadClass("SharedLibraryOne");
117*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraryLevel2[0], cls.getClassLoader());
118*795d594fSAndroid Build Coastguard Worker 
119*795d594fSAndroid Build Coastguard Worker       ClassLoader delegateLast =
120*795d594fSAndroid Build Coastguard Worker           new DelegateLastClassLoader("", null, bootLoader, sharedLibraryLevel1);
121*795d594fSAndroid Build Coastguard Worker       cls = delegateLast.loadClass("Main");
122*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraryLevel2[0], cls.getClassLoader());
123*795d594fSAndroid Build Coastguard Worker       cls = delegateLast.loadClass("SharedLibraryOne");
124*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraryLevel2[0], cls.getClassLoader());
125*795d594fSAndroid Build Coastguard Worker     }
126*795d594fSAndroid Build Coastguard Worker 
testTransitive2()127*795d594fSAndroid Build Coastguard Worker     public static void testTransitive2() throws Exception {
128*795d594fSAndroid Build Coastguard Worker       ClassLoader[] sharedLibraryLevel2 = {
129*795d594fSAndroid Build Coastguard Worker           new PathClassLoader(MAIN_JAR_FILE, null, bootLoader),
130*795d594fSAndroid Build Coastguard Worker       };
131*795d594fSAndroid Build Coastguard Worker       ClassLoader[] sharedLibraryLevel1 = {
132*795d594fSAndroid Build Coastguard Worker           new PathClassLoader(EX_JAR_FILE, null, bootLoader, sharedLibraryLevel2),
133*795d594fSAndroid Build Coastguard Worker       };
134*795d594fSAndroid Build Coastguard Worker 
135*795d594fSAndroid Build Coastguard Worker       ClassLoader delegateFirst = new PathClassLoader("", null, bootLoader, sharedLibraryLevel1);
136*795d594fSAndroid Build Coastguard Worker       Class<?> cls = delegateFirst.loadClass("Main");
137*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraryLevel2[0], cls.getClassLoader());
138*795d594fSAndroid Build Coastguard Worker       cls = delegateFirst.loadClass("SharedLibraryOne");
139*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraryLevel1[0], cls.getClassLoader());
140*795d594fSAndroid Build Coastguard Worker 
141*795d594fSAndroid Build Coastguard Worker       ClassLoader delegateLast =
142*795d594fSAndroid Build Coastguard Worker           new DelegateLastClassLoader("", null, bootLoader, sharedLibraryLevel1);
143*795d594fSAndroid Build Coastguard Worker       cls = delegateLast.loadClass("Main");
144*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraryLevel2[0], cls.getClassLoader());
145*795d594fSAndroid Build Coastguard Worker       cls = delegateLast.loadClass("SharedLibraryOne");
146*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraryLevel1[0], cls.getClassLoader());
147*795d594fSAndroid Build Coastguard Worker     }
148*795d594fSAndroid Build Coastguard Worker 
testTransitive3()149*795d594fSAndroid Build Coastguard Worker     public static void testTransitive3() throws Exception {
150*795d594fSAndroid Build Coastguard Worker       ClassLoader[] sharedLibraryLevel2 = {
151*795d594fSAndroid Build Coastguard Worker           new PathClassLoader(MAIN_JAR_FILE, null, bootLoader),
152*795d594fSAndroid Build Coastguard Worker       };
153*795d594fSAndroid Build Coastguard Worker       ClassLoader[] sharedLibraryLevel1 = {
154*795d594fSAndroid Build Coastguard Worker           new PathClassLoader(EX_JAR_FILE, null, bootLoader, sharedLibraryLevel2),
155*795d594fSAndroid Build Coastguard Worker           sharedLibraryLevel2[0],
156*795d594fSAndroid Build Coastguard Worker       };
157*795d594fSAndroid Build Coastguard Worker 
158*795d594fSAndroid Build Coastguard Worker       ClassLoader delegateFirst = new PathClassLoader("", null, bootLoader, sharedLibraryLevel1);
159*795d594fSAndroid Build Coastguard Worker       Class<?> cls = delegateFirst.loadClass("Main");
160*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraryLevel2[0], cls.getClassLoader());
161*795d594fSAndroid Build Coastguard Worker       cls = delegateFirst.loadClass("SharedLibraryOne");
162*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraryLevel1[0], cls.getClassLoader());
163*795d594fSAndroid Build Coastguard Worker 
164*795d594fSAndroid Build Coastguard Worker       ClassLoader delegateLast =
165*795d594fSAndroid Build Coastguard Worker           new DelegateLastClassLoader("", null, bootLoader, sharedLibraryLevel1);
166*795d594fSAndroid Build Coastguard Worker       cls = delegateLast.loadClass("Main");
167*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraryLevel2[0], cls.getClassLoader());
168*795d594fSAndroid Build Coastguard Worker       cls = delegateLast.loadClass("SharedLibraryOne");
169*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraryLevel1[0], cls.getClassLoader());
170*795d594fSAndroid Build Coastguard Worker     }
171*795d594fSAndroid Build Coastguard Worker 
testTransitive4()172*795d594fSAndroid Build Coastguard Worker     public static void testTransitive4() throws Exception {
173*795d594fSAndroid Build Coastguard Worker       ClassLoader[] sharedLibraryLevel2 = {
174*795d594fSAndroid Build Coastguard Worker           new PathClassLoader(EX_JAR_FILE, null, bootLoader),
175*795d594fSAndroid Build Coastguard Worker       };
176*795d594fSAndroid Build Coastguard Worker       ClassLoader[] sharedLibraryLevel1 = {
177*795d594fSAndroid Build Coastguard Worker           new PathClassLoader(MAIN_JAR_FILE, null, bootLoader, sharedLibraryLevel2),
178*795d594fSAndroid Build Coastguard Worker           sharedLibraryLevel2[0],
179*795d594fSAndroid Build Coastguard Worker       };
180*795d594fSAndroid Build Coastguard Worker 
181*795d594fSAndroid Build Coastguard Worker       ClassLoader delegateFirst = new PathClassLoader("", null, bootLoader, sharedLibraryLevel1);
182*795d594fSAndroid Build Coastguard Worker       Class<?> cls = delegateFirst.loadClass("Main");
183*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraryLevel2[0], cls.getClassLoader());
184*795d594fSAndroid Build Coastguard Worker       cls = delegateFirst.loadClass("SharedLibraryOne");
185*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraryLevel2[0], cls.getClassLoader());
186*795d594fSAndroid Build Coastguard Worker 
187*795d594fSAndroid Build Coastguard Worker       ClassLoader delegateLast =
188*795d594fSAndroid Build Coastguard Worker           new DelegateLastClassLoader("", null, bootLoader, sharedLibraryLevel1);
189*795d594fSAndroid Build Coastguard Worker       cls = delegateLast.loadClass("Main");
190*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraryLevel2[0], cls.getClassLoader());
191*795d594fSAndroid Build Coastguard Worker       cls = delegateLast.loadClass("SharedLibraryOne");
192*795d594fSAndroid Build Coastguard Worker       assertIdentical(sharedLibraryLevel2[0], cls.getClassLoader());
193*795d594fSAndroid Build Coastguard Worker     }
194*795d594fSAndroid Build Coastguard Worker }
195