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