13e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz/* 23e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * Licensed to the Apache Software Foundation (ASF) under one or more 33e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * contributor license agreements. See the NOTICE file distributed with 43e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * this work for additional information regarding copyright ownership. 53e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * The ASF licenses this file to You under the Apache License, Version 2.0 63e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * (the "License"); you may not use this file except in compliance with 73e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * the License. You may obtain a copy of the License at 83e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * 93e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * http://www.apache.org/licenses/LICENSE-2.0 103e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * 113e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * Unless required by applicable law or agreed to in writing, software 123e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * distributed under the License is distributed on an "AS IS" BASIS, 133e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 143e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * 153e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * See the License for the specific language governing permissions and 163e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * limitations under the License. 173e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz */ 183e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 193e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertzpackage org.apache.harmony.jpda.tests.jdwp.Events; 203e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 213e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertzimport org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket; 223e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertzimport org.apache.harmony.jpda.tests.framework.jdwp.EventPacket; 233e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertzimport org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands; 243e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertzimport org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants; 253e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertzimport org.apache.harmony.jpda.tests.framework.jdwp.Location; 263e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertzimport org.apache.harmony.jpda.tests.framework.jdwp.ParsedEvent; 273e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertzimport org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket; 283e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 293e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz/** 303e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * Base class for EXCEPTION tests. 313e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz */ 323e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertzpublic abstract class ExceptionBaseTest extends JDWPEventTestCase { 333e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 343e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz /** 353e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * Waits for EXCEPTION event and checks it is the one we expect and the event 363e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * thread's state. 373e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz */ 383e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz protected ParsedEvent.Event_EXCEPTION receiveAndCheckExceptionEvent(int requestID) { 393e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz printTestLog("=> receiveEvent()..."); 403e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz EventPacket event = debuggeeWrapper.vmMirror.receiveEvent(); 413e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz printTestLog("Event is received! Check it ..."); 423e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz ParsedEvent[] parsedEvents = ParsedEvent.parseEventPacket(event); 433e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 443e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz // assert that event is the expected one 453e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz printTestLog("parsedEvents.length = " + parsedEvents.length); 463e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz printTestLog("parsedEvents[0].getEventKind() = " + parsedEvents[0].getEventKind()); 473e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz assertEquals("Invalid number of events,", 1, parsedEvents.length); 483e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz assertEquals("Invalid event kind,", 493e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz JDWPConstants.EventKind.EXCEPTION, 503e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz parsedEvents[0].getEventKind(), 513e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz JDWPConstants.EventKind.getName(JDWPConstants.EventKind.EXCEPTION), 523e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz JDWPConstants.EventKind.getName(parsedEvents[0].getEventKind())); 533e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz assertEquals("Invalid event request ID", requestID, parsedEvents[0].getRequestID()); 543e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 553e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz ParsedEvent.Event_EXCEPTION exceptionEvent = (ParsedEvent.Event_EXCEPTION) parsedEvents[0]; 563e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 573e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz long eventThreadID = exceptionEvent.getThreadID(); 583e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz checkThreadState(eventThreadID, JDWPConstants.ThreadStatus.RUNNING, 593e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz JDWPConstants.SuspendStatus.SUSPEND_STATUS_SUSPENDED); 603e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 613e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz // Remove event request. 623e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz debuggeeWrapper.vmMirror.clearEvent(JDWPConstants.EventKind.EXCEPTION, requestID); 633e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 643e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz return exceptionEvent; 653e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } 663e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 673e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz /** 683e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * Returns the location of the top stack frame of a thread by sending a 693e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * ThreadReference.Frames command for only one frame. 703e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * @param threadID the thread ID 713e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz * @return the location of the top stack frame of a thread 723e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz */ 733e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz protected Location getTopFrameLocation(long threadID) { 743e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz // getting frames of the thread 753e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz CommandPacket packet = new CommandPacket( 763e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz JDWPCommands.ThreadReferenceCommandSet.CommandSetID, 773e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz JDWPCommands.ThreadReferenceCommandSet.FramesCommand); 783e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz packet.setNextValueAsThreadID(threadID); 793e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz packet.setNextValueAsInt(0); 803e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz packet.setNextValueAsInt(1); 813e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet); 823e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz debuggeeWrapper.vmMirror.checkReply(reply); 833e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 843e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz // assert that only one top frame is returned 853e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz int framesCount = reply.getNextValueAsInt(); 863e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz assertEquals("Invalid number of top stack frames,", 1, framesCount); 873e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 883e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz reply.getNextValueAsFrameID(); // frameID 893e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz return reply.getNextValueAsLocation(); 903e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } 913e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz 923e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz public String dumpLocation(Location location) { 933e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz StringBuilder builder = new StringBuilder("{"); 943e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz String classSig = "<null>"; 953e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz String methodName = "<null>"; 963e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz if (location.classID != 0 && location.methodID != 0) { 973e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz classSig = getClassSignature(location.classID); 983e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz methodName = getMethodName(location.classID, location.methodID); 993e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } 1003e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz builder.append(JDWPConstants.TypeTag.getName(location.tag)); 1013e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz builder.append(','); 1023e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz builder.append("0x" + Long.toHexString(location.classID)); 1033e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz builder.append(" (" + classSig + "),"); 1043e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz builder.append("0x" + Long.toHexString(location.methodID)); 1053e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz builder.append(" (" + methodName + "),"); 1063e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz builder.append("0x" + Long.toHexString(location.index)); 1073e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz builder.append('}'); 1083e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz return builder.toString(); 1093e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz } 1103e35c96b816be002cbdbfd623f2b2d8300f62816Sebastien Hertz} 111