1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2016 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 static art.Redefinition.*; 18*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.*; 19*795d594fSAndroid Build Coastguard Worker import java.util.Base64; 20*795d594fSAndroid Build Coastguard Worker 21*795d594fSAndroid Build Coastguard Worker class Main { 22*795d594fSAndroid Build Coastguard Worker public static String TEST_NAME = "938-load-transform-bcp"; 23*795d594fSAndroid Build Coastguard Worker 24*795d594fSAndroid Build Coastguard Worker /** 25*795d594fSAndroid Build Coastguard Worker * base64 encoded class/dex file for 26*795d594fSAndroid Build Coastguard Worker * 27*795d594fSAndroid Build Coastguard Worker * // Yes this version of OptionalLong is not compatible with the real one but since it isn't used 28*795d594fSAndroid Build Coastguard Worker * // for anything in the runtime initialization it should be fine. 29*795d594fSAndroid Build Coastguard Worker * 30*795d594fSAndroid Build Coastguard Worker * package java.util; 31*795d594fSAndroid Build Coastguard Worker * public final class OptionalLong { 32*795d594fSAndroid Build Coastguard Worker * private long val; 33*795d594fSAndroid Build Coastguard Worker * 34*795d594fSAndroid Build Coastguard Worker * private OptionalLong(long abc) { 35*795d594fSAndroid Build Coastguard Worker * this.val = abc; 36*795d594fSAndroid Build Coastguard Worker * } 37*795d594fSAndroid Build Coastguard Worker * 38*795d594fSAndroid Build Coastguard Worker * public static OptionalLong of(long abc) { 39*795d594fSAndroid Build Coastguard Worker * return new OptionalLong(abc); 40*795d594fSAndroid Build Coastguard Worker * } 41*795d594fSAndroid Build Coastguard Worker * 42*795d594fSAndroid Build Coastguard Worker * public String foo() { 43*795d594fSAndroid Build Coastguard Worker * return "This is foo for val=" + val; 44*795d594fSAndroid Build Coastguard Worker * } 45*795d594fSAndroid Build Coastguard Worker * 46*795d594fSAndroid Build Coastguard Worker * public String toString() { 47*795d594fSAndroid Build Coastguard Worker * return "This is toString() for val=" + val; 48*795d594fSAndroid Build Coastguard Worker * } 49*795d594fSAndroid Build Coastguard Worker * } 50*795d594fSAndroid Build Coastguard Worker */ 51*795d594fSAndroid Build Coastguard Worker private static final byte[] CLASS_BYTES = Base64.getDecoder().decode( 52*795d594fSAndroid Build Coastguard Worker "yv66vgAAADQAKQoADAAaCQADABsHABwKAAMAHQcAHgoABQAaCAAfCgAFACAKAAUAIQoABQAiCAAj" + 53*795d594fSAndroid Build Coastguard Worker "BwAkAQADdmFsAQABSgEABjxpbml0PgEABChKKVYBAARDb2RlAQAPTGluZU51bWJlclRhYmxlAQAC" + 54*795d594fSAndroid Build Coastguard Worker "b2YBABsoSilMamF2YS91dGlsL09wdGlvbmFsTG9uZzsBAANmb28BABQoKUxqYXZhL2xhbmcvU3Ry" + 55*795d594fSAndroid Build Coastguard Worker "aW5nOwEACHRvU3RyaW5nAQAKU291cmNlRmlsZQEAEU9wdGlvbmFsTG9uZy5qYXZhDAAPACUMAA0A" + 56*795d594fSAndroid Build Coastguard Worker "DgEAFmphdmEvdXRpbC9PcHRpb25hbExvbmcMAA8AEAEAF2phdmEvbGFuZy9TdHJpbmdCdWlsZGVy" + 57*795d594fSAndroid Build Coastguard Worker "AQAUVGhpcyBpcyBmb28gZm9yIHZhbD0MACYAJwwAJgAoDAAXABYBABtUaGlzIGlzIHRvU3RyaW5n" + 58*795d594fSAndroid Build Coastguard Worker "KCkgZm9yIHZhbD0BABBqYXZhL2xhbmcvT2JqZWN0AQADKClWAQAGYXBwZW5kAQAtKExqYXZhL2xh" + 59*795d594fSAndroid Build Coastguard Worker "bmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1aWxkZXI7AQAcKEopTGphdmEvbGFuZy9TdHJp" + 60*795d594fSAndroid Build Coastguard Worker "bmdCdWlsZGVyOwAxAAMADAAAAAEAAgANAA4AAAAEAAIADwAQAAEAEQAAACoAAwADAAAACiq3AAEq" + 61*795d594fSAndroid Build Coastguard Worker "H7UAArEAAAABABIAAAAOAAMAAAAFAAQABgAJAAcACQATABQAAQARAAAAIQAEAAIAAAAJuwADWR63" + 62*795d594fSAndroid Build Coastguard Worker "AASwAAAAAQASAAAABgABAAAACgABABUAFgABABEAAAAvAAMAAQAAABe7AAVZtwAGEge2AAgqtAAC" + 63*795d594fSAndroid Build Coastguard Worker "tgAJtgAKsAAAAAEAEgAAAAYAAQAAAA4AAQAXABYAAQARAAAALwADAAEAAAAXuwAFWbcABhILtgAI" + 64*795d594fSAndroid Build Coastguard Worker "KrQAArYACbYACrAAAAABABIAAAAGAAEAAAASAAEAGAAAAAIAGQ=="); 65*795d594fSAndroid Build Coastguard Worker private static final byte[] DEX_BYTES = Base64.getDecoder().decode( 66*795d594fSAndroid Build Coastguard Worker "ZGV4CjAzNQAOe/TYJCvVthTToFA3tveMDhwTo7uDf0IcBAAAcAAAAHhWNBIAAAAAAAAAAHwDAAAU" + 67*795d594fSAndroid Build Coastguard Worker "AAAAcAAAAAYAAADAAAAABgAAANgAAAABAAAAIAEAAAkAAAAoAQAAAQAAAHABAACMAgAAkAEAAFYC" + 68*795d594fSAndroid Build Coastguard Worker "AABeAgAAYQIAAGQCAABoAgAAbAIAAIACAACUAgAArwIAAMkCAADcAgAA8gIAAA8DAAASAwAAFgMA" + 69*795d594fSAndroid Build Coastguard Worker "AB4DAAAyAwAANwMAADsDAABFAwAAAQAAAAUAAAAGAAAABwAAAAgAAAAMAAAAAgAAAAIAAAAAAAAA" + 70*795d594fSAndroid Build Coastguard Worker "AwAAAAMAAABIAgAABAAAAAMAAABQAgAAAwAAAAQAAABIAgAADAAAAAUAAAAAAAAADQAAAAUAAABI" + 71*795d594fSAndroid Build Coastguard Worker "AgAABAAAABMAAAABAAQAAAAAAAMABAAAAAAAAwABAA4AAAADAAIADgAAAAMAAAASAAAABAAFAAAA" + 72*795d594fSAndroid Build Coastguard Worker "AAAEAAAAEAAAAAQAAwARAAAABAAAABIAAAAEAAAAEQAAAAEAAAAAAAAACQAAAAAAAABiAwAAAAAA" + 73*795d594fSAndroid Build Coastguard Worker "AAQAAwABAAAASgMAAAYAAABwEAAAAQBaEgAADgAEAAIAAwAAAFIDAAAGAAAAIgAEAHAwBQAgAxEA" + 74*795d594fSAndroid Build Coastguard Worker "BQABAAMAAABYAwAAFwAAACIAAwBwEAEAAAAbAQoAAABuIAMAEAAMAFNCAABuMAIAIAMMAG4QBAAA" + 75*795d594fSAndroid Build Coastguard Worker "AAwAEQAAAAUAAQADAAAAXQMAABcAAAAiAAMAcBABAAAAGwELAAAAbiADABAADABTQgAAbjACACAD" + 76*795d594fSAndroid Build Coastguard Worker "DABuEAQAAAAMABEAAAABAAAAAAAAAAEAAAACAAY8aW5pdD4AAUoAAUwAAkxKAAJMTAASTGphdmEv" + 77*795d594fSAndroid Build Coastguard Worker "bGFuZy9PYmplY3Q7ABJMamF2YS9sYW5nL1N0cmluZzsAGUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRl" + 78*795d594fSAndroid Build Coastguard Worker "cjsAGExqYXZhL3V0aWwvT3B0aW9uYWxMb25nOwART3B0aW9uYWxMb25nLmphdmEAFFRoaXMgaXMg" + 79*795d594fSAndroid Build Coastguard Worker "Zm9vIGZvciB2YWw9ABtUaGlzIGlzIHRvU3RyaW5nKCkgZm9yIHZhbD0AAVYAAlZKAAZhcHBlbmQA" + 80*795d594fSAndroid Build Coastguard Worker "EmVtaXR0ZXI6IGphY2stNC4yMgADZm9vAAJvZgAIdG9TdHJpbmcAA3ZhbAAFAQAHDjwtAAoBAAcO" + 81*795d594fSAndroid Build Coastguard Worker "AA4ABw4AEgAHDgAAAQICAAIFgoAEkAMCCawDBgHIAwIBiAQAAA0AAAAAAAAAAQAAAAAAAAABAAAA" + 82*795d594fSAndroid Build Coastguard Worker "FAAAAHAAAAACAAAABgAAAMAAAAADAAAABgAAANgAAAAEAAAAAQAAACABAAAFAAAACQAAACgBAAAG" + 83*795d594fSAndroid Build Coastguard Worker "AAAAAQAAAHABAAABIAAABAAAAJABAAABEAAAAgAAAEgCAAACIAAAFAAAAFYCAAADIAAABAAAAEoD" + 84*795d594fSAndroid Build Coastguard Worker "AAAAIAAAAQAAAGIDAAAAEAAAAQAAAHwDAAA="); 85*795d594fSAndroid Build Coastguard Worker getClassLoaderFor(String location)86*795d594fSAndroid Build Coastguard Worker public static ClassLoader getClassLoaderFor(String location) throws Exception { 87*795d594fSAndroid Build Coastguard Worker try { 88*795d594fSAndroid Build Coastguard Worker Class<?> class_loader_class = Class.forName("dalvik.system.PathClassLoader"); 89*795d594fSAndroid Build Coastguard Worker Constructor<?> ctor = class_loader_class.getConstructor(String.class, ClassLoader.class); 90*795d594fSAndroid Build Coastguard Worker return (ClassLoader)ctor.newInstance(location + "/" + TEST_NAME + "-ex.jar", 91*795d594fSAndroid Build Coastguard Worker Main.class.getClassLoader()); 92*795d594fSAndroid Build Coastguard Worker } catch (ClassNotFoundException e) { 93*795d594fSAndroid Build Coastguard Worker // Running on RI. Use URLClassLoader. 94*795d594fSAndroid Build Coastguard Worker return new java.net.URLClassLoader( 95*795d594fSAndroid Build Coastguard Worker new java.net.URL[] { new java.net.URL("file://" + location + "/classes-ex/") }); 96*795d594fSAndroid Build Coastguard Worker } 97*795d594fSAndroid Build Coastguard Worker } 98*795d594fSAndroid Build Coastguard Worker main(String[] args)99*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) { 100*795d594fSAndroid Build Coastguard Worker setPopRetransformations(false); 101*795d594fSAndroid Build Coastguard Worker addCommonTransformationResult("java/util/OptionalLong", CLASS_BYTES, DEX_BYTES); 102*795d594fSAndroid Build Coastguard Worker enableCommonRetransformation(true); 103*795d594fSAndroid Build Coastguard Worker try { 104*795d594fSAndroid Build Coastguard Worker /* this is the "alternate" DEX/Jar file */ 105*795d594fSAndroid Build Coastguard Worker ClassLoader new_loader = getClassLoaderFor(System.getenv("DEX_LOCATION")); 106*795d594fSAndroid Build Coastguard Worker Class<?> klass = (Class<?>)new_loader.loadClass("TestMain"); 107*795d594fSAndroid Build Coastguard Worker if (klass == null) { 108*795d594fSAndroid Build Coastguard Worker throw new AssertionError("loadClass failed"); 109*795d594fSAndroid Build Coastguard Worker } 110*795d594fSAndroid Build Coastguard Worker Method run_test = klass.getMethod("runTest"); 111*795d594fSAndroid Build Coastguard Worker run_test.invoke(null); 112*795d594fSAndroid Build Coastguard Worker } catch (Exception e) { 113*795d594fSAndroid Build Coastguard Worker System.out.println(e.toString()); 114*795d594fSAndroid Build Coastguard Worker e.printStackTrace(System.out); 115*795d594fSAndroid Build Coastguard Worker } 116*795d594fSAndroid Build Coastguard Worker } 117*795d594fSAndroid Build Coastguard Worker } 118