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();
605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        beforeDebuggeeStart(debuggeeWrapper);
615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        startDebuggeeWrapper();
625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // receive and handle initial event
645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        receiveInitialEvent();
655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // adjust JDWP types length
675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        debuggeeWrapper.vmMirror.adjustTypeLength();
685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("Adjusted VM-dependent type lengths");
695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Creates wrapper for debuggee process.
735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected JDWPUnitDebuggeeWrapper createDebuggeeWrapper() {
755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (settings.getDebuggeeLaunchKind().equals("manual")) {
765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return new JDWPManualDebuggeeWrapper(settings, logWriter);
775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } else {
785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return new JDWPUnitDebuggeeWrapper(settings, logWriter);
795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Starts wrapper for debuggee process.
845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void startDebuggeeWrapper() {
865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    	debuggeeWrapper.start();
875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("Established JDWP connection with debuggee VM");
885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Receives initial VM_INIT event if debuggee is suspended on event.
925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void receiveInitialEvent() {
945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (settings.isDebuggeeSuspend()) {
955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            initialEvent =
965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                debuggeeWrapper.vmMirror.receiveCertainEvent(JDWPConstants.EventKind.VM_INIT);
975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("Received inital VM_INIT event");
985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Overrides inherited method to stop started debuggee VM and close all
1035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * connections.
1045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void internalTearDown() {
1065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (debuggeeWrapper != null) {
1075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            debuggeeWrapper.stop();
1085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("Closed JDWP connection with debuggee VM");
1095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        super.internalTearDown();
1115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * This method is invoked right before starting debuggee VM.
1155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void beforeDebuggeeStart(JDWPUnitDebuggeeWrapper debuggeeWrapper) {
1175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Opens JDWP connection with debuggee (doesn't run debuggee and doesn't
1225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * establish synchronize connection).
1235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void openConnection() {
1255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        debuggeeWrapper.openConnection();
1265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("Opened transport connection");
1275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        debuggeeWrapper.vmMirror.adjustTypeLength();
1285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("Adjusted VM-dependent type lengths");
1295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Closes JDWP connection with debuggee (doesn't terminate debuggee and
1335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * doesn't stop synchronize connection).
1345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    public void closeConnection() {
1365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (debuggeeWrapper != null) {
1375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            debuggeeWrapper.disposeConnection();
1385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            try {
1395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                debuggeeWrapper.vmMirror.closeConnection();
1405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            } catch (Exception e) {
1415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                throw new TestErrorException(e);
1425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
1435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("Closed transport connection");
1445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
1455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper that returns reference type signature of input object ID.
1495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
1505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param objectID -
1515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            debuggee object ID
1525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return object signature of reference type
1535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected String getObjectSignature(long objectID) {
1555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long classID = getObjectReferenceType(objectID);
1565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return getClassSignature(classID);
1575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper that returns reference type ID for input object ID.
1615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
1625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param objectID -
1635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            debuggee object ID
1645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return reference type ID
1655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected long getObjectReferenceType(long objectID) {
1675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
1685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.CommandSetID,
1695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ObjectReferenceCommandSet.ReferenceTypeCommand);
1705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsReferenceTypeID(objectID);
1715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(command);
1725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "ObjectReference::ReferenceType command");
1735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // byte refTypeTag =
1745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        reply.getNextValueAsByte();
1755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long objectRefTypeID = reply.getNextValueAsReferenceTypeID();
1765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return objectRefTypeID;
1775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
1785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
1795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
1805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper for getting method ID of corresponding class and method name.
1815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
1825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classID -
1835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class ID
1845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param methodName -
1855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            method name
1865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return method ID
1875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
1885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected long getMethodID(long classID, String methodName) {
1895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
1905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
1915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.MethodsCommand);
1925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsClassID(classID);
1935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(command);
1945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "ReferenceType::Methods command");
1955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int methods = reply.getNextValueAsInt();
1965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < methods; i++) {
1975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long methodID = reply.getNextValueAsMethodID();
1985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String name = reply.getNextValueAsString(); // method name
1995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            reply.getNextValueAsString(); // method signature
2005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            reply.getNextValueAsInt(); // method modifiers
2015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (name.equals(methodName)) {
2025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                return methodID;
2035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
2045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
2055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return -1;
2065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
2075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
2095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Issues LineTable command.
2105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
2115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classID -
2125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            class ID
2135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param methodID -
2145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            method ID
2155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return reply packet
2165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
2175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected ReplyPacket getLineTable(long classID, long methodID) {
2185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket lineTableCommand = new CommandPacket(
2195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.MethodCommandSet.CommandSetID,
2205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.MethodCommandSet.LineTableCommand);
2215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        lineTableCommand.setNextValueAsReferenceTypeID(classID);
2225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        lineTableCommand.setNextValueAsMethodID(methodID);
2235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket lineTableReply = debuggeeWrapper.vmMirror
2245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .performCommand(lineTableCommand);
2255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(lineTableReply, "Method::LineTable command");
2265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return lineTableReply;
2275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
2285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
2305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper for getting method name of corresponding class and method ID.
2315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
2325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classID class id
2335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param methodID method id
2345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return String
2355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
2365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected String getMethodName(long classID, long methodID) {
2375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
2385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
2395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.MethodsCommand);
2405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsClassID(classID);
2415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
2425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "ReferenceType::Methods command");
2435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int methods = reply.getNextValueAsInt();
2445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < methods; i++) {
2455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long mid = reply.getNextValueAsMethodID();
2465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String name = reply.getNextValueAsString();
2475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            reply.getNextValueAsString();
2485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            reply.getNextValueAsInt();
2495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (mid == methodID) {
2505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                return name;
2515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
2525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
2535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return "unknown";
2545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
2555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
2575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns jni signature for selected classID
2585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
2595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classID
2605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return jni signature for selected classID
2615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
2625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected String getClassSignature(long classID) {
2635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket command = new CommandPacket(
2645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
2655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.SignatureCommand);
2665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        command.setNextValueAsReferenceTypeID(classID);
2675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(command);
2685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "ReferenceType::Signature command");
2695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String signature = reply.getNextValueAsString();
2705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return signature;
2715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
2725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
2735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
2745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns classID for the selected jni signature
2755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
2765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param signature
2775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return classID for the selected jni signature
2785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
2795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected long getClassIDBySignature(String signature) {
2805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("=> Getting reference type ID for class: "
2815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + signature);
2825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
2835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.CommandSetID,
2845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.ClassesBySignatureCommand);
2855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsString(signature);
2865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
2875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "VirtualMachine::ClassesBySignature command");
2885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int classes = reply.getNextValueAsInt();
2895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("=> Returned number of classes: " + classes);
2905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long classID = 0;
2915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < classes; i++) {
2925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            reply.getNextValueAsByte();
2935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            classID = reply.getNextValueAsReferenceTypeID();
2945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            reply.getNextValueAsInt();
2955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            // we need the only class, even if there were multiply ones
2965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            break;
2975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
2985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertTrue(
2995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                "VirtualMachine::ClassesBySignature command returned invalid classID:<"
3005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                        + classID + "> for signature " + signature, classID > 0);
3015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return classID;
3025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
3035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
3055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns reference type ID.
3065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
3075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param signature
3085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return type ID for the selected jni signature
3095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
3105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected long getReferenceTypeID(String signature) {
3115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
3125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.CommandSetID,
3135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.ClassesBySignatureCommand);
3145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsString(signature);
3155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
3165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "VirtualMachine::ClassesBySignature command");
3175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int classes = reply.getNextValueAsInt();
3185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // this class may be loaded only once
3195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals("Invalid number of classes for reference type: "
3205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + signature + ",", 1, classes);
3215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        byte refTypeTag = reply.getNextValueAsByte();
3225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long classID = reply.getNextValueAsReferenceTypeID();
3235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int status = reply.getNextValueAsInt();
3245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("VirtualMachine.ClassesBySignature: classes="
3255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + classes + " refTypeTag=" + refTypeTag + " typeID= " + classID
3265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + " status=" + status);
3275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(reply);
3285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertEquals("", JDWPConstants.TypeTag.CLASS, refTypeTag);
3295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return classID;
3305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
3315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
3335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper function for resuming debuggee.
3345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
3355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void resumeDebuggee() {
3361bd7ebbd135d3a0b13d728fa4e73996020c4a14fSebastien Hertz        logWriter.println("=> Resume debuggee");
3375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
3385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.CommandSetID,
3395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.ResumeCommand);
3405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("Sending VirtualMachine::Resume command...");
3415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
3425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "VirtualMachine::Resume command");
3435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(reply);
3445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
3455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
3475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Performs string creation in debuggee.
3485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
3495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param value -
3505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            content for new string
3515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return StringID of new created string
3525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
3535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected long createString(String value) {
3545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
3555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.CommandSetID,
3565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.VirtualMachineCommandSet.CreateStringCommand);
3575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsString(value);
3585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
3595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "VirtualMachine::CreateString command");
3605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long stringID = reply.getNextValueAsStringID();
3615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return stringID;
3625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
3635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
3655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Returns corresponding string from string ID.
3665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
3675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param stringID -
3685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            string ID
3695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return string value
3705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
3715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected String getStringValue(long stringID) {
3725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
3735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.StringReferenceCommandSet.CommandSetID,
3745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.StringReferenceCommandSet.ValueCommand);
3755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsObjectID(stringID);
3765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
3775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "StringReference::Value command");
3785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String returnedTestString = reply.getNextValueAsString();
3795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return returnedTestString;
3805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
3815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
3835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Multiple field verification routine.
3845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
3855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param refTypeID -
3865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            reference type ID
3875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param checkedFieldNames -
3885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            list of field names to be checked
3895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return list of field IDs
3905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
3915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected long[] checkFields(long refTypeID, String checkedFieldNames[]) {
3925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkFields(refTypeID, checkedFieldNames, null, null);
3935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
3945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
3955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
3965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Single field verification routine.
3975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
3985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param refTypeID -
3995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            reference type ID
4005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param fieldName -
4015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            name of single field
4025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return filed ID
4035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
4045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected long checkField(long refTypeID, String fieldName) {
4055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkFields(refTypeID, new String[] { fieldName }, null, null)[0];
4065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
4075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
4095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Multiple field verification routine.
4105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
4115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param refTypeID -
4125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            reference type ID
4135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param checkedFieldNames -
4145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            list of field names to be checked
4155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param expectedSignatures -
4165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            list of expected field signatures
4175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param expectedModifiers -
4185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            list of expected field modifiers
4195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return list of field IDs
4205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
4215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected long[] checkFields(long refTypeID, String checkedFieldNames[],
4225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String expectedSignatures[], int expectedModifiers[]) {
4235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        boolean checkedFieldFound[] = new boolean[checkedFieldNames.length];
4255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long checkedFieldIDs[] = new long[checkedFieldNames.length];
4265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter
4285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .println("=> Send ReferenceType::Fields command and get field ID(s)");
4295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket fieldsCommand = new CommandPacket(
4315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.CommandSetID,
4325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ReferenceTypeCommandSet.FieldsCommand);
4335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        fieldsCommand.setNextValueAsReferenceTypeID(refTypeID);
4345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket fieldsReply = debuggeeWrapper.vmMirror
4355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .performCommand(fieldsCommand);
4365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        fieldsCommand = null;
4375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(fieldsReply, "ReferenceType::Fields command");
4385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int returnedFieldsNumber = fieldsReply.getNextValueAsInt();
4405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter
4415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                .println("=> Returned fields number = " + returnedFieldsNumber);
4425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int checkedFieldsNumber = checkedFieldNames.length;
4445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        final int fieldSyntheticFlag = 0xf0000000;
4455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int nameDuplicated = 0;
4475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String fieldNameDuplicated = null; // <= collects all duplicated fields
4485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int nameMissing = 0;
4495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        String fieldNameMissing = null; // <= collects all missed fields
4505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
4515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < returnedFieldsNumber; i++) {
4525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            long returnedFieldID = fieldsReply.getNextValueAsFieldID();
4535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String returnedFieldName = fieldsReply.getNextValueAsString();
4545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String returnedFieldSignature = fieldsReply.getNextValueAsString();
4555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            int returnedFieldModifiers = fieldsReply.getNextValueAsInt();
4565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("");
4575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("=> Field ID: " + returnedFieldID);
4585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("=> Field name: " + returnedFieldName);
4595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("=> Field signature: " + returnedFieldSignature);
4605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("=> Field modifiers: 0x"
4615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + Integer.toHexString(returnedFieldModifiers));
4625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if ((returnedFieldModifiers & fieldSyntheticFlag) == fieldSyntheticFlag) {
4635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                continue; // do not check synthetic fields
4645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
4655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            for (int k = 0; k < checkedFieldsNumber; k++) {
4665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                if (!checkedFieldNames[k].equals(returnedFieldName)) {
4675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    continue;
4685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                }
4695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                if (checkedFieldFound[k]) {
4705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter.println("");
4715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter
4725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            .println("## FAILURE: The field is found repeatedly in the list");
4735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter.println("## Field Name: " + returnedFieldName);
4745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter.println("## Field ID: " + returnedFieldID);
4755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter.println("## Field Signature: "
4765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + returnedFieldSignature);
4775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    logWriter.println("## Field Modifiers: 0x"
4785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + Integer.toHexString(returnedFieldModifiers));
4795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    fieldNameDuplicated = (0 == nameDuplicated ? returnedFieldName
4805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            : fieldNameDuplicated + "," + returnedFieldName);
4815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    nameDuplicated++;
4825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    break;
4835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                }
4845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                checkedFieldFound[k] = true;
4855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                checkedFieldIDs[k] = returnedFieldID;
4865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                if (null != expectedSignatures) {
4875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    assertString(
4885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            "Invalid field signature is returned for field:"
4895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                                    + returnedFieldName + ",",
4905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            expectedSignatures[k], returnedFieldSignature);
4915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                }
4925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                if (null != expectedModifiers) {
4935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    assertEquals(
4945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            "Invalid field modifiers are returned for field:"
4955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                                    + returnedFieldName + ",",
4965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            expectedModifiers[k], returnedFieldModifiers);
4975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                }
4985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                break;
4995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
5005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
5015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int k = 0; k < checkedFieldsNumber; k++) {
5035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (!checkedFieldFound[k]) {
5045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                logWriter.println("");
5055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                logWriter
5065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                        .println("\n## FAILURE: Expected field is NOT found in the list of retuned fields:");
5075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                logWriter.println("## Field name = " + checkedFieldNames[k]);
5085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                fieldNameMissing = 0 == nameMissing ? checkedFieldNames[k]
5095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                        : fieldNameMissing + "," + checkedFieldNames[k];
5105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                nameMissing++;
5115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                // break;
5125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
5135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
5145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // String thisTestName = this.getClass().getName();
5165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // logWriter.println("==> " + thisTestName + " for " + thisCommandName +
5175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // ": FAILED");
5185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (nameDuplicated > 1) {
5205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            fail("Duplicated fields are found in the retuned by FieldsCommand list: "
5215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + fieldNameDuplicated);
5225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
5235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (nameDuplicated > 0) {
5245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            fail("Duplicated field is found in the retuned by FieldsCommand list: "
5255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + fieldNameDuplicated);
5265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
5275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (nameMissing > 1) {
5285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            fail("Expected fields are NOT found in the retuned by FieldsCommand list: "
5295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + fieldNameMissing);
5305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
5315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (nameMissing > 0) {
5325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            fail("Expected field is NOT found in the retuned by FieldsCommand list: "
5335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + fieldNameMissing);
5345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
5355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.println("");
5375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (1 == checkedFieldsNumber) {
5385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter
5395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    .println("=> Expected field was found and field ID was got");
5405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } else {
5415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter
5425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    .println("=> Expected fields were found and field IDs were got");
5435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
5445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(fieldsReply);
5465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkedFieldIDs;
5475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
5485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
5505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper for checking reply packet error code. Calls junit fail if packet
5515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * error code does not equal to expected error code.
5525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
5535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param reply -
5545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            returned from debuggee packet
5555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param message -
5565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            additional message
5575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param errorCodeExpected -
5585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            array of expected error codes
5595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
5605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void checkReplyPacket(ReplyPacket reply, String message,
5615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            int errorCodeExpected) {
5625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, message, new int[] { errorCodeExpected });
5635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
5645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
5665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper for checking reply packet error code. Calls junit fail if packet
5675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * error code does not equal NONE.
5685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
5695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param reply -
5705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            returned from debuggee packet
5715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param message -
5725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            additional message
5735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
5745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void checkReplyPacket(ReplyPacket reply, String message) {
5755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, message, JDWPConstants.Error.NONE);
5765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
5775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
5795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper for checking reply packet error code. Calls junit fail if packet
5805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * error code does not equal to expected error code.
5815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
5825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param reply -
5835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            returned from debuggee packet
5845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param message -
5855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            additional message
5865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param expected -
5875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            array of expected error codes
5885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
5895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void checkReplyPacket(ReplyPacket reply, String message,
5905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            int[] expected) {
5915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, message, expected, true /* failSign */);
5925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
5935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
5945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
5955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper for checking reply packet error code. If reply packet does not
5965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * have error - returns true. Otherwise does not call junit fail - simply
5975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * prints error message and returns false. if packet error code does not
5985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * equal NONE.
5995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
6005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param reply -
6015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            returned from debuggee packet
6025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param message -
6035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            additional message
6045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return true if error is not found, or false otherwise
6055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
6065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected boolean checkReplyPacketWithoutFail(ReplyPacket reply,
6075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String message) {
6085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return checkReplyPacket(reply, message,
6095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                new int[] { JDWPConstants.Error.NONE }, false /* failSign */);
6105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
6115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
6135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper for checking reply packet error code. If reply packet does not
6145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * have unexpected error - returns true. If reply packet has got unexpected
6155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * error: If failSign param = true - calls junit fail. Otherwise prints
6165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * message about error and returns false.
6175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
6185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param reply -
6195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            returned from debuggee packet
6205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param message -
6215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            additional message
6225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param expected -
6235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            array of expected error codes
6245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param failSign -
6255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            defines to call junit fail or not
6265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return true if unexpected errors are not found, or false otherwise
6275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
6285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected boolean checkReplyPacket(ReplyPacket reply, String message,
6295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            int[] expected, boolean failSign) {
6305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // check reply code against expected
6315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int errorCode = reply.getErrorCode();
6325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        for (int i = 0; i < expected.length; i++) {
6335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            if (reply.getErrorCode() == expected[i]) {
6345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                return true; // OK
6355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
6365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
6375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // replay code validation failed
6395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // start error message composition
6405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (null == message) {
6415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            message = "";
6425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } else {
6435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            message = message + ", ";
6445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
6455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        // format error message
6475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (expected.length == 1 && JDWPConstants.Error.NONE == expected[0]) {
6485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            message = message + "Error Code:<" + errorCode + "("
6495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + JDWPConstants.Error.getName(errorCode) + ")>";
6505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } else {
6515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            message = message + "Unexpected error code:<" + errorCode + "("
6525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + JDWPConstants.Error.getName(errorCode) + ")>"
6535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + ", Expected error code"
6545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + (expected.length == 1 ? ":" : "s:");
6555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            for (int i = 0; i < expected.length; i++) {
6565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                message = message + (i > 0 ? ",<" : "<") + expected[i] + "("
6575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                        + JDWPConstants.Error.getName(expected[i]) + ")>";
6585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            }
6595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
6605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (failSign) {
6625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            printErrorAndFail(message);
6635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
6645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.printError(message);
6655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return false;
6665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
6675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
6695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper for comparison numbers and printing string equivalents.
6705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
6715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param message -
6725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            user message
6735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param expected -
6745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            expected value
6755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param actual -
6765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            actual value
6775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param strExpected -
6785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            string equivalent of expected value
6795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param strActual -
6805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            string equivalent of actual value
6815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
6825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void assertEquals(String message, long expected, long actual,
6835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String strExpected, String strActual) {
6845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (expected == actual) {
6855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return; // OK
6865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
6875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (null == message) {
6895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            message = "";
6905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
6915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (null == strExpected) {
6935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            strExpected = expected + "";
6945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } else {
6955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            strExpected = expected + "(" + strExpected + ")";
6965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
6975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
6985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (null == strActual) {
6995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            strActual = actual + "";
7005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        } else {
7015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            strActual = actual + "(" + strActual + ")";
7025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
7035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        printErrorAndFail(message + " expected:<" + strExpected + "> but was:<"
7055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + strActual + ">");
7065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
7075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
7095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Asserts that two strings are equal.
7105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
7115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param message -
7125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            user message
7135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param expected -
7145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            expected string
7155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param actual -
7165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            actual string
7175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
7185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void assertString(String message, String expected, String actual) {
7195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (null == expected) {
7205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            expected = "";
7215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
7225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (null == actual) {
7235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            actual = "";
7245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
7255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (expected.equals(actual)) {
7265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return; // OK
7275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
7285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        printErrorAndFail(message + " expected:<" + expected + "> but was:<"
7295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                + actual + ">");
7305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
7315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
7335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper for checking reply packet data has been read.
7345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
7355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param reply -
7365f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            reply packet from debuggee
7375f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
7385f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void assertAllDataRead(Packet reply) {
7395f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (reply.isAllDataRead()) {
7405f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return; // OK
7415f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
7425f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        printErrorAndFail("Not all data has been read");
7435f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
7445f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7455f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
7465f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Prints error message in log writer and in junit fail.
7475f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
7485f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param message -
7495f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            error message
7505f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
7515f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void printErrorAndFail(String message) {
7525f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        logWriter.printError(message);
7535f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        fail(message);
7545f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
7555f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7565f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
7575f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Helper for setting static int field in class with new value.
7585f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
7595f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param classSignature -
7605f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            String defining signature of class
7615f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param fieldName -
7625f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            String defining field name in specified class
7635f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param newValue -
7645f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            int value to set for specified field
7655f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @return true, if setting is successfully, or false otherwise
7665f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
7675f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected boolean setStaticIntField(String classSignature,
7685f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            String fieldName, int newValue) {
7695f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7705f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long classID = debuggeeWrapper.vmMirror.getClassID(classSignature);
7715f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (classID == -1) {
7725f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter
7735f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    .println("## setStaticIntField(): Can NOT get classID for class signature = '"
7745f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + classSignature + "'");
7755f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return false;
7765f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
7775f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7785f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        long fieldID = debuggeeWrapper.vmMirror.getFieldID(classID, fieldName);
7795f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (fieldID == -1) {
7805f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter
7815f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    .println("## setStaticIntField(): Can NOT get fieldID for field = '"
7825f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + fieldName + "'");
7835f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return false;
7845f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
7855f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7865f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
7875f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.CommandSetID,
7885f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.ClassTypeCommandSet.SetValuesCommand);
7895f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsReferenceTypeID(classID);
7905f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(1);
7915f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsFieldID(fieldID);
7925f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(newValue);
7935f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
7945f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
7955f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        int errorCode = reply.getErrorCode();
7965f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (errorCode != JDWPConstants.Error.NONE) {
7975f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter
7985f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    .println("## setStaticIntField(): Can NOT set value for field = '"
7995f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + fieldName
8005f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + "' in class = '"
8015f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + classSignature
8025f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + "'; ClassType.SetValues command reurns error = "
8035f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                            + errorCode);
8045f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            return false;
8055f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
8065f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        return true;
8075f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
8085f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes
8095f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    /**
8105f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * Removes breakpoint of the given event kind corresponding to the given
8115f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * request id.
8125f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *
8135f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param eventKind
8145f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            request event kind
8155f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param requestID
8165f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            request id
8175f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     * @param verbose
8185f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     *            print or don't extra log info
8195f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes     */
8205f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    protected void clearEvent(byte eventKind, int requestID, boolean verbose) {
8215f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        CommandPacket packet = new CommandPacket(
8225f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.CommandSetID,
8235f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                JDWPCommands.EventRequestCommandSet.ClearCommand);
8245f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsByte(eventKind);
8255f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        packet.setNextValueAsInt(requestID);
8265f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        if (verbose) {
8275f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes            logWriter.println("Clearing event: "
8285f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + JDWPConstants.EventKind.getName(eventKind) + ", id: "
8295f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes                    + requestID);
8305f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        }
8315f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
8325f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        checkReplyPacket(reply, "EventRequest::Clear command");
8335f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes        assertAllDataRead(reply);
8345f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes    }
8355f0a23683aa603d8c50b6dd071a565821b76067bElliott Hughes}
836