1/* 2 * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24/* 25 * @test 26 * @bug 8023878 27 * @summary Test that the right kind of exception is thrown from the type 28 * annotation reflection code. 29 * @run testng BadCPIndex 30 */ 31 32import java.lang.annotation.*; 33import java.util.Base64; 34import java.util.function.Function; 35 36import org.testng.annotations.Test; 37import org.testng.annotations.DataProvider; 38 39public class BadCPIndex { 40 private static final MyLoader loader = new MyLoader(BadCPIndex.class.getClassLoader()); 41 42 // Blueprint for broken C 43 //public static class C extends @BadCPIndex.A Object {} 44 private static final String encodedBrokenC = "yv66vgAAADQAFgoAAwAPBwARBwATAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAClNvdXJjZUZpbGUBAA9CYWRDUEluZGV4LmphdmEBAB1SdW50aW1lVmlzaWJsZVR5cGVBbm5vdGF0aW9ucwcAFAEAAUEBAAxJbm5lckNsYXNzZXMBAA5MQmFkQ1BJbmRleCRBOwwABAAFBwAVAQAMQmFkQ1BJbmRleCRDAQABQwEAEGphdmEvbGFuZy9PYmplY3QBAAxCYWRDUEluZGV4JEEBAApCYWRDUEluZGV4ACEAAgADAAAAAAABAAEABAAFAAEABgAAAB0AAQABAAAABSq3AAGxAAAAAQAHAAAABgABAAAAKQADAAgAAAACAAkACgAAAAoAARD//wAADwAAAA0AAAASAAIACwAQAAwmCQACABAAEgAJ"; 45 46 // Blueprint for broken D 47 //public static class D<@BadCPIndex.B U> {} 48 private static final String encodedBrokenD = "yv66vgAAADQAGAoAAwARBwATBwAVAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEACVNpZ25hdHVyZQEAKDxVOkxqYXZhL2xhbmcvT2JqZWN0Oz5MamF2YS9sYW5nL09iamVjdDsBAApTb3VyY2VGaWxlAQAPQmFkQ1BJbmRleC5qYXZhAQAdUnVudGltZVZpc2libGVUeXBlQW5ub3RhdGlvbnMHABYBAAFCAQAMSW5uZXJDbGFzc2VzAQAOTEJhZENQSW5kZXgkQjsMAAQABQcAFwEADEJhZENQSW5kZXgkRAEAAUQBABBqYXZhL2xhbmcvT2JqZWN0AQAMQmFkQ1BJbmRleCRCAQAKQmFkQ1BJbmRleAAhAAIAAwAAAAAAAQABAAQABQABAAYAAAAdAAEAAQAAAAUqtwABsQAAAAEABwAAAAYAAQAAAEAABAAIAAAAAgAJAAoAAAACAAsADAAAAAkAAQAAAAARAAAADwAAABIAAgANABIADiYJAAIAEgAUAAk="; 49 50 // Blueprint for broken E 51 //public static class E extends @BadCPIndex.A Object {} 52 private static final String encodedBrokenE = "yv66vgAAADQAFgoAAwAPBwARBwATAQAGPGluaXQ+AQADKClWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAClNvdXJjZUZpbGUBAA9CYWRDUEluZGV4LmphdmEBAB1SdW50aW1lVmlzaWJsZVR5cGVBbm5vdGF0aW9ucwcAFAEAAUEBAAxJbm5lckNsYXNzZXMBAA5MQmFkQ1BJbmRleCRBOwwABAAFBwAVAQAMQmFkQ1BJbmRleCRFAQABRQEAEGphdmEvbGFuZy9PYmplY3QBAAxCYWRDUEluZGV4JEEBAApCYWRDUEluZGV4ACEAAgADAAAAAAABAAEABAAFAAEABgAAAB0AAQABAAAABSq3AAGxAAAAAQAHAAAABgABAAAARgADAAgAAAACAAkACgAAAAoAARD//wAADgAKAA0AAAASAAIACwAQAAwmCQACABAAEgAJ"; 53 54 private static final Object[][] cases = { 55 { new Case("BadCPIndex$C", encodedBrokenC, Class::getAnnotatedSuperclass) }, 56 { new Case("BadCPIndex$D", encodedBrokenD, (c -> c.getTypeParameters()[0].getAnnotations()))}, 57 { new Case("BadCPIndex$E", encodedBrokenE, Class::getAnnotatedSuperclass) }, 58 }; 59 60 @DataProvider 61 public static Object[][] data() { return cases; } 62 63 @Test(dataProvider="data") 64 public static void testOpThrowsAFE(Case testCase) { 65 Class<?> c = loader.defineClass(testCase.name, Base64.getDecoder().decode(testCase.encoding)); 66 try { 67 System.out.println("Testing: " + c); 68 testCase.trigger.apply(c); 69 throw new RuntimeException("Expecting AnnotationFormatError here"); 70 } catch (AnnotationFormatError e) { 71 ; //ok 72 } catch (Exception e) { 73 e.printStackTrace(); 74 } 75 } 76 77 private static class MyLoader extends ClassLoader { 78 public MyLoader(ClassLoader parent) { 79 super(parent); 80 } 81 82 public Class<?> defineClass(String name, byte[] bytes) { 83 return defineClass(name, bytes, 0, bytes.length); 84 } 85 } 86 87 private static class Case { 88 public String name; 89 public String encoding; 90 public Function<Class<?>, Object> trigger; 91 92 public Case(String name, String encoding, Function<Class<?>, Object> trigger) { 93 this.name = name; 94 this.encoding = encoding; 95 this.trigger = trigger; 96 } 97 } 98 99 @Target(ElementType.TYPE_USE) 100 @Retention(RetentionPolicy.RUNTIME) 101 public static @interface A {} 102 103 @Target(ElementType.TYPE_PARAMETER) 104 @Retention(RetentionPolicy.RUNTIME) 105 public static @interface B {} 106} 107