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