xref: /aosp_15_r20/art/test/1938-transform-abstract-single-impl/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2017 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 art.Redefinition;
18*795d594fSAndroid Build Coastguard Worker import java.util.Base64;
19*795d594fSAndroid Build Coastguard Worker public class Main {
20*795d594fSAndroid Build Coastguard Worker   static abstract class TransformAbstract {
doSayHi()21*795d594fSAndroid Build Coastguard Worker     public abstract void doSayHi();
22*795d594fSAndroid Build Coastguard Worker 
sayHi()23*795d594fSAndroid Build Coastguard Worker     public void sayHi() {
24*795d594fSAndroid Build Coastguard Worker       System.out.println("hello");
25*795d594fSAndroid Build Coastguard Worker     }
26*795d594fSAndroid Build Coastguard Worker   }
27*795d594fSAndroid Build Coastguard Worker 
28*795d594fSAndroid Build Coastguard Worker   static final class TransformConcrete extends TransformAbstract {
doSayHi()29*795d594fSAndroid Build Coastguard Worker     public final void doSayHi() {
30*795d594fSAndroid Build Coastguard Worker       System.out.print("Running sayHi() - ");
31*795d594fSAndroid Build Coastguard Worker       sayHi();
32*795d594fSAndroid Build Coastguard Worker     }
33*795d594fSAndroid Build Coastguard Worker   }
34*795d594fSAndroid Build Coastguard Worker 
ensureJitCompiled(Class k, String m)35*795d594fSAndroid Build Coastguard Worker   public static native void ensureJitCompiled(Class k, String m);
36*795d594fSAndroid Build Coastguard Worker 
37*795d594fSAndroid Build Coastguard Worker   /**
38*795d594fSAndroid Build Coastguard Worker    * base64 encoded class/dex file for
39*795d594fSAndroid Build Coastguard Worker    * static abstract class TransformAbstract {
40*795d594fSAndroid Build Coastguard Worker    *   public abstract void doSayHi();
41*795d594fSAndroid Build Coastguard Worker    *   public void sayHi() {
42*795d594fSAndroid Build Coastguard Worker    *    System.out.println("Goodbye");
43*795d594fSAndroid Build Coastguard Worker    *   }
44*795d594fSAndroid Build Coastguard Worker    * }
45*795d594fSAndroid Build Coastguard Worker    */
46*795d594fSAndroid Build Coastguard Worker   private static final byte[] CLASS_BYTES = Base64.getDecoder().decode(
47*795d594fSAndroid Build Coastguard Worker     "yv66vgAAADQAIQoABgAPCQAQABEIABIKABMAFAcAFgcAGQEABjxpbml0PgEAAygpVgEABENvZGUB" +
48*795d594fSAndroid Build Coastguard Worker     "AA9MaW5lTnVtYmVyVGFibGUBAAdkb1NheUhpAQAFc2F5SGkBAApTb3VyY2VGaWxlAQAJTWFpbi5q" +
49*795d594fSAndroid Build Coastguard Worker     "YXZhDAAHAAgHABoMABsAHAEAB0dvb2RieWUHAB0MAB4AHwcAIAEAFk1haW4kVHJhbnNmb3JtQWJz" +
50*795d594fSAndroid Build Coastguard Worker     "dHJhY3QBABFUcmFuc2Zvcm1BYnN0cmFjdAEADElubmVyQ2xhc3NlcwEAEGphdmEvbGFuZy9PYmpl" +
51*795d594fSAndroid Build Coastguard Worker     "Y3QBABBqYXZhL2xhbmcvU3lzdGVtAQADb3V0AQAVTGphdmEvaW8vUHJpbnRTdHJlYW07AQATamF2" +
52*795d594fSAndroid Build Coastguard Worker     "YS9pby9QcmludFN0cmVhbQEAB3ByaW50bG4BABUoTGphdmEvbGFuZy9TdHJpbmc7KVYBAARNYWlu" +
53*795d594fSAndroid Build Coastguard Worker     "BCAABQAGAAAAAAADAAAABwAIAAEACQAAAB0AAQABAAAABSq3AAGxAAAAAQAKAAAABgABAAAAHAQB" +
54*795d594fSAndroid Build Coastguard Worker     "AAsACAAAAAEADAAIAAEACQAAACUAAgABAAAACbIAAhIDtgAEsQAAAAEACgAAAAoAAgAAAB8ACAAg" +
55*795d594fSAndroid Build Coastguard Worker     "AAIADQAAAAIADgAYAAAACgABAAUAFQAXBAg=");
56*795d594fSAndroid Build Coastguard Worker   private static final byte[] DEX_BYTES = Base64.getDecoder().decode(
57*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzNQCQkoTiKzIz0l96rtsnUxdY4Kwx+YINWFHEAwAAcAAAAHhWNBIAAAAAAAAAAAADAAAV" +
58*795d594fSAndroid Build Coastguard Worker     "AAAAcAAAAAkAAADEAAAAAgAAAOgAAAABAAAAAAEAAAUAAAAIAQAAAQAAADABAAB0AgAAUAEAAKoB" +
59*795d594fSAndroid Build Coastguard Worker     "AACyAQAAuwEAANUBAADdAQAAAQIAACECAAA4AgAATAIAAGACAAB0AgAAfwIAAJICAACVAgAAmQIA" +
60*795d594fSAndroid Build Coastguard Worker     "AKYCAACvAgAAtQIAALoCAADDAgAAygIAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAJAAAA" +
61*795d594fSAndroid Build Coastguard Worker     "DAAAAAwAAAAIAAAAAAAAAA0AAAAIAAAApAEAAAcABAARAAAAAAAAAAAAAAAAAAAADwAAAAAAAAAT" +
62*795d594fSAndroid Build Coastguard Worker     "AAAABAABABIAAAAFAAAAAAAAAAAAAAAABAAABQAAAAAAAAAKAAAAlAEAAOwCAAAAAAAAAgAAANwC" +
63*795d594fSAndroid Build Coastguard Worker     "AADiAgAAAQABAAEAAADRAgAABAAAAHAQBAAAAA4AAwABAAIAAADWAgAACAAAAGIAAAAaAQEAbiAD" +
64*795d594fSAndroid Build Coastguard Worker     "ABAADgBQAQAAAAAAAAAAAAAAAAAAAQAAAAYABjxpbml0PgAHR29vZGJ5ZQAYTE1haW4kVHJhbnNm" +
65*795d594fSAndroid Build Coastguard Worker     "b3JtQWJzdHJhY3Q7AAZMTWFpbjsAIkxkYWx2aWsvYW5ub3RhdGlvbi9FbmNsb3NpbmdDbGFzczsA" +
66*795d594fSAndroid Build Coastguard Worker     "HkxkYWx2aWsvYW5ub3RhdGlvbi9Jbm5lckNsYXNzOwAVTGphdmEvaW8vUHJpbnRTdHJlYW07ABJM" +
67*795d594fSAndroid Build Coastguard Worker     "amF2YS9sYW5nL09iamVjdDsAEkxqYXZhL2xhbmcvU3RyaW5nOwASTGphdmEvbGFuZy9TeXN0ZW07" +
68*795d594fSAndroid Build Coastguard Worker     "AAlNYWluLmphdmEAEVRyYW5zZm9ybUFic3RyYWN0AAFWAAJWTAALYWNjZXNzRmxhZ3MAB2RvU2F5" +
69*795d594fSAndroid Build Coastguard Worker     "SGkABG5hbWUAA291dAAHcHJpbnRsbgAFc2F5SGkABXZhbHVlABwABw4AHwAHDngAAgIBFBgBAgMC" +
70*795d594fSAndroid Build Coastguard Worker     "DiQIBBAXCwAAAQIAgIAE3AIBgQgAAQH0AgAAEAAAAAAAAAABAAAAAAAAAAEAAAAVAAAAcAAAAAIA" +
71*795d594fSAndroid Build Coastguard Worker     "AAAJAAAAxAAAAAMAAAACAAAA6AAAAAQAAAABAAAAAAEAAAUAAAAFAAAACAEAAAYAAAABAAAAMAEA" +
72*795d594fSAndroid Build Coastguard Worker     "AAMQAAABAAAAUAEAAAEgAAACAAAAXAEAAAYgAAABAAAAlAEAAAEQAAABAAAApAEAAAIgAAAVAAAA" +
73*795d594fSAndroid Build Coastguard Worker     "qgEAAAMgAAACAAAA0QIAAAQgAAACAAAA3AIAAAAgAAABAAAA7AIAAAAQAAABAAAAAAMAAA==");
74*795d594fSAndroid Build Coastguard Worker 
main(String[] args)75*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) throws Exception {
76*795d594fSAndroid Build Coastguard Worker     System.loadLibrary(args[0]);
77*795d594fSAndroid Build Coastguard Worker     Redefinition.setTestConfiguration(Redefinition.Config.COMMON_REDEFINE);
78*795d594fSAndroid Build Coastguard Worker 
79*795d594fSAndroid Build Coastguard Worker     ensureJitCompiled(TransformAbstract.class, "sayHi");
80*795d594fSAndroid Build Coastguard Worker     ensureJitCompiled(TransformConcrete.class, "doSayHi");
81*795d594fSAndroid Build Coastguard Worker 
82*795d594fSAndroid Build Coastguard Worker     TransformAbstract t1 = new TransformConcrete();
83*795d594fSAndroid Build Coastguard Worker     t1.doSayHi();
84*795d594fSAndroid Build Coastguard Worker 
85*795d594fSAndroid Build Coastguard Worker     assertSingleImplementation(TransformAbstract.class, "doSayHi", true);
86*795d594fSAndroid Build Coastguard Worker 
87*795d594fSAndroid Build Coastguard Worker     System.out.println("redefining TransformAbstract");
88*795d594fSAndroid Build Coastguard Worker     Redefinition.doCommonClassRedefinition(TransformAbstract.class, CLASS_BYTES, DEX_BYTES);
89*795d594fSAndroid Build Coastguard Worker 
90*795d594fSAndroid Build Coastguard Worker     t1.doSayHi();
91*795d594fSAndroid Build Coastguard Worker   }
92*795d594fSAndroid Build Coastguard Worker 
hasSingleImplementation(Class<?> clazz, String method_name)93*795d594fSAndroid Build Coastguard Worker   private static native boolean hasSingleImplementation(Class<?> clazz, String method_name);
assertSingleImplementation(Class<?> clazz, String method_name, boolean b)94*795d594fSAndroid Build Coastguard Worker   private static void assertSingleImplementation(Class<?> clazz, String method_name, boolean b) {
95*795d594fSAndroid Build Coastguard Worker     if (hasSingleImplementation(clazz, method_name) != b) {
96*795d594fSAndroid Build Coastguard Worker       System.out.println(clazz + "." + method_name +
97*795d594fSAndroid Build Coastguard Worker           " doesn't have single implementation value of " + b);
98*795d594fSAndroid Build Coastguard Worker     }
99*795d594fSAndroid Build Coastguard Worker   }
100*795d594fSAndroid Build Coastguard Worker }
101