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/**
20 * @author Aleksander V. Budniy
21 */
22
23/**
24 * Created on 8.7.2005
25 */
26package org.apache.harmony.jpda.tests.jdwp.MultiSession;
27
28import org.apache.harmony.jpda.tests.framework.TestOptions;
29import org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket;
30import org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
31import org.apache.harmony.jpda.tests.framework.jdwp.ParsedEvent;
32import org.apache.harmony.jpda.tests.jdwp.Events.ExceptionCaughtDebuggee;
33import org.apache.harmony.jpda.tests.jdwp.share.JDWPUnitDebuggeeWrapper;
34import org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;
35
36
37/**
38 * JDWP Unit test for verifying canceling of EXCEPTION event after re-connection.
39 */
40public class ExceptionTest extends JDWPEventTestCase {
41
42    protected String getDebuggeeClassName() {
43        return ExceptionCaughtDebuggee.class.getName();
44    }
45
46    /**
47     * This testcase verifies canceling of EXCEPTION event after re-connection.
48     * <BR>It runs ExceptionDebuggee, sets request for EXCEPTION event
49     * and re-connects.
50     * <BR>It is expected that only auto VM_DEATH event occurs after re-connection,
51     * but no any other event, including EXCEPTION event.
52     */
53    public void testException001() {
54        logWriter.println(">> testException001: STARTED...");
55
56        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
57
58        String exceptionSignature = "Lorg/apache/harmony/jpda/tests/jdwp/Events/DebuggeeException;";
59        boolean isCatch = true;
60        boolean isUncatch = true;
61        logWriter.println("\n>> testExceptionEvent: => setException(...)...");
62        debuggeeWrapper.vmMirror.setException(exceptionSignature, isCatch,
63                isUncatch);
64        logWriter.println(">> testExceptionEvent: setException(...) DONE");
65
66        logWriter.println("");
67        logWriter.println("=> CLOSE CONNECTION");
68        closeConnection();
69        logWriter.println("=> CONNECTION CLOSED");
70
71        logWriter.println("");
72        logWriter.println("=> OPEN NEW CONNECTION");
73        openConnection();
74        logWriter.println("=> CONNECTION OPENED");
75
76        logWriter.println("=> Resuming debuggee");
77
78        // start the thread
79        synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
80        synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
81
82        // receive event
83        logWriter.println("=> Wait for event..");
84        CommandPacket eventPacket = debuggeeWrapper.vmMirror.receiveEvent();
85        ParsedEvent[] parsedEvents = ParsedEvent.parseEventPacket(eventPacket);
86        int eventsCount = parsedEvents.length;
87        logWriter.println("=> Received event set: count=" + eventsCount);
88
89        // ckeck if received events are expected
90        int result = 0;
91        int autoEvents = 0;
92        int wrongEvents = 0;
93        for (int i = 0; i < eventsCount; i++) {
94            ParsedEvent event = parsedEvents[i];
95            logWriter.println("=> Event #" + i + ";");
96
97            // print event info
98            byte eventSuspendPolicy = event.getSuspendPolicy();
99            logWriter.println("=> SuspendPolicy=" + eventSuspendPolicy + "/"
100                    + JDWPConstants.SuspendPolicy.getName(eventSuspendPolicy));
101            byte eventKind = event.getEventKind();
102            logWriter.println("=> EventKind=" + eventKind + "/"
103                    + JDWPConstants.EventKind.getName(eventKind));
104            int eventRequestID = event.getRequestID();
105            logWriter.println("=> RequestID=" + eventRequestID);
106
107            // check if event is expected
108            if (eventKind == JDWPConstants.EventKind.VM_DEATH) {
109                if (parsedEvents[i].getRequestID() == 0) {
110                    autoEvents++;
111                    logWriter.println("=> found auto VM_DEATH event!");
112                    // for automatical event suspend policy can be changed
113                } else {
114                    logWriter.println("## FAILURE: VM_DEATH event "
115                            + "with unexpected RequestID: " + eventRequestID);
116                    result = 1;
117                }
118            } else {
119                wrongEvents++;
120                logWriter.println("## FAILURE: unexpected event kind: "
121                        + eventKind);
122                result = 2;
123            }
124        }
125
126        if (1 == result)
127            fail("VM_DEATH event with unexpected RequestID");
128        else if (2 == result)
129            fail("Unexpected event kind");
130
131        logWriter.println("==> testException001 PASSED!");
132    }
133
134    protected void beforeDebuggeeStart(JDWPUnitDebuggeeWrapper debuggeeWrapper) {
135        settings.setAttachConnectorKind();
136        if (settings.getTransportAddress() == null) {
137            settings.setTransportAddress(TestOptions.DEFAULT_ATTACHING_ADDRESS);
138        }
139        logWriter.println("ATTACH connector kind");
140        super.beforeDebuggeeStart(debuggeeWrapper);
141    }
142}
143