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