1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements.  See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License.  You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *
15  *  See the License for the specific language governing permissions and
16  *  limitations under the License.
17  */
18 
19 package org.apache.harmony.jpda.tests.jdwp.Events;
20 
21 import org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket;
22 import org.apache.harmony.jpda.tests.framework.jdwp.EventPacket;
23 import org.apache.harmony.jpda.tests.framework.jdwp.JDWPCommands;
24 import org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
25 import org.apache.harmony.jpda.tests.framework.jdwp.Location;
26 import org.apache.harmony.jpda.tests.framework.jdwp.ParsedEvent;
27 import org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket;
28 
29 /**
30  * Base class for EXCEPTION tests.
31  */
32 public abstract class ExceptionBaseTest extends JDWPEventTestCase {
33 
34     /**
35      * Waits for EXCEPTION event and checks it is the one we expect and the event
36      * thread's state.
37      */
receiveAndCheckExceptionEvent(int requestID)38     protected ParsedEvent.Event_EXCEPTION receiveAndCheckExceptionEvent(int requestID) {
39         printTestLog("=> receiveEvent()...");
40         EventPacket event = debuggeeWrapper.vmMirror.receiveEvent();
41         printTestLog("Event is received! Check it ...");
42         ParsedEvent[] parsedEvents = ParsedEvent.parseEventPacket(event);
43 
44         // assert that event is the expected one
45         printTestLog("parsedEvents.length = " + parsedEvents.length);
46         printTestLog("parsedEvents[0].getEventKind() = " + parsedEvents[0].getEventKind());
47         assertEquals("Invalid number of events,", 1, parsedEvents.length);
48         assertEquals("Invalid event kind,",
49                 JDWPConstants.EventKind.EXCEPTION,
50                 parsedEvents[0].getEventKind(),
51                 JDWPConstants.EventKind.getName(JDWPConstants.EventKind.EXCEPTION),
52                 JDWPConstants.EventKind.getName(parsedEvents[0].getEventKind()));
53         assertEquals("Invalid event request ID", requestID, parsedEvents[0].getRequestID());
54 
55         ParsedEvent.Event_EXCEPTION exceptionEvent = (ParsedEvent.Event_EXCEPTION) parsedEvents[0];
56 
57         long eventThreadID = exceptionEvent.getThreadID();
58         checkThreadState(eventThreadID, JDWPConstants.ThreadStatus.RUNNING,
59                 JDWPConstants.SuspendStatus.SUSPEND_STATUS_SUSPENDED);
60 
61         // Remove event request.
62         debuggeeWrapper.vmMirror.clearEvent(JDWPConstants.EventKind.EXCEPTION, requestID);
63 
64         return exceptionEvent;
65     }
66 
67     /**
68      * Returns the location of the top stack frame of a thread by sending a
69      * ThreadReference.Frames command for only one frame.
70      * @param threadID the thread ID
71      * @return the location of the top stack frame of a thread
72      */
getTopFrameLocation(long threadID)73     protected Location getTopFrameLocation(long threadID) {
74         // getting frames of the thread
75         CommandPacket packet = new CommandPacket(
76                 JDWPCommands.ThreadReferenceCommandSet.CommandSetID,
77                 JDWPCommands.ThreadReferenceCommandSet.FramesCommand);
78         packet.setNextValueAsThreadID(threadID);
79         packet.setNextValueAsInt(0);
80         packet.setNextValueAsInt(1);
81         ReplyPacket reply = debuggeeWrapper.vmMirror.performCommand(packet);
82         debuggeeWrapper.vmMirror.checkReply(reply);
83 
84         // assert that only one top frame is returned
85         int framesCount = reply.getNextValueAsInt();
86         assertEquals("Invalid number of top stack frames,", 1, framesCount);
87 
88         reply.getNextValueAsFrameID(); // frameID
89         return reply.getNextValueAsLocation();
90     }
91 
dumpLocation(Location location)92     public String dumpLocation(Location location) {
93         StringBuilder builder = new StringBuilder("{");
94         String classSig = "<null>";
95         String methodName = "<null>";
96         if (location.classID != 0 && location.methodID != 0) {
97             classSig = getClassSignature(location.classID);
98             methodName = getMethodName(location.classID, location.methodID);
99         }
100         builder.append(JDWPConstants.TypeTag.getName(location.tag));
101         builder.append(',');
102         builder.append("0x" + Long.toHexString(location.classID));
103         builder.append(" (" + classSig + "),");
104         builder.append("0x" + Long.toHexString(location.methodID));
105         builder.append(" (" + methodName + "),");
106         builder.append("0x" + Long.toHexString(location.index));
107         builder.append('}');
108         return builder.toString();
109     }
110 }
111