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 15.03.2005
255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespackage org.apache.harmony.jpda.tests.jdwp.ObjectReference;
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/**
405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Unit test for NewInstance command.
415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Runs <code>InvokeMethodDebuggee</code>, creates NewInstance of testClass2:
425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Case 1: with options
435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Case 2: without options
445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes *
455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Then invokes it's testMethod3:
465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Case 1: with and without exceptions
475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Case 2: nonvirtual child method without exception and nonvirtual super method without exception
485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/**
515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * JDWP unit test for ObjectReference.InvokeMethod command.
525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespublic class InvokeMethodTest extends JDWPSyncTestCase {
545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
55e1833aa2673d4f975ad35e7a39317feeea922fe1Sebastien Hertz    @Override
565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected String getDebuggeeClassName() {
575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return "org.apache.harmony.jpda.tests.jdwp.share.debuggee.InvokeMethodDebuggee";
585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected int setEventRequest() {
615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.CommandSetID,
635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.SetCommand);
645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsByte(JDWPConstants.EventKind.METHOD_ENTRY);
655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsByte(JDWPConstants.SuspendPolicy.ALL);
665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(1);
675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsByte((byte) 5);
685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsString("*.InvokeMethodDebuggee");
695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("\nSend EventRequest::Set command...");
715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "EventRequest::Set command");
735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int requestID = reply.getNextValueAsInt();
755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" EventRequest.Set: requestID=" + requestID);
765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue(reply.isAllDataRead());
775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return requestID;
785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected long waitEvent(int requestID) {
815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long targetThreadID = 0;
825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket event = debuggeeWrapper.vmMirror
845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .receiveCertainEvent(JDWPConstants.EventKind.METHOD_ENTRY);
855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte suspendPolicy = event.getNextValueAsByte();
865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int events = event.getNextValueAsInt();
875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" EVENT_THREAD event: suspendPolicy=" + suspendPolicy
885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + " events=" + events);
895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < events; i++) {
905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            byte eventKind = event.getNextValueAsByte();
915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            int newRequestID = event.getNextValueAsInt();
925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long threadID = event.getNextValueAsThreadID();
935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            //Location location =
945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                event.getNextValueAsLocation();
955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("  EVENT_THREAD event " + i + ": eventKind="
965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + eventKind + " requestID=" + newRequestID + " threadID="
975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + threadID);
985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (newRequestID == requestID) {
995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                targetThreadID = threadID;
1005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
1015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(event);
1035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue("targetThreadID must be != 0", targetThreadID != 0);
1045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return targetThreadID;
1055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void clearEvent(int requestID) {
1085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
1095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.CommandSetID,
1105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.ClearCommand);
1115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsByte(JDWPConstants.EventKind.METHOD_ENTRY);
1125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(requestID);
1135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("\nSend EventRequest::Clear command...");
1145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
1155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "EventRequest::Clear command");
1165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(reply);
1175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected TaggedObject makeNewInstance(long typeID, long threadID,
1205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long constructorID, int testNumber) {
1215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
1225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.CommandSetID,
1235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.NewInstanceCommand);
1245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsClassID(typeID);
1255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsThreadID(threadID);
1265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsMethodID(constructorID);
1275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if ( testNumber == 1 ) {
1285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            packet.setNextValueAsInt(1); // number of parameters
129e9e1750a916cf602df722515736d21af63de1defSebastien Hertz            packet.setNextValueAsValue(Value.createBoolean(false));
1305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if ( testNumber == 2 ) {
1325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            packet.setNextValueAsInt(0); // number of parameters
1335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(0);
1355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("\nSend ClassType.NewInstance");
1365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
1375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "ClassType::NewInstance command");
1385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TaggedObject newObject = reply.getNextValueAsTaggedObject();
1405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" ClassType.NewInstance: newObject.tag="
1415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + newObject.tag + " newObject.objectID=" + newObject.objectID);
1425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TaggedObject exception = reply.getNextValueAsTaggedObject();
1445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" ClassType.NewInstance: exception.tag="
1455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + exception.tag + " exception.objectID=" + exception.objectID);
1465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue("newObject must be != null", newObject != null);
1485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue("newObject.objectID must be != 0", newObject.objectID != 0);
1495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals("Invalid object tag,", JDWPConstants.Tag.OBJECT_TAG, newObject.tag
1505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                , JDWPConstants.Tag.getName(JDWPConstants.Tag.OBJECT_TAG)
1515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                , JDWPConstants.Tag.getName(newObject.tag));
1525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue("exception must be != null", exception != null);
1545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue("exception.objectID must be == 0", exception.objectID == 0);
1555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals("Invalid exception.tag,", JDWPConstants.Tag.OBJECT_TAG, exception.tag
1565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                , JDWPConstants.Tag.getName(JDWPConstants.Tag.OBJECT_TAG)
1575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                , JDWPConstants.Tag.getName(exception.tag));
1585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(reply);
1605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return newObject;
1615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * This testcase exercises ObjectReference.InvokeMethod command.
1655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>At first the test starts debuggee.
1665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>Then does the following checks:
1675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - send ObjectReference.InvokeMethod command for method,
1685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * which should not throw any Exception, and checks,
1695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * that returned value is int value and returned
1705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * exception object is null;
1715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - send ObjectReference.InvokeMethod command for method,
1725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * which should throw some Exception, and checks, that
1735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * returned exception object is not null and has expected attributes;
1745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void testInvokeMethod001() {
1765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
1775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get referenceTypeID
1795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String classSig = "Lorg/apache/harmony/jpda/tests/jdwp/share/debuggee/testClass2;";
1805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long typeID = getReferenceTypeID(classSig);
1815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get methodIDs
1835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long targetMethodID = getMethodID(typeID, "testMethod3");
1845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long targetConstructorID = getMethodID(typeID, "<init>");
1855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set EventRequest
1875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int requestID = setEventRequest();
1885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
1905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Wait event
1925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long targetThreadID = waitEvent(requestID);
1935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        //  Let's clear event request
1955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        clearEvent(requestID);
1965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Make NewInstance
1985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TaggedObject newObject = makeNewInstance(typeID, targetThreadID,
1995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                targetConstructorID, 1 /* test number */);
2005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        //  Make InvokeMethod without exception
2025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
2035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
2045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.InvokeMethodCommand);
2055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsObjectID(newObject.objectID);
2065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsThreadID(targetThreadID);
2075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsClassID(typeID);
2085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsMethodID(targetMethodID);
2095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(1);
210e9e1750a916cf602df722515736d21af63de1defSebastien Hertz        packet.setNextValueAsValue(Value.createBoolean(false));
2115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(0);
2125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("\nSend ObjectReference.InvokeMethod without exception...");
2135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
2145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "ObjectReference::InvokeMethod command");
2155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Value returnValue = reply.getNextValueAsValue();
2175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" ObjectReference.InvokeMethod: returnValue.getIntValue()="
2185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                        + returnValue.getIntValue());
2195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TaggedObject exception = reply.getNextValueAsTaggedObject();
2215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" ObjectReference.InvokeMethod: exception.tag="
2225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + exception.tag + " exception.objectID=" + exception.objectID);
2235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue("returnValue must be != null", returnValue != null);
2255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals("Invalid returned value,", 345, returnValue.getIntValue());
2265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue("exception must be != null", exception != null);
2285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue("exception.objectID must be == 0", exception.objectID == 0);
2295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals("invalid exception.tag,", JDWPConstants.Tag.OBJECT_TAG, exception.tag
2305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                , JDWPConstants.Tag.getName(JDWPConstants.Tag.OBJECT_TAG)
2315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                , JDWPConstants.Tag.getName(exception.tag));
2325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(reply);
2345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        //  Make InvokeMethod with exception
2365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet = new CommandPacket(
2375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
2385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.InvokeMethodCommand);
2395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsObjectID(newObject.objectID);
2405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsThreadID(targetThreadID);
2415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsClassID(typeID);
2425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsMethodID(targetMethodID);
2435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(1);
244e9e1750a916cf602df722515736d21af63de1defSebastien Hertz        packet.setNextValueAsValue(Value.createBoolean(true));
2455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(0);
2465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("\nSend ObjectReference.InvokeMethod with exception...");
2475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply = debuggeeWrapper.vmMirror.performCommand(packet);
2485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "ObjectReference::InvokeMethod command");
2495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        returnValue = reply.getNextValueAsValue();
2515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" ObjectReference.InvokeMethod: returnValue.getIntValue()="
2525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + returnValue.getIntValue());
2535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        exception = reply.getNextValueAsTaggedObject();
2555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" ObjectReference.InvokeMethod: exception.tag="
2565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + exception.tag + " exception.objectID=" + exception.objectID);
2575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue("exception must be != null", exception != null);
2595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue("exception.objectID must be != 0", exception.objectID != 0);
2605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals("Invalid exception.tag", JDWPConstants.Tag.OBJECT_TAG, exception.tag
2615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                , JDWPConstants.Tag.getName(JDWPConstants.Tag.OBJECT_TAG)
2625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                , JDWPConstants.Tag.getName(exception.tag));
2635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(reply);
2655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        //  Let's resume application
2675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        resumeDebuggee();
2685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
2705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
2715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
2735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * This testcase exercises ObjectReference.InvokeMethod command with INVOKE_NONVIRTUAL InvokeOption.
2745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>At first the test starts debuggee.
2755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>Then does the following checks:
2765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - send ObjectReference.InvokeMethod command for nonvirtual
2775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * child method (from subclass), which should not throw any Exception, and checks,
2785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * that returned value is expected int value and returned
2795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * exception object is null;
2805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * <BR>&nbsp;&nbsp; - send ObjectReference.InvokeMethod command for nonvirtual
2815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * super method (from super class), which should not throw any Exception, and checks,
2825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * that returned value is expected int value and returned
2835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * exception object is null;
2845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
2855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void testInvokeMethod002() {
2865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
2875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get referenceTypeID of super class
2895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String classSig = "Lorg/apache/harmony/jpda/tests/jdwp/share/debuggee/testClass2;";
2905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long typeIDSuper = getReferenceTypeID(classSig);
2915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get referenceTypeID of child class
2935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        classSig = "Lorg/apache/harmony/jpda/tests/jdwp/share/debuggee/testClass3;";
2945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long typeIDChild = getReferenceTypeID(classSig);
2955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Get methodID
2975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long targetMethodIDSuper = getMethodID(typeIDSuper, "testMethod3");
2985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long targetMethodIDChild = getMethodID(typeIDChild, "testMethod3");
2995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long targetConstructorID = getMethodID(typeIDChild, "<init>");
3005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Set EventRequest
3025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int requestID = setEventRequest();
3035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
3055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Wait event
3075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long targetThreadID = waitEvent(requestID);
3085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        //  Let's clear event request
3105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        clearEvent(requestID);
3115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // Make NewInstance
3135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TaggedObject newObject = makeNewInstance(typeIDChild, targetThreadID,
3145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                targetConstructorID, 2 /* test number */);
3155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        //  Make InvokeMethod: nonvirtual child method without exception
3175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
3185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
3195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.InvokeMethodCommand);
3205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsObjectID(newObject.objectID);
3215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsThreadID(targetThreadID);
3225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsClassID(typeIDChild);
3235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsMethodID(targetMethodIDChild);
3245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(1);
325e9e1750a916cf602df722515736d21af63de1defSebastien Hertz        packet.setNextValueAsValue(Value.createBoolean(false));
3265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(JDWPConstants.InvokeOptions.INVOKE_NONVIRTUAL);
3275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println
3285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ("\nSend ObjectReference.InvokeMethod:: nonvirtual child method without exception...");
3295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
3305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "ObjectReference::InvokeMethod command");
3315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        Value returnValue = reply.getNextValueAsValue();
3335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" ObjectReference.InvokeMethod: returnValue.getIntValue()="
3345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + returnValue.getIntValue());
3355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        TaggedObject exception = reply.getNextValueAsTaggedObject();
3375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" ObjectReference.InvokeMethod: exception.tag="
3385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + exception.tag + " exception.objectID=" + exception.objectID);
3395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue("returnValue must be != null", returnValue != null);
3415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals("Invalid value,", 456, returnValue.getIntValue());
3425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue("exception must be != null", exception != null);
3445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue("exception.objectID must be == 0", exception.objectID == 0);
3455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals("Invalid exception.tag", JDWPConstants.Tag.OBJECT_TAG, exception.tag
3465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                , JDWPConstants.Tag.getName(JDWPConstants.Tag.OBJECT_TAG)
3475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                , JDWPConstants.Tag.getName(exception.tag));
3485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(reply);
3505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        //  Make InvokeMethod: nonvirtual super method without exception
3525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet = new CommandPacket(
3535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
3545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.InvokeMethodCommand);
3555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsObjectID(newObject.objectID);
3565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsThreadID(targetThreadID);
3575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsClassID(typeIDSuper);
3585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsMethodID(targetMethodIDSuper);
3595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(1);
360e9e1750a916cf602df722515736d21af63de1defSebastien Hertz        packet.setNextValueAsValue(Value.createBoolean(false));
3615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(JDWPConstants.InvokeOptions.INVOKE_NONVIRTUAL);
3625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println
3635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ("\nSend ObjectReference.InvokeMethod: nonvirtual super method without exception...");
3645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply = debuggeeWrapper.vmMirror.performCommand(packet);
3655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "ObjectReference::InvokeMethod command");
3665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        returnValue = reply.getNextValueAsValue();
3685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" ObjectReference.InvokeMethod: returnValue.getIntValue()="
3695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + returnValue.getIntValue());
3705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        exception = reply.getNextValueAsTaggedObject();
3725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println(" ObjectReference.InvokeMethod: exception.tag="
3735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + exception.tag + " exception.objectID=" + exception.objectID);
3745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue("returnValue must be != null", returnValue != null);
3765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals("Invalid value,", 345, returnValue.getIntValue());
3775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue("exception must be != null", exception != null);
3795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue("exception.objectID must be == 0" ,exception.objectID == 0);
3805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals("Invalid exception.tag", JDWPConstants.Tag.OBJECT_TAG, exception.tag
3815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                , JDWPConstants.Tag.getName(JDWPConstants.Tag.OBJECT_TAG)
3825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                , JDWPConstants.Tag.getName(exception.tag));
3835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(reply);
3855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        //  Let's resume application
3875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        resumeDebuggee();
3885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
3905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
3915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes}
392