18aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light/* 28aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light * Copyright (C) 2017 The Android Open Source Project 38aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light * 48aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light * Licensed under the Apache License, Version 2.0 (the "License"); 58aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light * you may not use this file except in compliance with the License. 68aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light * You may obtain a copy of the License at 78aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light * 88aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light * http://www.apache.org/licenses/LICENSE-2.0 98aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light * 108aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light * Unless required by applicable law or agreed to in writing, software 118aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light * distributed under the License is distributed on an "AS IS" BASIS, 128aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light * See the License for the specific language governing permissions and 148aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light * limitations under the License. 158aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light */ 168aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light 178aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Lightpackage art; 188aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light 198aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Lightimport java.util.ArrayList; 208aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light// Common Redefinition functions. Placed here for use by CTS 218aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Lightpublic class Redefinition { 228aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light public static final class CommonClassDefinition { 238aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light public final Class<?> target; 248aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light public final byte[] class_file_bytes; 258aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light public final byte[] dex_file_bytes; 268aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light 278aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light public CommonClassDefinition(Class<?> target, byte[] class_file_bytes, byte[] dex_file_bytes) { 288aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light this.target = target; 298aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light this.class_file_bytes = class_file_bytes; 308aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light this.dex_file_bytes = dex_file_bytes; 318aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light } 328aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light } 338aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light 343ccf980505e8b62280cb08616efce28113037f28Alex Light // A set of possible test configurations. Test should set this if they need to. 353ccf980505e8b62280cb08616efce28113037f28Alex Light // This must be kept in sync with the defines in ti-agent/common_helper.cc 363ccf980505e8b62280cb08616efce28113037f28Alex Light public static enum Config { 373ccf980505e8b62280cb08616efce28113037f28Alex Light COMMON_REDEFINE(0), 383ccf980505e8b62280cb08616efce28113037f28Alex Light COMMON_RETRANSFORM(1), 393ccf980505e8b62280cb08616efce28113037f28Alex Light COMMON_TRANSFORM(2); 403ccf980505e8b62280cb08616efce28113037f28Alex Light 413ccf980505e8b62280cb08616efce28113037f28Alex Light private final int val; 423ccf980505e8b62280cb08616efce28113037f28Alex Light private Config(int val) { 433ccf980505e8b62280cb08616efce28113037f28Alex Light this.val = val; 443ccf980505e8b62280cb08616efce28113037f28Alex Light } 453ccf980505e8b62280cb08616efce28113037f28Alex Light } 463ccf980505e8b62280cb08616efce28113037f28Alex Light 473ccf980505e8b62280cb08616efce28113037f28Alex Light public static void setTestConfiguration(Config type) { 483ccf980505e8b62280cb08616efce28113037f28Alex Light nativeSetTestConfiguration(type.val); 493ccf980505e8b62280cb08616efce28113037f28Alex Light } 503ccf980505e8b62280cb08616efce28113037f28Alex Light 513ccf980505e8b62280cb08616efce28113037f28Alex Light private static native void nativeSetTestConfiguration(int type); 523ccf980505e8b62280cb08616efce28113037f28Alex Light 538aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light // Transforms the class 548aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light public static native void doCommonClassRedefinition(Class<?> target, 558aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light byte[] classfile, 568aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light byte[] dexfile); 578aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light 588aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light public static void doMultiClassRedefinition(CommonClassDefinition... defs) { 598aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light ArrayList<Class<?>> classes = new ArrayList<>(); 608aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light ArrayList<byte[]> class_files = new ArrayList<>(); 618aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light ArrayList<byte[]> dex_files = new ArrayList<>(); 628aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light 638aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light for (CommonClassDefinition d : defs) { 648aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light classes.add(d.target); 658aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light class_files.add(d.class_file_bytes); 668aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light dex_files.add(d.dex_file_bytes); 678aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light } 688aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light doCommonMultiClassRedefinition(classes.toArray(new Class<?>[0]), 698aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light class_files.toArray(new byte[0][]), 708aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light dex_files.toArray(new byte[0][])); 718aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light } 728aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light 738aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light public static void addMultiTransformationResults(CommonClassDefinition... defs) { 748aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light for (CommonClassDefinition d : defs) { 758aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light addCommonTransformationResult(d.target.getCanonicalName(), 768aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light d.class_file_bytes, 778aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light d.dex_file_bytes); 788aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light } 798aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light } 808aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light 818aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light public static native void doCommonMultiClassRedefinition(Class<?>[] targets, 828aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light byte[][] classfiles, 838aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light byte[][] dexfiles); 848aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light public static native void doCommonClassRetransformation(Class<?>... target); 858aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light public static native void setPopRetransformations(boolean pop); 868aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light public static native void popTransformationFor(String name); 878aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light public static native void enableCommonRetransformation(boolean enable); 888aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light public static native void addCommonTransformationResult(String target_name, 898aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light byte[] class_bytes, 908aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light byte[] dex_bytes); 918aa4f41d6d59e4449651fe17d25fdd2124944e76Alex Light} 92