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 Viacheslav G. Rybalov
215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/**
245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Created on 10.03.2005
255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespackage org.apache.harmony.jpda.tests.jdwp.ClassType;
275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket;
295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands;
305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket;
325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.TaggedObject;
335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.Value;
345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.jdwp.share.JDWPSyncTestCase;
355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;
365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/**
395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * JDWP unit test for ClassType.InvokeMethod command.
405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespublic class InvokeMethodTest extends JDWPSyncTestCase {
425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    static final int testStatusPassed = 0;
445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    static final int testStatusFailed = -1;
455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected String getDebuggeeClassName() {
475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return "org.apache.harmony.jpda.tests.jdwp.share.debuggee.InvokeMethodDebuggee";
485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * This testcase exercises ClassType.InvokeMethod command.
525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>At first the test starts debuggee.
535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>Then does the following checks:
545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - send ClassType.InvokeMethod command for method,
555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * which should not throw any Exception, and checks,
565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * that returned value is expected int value and returned
575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * exception object is null;
585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - send ClassType.InvokeMethod command for method,
595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * which should throw some Exception, and checks, that
605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * returned exception object is not null and has expected attributes;
615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void testInvokeMethod001() {
635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get referenceTypeID
665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.CommandSetID,
685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.ClassesBySignatureCommand);
695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String classSig = "Lorg/apache/harmony/jpda/tests/jdwp/share/debuggee/InvokeMethodDebuggee;";
705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsString(classSig);
715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "VirtualMachine::ClassesBySignature command");
735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int classes = reply.getNextValueAsInt();
755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals("VirtualMachine::ClassesBySignature returned invalid number of classes,",
765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                1, classes); //this class may be loaded only once
775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte refTypeTag = reply.getNextValueAsByte();
785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long typeID = reply.getNextValueAsReferenceTypeID();
795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int status = reply.getNextValueAsInt();
805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(reply);
815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals("VirtualMachine::ClassesBySignature returned Invalid type tag,",
825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPConstants.TypeTag.CLASS, refTypeTag,
835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPConstants.TypeTag.getName(JDWPConstants.TypeTag.CLASS),
845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPConstants.TypeTag.getName(refTypeTag));
855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" VirtualMachine.ClassesBySignature: classes="
875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + classes + " refTypeTag=" + refTypeTag + " typeID= " + typeID
885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + " status=" + status);
895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get methodID
915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet = new CommandPacket(
925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.MethodsCommand);
945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsClassID(typeID);
955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply = debuggeeWrapper.vmMirror.performCommand(packet);
965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "ReferenceType::Methods command");
975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int declared = reply.getNextValueAsInt();
995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" ReferenceType.Methods: declared=" + declared);
1005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long targetMethodID = 0;
1015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < declared; i++) {
1025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long methodID = reply.getNextValueAsMethodID();
1035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String name = reply.getNextValueAsString();
1045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String signature = reply.getNextValueAsString();
1055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            int modBits = reply.getNextValueAsInt();
1065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("  methodID=" + methodID + " name=" + name
1075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + " signature=" + signature + " modBits=" + modBits);
1085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (name.equals("testMethod2")) {
1095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                targetMethodID = methodID;
1105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
1115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(reply);
1135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set EventRequest
1155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet = new CommandPacket(
1165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.CommandSetID,
1175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.SetCommand);
1185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsByte(JDWPConstants.EventKind.METHOD_ENTRY);
1195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsByte(JDWPConstants.SuspendPolicy.ALL);
1205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(1);
1215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsByte((byte) 5);
1225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsString("*.InvokeMethodDebuggee");
1235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply = debuggeeWrapper.vmMirror.performCommand(packet);
1245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "EventRequest::Set command");
1255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int requestID = reply.getNextValueAsInt();
1275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" EventRequest.Set: requestID=" + requestID);
1285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(reply);
1295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
1305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long targetThreadID = 0;
1325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Wait event
1335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket event = debuggeeWrapper.vmMirror.receiveEvent();
1345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = event.getNextValueAsByte();
1355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int events = event.getNextValueAsInt();
1365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" EVENT_THREAD event: suspendPolicy=" + suspendPolicy + " events=" + events);
1375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < events; i++) {
1385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            byte eventKind = event.getNextValueAsByte();
1395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            int newRequestID = event.getNextValueAsInt();
1405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long threadID = event.getNextValueAsThreadID();
1415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            //Location location =
1425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                event.getNextValueAsLocation();
1435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("  EVENT_THREAD event " + i + ": eventKind="
1445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + eventKind + " requestID=" + newRequestID + " threadID="
1455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + threadID);
1465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (newRequestID == requestID) {
1475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                targetThreadID = threadID;
1485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
1495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(event);
1515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue("Invalid targetThreadID, must be != 0", targetThreadID != 0);
1525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        //  Let's clear event request
1545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet = new CommandPacket(
1555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.CommandSetID,
1565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.ClearCommand);
1575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsByte(JDWPConstants.EventKind.METHOD_ENTRY);
1585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(requestID);
1595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply = debuggeeWrapper.vmMirror.performCommand(packet);
1605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "EventRequest::Clear command");
1615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(reply);
1625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Make InvokeMethod without Exception
1645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet = new CommandPacket(
1655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.CommandSetID,
1665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.InvokeMethodCommand);
1675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsClassID(typeID);
1685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsThreadID(targetThreadID);
1695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsMethodID(targetMethodID);
1705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(1);
1715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            packet.setNextValueAsValue(new Value(false));
1725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(0);
1735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" Send ClassType.InvokeMethod without Exception");
1745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply = debuggeeWrapper.vmMirror.performCommand(packet);
1755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "ClassType::InvokeMethod command");
1765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Value returnValue = reply.getNextValueAsValue();
1785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertNotNull("Returned value is null", returnValue);
1795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals("Invalid returned value,", 234, returnValue.getIntValue());
1805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" ClassType.InvokeMethod: returnValue.getIntValue()="
1815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + returnValue.getIntValue());
1825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TaggedObject exception = reply.getNextValueAsTaggedObject();
1845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertNotNull("Returned exception is null", exception);
1855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue("Invalid exception object ID:<" + exception.objectID + ">", exception.objectID == 0);
1865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals("Invalid exception tag,", JDWPConstants.Tag.OBJECT_TAG, exception.tag
1875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                , JDWPConstants.Tag.getName(JDWPConstants.Tag.OBJECT_TAG)
1885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                , JDWPConstants.Tag.getName(exception.tag));
1895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" ClassType.InvokeMethod: exception.tag="
1905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + exception.tag + " exception.objectID=" + exception.objectID);
1915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(reply);
1925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Make InvokeMethod with Exception
1945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet = new CommandPacket(
1955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.CommandSetID,
1965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.InvokeMethodCommand);
1975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsClassID(typeID);
1985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsThreadID(targetThreadID);
1995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsMethodID(targetMethodID);
2005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(1);
2015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            packet.setNextValueAsValue(new Value(true));
2025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(0);
2035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" Send ClassType.InvokeMethod with Exception");
2045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply = debuggeeWrapper.vmMirror.performCommand(packet);
2055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "ClassType::InvokeMethod command");
2065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        returnValue = reply.getNextValueAsValue();
2085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" ClassType.InvokeMethod: returnValue.getIntValue()="
2095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + returnValue.getIntValue());
2105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        exception = reply.getNextValueAsTaggedObject();
2125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertNotNull("Returned exception is null", exception);
2135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue("Invalid exception object ID:<" + exception.objectID + ">", exception.objectID != 0);
2145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals("Invalid exception tag,", JDWPConstants.Tag.OBJECT_TAG, exception.tag
2155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                , JDWPConstants.Tag.getName(JDWPConstants.Tag.OBJECT_TAG)
2165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                , JDWPConstants.Tag.getName(exception.tag));
2175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" ClassType.InvokeMethod: exception.tag="
2185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + exception.tag + " exception.objectID=" + exception.objectID);
2195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(reply);
2205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        //  Let's resume application
2225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet = new CommandPacket(
2235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.CommandSetID,
2245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.ResumeCommand);
2255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply = debuggeeWrapper.vmMirror.performCommand(packet);
2265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "VirtualMachine::Resume command");
2275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(reply);
2285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
2305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
2315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
2335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * This testcase exercises ClassType.InvokeMethod command.
2345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>At first the test starts debuggee.
2355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>Then does the following checks:
2365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - send ClassType.InvokeMethod command for method,
2375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * which actually does not belong to passed class (taking into account
2385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * inheritance).
2395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>Test expects that INVALID_METHODID error is returned by command.
2405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
2415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void testInvokeMethod002() {
2425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==> testInvokeMethod002: START...");
2435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
2445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("\n==> Getting debuggeeRefTypeID... ");
2465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String debuggeeSignature = "Lorg/apache/harmony/jpda/tests/jdwp/share/debuggee/InvokeMethodDebuggee;";
2475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==> debuggeeSignature = |" + debuggeeSignature + "|+");
2485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long debuggeeRefTypeID = debuggeeWrapper.vmMirror.getClassID(debuggeeSignature);
2495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if ( debuggeeRefTypeID == -1 ) {
2505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("## FAILURE: Can not get debuggeeRefTypeID!");
2515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            fail("Can not get debuggeeRefTypeID!");
2525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
2535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==> debuggeeRefTypeID = " + debuggeeRefTypeID);
2545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("\n==> Getting testMethodID for debuggee method 'testMethod2'... ");
2565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String testMethodName = "testMethod2";
2575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long testMethodID =
2585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            debuggeeWrapper.vmMirror.getMethodID(debuggeeRefTypeID, testMethodName);
2595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if ( testMethodID == -1 ) {
2605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("## FAILURE: Can not get methodID!");
2615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            fail("Can not get methodID!");
2625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
2635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==> testMethodID = " + testMethodID);
2645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("\n==> Setting EventRequest... ");
2665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
2675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.CommandSetID,
2685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.SetCommand);
2695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsByte(JDWPConstants.EventKind.METHOD_ENTRY);
2705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsByte(JDWPConstants.SuspendPolicy.ALL);
2715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(1);
2725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsByte((byte) 5);
2735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsString("*.InvokeMethodDebuggee");
2745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
2765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "EventRequest::Set command");
2775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int requestID = reply.getNextValueAsInt();
2795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" EventRequest.Set: requestID=" + requestID);
2805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
2825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("\n==> Getting targetThreadID... ");
2845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long targetThreadID = 0;
2855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Wait event
2865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket event = debuggeeWrapper.vmMirror
2875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .receiveEvent();
2885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = event.getNextValueAsByte();
2895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int events = event.getNextValueAsInt();
2905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" EVENT_THREAD event: suspendPolicy=" + suspendPolicy
2915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + " events=" + events);
2925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < events; i++) {
2935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            byte eventKind = event.getNextValueAsByte();
2945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            int newRequestID = event.getNextValueAsInt();
2955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long threadID = event.getNextValueAsThreadID();
2965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            //Location location =
2975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                event.getNextValueAsLocation();
2985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("  EVENT_THREAD event " + i + ": eventKind="
2995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + eventKind + " requestID=" + newRequestID + " threadID="
3005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + threadID);
3015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (newRequestID == requestID) {
3025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                targetThreadID = threadID;
3035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
3045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
3055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==> targetThreadID = " + targetThreadID);
3065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue("Invalid targetThreadID, must be != 0", targetThreadID != 0);
3075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("\n==> Clear EventRequest... ");
3095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet = new CommandPacket(
3105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.CommandSetID,
3115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.ClearCommand);
3125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsByte(JDWPConstants.EventKind.METHOD_ENTRY);
3135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(requestID);
3145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply = debuggeeWrapper.vmMirror.performCommand(packet);
3155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "EventRequest::Clear command");
3165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("\n==> Getting invalidClassRefTypeID... ");
3185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String invalidClassSignature = "Lorg/apache/harmony/jpda/tests/jdwp/share/debuggee/testClass2;";
3195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==> invalidClassSignature = |" + invalidClassSignature + "|+");
3205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long invalidClassRefTypeID = debuggeeWrapper.vmMirror.getClassID(invalidClassSignature);
3215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if ( invalidClassRefTypeID == -1 ) {
3225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("## FAILURE: Can not get invalidClassRefTypeID!");
3235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            fail("Can not get invalidClassRefTypeID!");
3245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
3255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==> invalidClassRefTypeID = " + invalidClassRefTypeID);
3265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println
3285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ("\n==> Send ClassType::InvokeMethod for invalidClassRefTypeID, testMethodID...");
3295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet = new CommandPacket(
3305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.CommandSetID,
3315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.InvokeMethodCommand);
3325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsClassID(invalidClassRefTypeID);
3335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsThreadID(targetThreadID);
3345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsMethodID(testMethodID);
3355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(1);
3365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            packet.setNextValueAsValue(new Value(false));
3375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(0);
3385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply = debuggeeWrapper.vmMirror.performCommand(packet);
3395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        short errorCode = reply.getErrorCode();
3405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (errorCode == JDWPConstants.Error.NONE) {
3415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println
3425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            ("## FAILURE: ClassType::InvokeMethod command does NOT return expected error - INVALID_METHODID");
3435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            // next is only for extra info
3455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("\n==> Result if invoke method:");
3465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            Value returnValue = reply.getNextValueAsValue();
3475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (returnValue != null) {
3485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                logWriter.println(" ClassType.InvokeMethod: returnValue.getIntValue()="
3495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                        + returnValue.getIntValue());
3505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
3515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            TaggedObject exception = reply.getNextValueAsTaggedObject();
3535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (exception != null) {
3545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                logWriter.println(" ClassType.InvokeMethod: exception.tag="
3555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                        + exception.tag + " exception.objectID=" + exception.objectID);
3565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                if ( exception.objectID != 0 ) {
3575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    String exceptionSignature = getObjectSignature(exception.objectID);
3585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter.println(" exceptionSignature = " + exceptionSignature);
3595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                }
3605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
3615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
3625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "ClassType::InvokeMethod command", JDWPConstants.Error.INVALID_METHODID);
3635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==> PASSED: Expected error (INVALID_METHODID) is returned");
3655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        resumeDebuggee();
3665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
3685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
3695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
3715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * This testcase exercises ClassType.InvokeMethod command.
3725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>At first the test starts debuggee.
3735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>Then does the following checks:
3745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - send ClassType.InvokeMethod command for method,
3755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * which actually is not static method.
3765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>Test expects that INVALID_METHODID error is returned by command.
3775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
3785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void testInvokeMethod003() {
3795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==> testInvokeMethod003: START...");
3805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
3815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("\n==> Getting debuggeeRefTypeID... ");
3835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String debuggeeSignature = "Lorg/apache/harmony/jpda/tests/jdwp/share/debuggee/InvokeMethodDebuggee;";
3845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==> debuggeeSignature = |" + debuggeeSignature + "|+");
3855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long debuggeeRefTypeID = debuggeeWrapper.vmMirror.getClassID(debuggeeSignature);
3865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if ( debuggeeRefTypeID == -1 ) {
3875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("## FAILURE: Can not get debuggeeRefTypeID!");
3885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            fail("Can not get debuggeeRefTypeID!");
3895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
3905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==> debuggeeRefTypeID = " + debuggeeRefTypeID);
3915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("\n==> Getting nonStaticMethodID for debuggee method 'testMethod1'... ");
3935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String nonStaticMethodName = "testMethod1";
3945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long nonStaticMethodID =
3955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            debuggeeWrapper.vmMirror.getMethodID(debuggeeRefTypeID, nonStaticMethodName);
3965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if ( nonStaticMethodID == -1 ) {
3975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("## FAILURE: Can not get methodID!");
3985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            fail("Can not get methodID!");
3995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
4005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==> nonStaticMethodID = " + nonStaticMethodID);
4015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("\n==> Setting EventRequest... ");
4035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
4045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.CommandSetID,
4055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.SetCommand);
4065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsByte(JDWPConstants.EventKind.METHOD_ENTRY);
4075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsByte(JDWPConstants.SuspendPolicy.ALL);
4085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(1);
4095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsByte((byte) 5);
4105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsString("*.InvokeMethodDebuggee");
4115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
4135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "EventRequest::Set command");
4145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int requestID = reply.getNextValueAsInt();
4165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" EventRequest.Set: requestID=" + requestID);
4175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
4195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("\n==> Getting targetThreadID... ");
4215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long targetThreadID = 0;
4225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Wait event
4235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket event = debuggeeWrapper.vmMirror
4245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .receiveEvent();
4255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = event.getNextValueAsByte();
4265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int events = event.getNextValueAsInt();
4275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" EVENT_THREAD event: suspendPolicy=" + suspendPolicy
4285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + " events=" + events);
4295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < events; i++) {
4305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            byte eventKind = event.getNextValueAsByte();
4315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            int newRequestID = event.getNextValueAsInt();
4325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long threadID = event.getNextValueAsThreadID();
4335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            //Location location =
4345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                event.getNextValueAsLocation();
4355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("  EVENT_THREAD event " + i + ": eventKind="
4365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + eventKind + " requestID=" + newRequestID + " threadID="
4375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + threadID);
4385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (newRequestID == requestID) {
4395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                targetThreadID = threadID;
4405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
4415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
4425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==> targetThreadID = " + targetThreadID);
4435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue("Invalid targetThreadID, must be != 0", targetThreadID != 0);
4445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("\n==> Clear EventRequest... ");
4465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet = new CommandPacket(
4475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.CommandSetID,
4485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.ClearCommand);
4495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsByte(JDWPConstants.EventKind.METHOD_ENTRY);
4505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(requestID);
4515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply = debuggeeWrapper.vmMirror.performCommand(packet);
4525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "EventRequest::Clear command");
4535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println
4555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ("\n==> Send ClassType::InvokeMethod for debuggeeRefTypeID, nonStaticMethodID...");
4565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet = new CommandPacket(
4575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.CommandSetID,
4585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.InvokeMethodCommand);
4595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsClassID(debuggeeRefTypeID);
4605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsThreadID(targetThreadID);
4615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsMethodID(nonStaticMethodID);
4625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(1);
4635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsValue(new Value(false));
4645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(0);
4655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply = debuggeeWrapper.vmMirror.performCommand(packet);
4665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        short errorCode = reply.getErrorCode();
4675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (errorCode == JDWPConstants.Error.NONE) {
4685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println
4695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            ("## FAILURE: ClassType::InvokeMethod command does NOT return expected error - INVALID_METHODID");
4705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            // next is only for extra info
4725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("\n==> Result if invoke method:");
4735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            Value returnValue = reply.getNextValueAsValue();
4745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (returnValue != null) {
4755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                logWriter.println(" ClassType.InvokeMethod: returnValue.getIntValue()="
4765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                        + returnValue.getIntValue());
4775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
4785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            TaggedObject exception = reply.getNextValueAsTaggedObject();
4805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (exception != null) {
4815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                logWriter.println(" ClassType.InvokeMethod: exception.tag="
4825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                        + exception.tag + " exception.objectID=" + exception.objectID);
4835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                if ( exception.objectID != 0 ) {
4845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    String exceptionSignature = getObjectSignature(exception.objectID);
4855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter.println(" exceptionSignature = " + exceptionSignature);
4865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                }
4875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
4885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
4895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "ClassType::InvokeMethod command", JDWPConstants.Error.INVALID_METHODID);
4905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("==> PASSED: Expected error (INVALID_METHODID) is returned");
4925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        resumeDebuggee();
4935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
4955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
4965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes}
497