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 Vitaly A. Provodin
215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/**
245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Created on 29.01.2005
255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespackage org.apache.harmony.jpda.tests.jdwp.share;
275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.TestErrorException;
295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket;
305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.EventPacket;
315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands;
325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.Packet;
345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughesimport org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket;
355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes/**
375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes * Basic class for unit tests which use only one debuggee VM.
385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes */
395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughespublic abstract class JDWPTestCase extends JDWPRawTestCase {
405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * DebuggeeWrapper instance for launched debuggee VM.
435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected JDWPUnitDebuggeeWrapper debuggeeWrapper;
455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * EventPacket instance with received VM_START event.
485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected EventPacket initialEvent = null;
505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Overrides inherited method to launch one debuggee VM, establish JDWP
535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * connection, and wait for VM_START event.
545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void internalSetUp() throws Exception {
565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        super.internalSetUp();
575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // launch debuggee process
595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        debuggeeWrapper = createDebuggeeWrapper();
6025d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain        beforeConnectionSetUp();
6125d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain        setUpDebuggeeWrapperConnection();
6225d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain        beforeDebuggeeStart();
635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        startDebuggeeWrapper();
645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // receive and handle initial event
665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        receiveInitialEvent();
675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // adjust JDWP types length
695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        debuggeeWrapper.vmMirror.adjustTypeLength();
705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("Adjusted VM-dependent type lengths");
715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Creates wrapper for debuggee process.
755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected JDWPUnitDebuggeeWrapper createDebuggeeWrapper() {
775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (settings.getDebuggeeLaunchKind().equals("manual")) {
785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return new JDWPManualDebuggeeWrapper(settings, logWriter);
795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } else {
805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return new JDWPUnitDebuggeeWrapper(settings, logWriter);
815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
8525d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain     * Set up server side JDWP connection.
8625d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain     */
8725d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain    protected void setUpDebuggeeWrapperConnection() {
8825d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain        debuggeeWrapper.setUpConnection();
8925d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain        logWriter.println("Set up server side JDWP connection.");
9025d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain    }
9125d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain
9225d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain    /**
935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Starts wrapper for debuggee process.
945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void startDebuggeeWrapper() {
9625d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain        debuggeeWrapper.start();
975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("Established JDWP connection with debuggee VM");
985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
9925d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain
1005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Receives initial VM_INIT event if debuggee is suspended on event.
1025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void receiveInitialEvent() {
1045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (settings.isDebuggeeSuspend()) {
10525d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain            initialEvent =
1065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                debuggeeWrapper.vmMirror.receiveCertainEvent(JDWPConstants.EventKind.VM_INIT);
1075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("Received inital VM_INIT event");
1085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Overrides inherited method to stop started debuggee VM and close all
1135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * connections.
1145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void internalTearDown() {
1165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (debuggeeWrapper != null) {
1175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            debuggeeWrapper.stop();
1185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("Closed JDWP connection with debuggee VM");
1195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        super.internalTearDown();
1215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
12425d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain     * This method is invoked right before setting up the server side JDWP connection.
1255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
12625d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain    protected void beforeConnectionSetUp() {
12725d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain      // Empty.
12825d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain    }
1295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
13025d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain    /**
13125d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain     * This method is invoked right before starting debuggee VM.
13225d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain     */
13325d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain    protected void beforeDebuggeeStart() {
13425d0ba6cfaa67354e1dd47ce156ca56a815f5fd0Roland Levillain      // Empty.
1355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Opens JDWP connection with debuggee (doesn't run debuggee and doesn't
1395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * establish synchronize connection).
1405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void openConnection() {
1425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        debuggeeWrapper.openConnection();
1435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("Opened transport connection");
1445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        debuggeeWrapper.vmMirror.adjustTypeLength();
1455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("Adjusted VM-dependent type lengths");
1465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Closes JDWP connection with debuggee (doesn't terminate debuggee and
1505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * doesn't stop synchronize connection).
1515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void closeConnection() {
1535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (debuggeeWrapper != null) {
1545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            debuggeeWrapper.disposeConnection();
1555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            try {
1565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                debuggeeWrapper.vmMirror.closeConnection();
1575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            } catch (Exception e) {
1585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                throw new TestErrorException(e);
1595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
1605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("Closed transport connection");
1615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper that returns reference type signature of input object ID.
1665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
1675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param objectID -
1685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            debuggee object ID
1695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return object signature of reference type
1705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected String getObjectSignature(long objectID) {
1725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long classID = getObjectReferenceType(objectID);
1735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return getClassSignature(classID);
1745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper that returns reference type ID for input object ID.
1785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
1795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param objectID -
1805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            debuggee object ID
1815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return reference type ID
1825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected long getObjectReferenceType(long objectID) {
1845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
1855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
1865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.ReferenceTypeCommand);
1875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsReferenceTypeID(objectID);
1885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(command);
1895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "ObjectReference::ReferenceType command");
1905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // byte refTypeTag =
1915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply.getNextValueAsByte();
1925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long objectRefTypeID = reply.getNextValueAsReferenceTypeID();
1935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return objectRefTypeID;
1945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper for getting method ID of corresponding class and method name.
1985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
1995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classID -
2005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class ID
2015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param methodName -
2025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            method name
2035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return method ID
2045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
2055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected long getMethodID(long classID, String methodName) {
2065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
2075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
2085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.MethodsCommand);
2095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsClassID(classID);
2105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(command);
2115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "ReferenceType::Methods command");
2125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int methods = reply.getNextValueAsInt();
2135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < methods; i++) {
2145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long methodID = reply.getNextValueAsMethodID();
2155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String name = reply.getNextValueAsString(); // method name
2165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            reply.getNextValueAsString(); // method signature
2175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            reply.getNextValueAsInt(); // method modifiers
2185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (name.equals(methodName)) {
2195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                return methodID;
2205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
2215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
2225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return -1;
2235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
2245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
226ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz     * Helper for getting method ID of corresponding class, method name and signature.
227ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz     *
228ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz     * @param classID -
229ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz     *            class ID
230ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz     * @param methodName -
231ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz     *            method name
232ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz     * @param methodSignature -
233ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz     *            method signature
234ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz     * @return method ID
235ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz     */
236ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz    protected long getMethodID(long classID, String methodName, String methodSignature) {
237ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz        CommandPacket command = new CommandPacket(
238ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
239ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz                JDWPCommands.ReferenceTypeCommandSet.MethodsCommand);
240ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz        command.setNextValueAsClassID(classID);
241ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(command);
242ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz        checkReplyPacket(reply, "ReferenceType::Methods command");
243ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz        int methods = reply.getNextValueAsInt();
244ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz        for (int i = 0; i < methods; i++) {
245ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz            long methodID = reply.getNextValueAsMethodID();
246ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz            String name = reply.getNextValueAsString(); // method name
247ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz            String signature = reply.getNextValueAsString();
248ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz            reply.getNextValueAsInt(); // method modifiers
249ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz            if (name.equals(methodName) && signature.equals(methodSignature)) {
250ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz                return methodID;
251ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz            }
252ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz        }
253ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz        return -1;
254ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz    }
255ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz
256ad8a1ac1d45d7626686bfb431f1039e12d5f5794Sebastien Hertz    /**
2575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Issues LineTable command.
2585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
2595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classID -
2605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class ID
2615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param methodID -
2625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            method ID
2635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return reply packet
2645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
2655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected ReplyPacket getLineTable(long classID, long methodID) {
2665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket lineTableCommand = new CommandPacket(
2675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.MethodCommandSet.CommandSetID,
2685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.MethodCommandSet.LineTableCommand);
2695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        lineTableCommand.setNextValueAsReferenceTypeID(classID);
2705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        lineTableCommand.setNextValueAsMethodID(methodID);
2715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket lineTableReply = debuggeeWrapper.vmMirror
2725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .performCommand(lineTableCommand);
2735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(lineTableReply, "Method::LineTable command");
2745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return lineTableReply;
2755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
2765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
2785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper for getting method name of corresponding class and method ID.
2795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
2805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classID class id
2815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param methodID method id
2825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return String
2835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
2845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected String getMethodName(long classID, long methodID) {
2855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
2865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
2875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.MethodsCommand);
2885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsClassID(classID);
2895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
2905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "ReferenceType::Methods command");
2915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int methods = reply.getNextValueAsInt();
2925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < methods; i++) {
2935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long mid = reply.getNextValueAsMethodID();
2945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String name = reply.getNextValueAsString();
2955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            reply.getNextValueAsString();
2965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            reply.getNextValueAsInt();
2975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (mid == methodID) {
2985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                return name;
2995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
3005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
3015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return "unknown";
3025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
3035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
3055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns jni signature for selected classID
3065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
3075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classID
3085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return jni signature for selected classID
3095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
3105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected String getClassSignature(long classID) {
3115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
3125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
3135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.SignatureCommand);
3145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsReferenceTypeID(classID);
3155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(command);
3165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "ReferenceType::Signature command");
3175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String signature = reply.getNextValueAsString();
3185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return signature;
3195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
3205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
3225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns classID for the selected jni signature
3235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
3245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param signature
3255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return classID for the selected jni signature
3265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
3275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected long getClassIDBySignature(String signature) {
3285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("=> Getting reference type ID for class: "
3295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + signature);
3305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
3315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.CommandSetID,
3325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.ClassesBySignatureCommand);
3335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsString(signature);
3345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
3355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "VirtualMachine::ClassesBySignature command");
3365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int classes = reply.getNextValueAsInt();
3375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("=> Returned number of classes: " + classes);
3385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long classID = 0;
3395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < classes; i++) {
3405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            reply.getNextValueAsByte();
3415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            classID = reply.getNextValueAsReferenceTypeID();
3425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            reply.getNextValueAsInt();
3435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            // we need the only class, even if there were multiply ones
3445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            break;
3455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
3465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue(
3475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                "VirtualMachine::ClassesBySignature command returned invalid classID:<"
3485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                        + classID + "> for signature " + signature, classID > 0);
3495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return classID;
3505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
3515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
3535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns reference type ID.
3545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
3555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param signature
3565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return type ID for the selected jni signature
3575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
3585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected long getReferenceTypeID(String signature) {
3595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
3605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.CommandSetID,
3615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.ClassesBySignatureCommand);
3625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsString(signature);
3635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
3645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "VirtualMachine::ClassesBySignature command");
3655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int classes = reply.getNextValueAsInt();
3665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // this class may be loaded only once
3675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals("Invalid number of classes for reference type: "
3685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + signature + ",", 1, classes);
3695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte refTypeTag = reply.getNextValueAsByte();
3705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long classID = reply.getNextValueAsReferenceTypeID();
3715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int status = reply.getNextValueAsInt();
3725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("VirtualMachine.ClassesBySignature: classes="
3735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + classes + " refTypeTag=" + refTypeTag + " typeID= " + classID
3745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + " status=" + status);
3755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(reply);
3765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals("", JDWPConstants.TypeTag.CLASS, refTypeTag);
3775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return classID;
3785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
3795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
3815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper function for resuming debuggee.
3825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
3835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void resumeDebuggee() {
384684d91ef9b8c8022f19cc0d51598c2402303ed7cSebastien Hertz        logWriter.println("=> Resume debuggee");
3855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
3865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.CommandSetID,
3875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.ResumeCommand);
3885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("Sending VirtualMachine::Resume command...");
3895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
3905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "VirtualMachine::Resume command");
3915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(reply);
3925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
3935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
3955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Performs string creation in debuggee.
3965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
3975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param value -
3985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            content for new string
3995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return StringID of new created string
4005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
4015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected long createString(String value) {
4025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
4035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.CommandSetID,
4045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.CreateStringCommand);
4055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsString(value);
4065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
4075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "VirtualMachine::CreateString command");
4085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long stringID = reply.getNextValueAsStringID();
4095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return stringID;
4105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
4115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
4135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns corresponding string from string ID.
4145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
4155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param stringID -
4165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            string ID
4175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return string value
4185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
4195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected String getStringValue(long stringID) {
4205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
4215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.StringReferenceCommandSet.CommandSetID,
4225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.StringReferenceCommandSet.ValueCommand);
4235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsObjectID(stringID);
4245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
4255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "StringReference::Value command");
4265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String returnedTestString = reply.getNextValueAsString();
4275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return returnedTestString;
4285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
4295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
4315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Multiple field verification routine.
4325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
4335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param refTypeID -
4345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            reference type ID
4355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param checkedFieldNames -
4365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            list of field names to be checked
4375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return list of field IDs
4385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
4395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected long[] checkFields(long refTypeID, String checkedFieldNames[]) {
4405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkFields(refTypeID, checkedFieldNames, null, null);
4415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
4425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
4445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Single field verification routine.
4455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
4465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param refTypeID -
4475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            reference type ID
4485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param fieldName -
4495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            name of single field
4505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return filed ID
4515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
4525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected long checkField(long refTypeID, String fieldName) {
4535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkFields(refTypeID, new String[] { fieldName }, null, null)[0];
4545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
4555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
4575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Multiple field verification routine.
4585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
4595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param refTypeID -
4605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            reference type ID
4615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param checkedFieldNames -
4625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            list of field names to be checked
4635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param expectedSignatures -
4645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            list of expected field signatures
4655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param expectedModifiers -
4665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            list of expected field modifiers
4675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return list of field IDs
4685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
4695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected long[] checkFields(long refTypeID, String checkedFieldNames[],
4705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String expectedSignatures[], int expectedModifiers[]) {
4715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        boolean checkedFieldFound[] = new boolean[checkedFieldNames.length];
4735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long checkedFieldIDs[] = new long[checkedFieldNames.length];
4745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter
4765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .println("=> Send ReferenceType::Fields command and get field ID(s)");
4775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket fieldsCommand = new CommandPacket(
4795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
4805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.FieldsCommand);
4815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        fieldsCommand.setNextValueAsReferenceTypeID(refTypeID);
4825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket fieldsReply = debuggeeWrapper.vmMirror
4835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .performCommand(fieldsCommand);
4845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        fieldsCommand = null;
4855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(fieldsReply, "ReferenceType::Fields command");
4865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int returnedFieldsNumber = fieldsReply.getNextValueAsInt();
4885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter
4895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .println("=> Returned fields number = " + returnedFieldsNumber);
4905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int checkedFieldsNumber = checkedFieldNames.length;
4925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        final int fieldSyntheticFlag = 0xf0000000;
4935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int nameDuplicated = 0;
4955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String fieldNameDuplicated = null; // <= collects all duplicated fields
4965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int nameMissing = 0;
4975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String fieldNameMissing = null; // <= collects all missed fields
4985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < returnedFieldsNumber; i++) {
5005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long returnedFieldID = fieldsReply.getNextValueAsFieldID();
5015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String returnedFieldName = fieldsReply.getNextValueAsString();
5025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String returnedFieldSignature = fieldsReply.getNextValueAsString();
5035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            int returnedFieldModifiers = fieldsReply.getNextValueAsInt();
5045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("");
5055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("=> Field ID: " + returnedFieldID);
5065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("=> Field name: " + returnedFieldName);
5075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("=> Field signature: " + returnedFieldSignature);
5085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("=> Field modifiers: 0x"
5095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + Integer.toHexString(returnedFieldModifiers));
5105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if ((returnedFieldModifiers & fieldSyntheticFlag) == fieldSyntheticFlag) {
5115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                continue; // do not check synthetic fields
5125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
5135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            for (int k = 0; k < checkedFieldsNumber; k++) {
5145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                if (!checkedFieldNames[k].equals(returnedFieldName)) {
5155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    continue;
5165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                }
5175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                if (checkedFieldFound[k]) {
5185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter.println("");
5195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter
5205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            .println("## FAILURE: The field is found repeatedly in the list");
5215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter.println("## Field Name: " + returnedFieldName);
5225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter.println("## Field ID: " + returnedFieldID);
5235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter.println("## Field Signature: "
5245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + returnedFieldSignature);
5255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter.println("## Field Modifiers: 0x"
5265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + Integer.toHexString(returnedFieldModifiers));
5275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    fieldNameDuplicated = (0 == nameDuplicated ? returnedFieldName
5285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            : fieldNameDuplicated + "," + returnedFieldName);
5295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    nameDuplicated++;
5305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    break;
5315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                }
5325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                checkedFieldFound[k] = true;
5335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                checkedFieldIDs[k] = returnedFieldID;
5345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                if (null != expectedSignatures) {
5355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    assertString(
5365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            "Invalid field signature is returned for field:"
5375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                                    + returnedFieldName + ",",
5385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            expectedSignatures[k], returnedFieldSignature);
5395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                }
5405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                if (null != expectedModifiers) {
5415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    assertEquals(
5425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            "Invalid field modifiers are returned for field:"
5435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                                    + returnedFieldName + ",",
5445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            expectedModifiers[k], returnedFieldModifiers);
5455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                }
5465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                break;
5475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
5485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
5495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int k = 0; k < checkedFieldsNumber; k++) {
5515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (!checkedFieldFound[k]) {
5525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                logWriter.println("");
5535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                logWriter
5545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                        .println("\n## FAILURE: Expected field is NOT found in the list of retuned fields:");
5555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                logWriter.println("## Field name = " + checkedFieldNames[k]);
5565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                fieldNameMissing = 0 == nameMissing ? checkedFieldNames[k]
5575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                        : fieldNameMissing + "," + checkedFieldNames[k];
5585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                nameMissing++;
5595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                // break;
5605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
5615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
5625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // String thisTestName = this.getClass().getName();
5645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // logWriter.println("==> " + thisTestName + " for " + thisCommandName +
5655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // ": FAILED");
5665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (nameDuplicated > 1) {
5685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            fail("Duplicated fields are found in the retuned by FieldsCommand list: "
5695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + fieldNameDuplicated);
5705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
5715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (nameDuplicated > 0) {
5725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            fail("Duplicated field is found in the retuned by FieldsCommand list: "
5735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + fieldNameDuplicated);
5745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
5755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (nameMissing > 1) {
5765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            fail("Expected fields are NOT found in the retuned by FieldsCommand list: "
5775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + fieldNameMissing);
5785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
5795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (nameMissing > 0) {
5805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            fail("Expected field is NOT found in the retuned by FieldsCommand list: "
5815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + fieldNameMissing);
5825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
5835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("");
5855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (1 == checkedFieldsNumber) {
5865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter
5875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    .println("=> Expected field was found and field ID was got");
5885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } else {
5895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter
5905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    .println("=> Expected fields were found and field IDs were got");
5915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
5925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(fieldsReply);
5945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkedFieldIDs;
5955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
5965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
598e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz     * Checks thread status and suspend status of a thread
599e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz     *
600e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz     * @param eventThreadID
601e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz     *          the thread ID to check
602e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz     * @param expectedThreadStatus
603e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz     *          the expected thread status
604e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz     * @param expectedSuspendStatus
605e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz     *          the expected suspend status
606e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz     */
607e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz    protected void checkThreadState(long eventThreadID, byte expectedThreadStatus,
608e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz            byte expectedSuspendStatus) {
609e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz        CommandPacket commandPacket = new CommandPacket(
610e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz                JDWPCommands.ThreadReferenceCommandSet.CommandSetID,
611e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz                JDWPCommands.ThreadReferenceCommandSet.StatusCommand);
612e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz        commandPacket.setNextValueAsThreadID(eventThreadID);
613e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz        ReplyPacket replyPacket = debuggeeWrapper.vmMirror.performCommand(commandPacket);
614e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz        debuggeeWrapper.vmMirror.checkReply(replyPacket);
615e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz
616e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz        int threadStatus = replyPacket.getNextValueAsInt();
617e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz        int suspendStatus = replyPacket.getNextValueAsInt();
618e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz        assertAllDataRead(replyPacket);
619e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz
620e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz        assertEquals("Invalid thread status", threadStatus, expectedThreadStatus,
621e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz                JDWPConstants.ThreadStatus.getName(expectedThreadStatus),
622e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz                JDWPConstants.ThreadStatus.getName(threadStatus));
623e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz        assertEquals("Invalid suspend status", suspendStatus, expectedSuspendStatus,
624e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz                JDWPConstants.SuspendStatus.getName(expectedSuspendStatus),
625e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz                JDWPConstants.SuspendStatus.getName(suspendStatus));
626e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz    }
627e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz
628e8c8e4aa631449e03043945cb4bbf1338d6b9894Sebastien Hertz    /**
6295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper for checking reply packet error code. Calls junit fail if packet
6305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * error code does not equal to expected error code.
6315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
6325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param reply -
6335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            returned from debuggee packet
6345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param message -
6355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            additional message
6365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param errorCodeExpected -
6375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            array of expected error codes
6385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
6395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void checkReplyPacket(ReplyPacket reply, String message,
6405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            int errorCodeExpected) {
6415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, message, new int[] { errorCodeExpected });
6425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
6435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
6455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper for checking reply packet error code. Calls junit fail if packet
6465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * error code does not equal NONE.
6475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
6485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param reply -
6495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            returned from debuggee packet
6505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param message -
6515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            additional message
6525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
6535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void checkReplyPacket(ReplyPacket reply, String message) {
6545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, message, JDWPConstants.Error.NONE);
6555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
6565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
6585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper for checking reply packet error code. Calls junit fail if packet
6595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * error code does not equal to expected error code.
6605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
6615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param reply -
6625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            returned from debuggee packet
6635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param message -
6645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            additional message
6655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param expected -
6665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            array of expected error codes
6675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
6685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void checkReplyPacket(ReplyPacket reply, String message,
6695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            int[] expected) {
6705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, message, expected, true /* failSign */);
6715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
6725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
6745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper for checking reply packet error code. If reply packet does not
6755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * have error - returns true. Otherwise does not call junit fail - simply
6765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * prints error message and returns false. if packet error code does not
6775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * equal NONE.
6785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
6795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param reply -
6805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            returned from debuggee packet
6815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param message -
6825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            additional message
6835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return true if error is not found, or false otherwise
6845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
6855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected boolean checkReplyPacketWithoutFail(ReplyPacket reply,
6865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String message) {
6875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkReplyPacket(reply, message,
6885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                new int[] { JDWPConstants.Error.NONE }, false /* failSign */);
6895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
6905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
6925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper for checking reply packet error code. If reply packet does not
6935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * have unexpected error - returns true. If reply packet has got unexpected
6945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * error: If failSign param = true - calls junit fail. Otherwise prints
6955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * message about error and returns false.
6965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
6975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param reply -
6985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            returned from debuggee packet
6995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param message -
7005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            additional message
7015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param expected -
7025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            array of expected error codes
7035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param failSign -
7045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            defines to call junit fail or not
7055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return true if unexpected errors are not found, or false otherwise
7065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
7075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected boolean checkReplyPacket(ReplyPacket reply, String message,
7085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            int[] expected, boolean failSign) {
7095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // check reply code against expected
7105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int errorCode = reply.getErrorCode();
7115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < expected.length; i++) {
7125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (reply.getErrorCode() == expected[i]) {
7135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                return true; // OK
7145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
7155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
7165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // replay code validation failed
7185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // start error message composition
7195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (null == message) {
7205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            message = "";
7215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } else {
7225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            message = message + ", ";
7235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
7245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // format error message
7265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (expected.length == 1 && JDWPConstants.Error.NONE == expected[0]) {
7275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            message = message + "Error Code:<" + errorCode + "("
7285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + JDWPConstants.Error.getName(errorCode) + ")>";
7295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } else {
7305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            message = message + "Unexpected error code:<" + errorCode + "("
7315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + JDWPConstants.Error.getName(errorCode) + ")>"
7325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + ", Expected error code"
7335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + (expected.length == 1 ? ":" : "s:");
7345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            for (int i = 0; i < expected.length; i++) {
7355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                message = message + (i > 0 ? ",<" : "<") + expected[i] + "("
7365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                        + JDWPConstants.Error.getName(expected[i]) + ")>";
7375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
7385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
7395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (failSign) {
7415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            printErrorAndFail(message);
7425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
7435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.printError(message);
7445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return false;
7455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
7465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
7485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper for comparison numbers and printing string equivalents.
7495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
7505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param message -
7515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            user message
7525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param expected -
7535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            expected value
7545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param actual -
7555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            actual value
7565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param strExpected -
7575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            string equivalent of expected value
7585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param strActual -
7595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            string equivalent of actual value
7605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
7615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void assertEquals(String message, long expected, long actual,
7625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String strExpected, String strActual) {
7635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (expected == actual) {
7645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return; // OK
7655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
7665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (null == message) {
7685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            message = "";
7695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
7705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (null == strExpected) {
7725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            strExpected = expected + "";
7735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } else {
7745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            strExpected = expected + "(" + strExpected + ")";
7755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
7765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (null == strActual) {
7785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            strActual = actual + "";
7795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } else {
7805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            strActual = actual + "(" + strActual + ")";
7815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
7825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        printErrorAndFail(message + " expected:<" + strExpected + "> but was:<"
7845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + strActual + ">");
7855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
7865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
7885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Asserts that two strings are equal.
7895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
7905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param message -
7915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            user message
7925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param expected -
7935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            expected string
7945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param actual -
7955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            actual string
7965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
7975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void assertString(String message, String expected, String actual) {
7985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (null == expected) {
7995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            expected = "";
8005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
8015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (null == actual) {
8025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            actual = "";
8035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
8045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (expected.equals(actual)) {
8055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return; // OK
8065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
8075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        printErrorAndFail(message + " expected:<" + expected + "> but was:<"
8085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + actual + ">");
8095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
8105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
8115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
8125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper for checking reply packet data has been read.
8135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
8145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param reply -
8155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            reply packet from debuggee
8165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
8175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void assertAllDataRead(Packet reply) {
8185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (reply.isAllDataRead()) {
8195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return; // OK
8205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
8215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        printErrorAndFail("Not all data has been read");
8225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
8235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
8247155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz    /**
8257155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz     * Asserts that two JDWP event kinds are equal.
8267155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz     *
8277155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz     * @param message
8287155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz     *          user message
8297155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz     * @param expected
8307155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz     *          expected event kind
8317155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz     * @param actual
8327155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz     *          actual event kind
8337155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz     */
834f5788f20ea7a909f12d33623b1d64148db8aef83Sebastien Hertz    protected void assertEventKindEquals(String message, byte expected, byte actual) {
835f5788f20ea7a909f12d33623b1d64148db8aef83Sebastien Hertz        if (expected != actual) {
836f5788f20ea7a909f12d33623b1d64148db8aef83Sebastien Hertz            StringBuilder builder = new StringBuilder(message);
837f5788f20ea7a909f12d33623b1d64148db8aef83Sebastien Hertz            builder.append(": expected ");
838f5788f20ea7a909f12d33623b1d64148db8aef83Sebastien Hertz            builder.append(expected);
839f5788f20ea7a909f12d33623b1d64148db8aef83Sebastien Hertz            builder.append(" (");
840f5788f20ea7a909f12d33623b1d64148db8aef83Sebastien Hertz            builder.append(JDWPConstants.EventKind.getName(expected));
841f5788f20ea7a909f12d33623b1d64148db8aef83Sebastien Hertz            builder.append(") but was ");
842f5788f20ea7a909f12d33623b1d64148db8aef83Sebastien Hertz            builder.append(actual);
843f5788f20ea7a909f12d33623b1d64148db8aef83Sebastien Hertz            builder.append(" (");
844f5788f20ea7a909f12d33623b1d64148db8aef83Sebastien Hertz            builder.append(JDWPConstants.EventKind.getName(actual));
845f5788f20ea7a909f12d33623b1d64148db8aef83Sebastien Hertz            builder.append(")");
846f5788f20ea7a909f12d33623b1d64148db8aef83Sebastien Hertz            printErrorAndFail(builder.toString());
847f5788f20ea7a909f12d33623b1d64148db8aef83Sebastien Hertz        }
848f5788f20ea7a909f12d33623b1d64148db8aef83Sebastien Hertz    }
849f5788f20ea7a909f12d33623b1d64148db8aef83Sebastien Hertz
8505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
8517155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz     * Asserts that two JDWP tags are equal.
8527155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz     *
8537155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz     * @param message
8547155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz     *          user message
8557155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz     * @param expected
8567155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz     *          expected tag
8577155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz     * @param actual
8587155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz     *          actual tag
8597155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz     */
8607155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz    protected void assertTagEquals(String message, byte expected, byte actual) {
8617155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz        if (expected != actual) {
8627155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz            StringBuilder builder = new StringBuilder(message);
8637155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz            builder.append(": expected ");
8647155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz            builder.append(expected);
8657155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz            builder.append(" (");
8667155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz            builder.append(JDWPConstants.Tag.getName(expected));
8677155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz            builder.append(") but was ");
8687155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz            builder.append(actual);
8697155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz            builder.append(" (");
8707155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz            builder.append(JDWPConstants.Tag.getName(actual));
8717155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz            builder.append(")");
8727155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz            printErrorAndFail(builder.toString());
8737155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz        }
8747155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz    }
8757155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz
8767155f480730369fd86657146a4343551f1a0e0d0Sebastien Hertz    /**
8775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Prints error message in log writer and in junit fail.
8785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
8795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param message -
8805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            error message
8815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
8825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void printErrorAndFail(String message) {
8835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.printError(message);
8845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        fail(message);
8855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
8865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
8875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
8885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper for setting static int field in class with new value.
8895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
8905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classSignature -
8915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            String defining signature of class
8925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param fieldName -
8935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            String defining field name in specified class
8945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param newValue -
8955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            int value to set for specified field
8965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return true, if setting is successfully, or false otherwise
8975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
8985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected boolean setStaticIntField(String classSignature,
8995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String fieldName, int newValue) {
9005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
9015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long classID = debuggeeWrapper.vmMirror.getClassID(classSignature);
9025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (classID == -1) {
9035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter
9045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    .println("## setStaticIntField(): Can NOT get classID for class signature = '"
9055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + classSignature + "'");
9065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return false;
9075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
9085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
9095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long fieldID = debuggeeWrapper.vmMirror.getFieldID(classID, fieldName);
9105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (fieldID == -1) {
9115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter
9125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    .println("## setStaticIntField(): Can NOT get fieldID for field = '"
9135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + fieldName + "'");
9145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return false;
9155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
9165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
9175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
9185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.CommandSetID,
9195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.SetValuesCommand);
9205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsReferenceTypeID(classID);
9215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(1);
9225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsFieldID(fieldID);
9235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(newValue);
9245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
9255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
9265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int errorCode = reply.getErrorCode();
9275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (errorCode != JDWPConstants.Error.NONE) {
9285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter
9295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    .println("## setStaticIntField(): Can NOT set value for field = '"
9305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + fieldName
9315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + "' in class = '"
9325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + classSignature
9335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + "'; ClassType.SetValues command reurns error = "
9345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + errorCode);
9355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return false;
9365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
9375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return true;
9385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
9395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
9405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
9415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Removes breakpoint of the given event kind corresponding to the given
9425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * request id.
9435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
9445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param eventKind
9455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            request event kind
9465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param requestID
9475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            request id
9485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param verbose
9495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            print or don't extra log info
9505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
9515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void clearEvent(byte eventKind, int requestID, boolean verbose) {
9525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
9535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.CommandSetID,
9545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.ClearCommand);
9555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsByte(eventKind);
9565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(requestID);
9575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (verbose) {
9585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("Clearing event: "
9595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + JDWPConstants.EventKind.getName(eventKind) + ", id: "
9605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + requestID);
9615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
9625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
9635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "EventRequest::Clear command");
9645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(reply);
9655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
9665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes}
967