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.*; 18*795d594fSAndroid Build Coastguard Worker import java.util.*; 19*795d594fSAndroid Build Coastguard Worker import java.lang.invoke.*; 20*795d594fSAndroid Build Coastguard Worker import java.io.*; 21*795d594fSAndroid Build Coastguard Worker import java.util.zip.*; 22*795d594fSAndroid Build Coastguard Worker 23*795d594fSAndroid Build Coastguard Worker public class Main { 24*795d594fSAndroid Build Coastguard Worker public static final String TEST_NAME = "2000-virtual-list-structural"; 25*795d594fSAndroid Build Coastguard Worker public static final boolean PRINT_COUNT = false; 26*795d594fSAndroid Build Coastguard Worker public static MethodHandles.Lookup lookup = MethodHandles.publicLookup(); 27*795d594fSAndroid Build Coastguard Worker public static MethodHandle getcnt; 28*795d594fSAndroid Build Coastguard Worker public static MethodHandle get_total_cnt; GetHandles()29*795d594fSAndroid Build Coastguard Worker public static void GetHandles() throws Throwable { 30*795d594fSAndroid Build Coastguard Worker getcnt = lookup.findGetter(AbstractCollection.class, "cnt", Integer.TYPE); 31*795d594fSAndroid Build Coastguard Worker get_total_cnt = lookup.findStaticGetter(AbstractCollection.class, "TOTAL_COUNT", Integer.TYPE); 32*795d594fSAndroid Build Coastguard Worker } 33*795d594fSAndroid Build Coastguard Worker GetDexBytes()34*795d594fSAndroid Build Coastguard Worker public static byte[] GetDexBytes() throws Throwable { 35*795d594fSAndroid Build Coastguard Worker String jar_loc = System.getenv("DEX_LOCATION") + "/" + TEST_NAME + "-ex.jar"; 36*795d594fSAndroid Build Coastguard Worker try (ZipFile zip = new ZipFile(new File(jar_loc))) { 37*795d594fSAndroid Build Coastguard Worker ZipEntry entry = zip.getEntry("classes.dex"); 38*795d594fSAndroid Build Coastguard Worker try (InputStream is = zip.getInputStream(entry)) { 39*795d594fSAndroid Build Coastguard Worker byte[] res = new byte[(int)entry.getSize()]; 40*795d594fSAndroid Build Coastguard Worker is.read(res); 41*795d594fSAndroid Build Coastguard Worker return res; 42*795d594fSAndroid Build Coastguard Worker } 43*795d594fSAndroid Build Coastguard Worker } 44*795d594fSAndroid Build Coastguard Worker } PrintListAndData(AbstractCollection<String> c)45*795d594fSAndroid Build Coastguard Worker public static void PrintListAndData(AbstractCollection<String> c) throws Throwable { 46*795d594fSAndroid Build Coastguard Worker if (PRINT_COUNT) { 47*795d594fSAndroid Build Coastguard Worker System.out.println("List is: " + c + " count = " + getcnt.invoke(c) + " TOTAL_COUNT = " + get_total_cnt.invoke()); 48*795d594fSAndroid Build Coastguard Worker } else { 49*795d594fSAndroid Build Coastguard Worker System.out.println("List is: " + c); 50*795d594fSAndroid Build Coastguard Worker } 51*795d594fSAndroid Build Coastguard Worker } main(String[] args)52*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) throws Throwable { 53*795d594fSAndroid Build Coastguard Worker AbstractCollection<String> l1 = (AbstractCollection<String>)Arrays.asList("a", "b", "c", "d"); 54*795d594fSAndroid Build Coastguard Worker AbstractCollection<String> l2 = new ArrayList<>(); 55*795d594fSAndroid Build Coastguard Worker l2.add("1"); 56*795d594fSAndroid Build Coastguard Worker l2.add("2"); 57*795d594fSAndroid Build Coastguard Worker l2.add("3"); 58*795d594fSAndroid Build Coastguard Worker l2.add("4"); 59*795d594fSAndroid Build Coastguard Worker Redefinition.doCommonStructuralClassRedefinition(AbstractCollection.class, GetDexBytes()); 60*795d594fSAndroid Build Coastguard Worker GetHandles(); 61*795d594fSAndroid Build Coastguard Worker AbstractCollection<String> l3 = new HashSet<>(l2); 62*795d594fSAndroid Build Coastguard Worker AbstractCollection<String> l4 = new LinkedList<>(l1); 63*795d594fSAndroid Build Coastguard Worker PrintListAndData(l1); 64*795d594fSAndroid Build Coastguard Worker PrintListAndData(l2); 65*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < 1000; i++) { 66*795d594fSAndroid Build Coastguard Worker l2.add("xyz: " + i); 67*795d594fSAndroid Build Coastguard Worker } 68*795d594fSAndroid Build Coastguard Worker PrintListAndData(l2); 69*795d594fSAndroid Build Coastguard Worker PrintListAndData(l3); 70*795d594fSAndroid Build Coastguard Worker PrintListAndData(l4); 71*795d594fSAndroid Build Coastguard Worker CheckLE(getcnt.invoke(l1), get_total_cnt.invoke()); 72*795d594fSAndroid Build Coastguard Worker CheckLE(getcnt.invoke(l2), get_total_cnt.invoke()); 73*795d594fSAndroid Build Coastguard Worker CheckLE(getcnt.invoke(l3), get_total_cnt.invoke()); 74*795d594fSAndroid Build Coastguard Worker CheckLE(getcnt.invoke(l4), get_total_cnt.invoke()); 75*795d594fSAndroid Build Coastguard Worker CheckEQ(getcnt.invoke(l1), 0); 76*795d594fSAndroid Build Coastguard Worker CheckLE(getcnt.invoke(l2), 0); 77*795d594fSAndroid Build Coastguard Worker CheckLE(getcnt.invoke(l1), getcnt.invoke(l2)); 78*795d594fSAndroid Build Coastguard Worker CheckLE(getcnt.invoke(l1), getcnt.invoke(l3)); 79*795d594fSAndroid Build Coastguard Worker CheckLE(getcnt.invoke(l1), getcnt.invoke(l4)); 80*795d594fSAndroid Build Coastguard Worker CheckLE(getcnt.invoke(l2), getcnt.invoke(l3)); 81*795d594fSAndroid Build Coastguard Worker CheckLE(getcnt.invoke(l2), getcnt.invoke(l4)); 82*795d594fSAndroid Build Coastguard Worker CheckLE(getcnt.invoke(l3), getcnt.invoke(l4)); 83*795d594fSAndroid Build Coastguard Worker } CheckEQ(Object a, int b)84*795d594fSAndroid Build Coastguard Worker public static void CheckEQ(Object a, int b) { 85*795d594fSAndroid Build Coastguard Worker CheckEQ(((Integer)a).intValue(), b); 86*795d594fSAndroid Build Coastguard Worker } CheckLE(Object a, Object b)87*795d594fSAndroid Build Coastguard Worker public static void CheckLE(Object a, Object b) { 88*795d594fSAndroid Build Coastguard Worker CheckLE(((Integer)a).intValue(), ((Integer)b).intValue()); 89*795d594fSAndroid Build Coastguard Worker } CheckEQ(int a, int b)90*795d594fSAndroid Build Coastguard Worker public static void CheckEQ(int a, int b) { 91*795d594fSAndroid Build Coastguard Worker if (a != b) { 92*795d594fSAndroid Build Coastguard Worker throw new Error(a + " is not equal to " + b); 93*795d594fSAndroid Build Coastguard Worker } 94*795d594fSAndroid Build Coastguard Worker } CheckLE(int a, int b)95*795d594fSAndroid Build Coastguard Worker public static void CheckLE(int a, int b) { 96*795d594fSAndroid Build Coastguard Worker if (!(a <= b)) { 97*795d594fSAndroid Build Coastguard Worker throw new Error(a + " is not less than or equal to " + b); 98*795d594fSAndroid Build Coastguard Worker } 99*795d594fSAndroid Build Coastguard Worker } 100*795d594fSAndroid Build Coastguard Worker } 101