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