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