| /* | |
| * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. | |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| * | |
| * This code is free software; you can redistribute it and/or modify it | |
| * under the terms of the GNU General Public License version 2 only, as | |
| * published by the Free Software Foundation. | |
| * | |
| * This code is distributed in the hope that it will be useful, but WITHOUT | |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| * version 2 for more details (a copy is included in the LICENSE file that | |
| * accompanied this code). | |
| * | |
| * You should have received a copy of the GNU General Public License version | |
| * 2 along with this work; if not, write to the Free Software Foundation, | |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| * | |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| * or visit www.oracle.com if you need additional information or have any | |
| * questions. | |
| */ | |
| import org.testng.annotations.DataProvider; | |
| import org.testng.annotations.Test; | |
| import java.lang.constant.ClassDesc; | |
| import java.lang.constant.ConstantDesc; | |
| import java.lang.constant.ConstantDescs; | |
| import java.lang.constant.DirectMethodHandleDesc; | |
| import java.lang.constant.DynamicCallSiteDesc; | |
| import java.lang.constant.DynamicConstantDesc; | |
| import java.lang.constant.MethodHandleDesc; | |
| import java.lang.constant.MethodTypeDesc; | |
| import java.lang.invoke.CallSite; | |
| import java.lang.invoke.ConstantBootstraps; | |
| import java.lang.invoke.MethodHandle; | |
| import java.lang.invoke.MethodHandles; | |
| import java.lang.invoke.MethodType; | |
| import java.lang.invoke.VarHandle; | |
| import java.lang.reflect.AccessFlag; | |
| import java.lang.reflect.Field; | |
| import java.util.Collection; | |
| import java.util.List; | |
| import java.util.Map; | |
| import java.util.Set; | |
| import java.util.stream.Stream; | |
| import static java.lang.constant.ConstantDescs.*; | |
| import static org.testng.Assert.assertEquals; | |
| /* | |
| * @test | |
| * @compile ConstantDescsTest.java | |
| * @run testng ConstantDescsTest | |
| * @summary unit tests for java.lang.constant.ConstantDescs | |
| */ | |
| public class ConstantDescsTest { | |
| @DataProvider(name = "validateFields") | |
| public Object[][] knownFieldsData() { | |
| return new Object[][]{ | |
| {CD_Object, Object.class}, | |
| {CD_String, String.class}, | |
| {CD_Class, Class.class}, | |
| {CD_Number, Number.class}, | |
| {CD_Integer, Integer.class}, | |
| {CD_Long, Long.class}, | |
| {CD_Float, Float.class}, | |
| {CD_Double, Double.class}, | |
| {CD_Short, Short.class}, | |
| {CD_Byte, Byte.class}, | |
| {CD_Character, Character.class}, | |
| {CD_Boolean, Boolean.class}, | |
| {CD_Void, Void.class}, | |
| {CD_Exception, Exception.class}, | |
| {CD_Throwable, Throwable.class}, | |
| {CD_Enum, Enum.class}, | |
| {CD_VarHandle, VarHandle.class}, | |
| {CD_MethodHandles, MethodHandles.class}, | |
| {CD_MethodHandles_Lookup, MethodHandles.Lookup.class}, | |
| {CD_MethodHandle, MethodHandle.class}, | |
| {CD_MethodType, MethodType.class}, | |
| {CD_CallSite, CallSite.class}, | |
| {CD_Collection, Collection.class}, | |
| {CD_List, List.class}, | |
| {CD_Set, Set.class}, | |
| {CD_Map, Map.class}, | |
| {CD_ConstantDesc, ConstantDesc.class}, | |
| {CD_ClassDesc, ClassDesc.class}, | |
| {CD_EnumDesc, Enum.EnumDesc.class}, | |
| {CD_MethodTypeDesc, MethodTypeDesc.class}, | |
| {CD_MethodHandleDesc, MethodHandleDesc.class}, | |
| {CD_DirectMethodHandleDesc, DirectMethodHandleDesc.class}, | |
| {CD_VarHandleDesc, VarHandle.VarHandleDesc.class}, | |
| {CD_MethodHandleDesc_Kind, DirectMethodHandleDesc.Kind.class}, | |
| {CD_DynamicConstantDesc, DynamicConstantDesc.class}, | |
| {CD_DynamicCallSiteDesc, DynamicCallSiteDesc.class}, | |
| {CD_ConstantBootstraps, ConstantBootstraps.class}, | |
| {CD_int, int.class}, | |
| {CD_long, long.class}, | |
| {CD_float, float.class}, | |
| {CD_double, double.class}, | |
| {CD_short, short.class}, | |
| {CD_byte, byte.class}, | |
| {CD_char, char.class}, | |
| {CD_boolean, boolean.class}, | |
| {CD_void, void.class}, | |
| {NULL, null}, | |
| {TRUE, Boolean.TRUE}, | |
| {FALSE, Boolean.FALSE}, | |
| }; | |
| } | |
| /** | |
| * Checks that ConstantDescs descriptor fields resolve to the right | |
| * constants. | |
| * @throws ReflectiveOperationException if the test fails | |
| */ | |
| @Test(dataProvider = "validateFields") | |
| public void validateFields(ConstantDesc desc, Object value) throws ReflectiveOperationException { | |
| // Use a minimally-trusted lookup | |
| assertEquals(desc.resolveConstantDesc(MethodHandles.publicLookup()), value); | |
| } | |
| /** | |
| * Ensures all public static final descriptor fields in ConstantDescs | |
| * are resolvable. | |
| * @throws ReflectiveOperationException if the test fails | |
| */ | |
| @Test | |
| public void checkFieldsResolvable() throws ReflectiveOperationException { | |
| // minimally trusted lookup | |
| var lookup = MethodHandles.publicLookup(); | |
| var fields = Stream.of(ConstantDescs.class.getFields()) | |
| .filter(f -> f.accessFlags().contains(AccessFlag.STATIC) | |
| && ConstantDesc.class.isAssignableFrom(f.getType())) | |
| .toArray(Field[]::new); | |
| for (var field : fields) { | |
| var desc = (ConstantDesc) field.get(null); | |
| desc.resolveConstantDesc(lookup); | |
| } | |
| } | |
| } |