if ( combinedEventsLocation == null ) {
String failureMessage = "## FAILURE: Can NOT get MethodEndLocation 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_EXIT event in debuggee: "
+ getDebuggeeClassName() + ", method: " + methodForEvents);
reply = debuggeeWrapper.vmMirror
.setMethodExit(methodEntryClassNameRegexp);
checkReplyPacket(reply, "Set METHOD_EXIT event");
int methodExitRequestID = reply.getNextValueAsInt();
logWriter.println("=> METHOD_EXIT requestID = " + methodExitRequestID);
logWriter.println("");
logWriter.println("Send SGNL_CONTINUE signal to debuggee...");
synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
// receive and check combined METHOD_EXIT, BREAKPOINT events
logWriter
.println("=> Try to receive and check combined events: METHOD_EXIT, BREAKPOINT events");
EventPacket event = debuggeeWrapper.vmMirror.receiveEvent();
ParsedEvent[] parsedEvents = ParsedEvent.parseEventPacket(event);
// print all received events
logWriter.println("=> Events received: " + parsedEvents.length);
for (int i = 0; i < parsedEvents.length; i++) {
logWriter.println("");
logWriter.println("=> Event #" + i + ";");
logWriter.println("=> EventKind: "
+ parsedEvents[i].getEventKind()
+ "["
+ JDWPConstants.EventKind.getName(parsedEvents[i]
.getEventKind()) + "]");
logWriter
.println("=> RequestID: " + parsedEvents[i].getRequestID());
if ( parsedEvents[i].getEventKind() == JDWPConstants.EventKind.METHOD_EXIT ) {
eventMethodExitReceived = true;
}
}
boolean success = true;
boolean locationsOK = checkEventsLocation(parsedEvents, combinedEventsLocation);
if (parsedEvents.length == EXPECTED_EVENTS_COUNT) {
logWriter.println("");
logWriter
.println("=> Combined events are received. Check events..");
for (int i = 0; i < parsedEvents.length; i++) {
boolean isFound = false;
for (int j = 0; j < EXPECTED_EVENTS_COUNT; j++) {
if (parsedEvents[i].getEventKind() == EXPECTED_EVENTS_ARRAY[j]) {
EXPECTED_EVENTS_ARRAY[j] = 0;
isFound = true;
break;
}
}
if (!isFound) {
logWriter
.println("##FAILURE: received unexpected event: "
+ parsedEvents[i].getEventKind()
+ "["
+ JDWPConstants.EventKind
.getName(parsedEvents[0]
.getEventKind()) + "]");
success = false;
}
}
if (!success) {
logWriter.println("");
logWriter
.println("##FAILURE: the following events were not received: ");
for (int k = 0; k < EXPECTED_EVENTS_COUNT; k++) {
if (EXPECTED_EVENTS_ARRAY[k] != 0)
logWriter.println(" #"
+ k
+ ": "
+ EXPECTED_EVENTS_ARRAY[k]
+ "["
+ JDWPConstants.EventKind
.getName(EXPECTED_EVENTS_ARRAY[k])
+ "]");
}
//DBG__fail("not all expected events were received");
}
} else {
logWriter.println("##FAILURE: received unexpected number of events: "
+ parsedEvents.length
+ " instead of "
+ EXPECTED_EVENTS_COUNT);
//DBG__fail("received unexpected number of events: " + parsedEvents.length);
}
if ( (! success) || (! locationsOK) ) {
String failureMessage = "## FAILURE during checking events !";
//DBG__printErrorAndFail(failureMessage);
}
if ( eventMethodExitReceived ) {
logWriter.println("");
logWriter.println("=> Clean request for METHOD_EXIT event...");
ReplyPacket clearReply = debuggeeWrapper.vmMirror.clearEvent(
JDWPConstants.EventKind.METHOD_EXIT, methodExitRequestID);
checkReplyPacket(clearReply, "EventRequest::Clear");
}
logWriter.println("=> Resume debuggee");