summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastien Hertz <shertz@google.com>2015-05-26 12:00:08 +0200
committerSebastien Hertz <shertz@google.com>2015-05-26 17:28:10 +0200
commit2fa3f21ad335734e8a72b406470ac6628de26ca8 (patch)
tree9454fdd2f26fb6fc18668e458fed70dca51c1a55
parent5ff01452b6b4f74a4aec484eafad1796d6745f1f (diff)
downloadapache-harmony-2fa3f21ad335734e8a72b406470ac6628de26ca8.tar.gz
JDWP: test breakpoint on catch statement
Bug: 21382373 (cherry picked from commit 42ff92232b028156a307bffc2e51282f3dfe673e) Change-Id: I6c513cbf3c509ef855dc7bc0d62abebed8570b37
-rw-r--r--jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/Events/BreakpointOnCatchDebuggee.java71
-rw-r--r--jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/Events/BreakpointOnCatchTest.java112
-rw-r--r--jdwp/src/test/java/org/apache/harmony/jpda/tests/share/AllTests.java1
3 files changed, 184 insertions, 0 deletions
diff --git a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/Events/BreakpointOnCatchDebuggee.java b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/Events/BreakpointOnCatchDebuggee.java
new file mode 100644
index 0000000..b08a615
--- /dev/null
+++ b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/Events/BreakpointOnCatchDebuggee.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.harmony.jpda.tests.jdwp.Events;
+
+import org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;
+import org.apache.harmony.jpda.tests.share.SyncDebuggee;
+
+/**
+ * Debuggee for BreakpointOnCatchTest unit test.
+ */
+public class BreakpointOnCatchDebuggee extends SyncDebuggee {
+ // This variable must be set to the name of the method where we set a breakpoint.
+ public static String BREAKPOINT_METHOD_NAME = "breakpointOnCatch";
+
+ public static class BreakpointOnCatchDebuggeeException extends Exception {
+ public BreakpointOnCatchDebuggeeException(String detailMessage) {
+ super(detailMessage);
+ }
+ }
+
+ @Override
+ public void run() {
+ // Force loading of exception class.
+ new BreakpointOnCatchDebuggeeException("");
+
+ synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_READY);
+
+ logWriter.println("BreakpointOnCatchDebuggee started");
+
+ synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
+
+ // First run to know the catch location.
+ logWriter.println("Execute breakpointOnCatch for EXCEPTION event");
+ breakpointOnCatch();
+
+ // Second run to test the breakpoint on a catch location.
+ logWriter.println("Execute breakpointOnCatch for BREAKPOINT event");
+ breakpointOnCatch();
+
+ logWriter.println("BreakpointOnCatchDebuggee finished");
+ }
+
+ private void breakpointOnCatch() {
+ try {
+ throw new BreakpointOnCatchDebuggeeException("Expected exception");
+ } catch (BreakpointOnCatchDebuggeeException e) {
+ logWriter.printError("Caught the expected exception", e);
+ }
+ }
+
+ public static void main(String[] args) {
+ runDebuggee(BreakpointOnCatchDebuggee.class);
+ }
+
+}
diff --git a/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/Events/BreakpointOnCatchTest.java b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/Events/BreakpointOnCatchTest.java
new file mode 100644
index 0000000..58e2ba7
--- /dev/null
+++ b/jdwp/src/test/java/org/apache/harmony/jpda/tests/jdwp/Events/BreakpointOnCatchTest.java
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.harmony.jpda.tests.jdwp.Events;
+
+import org.apache.harmony.jpda.tests.framework.TestErrorException;
+import org.apache.harmony.jpda.tests.framework.jdwp.CommandPacket;
+import org.apache.harmony.jpda.tests.framework.jdwp.JDWPConstants;
+import org.apache.harmony.jpda.tests.framework.jdwp.Location;
+import org.apache.harmony.jpda.tests.framework.jdwp.ParsedEvent;
+import org.apache.harmony.jpda.tests.framework.jdwp.ParsedEvent.EventThread;
+import org.apache.harmony.jpda.tests.framework.jdwp.ParsedEvent.Event_EXCEPTION;
+import org.apache.harmony.jpda.tests.framework.jdwp.ReplyPacket;
+import org.apache.harmony.jpda.tests.share.JPDADebuggeeSynchronizer;
+
+/**
+ * JDWP Unit test for BREAKPOINT event on "catch (...)" line.
+ */
+public class BreakpointOnCatchTest extends JDWPEventTestCase {
+ @Override
+ protected String getDebuggeeClassName() {
+ return BreakpointOnCatchDebuggee.class.getName();
+ }
+
+ /**
+ * This testcase is for BREAKPOINT event.
+ * <BR>It runs BreakpointOnCatchDebuggee and set breakpoint to its breakpointOnCatch
+ * method, then verifies that the requested BREAKPOINT event occurs on a catch statement
+ * (with a pending exception).
+ */
+ public void testBreakpointOnCatch() {
+ logWriter.println("testBreakpointOnCatch started");
+
+ // Wait for debuggee to start.
+ synchronizer.receiveMessage(JPDADebuggeeSynchronizer.SGNL_READY);
+
+ long classID = getClassIDBySignature(getDebuggeeClassSignature());
+ long methodID = getMethodID(classID, BreakpointOnCatchDebuggee.BREAKPOINT_METHOD_NAME);
+
+ // First, we set an EXCEPTION caught event to know the location of the catch.
+ int exceptionRequestID = requestExceptionCaughtEvent();
+
+ // Execute the EXCEPTION.
+ synchronizer.sendMessage(JPDADebuggeeSynchronizer.SGNL_CONTINUE);
+
+ // Wait for EXCEPTION event.
+ CommandPacket event =
+ debuggeeWrapper.vmMirror.receiveCertainEvent(JDWPConstants.EventKind.EXCEPTION);
+ ParsedEvent[] parsedEvents = ParsedEvent.parseEventPacket(event);
+ assertEquals("Invalid number of events:", 1, parsedEvents.length);
+ assertEquals("Invalid request ID:", exceptionRequestID, parsedEvents[0].getRequestID());
+
+ // Extract catch location and check it is in the tested method.
+ Location catchLocation = ((Event_EXCEPTION) parsedEvents[0]).getCatchLocation();
+ assertEquals("Invalid class ID:", classID, catchLocation.classID);
+ assertEquals("Invalid method ID:", methodID, catchLocation.methodID);
+
+ // Clear the EXCEPTION event.
+ debuggeeWrapper.vmMirror.clearEvent(JDWPConstants.EventKind.EXCEPTION, exceptionRequestID);
+
+ // Now we can set the BREAKPOINT on the catch location.
+ int requestID = requestBreakpointEvent(catchLocation);
+
+ // The debuggee is suspended on the EXCEPTION event: resume it to hit the BREAKPOINT event.
+ resumeDebuggee();
+
+ // Wait for BREAKPOINT event.
+ event =
+ debuggeeWrapper.vmMirror.receiveCertainEvent(JDWPConstants.EventKind.BREAKPOINT);
+ parsedEvents = ParsedEvent.parseEventPacket(event);
+ assertEquals("Invalid number of events:", 1, parsedEvents.length);
+ assertEquals("Invalid request ID:", requestID, parsedEvents[0].getRequestID());
+
+ // Check the thread is in an expected state.
+ long eventThreadID = ((EventThread) parsedEvents[0]).getThreadID();
+ checkThreadState(eventThreadID, JDWPConstants.ThreadStatus.RUNNING,
+ JDWPConstants.SuspendStatus.SUSPEND_STATUS_SUSPENDED);
+
+ logWriter.println("Successfully suspended on a catch statement");
+ logWriter.println("testBreakpointOnCatch done");
+ }
+
+ private int requestExceptionCaughtEvent() {
+ String exceptionSig =
+ getClassSignature(BreakpointOnCatchDebuggee.BreakpointOnCatchDebuggeeException.class);
+ ReplyPacket replyPacket = debuggeeWrapper.vmMirror.setException(exceptionSig, true, false);
+ return replyPacket.getNextValueAsInt();
+
+ }
+
+ private int requestBreakpointEvent(Location location) {
+ logWriter.println("Install breakpoint at " + location);
+ ReplyPacket replyPacket = debuggeeWrapper.vmMirror.setBreakpoint(location);
+ return replyPacket.getNextValueAsInt();
+
+ }
+}
diff --git a/jdwp/src/test/java/org/apache/harmony/jpda/tests/share/AllTests.java b/jdwp/src/test/java/org/apache/harmony/jpda/tests/share/AllTests.java
index 4a5a6a1..3936605 100644
--- a/jdwp/src/test/java/org/apache/harmony/jpda/tests/share/AllTests.java
+++ b/jdwp/src/test/java/org/apache/harmony/jpda/tests/share/AllTests.java
@@ -74,6 +74,7 @@ public class AllTests {
suite.addTestSuite(org.apache.harmony.jpda.tests.jdwp.EventModifiers.ThreadOnlyModifierTest.class);
suite.addTestSuite(org.apache.harmony.jpda.tests.jdwp.Events.Breakpoint002Test.class);
suite.addTestSuite(org.apache.harmony.jpda.tests.jdwp.Events.BreakpointMultipleTest.class);
+ suite.addTestSuite(org.apache.harmony.jpda.tests.jdwp.Events.BreakpointOnCatchTest.class);
suite.addTestSuite(org.apache.harmony.jpda.tests.jdwp.Events.BreakpointTest.class);
suite.addTestSuite(org.apache.harmony.jpda.tests.jdwp.Events.ClassPrepareTest.class);
suite.addTestSuite(org.apache.harmony.jpda.tests.jdwp.Events.CombinedEvents002Test.class);