15f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/*
25f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Licensed to the Apache Software Foundation (ASF) under one or more
35f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * contributor license agreements.  See the NOTICE file distributed with
45f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * this work for additional information regarding copyright ownership.
55f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * The ASF licenses this file to You under the Apache License, Version 2.0
65f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * (the "License"); you may not use this file except in compliance with
75f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * the License.  You may obtain a copy of the License at
85f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *
95f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *
115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *  Unless required by applicable law or agreed to in writing, software
125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *
155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *  See the License for the specific language governing permissions and
165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *  limitations under the License.
175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/**
205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * @author Anton V. Karnachuk
215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/**
245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Created on 09.02.2005
255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespackage org.apache.harmony.jpda.tests.jdwp.ClassType;
275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport java.io.UnsupportedEncodingException;
295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket;
315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands;
325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket;
345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;
355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/**
395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * JDWP unit test for ClassType.SuperClass command.
405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Contains three testcases: testSuperClass001, testSuperClass002, testSuperClass003.
415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespublic class SuperClassTest extends JDWPClassTypeTestCase {
435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    private ReplyPacket jdwpGetSuperClassReply(long classID, int errorExpected) {
445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.CommandSetID,
465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.SuperclassCommand);
475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsClassID(classID);
485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "ClassType.Superclass command", errorExpected);
505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return reply;
515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    private void asserSuperClassReplyIsValid(ReplyPacket reply, String expectedSignature) {
545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue(reply.getErrorCode() == JDWPConstants.Error.NONE);
555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long superClassID = reply.getNextValueAsClassID();
565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("superClassID=" + superClassID);
575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (superClassID == 0) {
585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            // for superclass of Object expectedSignature is null
595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            assertNull
605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            ("ClassType::Superclass command returned invalid expectedSignature that must be null",
615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    expectedSignature);
625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } else {
635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String signature = getClassSignature(superClassID);
645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("Signature: "+signature);
655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            assertString("ClassType::Superclass command returned invalid signature,",
665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    expectedSignature, signature);
675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * This testcase exercises ClassType.Superclass command.
725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>Starts <A HREF="ClassTypeDebuggee.html">ClassTypeDebuggee</A>.
735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>Then does the following checks:
745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - superclass for java.lang.String is java.lang.Object;
755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - superclass for array of Objects is java.lang.Object;
765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - superclass for primitive array is java.lang.Object;
775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - superclass for <A HREF="ClassTypeDebuggee.html">ClassTypeDebuggee</A>
785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * class is <A HREF="../../share/SyncDebuggee.html">SyncDebuggee</A> class.;
795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void testSuperClass001() throws UnsupportedEncodingException {
815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("testSuperClassTest001 started");
825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // check that superclass for java.lang.String is java.lang.Object
855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        {
865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            // test with String[] class
875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long classID = getClassIDBySignature("Ljava/lang/String;");
885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            ReplyPacket reply = jdwpGetSuperClassReply(classID, JDWPConstants.Error.NONE);
905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            // complare returned signature with superclass signature
915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            asserSuperClassReplyIsValid(reply, "Ljava/lang/Object;");
925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // check that superclass for array is java.lang.Object
955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        {
965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            // test with String[] class
975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long classID = getClassIDBySignature("[Ljava/lang/String;");
985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            ReplyPacket reply = jdwpGetSuperClassReply(classID, JDWPConstants.Error.NONE);
1005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            // complare returned signature with superclass signature
1015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            asserSuperClassReplyIsValid(reply, "Ljava/lang/Object;");
1025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // check that superclass for primitive array is java.lang.Object
1055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        {
1065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            // test with int[] class
1075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long classID = getClassIDBySignature("[I");
1085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            ReplyPacket reply = jdwpGetSuperClassReply(classID, JDWPConstants.Error.NONE);
1105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            // complare returned signature with superclass signature
1115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            asserSuperClassReplyIsValid(reply, "Ljava/lang/Object;");
1125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // check that superclass for Debuggee is SyncDebuggee
1155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        {
1165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long classID = getClassIDBySignature(getDebuggeeSignature());
1175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            ReplyPacket reply = jdwpGetSuperClassReply(classID, JDWPConstants.Error.NONE);
1195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            // complare returned signature with superclass signature
1205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            asserSuperClassReplyIsValid(reply, "Lorg/apache/harmony/jpda/tests/share/SyncDebuggee;");
1215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // check that there is no superclass for java.lang.Object
1245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        {
1255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            // test with java.lang.Object class
1265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long classID = getClassIDBySignature("Ljava/lang/Object;");
1275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            ReplyPacket reply = jdwpGetSuperClassReply(classID, JDWPConstants.Error.NONE);
1295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            // complare returned signature with superclass signature
1305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            // (expects null for this case)
1315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            asserSuperClassReplyIsValid(reply, null);
1325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
1355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * This testcase exercises ClassType.Superclass command.
1395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>Starts <A HREF="ClassTypeDebuggee.html">ClassTypeDebuggee</A>.
1405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>Then does the following checks:
1415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - there is no superclass for interface;
1425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - INVALID_OBJECT is returned if classID is non-existent;
1435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - INVALID_OBJECT is returned if instead of classID FieldID is passed;
1445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void testSuperClass002() throws UnsupportedEncodingException {
1465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("testSuperClassTest002 started");
1475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
1485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // check that there is no superclass for interface objects
1505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        {
1515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long interfaceID = getClassIDBySignature("Ljava/lang/Cloneable;");
1525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            ReplyPacket reply = jdwpGetSuperClassReply(interfaceID, JDWPConstants.Error.NONE);
1545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            // compare returned signature with superclass signature
1555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            // (null for interfaces)
1565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            asserSuperClassReplyIsValid(reply, null);
1575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // check that INVALID_OBJECT returns if classID is non-existent
1605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        {
1615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            jdwpGetSuperClassReply(10000
1625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                , JDWPConstants.Error.INVALID_OBJECT);
1635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // check that reply error code is INVALID_OBJECT for a FieldID Out Data
1665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        {
1675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long classID = getClassIDBySignature(getDebuggeeSignature());
1685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            FieldInfo[] fields = jdwpGetFields(classID);
1705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            // assert stringID is not null
1715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            assertTrue("Invalid fields.length: 0", fields.length > 0);
1725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            // test with the first field
1735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            jdwpGetSuperClassReply(fields[0].getFieldID()
1755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                , JDWPConstants.Error.INVALID_OBJECT);
1765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
1795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * This testcase exercises ClassType.Superclass command.
1835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>Starts <A HREF="ClassTypeDebuggee.html">ClassTypeDebuggee</A>.
1845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>Then does the following check:
1855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - INVALID_CLASS is returned if instead of classID ObjectID is passed;
1865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void testSuperClass003() throws UnsupportedEncodingException {
1885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("testSuperClassTest003 started");
1895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
1905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // check that reply error code is INVALID_CLASS for a StringID Out Data
1925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        {
1935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long stringID = createString("Some test string");
1945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            // assert stringID is not null
1955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            assertFalse("Invalid stringID: 0", stringID == 0);
1965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            jdwpGetSuperClassReply(stringID, JDWPConstants.Error.INVALID_CLASS);
1975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
2005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
2015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes}
202