/** * 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); }
/** * This test case checks events: METHOD_ENTRY, SINGLE_STEP, BREAKPOINT, METHOD_EXIT for empty * method. */ public void testCombinedEvents003_01() { logWriter.println("==> testCombinedEvents003_01 started"); byte[] EXPECTED_EVENTS_ARRAY = { JDWPConstants.EventKind.METHOD_ENTRY, JDWPConstants.EventKind.BREAKPOINT, JDWPConstants.EventKind.SINGLE_STEP, JDWPConstants.EventKind.METHOD_EXIT }; String debuggeeMainThreadName = synchronizer.receiveMessage(); long debuggeeClassID = debuggeeWrapper.vmMirror.getClassID(debuggeeSignature); logWriter.println("=> debuggeeClassID = " + debuggeeClassID); long threadID = debuggeeWrapper.vmMirror.getThreadID(debuggeeMainThreadName); logWriter.println("=> threadID = " + threadID); long runMethodID = debuggeeWrapper.vmMirror.getMethodID(debuggeeClassID, "run"); logWriter.println("=> runMethodID = " + runMethodID); long dummyMethodID = debuggeeWrapper.vmMirror.getMethodID(debuggeeClassID, "dummyMethod"); logWriter.println("=> dummyMethodID = " + dummyMethodID); logWriter.println(""); logWriter.println("=> Info for tested method '" + methodForEvents + "':"); long testedMethodID = debuggeeWrapper.vmMirror.getMethodID(debuggeeClassID, methodForEvents); if (testedMethodID == -1) { String failureMessage = "## FAILURE: Can NOT get MethodID for class '" + getDebuggeeClassName() + "'; Method name = " + methodForEvents; printErrorAndFail(failureMessage); } logWriter.println("=> testedMethodID = " + testedMethodID); printMethodLineTable(debuggeeClassID, null, methodForEvents); // set requests for events that will be checked logWriter.println(""); logWriter.println( "=> Set request for BREAKPOINT event in debuggee: " + getDebuggeeClassName() + ", beginning of method: " + methodForEvents); Location combinedEventsLocation = getMethodEntryLocation(debuggeeClassID, methodForEvents); if (combinedEventsLocation == null) { String failureMessage = "## FAILURE: Can NOT get MethodEntryLocation for method '" + methodForEvents + "'"; printErrorAndFail(failureMessage); } ReplyPacket reply = debuggeeWrapper.vmMirror.setBreakpoint(combinedEventsLocation); int breakpointRequestID = reply.getNextValueAsInt(); logWriter.println("=> Breakpoint requestID = " + breakpointRequestID); logWriter.println( "=> Set request for METHOD_ENTRY event in debuggee: " + getDebuggeeClassName()); reply = debuggeeWrapper.vmMirror.setMethodEntry(methodEntryClassNameRegexp); checkReplyPacket(reply, "Set METHOD_ENTRY event"); int methodEntryRequestID = reply.getNextValueAsInt(); logWriter.println("=> METHOD_ENTRY requestID = " + methodEntryRequestID); logWriter.println( "=> Set request for METHOD_EXIT event in debuggee: " + getDebuggeeClassName()); reply = debuggeeWrapper.vmMirror.setMethodExit(methodEntryClassNameRegexp); checkReplyPacket(reply, "Set METHOD_EXIT event"); int methodExitRequestID = reply.getNextValueAsInt(); logWriter.println("=> METHOD_EXIT requestID = " + methodExitRequestID); logWriter.println("=> Set request for SINGLE_STEP event in class " + debuggeeSignature); CommandPacket setRequestCommand = new CommandPacket( JDWPCommands.EventRequestCommandSet.CommandSetID, JDWPCommands.EventRequestCommandSet.SetCommand); setRequestCommand.setNextValueAsByte(JDWPConstants.EventKind.SINGLE_STEP); setRequestCommand.setNextValueAsByte(JDWPConstants.SuspendPolicy.ALL); setRequestCommand.setNextValueAsInt(2); setRequestCommand.setNextValueAsByte(EventMod.ModKind.Step); setRequestCommand.setNextValueAsThreadID(threadID); setRequestCommand.setNextValueAsInt(JDWPConstants.StepSize.MIN); setRequestCommand.setNextValueAsInt(JDWPConstants.StepDepth.INTO); setRequestCommand.setNextValueAsByte(EventMod.ModKind.ClassOnly); setRequestCommand.setNextValueAsReferenceTypeID(debuggeeClassID); ReplyPacket setRequestReply = debuggeeWrapper.vmMirror.performCommand(setRequestCommand); checkReplyPacket(setRequestReply, "EventRequest::Set command"); int stepRequestID = setRequestReply.getNextValueAsInt(); logWriter.println("=> SINGLE_STEP requestID = " + stepRequestID); logWriter.println(""); logWriter.println("=> Send SGNL_CONTINUE signal to debuggee..."); synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE); logWriter.println( "=> Try to receive and check combined events: " + " METHOD_ENTRY, SINGLE_STEP, BREAKPOINT, METHOD_EXIT events; ignore single SINGLE_STEP event"); receiveAndCheckEvents(EXPECTED_EVENTS_ARRAY, combinedEventsLocation); if (eventVmDeathReceived) { logWriter.println("==> testCombinedEvents001 is FINISHing as VM_DEATH is received!"); return; } logWriter.println(""); logWriter.println("=> Clean request for METHOD_ENTRY event..."); ReplyPacket clearReply = debuggeeWrapper.vmMirror.clearEvent( JDWPConstants.EventKind.METHOD_ENTRY, methodEntryRequestID); checkReplyPacket(clearReply, "EventRequest::Clear"); logWriter.println(""); logWriter.println("=> Clean request for SINGLE_STEP event..."); clearReply = debuggeeWrapper.vmMirror.clearEvent(JDWPConstants.EventKind.SINGLE_STEP, stepRequestID); checkReplyPacket(clearReply, "EventRequest::Clear"); logWriter.println("=> Resume debuggee"); debuggeeWrapper.vmMirror.resume(); // check that no other events, except VM_DEATH, will be received checkVMDeathEvent(); logWriter.println(""); logWriter.println("==> testCombinedEvents003_01 PASSED"); }
/** * The test checks ClassType.SetValues command for field of Debuggee class with value which has * other referenceType than field to set. The test expects the field should not be set. */ public void testSetValues002() { String thisTestName = "testSetValues002"; logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": START..."); synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY); CommandPacket classesBySignatureCommand = new CommandPacket( JDWPCommands.VirtualMachineCommandSet.CommandSetID, JDWPCommands.VirtualMachineCommandSet.ClassesBySignatureCommand); classesBySignatureCommand.setNextValueAsString(debuggeeSignature); ReplyPacket classesBySignatureReply = debuggeeWrapper.vmMirror.performCommand(classesBySignatureCommand); classesBySignatureCommand = null; checkReplyPacket(classesBySignatureReply, "VirtualMachine::ClassesBySignature command"); classesBySignatureReply.getNextValueAsInt(); // Number of returned reference types - is NOt used here classesBySignatureReply.getNextValueAsByte(); // refTypeTag of class - is NOt used here long refTypeID = classesBySignatureReply.getNextValueAsReferenceTypeID(); classesBySignatureReply = null; logWriter.println("=> Debuggee class = " + getDebuggeeClassName()); logWriter.println("=> referenceTypeID for Debuggee class = " + refTypeID); String checkedFieldNames[] = { "SetValues002DebuggeeObject", "objectField", }; long checkedFieldIDs[] = checkFields(refTypeID, checkedFieldNames); int checkedFieldsNumber = checkedFieldNames.length; logWriter.println( "=> Send ReferenceType::GetValues command and get ObjectID for value to set..."); CommandPacket getValuesCommand = new CommandPacket( JDWPCommands.ReferenceTypeCommandSet.CommandSetID, JDWPCommands.ReferenceTypeCommandSet.GetValuesCommand); getValuesCommand.setNextValueAsReferenceTypeID(refTypeID); getValuesCommand.setNextValueAsInt(1); getValuesCommand.setNextValueAsFieldID(checkedFieldIDs[0]); ReplyPacket getValuesReply = debuggeeWrapper.vmMirror.performCommand(getValuesCommand); getValuesCommand = null; checkReplyPacket(getValuesReply, "ReferenceType::GetValues command"); int returnedValuesNumber = getValuesReply.getNextValueAsInt(); logWriter.println("=> Returned values number = " + returnedValuesNumber); assertEquals( "ReferenceType::GetValues returned invalid values number,", 1, returnedValuesNumber); Value objectFieldValueToSet = getValuesReply.getNextValueAsValue(); byte objectFieldValueToSetTag = objectFieldValueToSet.getTag(); logWriter.println( "=> Returned field value tag for checked object= " + objectFieldValueToSetTag + "(" + JDWPConstants.Tag.getName(objectFieldValueToSetTag) + ")"); assertEquals( "ReferenceType::GetValues returned invalid value tag,", JDWPConstants.Tag.OBJECT_TAG, objectFieldValueToSetTag, JDWPConstants.Tag.getName(JDWPConstants.Tag.OBJECT_TAG), JDWPConstants.Tag.getName(objectFieldValueToSetTag)); long objectFieldID = objectFieldValueToSet.getLongValue(); logWriter.println("=> Returned ObjectID = " + objectFieldID); logWriter.println( "=> CHECK: send " + thisCommandName + " for Debuggee class with value which has other referenceType than field to set..."); CommandPacket checkedCommand = new CommandPacket( JDWPCommands.ClassTypeCommandSet.CommandSetID, JDWPCommands.ClassTypeCommandSet.SetValuesCommand); checkedCommand.setNextValueAsClassID(refTypeID); checkedCommand.setNextValueAsInt(checkedFieldsNumber - 1); int fieldIndex = 1; for (; fieldIndex < checkedFieldsNumber; fieldIndex++) { checkedCommand.setNextValueAsFieldID(checkedFieldIDs[fieldIndex]); switch (fieldIndex) { case 1: // objectField checkedCommand.setNextValueAsObjectID(objectFieldID); break; } } ReplyPacket checkedReply = debuggeeWrapper.vmMirror.performCommand(checkedCommand); checkedCommand = null; short errorCode = checkedReply.getErrorCode(); if (errorCode == JDWPConstants.Error.NONE) { logWriter.println("=> " + thisCommandName + " run without any ERROR!"); } else { logWriter.println( "=> " + thisCommandName + " returns ERROR = " + errorCode + "(" + JDWPConstants.Error.getName(errorCode) + ")"); } logWriter.println("=> Wait for Debuggee's status about check for set field..."); synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE); boolean debuggeeStatus = synchronizer.receiveMessage("PASSED"); if (!debuggeeStatus) { logWriter.println("## " + thisTestName + ": Debuggee returned status FAILED"); fail("Debuggee returned status FAILED"); } else { logWriter.println("=> " + thisTestName + ": Debuggee returned status PASSED"); } logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": OK"); }
/** * This testcase exercises ReferenceType.Modifiers command. <br> * The test starts HelloWorld debuggee, requests referenceTypeId for it by * VirtualMachine.ClassesBySignature command, then performs ReferenceType.Modifiers command and * checks that returned Modifiers contain expected flags: ACC_PUBLIC, ACC_SUPER; but do NOT * contain flags: ACC_FINAL, ACC_INTERFACE, ACC_ABSTRACT */ public void testModifiers001() { String thisTestName = "testModifiers001"; logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": START..."); String failMessage = ""; synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY); long refTypeID = getClassIDBySignature(debuggeeSignature); logWriter.println("=> Debuggee class = " + getDebuggeeClassName()); logWriter.println("=> referenceTypeID for Debuggee class = " + refTypeID); logWriter.println("=> CHECK1: send " + thisCommandName + " and check reply..."); CommandPacket modifiersCommand = new CommandPacket( JDWPCommands.ReferenceTypeCommandSet.CommandSetID, JDWPCommands.ReferenceTypeCommandSet.ModifiersCommand); modifiersCommand.setNextValueAsReferenceTypeID(refTypeID); ReplyPacket modifiersReply = debuggeeWrapper.vmMirror.performCommand(modifiersCommand); modifiersCommand = null; checkReplyPacket(modifiersReply, thisCommandName); int returnedModifiers = modifiersReply.getNextValueAsInt(); /* * The value of the access_flags item is a mask of modifiers used with class and * interface declarations. The access_flags modifiers are: * Flag Name Value Meaning Used By * ACC_PUBLIC 0x0001 Is public; may be accessed from outside its package. Class, interface * ACC_FINAL 0x0010 Is final; no subclasses allowed. Class * ACC_SUPER 0x0020 Treat superclass methods specially in invokespecial. Class, interface * ACC_INTERFACE 0x0200 Is an interface. Interface * ACC_ABSTRACT 0x0400 Is abstract; may not be instantiated. Class, interface */ logWriter.println("=> Returned modifiers = 0x" + Integer.toHexString(returnedModifiers)); int publicFlag = 0x0001; // expected int finalFlag = 0x0010; // unexpected int superFlag = 0x0020; // expected int interfaceFlag = 0x0200; // unexpected int abstractFlag = 0x0400; // unexpected if ((returnedModifiers & publicFlag) == 0) { logWriter.println( "## CHECK1: FAILURE: Returned modifiers do NOT contain expected ACC_PUBLIC flag(0x0001)"); failMessage = failMessage + "Returned modifiers do NOT contain expected ACC_PUBLIC flag(0x0001);\n"; } if ((returnedModifiers & superFlag) == 0) { logWriter.println( "## CHECK1: FAILURE: Returned modifiers do NOT contain expected ACC_SUPER flag(0x0020)"); failMessage = failMessage + "Returned modifiers do NOT contain expected ACC_SUPER flag(0x0020);\n"; } if ((returnedModifiers & finalFlag) != 0) { logWriter.println( "## CHECK1: FAILURE: Returned modifiers contain unexpected ACC_FINAL flag(0x0010)"); failMessage = failMessage + "Returned modifiers contain unexpected ACC_FINAL flag(0x0010);\n"; } if ((returnedModifiers & interfaceFlag) != 0) { logWriter.println( "## CHECK1: FAILURE: Returned modifiers contain unexpected ACC_INTERFACE flag(0x0200)"); failMessage = failMessage + "Returned modifiers contain unexpected ACC_INTERFACE flag(0x0200);\n"; } if ((returnedModifiers & abstractFlag) != 0) { logWriter.println( "## CHECK1: FAILURE: Returned modifiers contain unexpected ACC_ABSTRACT flag(0x0400)"); failMessage = failMessage + "Returned modifiers contain unexpected ACC_ABSTRACT flag(0x0400);\n"; } logWriter.println( "=> CHECK1: PASSED: expected modifiers are returned: ACC_PUBLIC flag(0x0001), ACC_SUPER flag(0x0020)"); synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE); logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": FINISH"); if (failMessage.length() > 0) { fail(failMessage); } assertAllDataRead(modifiersReply); }
/** * This test exercises ObjectReference.IsCollected command. <br> * The test starts IsCollectedDebuggee class, gets two objectIDs as value of static fields of this * class which (fields) represent two checked objects. Then for the first objectID test executes * ObjectReference.DisableCollection command. After that Debuggee tries to unload checked objects. * Then the test executes ObjectReference.IsCollected commands for both checked objects and checks * replies. */ public void testIsCollected001() { String thisTestName = "testIsCollected001"; logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": START..."); String failMessage = ""; synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY); finalSyncMessage = "TO_FINISH"; long refTypeID = getClassIDBySignature(debuggeeSignature); logWriter.println("=> Debuggee class = " + getDebuggeeClassName()); logWriter.println("=> referenceTypeID for Debuggee class = " + refTypeID); String checkedFieldNames[] = { "checkedObject_01", "checkedObject_02", }; long checkedFieldIDs[] = checkFields(refTypeID, checkedFieldNames); long checkedField_01ID = checkedFieldIDs[0]; long checkedField_02ID = checkedFieldIDs[1]; logWriter.println( "=> Send ReferenceType::GetValues command for received fieldIDs and get ObjectIDs to check..."); CommandPacket getValuesCommand = new CommandPacket( JDWPCommands.ReferenceTypeCommandSet.CommandSetID, JDWPCommands.ReferenceTypeCommandSet.GetValuesCommand); getValuesCommand.setNextValueAsReferenceTypeID(refTypeID); getValuesCommand.setNextValueAsInt(2); getValuesCommand.setNextValueAsFieldID(checkedField_01ID); getValuesCommand.setNextValueAsFieldID(checkedField_02ID); ReplyPacket getValuesReply = debuggeeWrapper.vmMirror.performCommand(getValuesCommand); getValuesCommand = null; checkReplyPacket(getValuesReply, "ReferenceType::GetValues command"); int returnedValuesNumber = getValuesReply.getNextValueAsInt(); logWriter.println("=> Returned values number = " + returnedValuesNumber); assertEquals("Invalid number of values,", 2, returnedValuesNumber); Value checkedObjectFieldValue = getValuesReply.getNextValueAsValue(); byte checkedObjectFieldTag = checkedObjectFieldValue.getTag(); logWriter.println( "=> Returned field value tag for checkedObject_01 = " + checkedObjectFieldTag + "(" + JDWPConstants.Tag.getName(checkedObjectFieldTag) + ")"); assertEquals( "Invalid value tag for checkedObject_01", JDWPConstants.Tag.OBJECT_TAG, checkedObjectFieldTag, JDWPConstants.Tag.getName(JDWPConstants.Tag.OBJECT_TAG), JDWPConstants.Tag.getName(checkedObjectFieldTag)); long checkedObject_01ID = checkedObjectFieldValue.getLongValue(); logWriter.println("=> Returned ObjectID for checkedObject_01 = " + checkedObject_01ID); checkedObjectFieldValue = getValuesReply.getNextValueAsValue(); checkedObjectFieldTag = checkedObjectFieldValue.getTag(); logWriter.println( "=> Returned field value tag for checkedObject_02 = " + checkedObjectFieldTag + "(" + JDWPConstants.Tag.getName(checkedObjectFieldTag) + ")"); assertEquals( "Invalid value tag for checkedObject_02", JDWPConstants.Tag.OBJECT_TAG, checkedObjectFieldTag, JDWPConstants.Tag.getName(JDWPConstants.Tag.OBJECT_TAG), JDWPConstants.Tag.getName(checkedObjectFieldTag)); long checkedObject_02ID = checkedObjectFieldValue.getLongValue(); logWriter.println("=> Returned ObjectID for checkedObject_02 = " + checkedObject_02ID); logWriter.println( "\n=> Send ObjectReference::DisableCollection command for checkedObject_01..."); CommandPacket disableCollectionCommand = new CommandPacket( JDWPCommands.ObjectReferenceCommandSet.CommandSetID, JDWPCommands.ObjectReferenceCommandSet.DisableCollectionCommand); disableCollectionCommand.setNextValueAsObjectID(checkedObject_01ID); ReplyPacket disableCollectionReply = debuggeeWrapper.vmMirror.performCommand(disableCollectionCommand); disableCollectionCommand = null; checkReplyPacket(disableCollectionReply, "ObjectReference::DisableCollection command"); logWriter.println( "=> Send to Debuggee signal to continue and try to unload checked objects..."); finalSyncMessage = null; synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE); String messageFromDebuggee = synchronizer.receiveMessage(); logWriter.println("\n=> Received message from Debuggee = \"" + messageFromDebuggee + "\""); logWriter.println("\n=> Send " + thisCommandName + " for checkedObject_01 and check reply..."); CommandPacket checkedCommand = new CommandPacket( JDWPCommands.ObjectReferenceCommandSet.CommandSetID, JDWPCommands.ObjectReferenceCommandSet.IsCollectedCommand); checkedCommand.setNextValueAsObjectID(checkedObject_01ID); ReplyPacket checkedReply = debuggeeWrapper.vmMirror.performCommand(checkedCommand); checkedCommand = null; checkReplyPacket(checkedReply, thisCommandName); boolean checkedObject_01_IsCollected = checkedReply.getNextValueAsBoolean(); logWriter.println("=> IsCollected for checkedObject_01 = " + checkedObject_01_IsCollected); if (messageFromDebuggee.indexOf("checkedObject_01 is UNLOADed;") != -1) { if (!checkedObject_01_IsCollected) { logWriter.println( "## FAILURE: Unexpected result for checkedObject_01 of " + thisCommandName + ":"); logWriter.println("## checkedObject_01 is UNLOADed so IsCollected must be 'true'"); failMessage = failMessage + "Unexpected result for checkedObject_01 of " + thisCommandName + "\n"; } } else { if (checkedObject_01_IsCollected) { logWriter.println( "## FAILURE: Unexpected result for checkedObject_01 of " + thisCommandName + ":"); logWriter.println("## checkedObject_01 is NOT UNLOADed so IsCollected must be 'false'"); failMessage = failMessage + "Unexpected result for checkedObject_01 of " + thisCommandName + "\n"; } } logWriter.println("=> PASSED for checkedObject_01"); logWriter.println("\n=> Send " + thisCommandName + " for checkedObject_02 and check reply..."); checkedCommand = new CommandPacket( JDWPCommands.ObjectReferenceCommandSet.CommandSetID, JDWPCommands.ObjectReferenceCommandSet.IsCollectedCommand); checkedCommand.setNextValueAsObjectID(checkedObject_02ID); checkedReply = debuggeeWrapper.vmMirror.performCommand(checkedCommand); checkedCommand = null; checkReplyPacket(checkedReply, thisCommandName); boolean checkedObject_02_IsCollected = checkedReply.getNextValueAsBoolean(); logWriter.println("=> IsCollected for checkedObject_02 = " + checkedObject_02_IsCollected); if (messageFromDebuggee.indexOf("checkedObject_02 is UNLOADed;") != -1) { if (!checkedObject_02_IsCollected) { logWriter.println( "## FAILURE: Unexpected result for checkedObject_02 of " + thisCommandName + ":"); logWriter.println("## checkedObject_02 is UNLOADed so IsCollected must be 'true'"); failMessage = failMessage + "Unexpected result for checkedObject_02 of " + thisCommandName + "\n"; } } else { if (checkedObject_02_IsCollected) { logWriter.println( "## FAILURE: Unexpected result for checkedObject_02 of " + thisCommandName + ":"); logWriter.println("## checkedObject_02 is NOT UNLOADed so IsCollected must be 'false'"); failMessage = failMessage + "Unexpected result for checkedObject_02 of " + thisCommandName + "\n"; } } logWriter.println("=> PASSED for checkedObject_02"); logWriter.println("=> Send to Debuggee signal to funish ..."); synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE); logWriter.println("==> " + thisTestName + " for " + thisCommandName + ": FINISH"); if (failMessage.length() > 0) { fail(failMessage); } assertAllDataRead(checkedReply); }