/** * This testcase exercises ArrayReference.SetValues command. <br> * Starts <A HREF="ArrayReferenceDebuggee.html">ArrayReferenceDebuggee</A>. <br> * Receives fields with ReferenceType.fields command, sets values with ArrayReference.SetValues * then checks changes. */ public void testSetValues001() { logWriter.println("testLength001 started"); synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY); // obtain classID long classID = getClassIDBySignature( "Lorg/apache/harmony/jpda/tests/jdwp/ArrayReference/ArrayReferenceDebuggee;"); // obtain fields CommandPacket packet = new CommandPacket( JDWPCommands.ReferenceTypeCommandSet.CommandSetID, JDWPCommands.ReferenceTypeCommandSet.FieldsCommand); packet.setNextValueAsReferenceTypeID(classID); ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet); checkReplyPacket(reply, "ReferenceType::Fields command"); int declared = reply.getNextValueAsInt(); for (int i = 0; i < declared; i++) { long fieldID = reply.getNextValueAsFieldID(); String name = reply.getNextValueAsString(); reply.getNextValueAsString(); reply.getNextValueAsInt(); if (name.equals("intArray")) { ArrayRegion valuesRegion = new ArrayRegion(JDWPConstants.Tag.INT_TAG, 10); for (int j = 0; j < valuesRegion.getLength(); j++) { valuesRegion.setValue(j, new Value(-j)); } checkArrayValues(valuesRegion, classID, fieldID); } else if (name.equals("longArray")) { ArrayRegion valuesRegion = new ArrayRegion(JDWPConstants.Tag.LONG_TAG, 10); for (int j = 0; j < valuesRegion.getLength(); j++) { valuesRegion.setValue(j, new Value((long) -j)); } checkArrayValues(valuesRegion, classID, fieldID); } else if (name.equals("byteArray")) { ArrayRegion valuesRegion = new ArrayRegion(JDWPConstants.Tag.BYTE_TAG, 10); for (int j = 0; j < valuesRegion.getLength(); j++) { valuesRegion.setValue(j, new Value((byte) -j)); } checkArrayValues(valuesRegion, classID, fieldID); } } synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE); }
private void checkArrayValues(ArrayRegion valuesRegion, long classID, long fieldID) { CommandPacket packet = new CommandPacket( JDWPCommands.ReferenceTypeCommandSet.CommandSetID, JDWPCommands.ReferenceTypeCommandSet.GetValuesCommand); packet.setNextValueAsReferenceTypeID(classID); packet.setNextValueAsInt(1); packet.setNextValueAsFieldID(fieldID); ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet); checkReplyPacket(reply, "ReferenceType::GetValues command"); assertEquals( "GetValuesCommand returned invalid number of values,", 1, reply.getNextValueAsInt()); Value value = reply.getNextValueAsValue(); // System.err.println("value="+value); long arrayID = value.getLongValue(); int length = valuesRegion.getLength(); checkArrayRegion(valuesRegion, arrayID, 0, length); }
private void checkArrayRegion( ArrayRegion valuesRegion, long arrayID, int firstIndex, int length) { // set values CommandPacket packet = new CommandPacket( JDWPCommands.ArrayReferenceCommandSet.CommandSetID, JDWPCommands.ArrayReferenceCommandSet.SetValuesCommand); packet.setNextValueAsArrayID(arrayID); packet.setNextValueAsInt(firstIndex); packet.setNextValueAsInt(length); for (int i = 0; i < length; i++) { packet.setNextValueAsUntaggedValue(valuesRegion.getValue(i)); } packet.setNextValueAsInt(length); ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet); checkReplyPacket(reply, "ArrayReference::SetValues command"); // get values packet = new CommandPacket( JDWPCommands.ArrayReferenceCommandSet.CommandSetID, JDWPCommands.ArrayReferenceCommandSet.GetValuesCommand); packet.setNextValueAsArrayID(arrayID); packet.setNextValueAsInt(firstIndex); packet.setNextValueAsInt(length); reply = debuggeeWrapper.vmMirror.performCommand(packet); checkReplyPacket(reply, "ArrayReference::GetValues command"); // do not check values for non-array fields ArrayRegion region = reply.getNextValueAsArrayRegion(); assertEquals("Invalud returned array length,", length, region.getLength()); for (int i = 0; i < region.getLength(); i++) { Value value = region.getValue(i); logWriter.println(value.toString()); assertEquals( "ArrayReference::GetValues returned invalid value on index:<" + i + ">", value, valuesRegion.getValue(i)); } }