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 Hughespackage org.apache.harmony.jpda.tests.jdwp.ObjectReference;
205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport java.util.Random;
225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket;
245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands;
255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket;
275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.Value;
285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.jdwp.share.JDWPSyncTestCase;
295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;
305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespublic class ReferringObjectsTest extends JDWPSyncTestCase {
325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    static final int testStatusPassed = 0;
345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    static final int testStatusFailed = -1;
365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    static int maxReferrers;
385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    static final String thisCommandName = "ObjectReference.ReferringObjects command";
405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    static final String debuggeeSignature = "Lorg/apache/harmony/jpda/tests/jdwp/ObjectReference/ReferringObjectsDebuggee;";
425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    static final String referreeObjSignature = "Lorg/apache/harmony/jpda/tests/jdwp/ObjectReference/ReferringObjectsReferree001;";
445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    static final String referrerObjSignature = "Lorg/apache/harmony/jpda/tests/jdwp/ObjectReference/ReferringObjectsReferrer001;";
465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected String getDebuggeeClassName() {
485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return "org.apache.harmony.jpda.tests.jdwp.ObjectReference.ReferringObjectsDebuggee";
495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * This testcase exercises ObjectReference.ReferringObjects command.
535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>The test starts ReferringObjectsDebuggee class, requests referree objectID,
545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * for this class by ReferenceType.Instances command, then performs ObjectReference.ReferringObjects
555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * command and checks that returned instances are equal to the expected referrer objects. Since maxReferrers
565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * equals zero, all instances are returned.
575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void testReferringObjects_MaxReferrersIsZero() {
595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        maxReferrers = 0;
605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        DoTestReferringObjects();
615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * This testcase exercises ObjectReference.ReferringObjects command.
655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>The test starts ReferringObjectsDebuggee class, requests referree objectID,
665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * for this class by ReferenceType.Instances command, then performs ObjectReference.ReferringObjects
675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * command and checks that returned instances are equal to the expected referrer objects. Since maxReferrers
685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * is more than the number of referrer objects, all instances are returned.
695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void testReferringObjects_MaxReferrersIsLarge() {
715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        maxReferrers = 20;
725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        DoTestReferringObjects();
735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * This testcase exercises ObjectReference.ReferringObjects command.
775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>The test starts ReferringObjectsDebuggee class, requests referree objectID,
785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * for this class by ReferenceType.Instances command, then performs ObjectReference.ReferringObjects
795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * command and checks that returned instances are equal to the expected referrer objects. Since maxReferrers
805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * is less than the number of referrer objects, the number of instances returned is equal to maxReferrers.
815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void testReferringObjects_MaxReferrersIsSmall() {
835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        maxReferrers = 1;
845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        DoTestReferringObjects();
855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * This is the real body of the testcase which exercises ObjectReference.ReferringObjects command.
895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>The test starts ReferringObjectsDebuggee class, requests referree objectID,
905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * for this class by ReferenceType.Instances command, then performs ObjectReference.ReferringObjects
915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * command and checks that returned instances are equal to the expected referrer objects.
925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void DoTestReferringObjects() {
940d3a487c78cf562bf179609ac4737a873463a454Sebastien Hertz        String thisTestName = getName();
955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": START...");
975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get the number of referrer objects in ReferringObjectsDebugee
1005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long debuggeeRefTypeID = getClassIDBySignature(debuggeeSignature);
1015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long referringObjNumID = debuggeeWrapper.vmMirror.getFieldID(
1025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                debuggeeRefTypeID, "referringObjNum");
1035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long[] fieldIDs = new long[1];
1045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        fieldIDs[0] = referringObjNumID;
1055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Value[] values = debuggeeWrapper.vmMirror.getReferenceTypeValues(
1065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                debuggeeRefTypeID, fieldIDs);
1075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int expectedReferringObjNum = values[0].getIntValue();
1085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("=> ReferringObjNum in debuggee is: " + expectedReferringObjNum);
1105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if(maxReferrers > 0) {
1125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            expectedReferringObjNum = (maxReferrers > expectedReferringObjNum) ? expectedReferringObjNum : maxReferrers;
1135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Compose Instances command to get referree objectID
1165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket InstancesCommand = new CommandPacket(
1175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
1185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.InstancesCommand);
1195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long referreeObjTypeID = getClassIDBySignature(referreeObjSignature);
1215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        InstancesCommand.setNextValueAsReferenceTypeID(referreeObjTypeID);
1225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        InstancesCommand.setNextValueAsInt(1);
1235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket checkedReply = debuggeeWrapper.vmMirror.performCommand(InstancesCommand);
1255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        InstancesCommand = null;
1265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get the number of instances that returned.
1285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int objNum = checkedReply.getNextValueAsInt();
1295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get the tagged-objectID
1305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte tag = checkedReply.getNextValueAsByte();
1315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long objectID = checkedReply.getNextValueAsObjectID();
1325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Compose ReferringObjects commnad
1345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket ReferringObjectsCommand = new CommandPacket(
1355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
1365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.ReferringObjectsCommand);
1375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReferringObjectsCommand.setNextValueAsObjectID(objectID);
1395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReferringObjectsCommand.setNextValueAsInt(maxReferrers);
1405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Perform ReferringObjects command and attain reply package
1425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkedReply = debuggeeWrapper.vmMirror
1435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .performCommand(ReferringObjectsCommand);
1445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReferringObjectsCommand = null;
1455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get referrer objects numbers
1475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int referringObjects = checkedReply.getNextValueAsInt();
1485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals(thisCommandName + "returned instances number is wrong.", expectedReferringObjNum, referringObjects,null,null);
1495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long referrerTypeID = getClassIDBySignature(referrerObjSignature);
1515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long referrerFieldID = debuggeeWrapper.vmMirror.getFieldID(
1525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                referrerTypeID, "isReferrer");
1535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Check the returned objects are referrer objects
1555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < referringObjects; i++) {
1565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            //Get the tagged-objectID
1575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            tag = checkedReply.getNextValueAsByte();
1585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            assertEquals(thisCommandName
1595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + "returned object tag is invalid.", 'L', tag, null, null);
1605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            objectID = checkedReply.getNextValueAsObjectID();
1625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("=> ObjectID is: " + objectID);
1635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            values = debuggeeWrapper.vmMirror.getObjectReferenceValues(
1645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    objectID, new long[] { referrerFieldID });
1655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            boolean isReferrer = values[0].getBooleanValue();
1665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (!isReferrer) {
1675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                printErrorAndFail(thisCommandName
1685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                        + "returned object is not a referrer which references this object.");
1695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
1705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("=> CHECK: PASSED: expected instances are returned:");
1725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("=> Returned referringObjects number is" + referringObjects);
1735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
1755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": FINISH");
1765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(checkedReply);
1775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * This testcase exercises ObjectReference.ReferringObjects command. <BR>
1815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Compose a ReferringObjects command with negative maxReferrers
1825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * The vm should throw a ILLEGAL_ARGUMENT exception.
1835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void testReferringObjects_IllegalArgument() {
1855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String thisTestName = "testReferringObjects_IllegalArgument";
1865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int maxReferrers = -1;
1885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": START...");
1905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
1915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Compose Instances command to get referree objectID
1935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket InstancesCommand = new CommandPacket(
1945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
1955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.InstancesCommand);
1965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long referreeObjTypeID = getClassIDBySignature(referreeObjSignature);
1985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        InstancesCommand.setNextValueAsReferenceTypeID(referreeObjTypeID);
1995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        InstancesCommand.setNextValueAsInt(1);
2005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket checkedReply = debuggeeWrapper.vmMirror.performCommand(InstancesCommand);
2025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        InstancesCommand = null;
2035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get the number of instances that returned.
2055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int objNum = checkedReply.getNextValueAsInt();
2065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get the tagged-objectID
2075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte tag = checkedReply.getNextValueAsByte();
2085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long objectID = checkedReply.getNextValueAsObjectID();
2095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Compose ReferringObjects commnad
2115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket ReferringObjectsCommand = new CommandPacket(
2125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
2135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.ReferringObjectsCommand);
2145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReferringObjectsCommand.setNextValueAsObjectID(objectID);
2165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReferringObjectsCommand.setNextValueAsInt(maxReferrers);
2175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Perform ReferringObjects command and attain reply package
2195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkedReply = debuggeeWrapper.vmMirror
2205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .performCommand(ReferringObjectsCommand);
2215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReferringObjectsCommand = null;
2225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        short errorCode = checkedReply.getErrorCode();
2245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (errorCode != JDWPConstants.Error.NONE) {
2255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (errorCode == JDWPConstants.Error.NOT_IMPLEMENTED) {
2265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                logWriter.println("=> CHECK PASSED: Expected error (NOT_IMPLEMENTED) is returned");
2275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                return;
2285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
2295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            else if(errorCode == JDWPConstants.Error.ILLEGAL_ARGUMENT) {
2305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                logWriter.println("=> CHECK PASSED: Expected error (ILLEGAL_ARGUMENT) is returned");
2315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                return;
2325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
2335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
2345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        printErrorAndFail(thisCommandName + " should throw ILLEGAL_ARGUMENT exception when maxReferrers is negative.");
2355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
2365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes}
237