TestMetaAccessProvider.java revision 12772:fbb9c8026495
122347Spst/* 222347Spst * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved. 329964Sache * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 492914Smarkm * 522347Spst * This code is free software; you can redistribute it and/or modify it 622347Spst * under the terms of the GNU General Public License version 2 only, as 722347Spst * published by the Free Software Foundation. 822347Spst * 922347Spst * This code is distributed in the hope that it will be useful, but WITHOUT 1022347Spst * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1122347Spst * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1222347Spst * version 2 for more details (a copy is included in the LICENSE file that 1322347Spst * accompanied this code). 1422347Spst * 1522347Spst * You should have received a copy of the GNU General Public License version 1622347Spst * 2 along with this work; if not, write to the Free Software Foundation, 1792914Smarkm * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 1892914Smarkm * 1959121Skris * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2059121Skris * or visit www.oracle.com if you need additional information or have any 2129964Sache * questions. 2229964Sache */ 2322347Spst 2422347Spst/** 2522347Spst * @test 2622347Spst * @requires vm.jvmci 2722347Spst * @library ../../../../../ 2822347Spst * @modules jdk.internal.vm.ci/jdk.vm.ci.meta 2922347Spst * jdk.internal.vm.ci/jdk.vm.ci.runtime 3022347Spst * java.base/jdk.internal.misc 3122347Spst * @run junit/othervm -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI -Djvmci.Compiler=null jdk.vm.ci.runtime.test.TestMetaAccessProvider 3222347Spst */ 3322347Spst 3422347Spstpackage jdk.vm.ci.runtime.test; 3522347Spst 3622347Spstimport jdk.vm.ci.meta.DeoptimizationAction; 3722347Spstimport jdk.vm.ci.meta.DeoptimizationReason; 3822347Spstimport jdk.vm.ci.meta.JavaConstant; 3922347Spstimport jdk.vm.ci.meta.JavaKind; 4022347Spstimport jdk.vm.ci.meta.MetaAccessProvider; 4122347Spstimport jdk.vm.ci.meta.ResolvedJavaField; 4222347Spstimport jdk.vm.ci.meta.ResolvedJavaMethod; 4322347Spstimport jdk.vm.ci.meta.ResolvedJavaType; 4422347Spstimport jdk.vm.ci.meta.Signature; 4522347Spstimport org.junit.Test; 4622347Spst 4722347Spstimport java.lang.reflect.Field; 4822347Spstimport java.lang.reflect.Method; 4922347Spst 5059121Skrisimport static jdk.vm.ci.meta.MetaUtil.toInternalName; 5159121Skrisimport static org.junit.Assert.assertEquals; 5222347Spstimport static org.junit.Assert.assertNotNull; 5322347Spstimport static org.junit.Assert.assertNull; 5422347Spstimport static org.junit.Assert.assertTrue; 5522347Spst 5622347Spst/** 5722347Spst * Tests for {@link MetaAccessProvider}. 5822347Spst */ 5922347Spstpublic class TestMetaAccessProvider extends TypeUniverse { 6022347Spst private static final DeoptimizationAction DEOPT_ACTION = DeoptimizationAction.InvalidateRecompile; 6122347Spst private static final DeoptimizationReason DEOPT_REASON = DeoptimizationReason.Aliasing; 6222347Spst private static final int INT_23BITS_SET = 0x7FFFFF; 6322347Spst private static final int[] DEBUG_IDS = new int[]{0, 1, 42, INT_23BITS_SET}; 6422347Spst private static final int[] VALID_ENCODED_VALUES = new int[]{ 6522347Spst metaAccess.encodeDeoptActionAndReason(DEOPT_ACTION, DEOPT_REASON, DEBUG_IDS[0]).asInt(), 6622347Spst metaAccess.encodeDeoptActionAndReason(DEOPT_ACTION, DEOPT_REASON, DEBUG_IDS[1]).asInt(), 6722347Spst metaAccess.encodeDeoptActionAndReason(DEOPT_ACTION, DEOPT_REASON, DEBUG_IDS[2]).asInt(), 6822347Spst metaAccess.encodeDeoptActionAndReason(DEOPT_ACTION, DEOPT_REASON, DEBUG_IDS[3]).asInt() 6922347Spst }; 7022347Spst 7122347Spst @Test 7222347Spst public void lookupJavaTypeTest() { 7322347Spst for (Class<?> c : classes) { 7422347Spst ResolvedJavaType type = metaAccess.lookupJavaType(c); 7522347Spst assertNotNull(c.toString(), type); 7622347Spst assertEquals(c.toString(), type.getName(), toInternalName(c.getName())); 7722347Spst assertEquals(c.toString(), type.getName(), toInternalName(type.toJavaName())); 7822347Spst assertEquals(c.toString(), c.getName(), type.toClassName()); 7922347Spst if (!type.isArray()) { 8022347Spst assertEquals(c.toString(), c.getName(), type.toJavaName()); 8122347Spst } 8222347Spst } 8322347Spst } 8422347Spst 8522347Spst @Test(expected = IllegalArgumentException.class) 8622347Spst public void lookupJavaTypeNegativeTest() { 8722347Spst metaAccess.lookupJavaType((Class<?>) null); 8822347Spst } 8922347Spst 9022347Spst @Test 9122347Spst public void lookupJavaTypesTest() { 9222347Spst ResolvedJavaType[] result = metaAccess.lookupJavaTypes(classes.toArray(new Class<?>[classes.size()])); 9322347Spst int counter = 0; 9422347Spst for (Class<?> aClass : classes) { 9522347Spst assertEquals("Unexpected javaType: " + result[counter] + " while expecting of class: " + aClass, result[counter].toClassName(), aClass.getName()); 9622347Spst counter++; 9722347Spst } 9822347Spst } 9922347Spst 10022347Spst @Test(expected = NullPointerException.class) 10122347Spst public void lookupJavaTypesNegative1Test() { 10222347Spst assertNull("Expected null", metaAccess.lookupJavaTypes(null)); 10322347Spst } 10422347Spst 10522347Spst @Test(expected = IllegalArgumentException.class) 10622347Spst public void lookupJavaTypesNegative2Test() { 10722347Spst ResolvedJavaType[] result = metaAccess.lookupJavaTypes(new Class<?>[]{null, null, null}); 10822347Spst for (ResolvedJavaType aType : result) { 10922347Spst assertNull("Expected null javaType", aType); 11022347Spst } 11122347Spst result = metaAccess.lookupJavaTypes(new Class<?>[]{String.class, String.class}); 11222347Spst assertEquals("Results not equals", result[0].getClass(), result[1].getClass()); 11322347Spst assertEquals("Result is not String.class", result[0].getClass(), String.class); 11422347Spst } 11522347Spst 11622347Spst @Test 11722347Spst public void lookupJavaMethodTest() { 11822347Spst for (Class<?> c : classes) { 11922347Spst for (Method reflect : c.getDeclaredMethods()) { 12022347Spst ResolvedJavaMethod method = metaAccess.lookupJavaMethod(reflect); 12122347Spst assertNotNull(method); 12222347Spst assertTrue(method.getDeclaringClass().equals(metaAccess.lookupJavaType(reflect.getDeclaringClass()))); 12322347Spst } 12422347Spst } 12522347Spst } 12622347Spst 12722347Spst @Test(expected = NullPointerException.class) 12822347Spst public void lookupJavaMethodNegativeTest() { 12922347Spst metaAccess.lookupJavaMethod(null); 13022347Spst } 13122347Spst 13222347Spst @Test 13322347Spst public void lookupJavaFieldTest() { 13422347Spst for (Class<?> c : classes) { 13522347Spst for (Field reflect : c.getDeclaredFields()) { 13622347Spst ResolvedJavaField field = metaAccess.lookupJavaField(reflect); 13722347Spst assertNotNull(field); 13822347Spst assertTrue(field.getDeclaringClass().equals(metaAccess.lookupJavaType(reflect.getDeclaringClass()))); 13922347Spst } 14022347Spst } 14122347Spst } 14222347Spst 14322347Spst @Test 14422347Spst public void lookupJavaTypeConstantTest() { 14522347Spst for (ConstantValue cv : constants()) { 14622347Spst JavaConstant c = cv.value; 14722347Spst if (c.getJavaKind() == JavaKind.Object && !c.isNull()) { 14822347Spst Object o = cv.boxed; 14922347Spst ResolvedJavaType type = metaAccess.lookupJavaType(c); 15022347Spst assertNotNull(type); 15122347Spst assertTrue(type.equals(metaAccess.lookupJavaType(o.getClass()))); 15222347Spst } else { 15322347Spst assertEquals(metaAccess.lookupJavaType(c), null); 15422347Spst } 15522347Spst } 15622347Spst } 15722347Spst 15822347Spst @Test(expected = NullPointerException.class) 15922347Spst public void lookupJavaTypeConstantNegativeTest() { 16022347Spst metaAccess.lookupJavaType((JavaConstant) null); 16122347Spst } 16222347Spst 16322347Spst @Test 16422347Spst public void getMemorySizeTest() { 16522347Spst for (ConstantValue cv : constants()) { 16622347Spst JavaConstant c = cv.value; 16722347Spst long memSize = metaAccess.getMemorySize(c); 16822347Spst if (c.isNull()) { 16922347Spst assertEquals("Expected size = 0 for null", memSize, 0L); 17022347Spst } else { 17122347Spst assertTrue("Expected size != 0 for " + cv, memSize != 0L); 17222347Spst } 17322347Spst } 17422347Spst } 17522347Spst 17622347Spst @Test(expected = NullPointerException.class) 17722347Spst public void getMemorySizeNegativeTest() { 17822347Spst metaAccess.getMemorySize(null); 17922347Spst } 18022347Spst 18122347Spst @Test 18222347Spst public void parseMethodDescriptorTest() { 18322347Spst for (String retType : new String[]{"V", "Z", "Ljava/lang/String;"}) { 18422347Spst for (String paramTypes : new String[]{"", "B", 18522347Spst "Ljava/lang/String;", "JLjava/lang/String;", 18622347Spst "Ljava/lang/String;F", 18722347Spst "[Ljava/lang/String;ZBCDFIJLS[ILjava/lang/Object;"}) { 18822347Spst String signature = "(" + paramTypes + ")" + retType; 18922347Spst Signature result = metaAccess.parseMethodDescriptor(signature); 19022347Spst assertEquals("Expected signatures to be equal", result.toMethodDescriptor(), signature); 19122347Spst } 19222347Spst } 19322347Spst } 19422347Spst 19522347Spst @Test(expected = NullPointerException.class) 19622347Spst public void parseMethodDescriptorNegativeNullTest() { 19722347Spst metaAccess.parseMethodDescriptor(null); 19822347Spst } 19922347Spst 20022347Spst @Test(expected = NullPointerException.class) 20122347Spst public void encodeDeoptActionAndReasonNegative1Test() { 20222347Spst metaAccess.encodeDeoptActionAndReason(null, DeoptimizationReason.Aliasing, 0); 20322347Spst 20422347Spst } 20522347Spst 20622347Spst @Test(expected = NullPointerException.class) 20722347Spst public void encodeDeoptActionAndReasonNegative2Test() { 20822347Spst metaAccess.encodeDeoptActionAndReason(DeoptimizationAction.InvalidateRecompile, null, 0); 20922347Spst } 21022347Spst 21122347Spst @Test 21222347Spst public void decodeDeoptReasonTest() { 21322347Spst for (int encoded : VALID_ENCODED_VALUES) { 21422347Spst JavaConstant value = JavaConstant.forInt(encoded); 21522347Spst DeoptimizationReason reason = metaAccess.decodeDeoptReason(value); 21622347Spst assertEquals("Expected equal reasons", reason, DEOPT_REASON); 21722347Spst } 21822347Spst } 21922347Spst 22022347Spst @Test 22122347Spst public void decodeDeoptReasonNegative1Test() { 22222347Spst int encoded = 42; 22322347Spst JavaConstant value = JavaConstant.forInt(encoded); 22422347Spst metaAccess.decodeDeoptReason(value); 22522347Spst } 22622347Spst 22722347Spst @Test(expected = NullPointerException.class) 22822347Spst public void decodeDeoptReasonNegative2Test() { 22922347Spst metaAccess.decodeDeoptReason(null); 23022347Spst } 23122347Spst 23222347Spst @Test 23322347Spst public void decodeDeoptActionTest() { 23422347Spst for (int encoded : VALID_ENCODED_VALUES) { 23522347Spst JavaConstant value = JavaConstant.forInt(encoded); 23622347Spst DeoptimizationAction action = metaAccess.decodeDeoptAction(value); 23722347Spst assertEquals("Expected equal actions", action, DEOPT_ACTION); 23829964Sache } 23922347Spst } 24022347Spst 24122347Spst @Test 24222347Spst public void decodeDeoptActionNegative1Test() { 24322347Spst int encoded = 123456789; 24422347Spst JavaConstant value = JavaConstant.forInt(encoded); 24522347Spst metaAccess.decodeDeoptAction(value); 24622347Spst } 24722347Spst 24892914Smarkm @Test(expected = NullPointerException.class) 24922347Spst public void decodeDeoptActionNegative2Test() { 25022347Spst metaAccess.decodeDeoptAction(null); 25122347Spst } 25222347Spst 25322347Spst @Test 25422347Spst public void decodeDebugIdTest() { 25522347Spst for (int i = 0; i < VALID_ENCODED_VALUES.length; i++) { 25622347Spst JavaConstant value = JavaConstant.forInt(VALID_ENCODED_VALUES[i]); 25722347Spst assertEquals("Unexpected debugId", metaAccess.decodeDebugId(value), DEBUG_IDS[i]); 25822347Spst } 25922347Spst } 26022347Spst} 26122347Spst