/******************************************************************************* * Copyright (c) 2000, 2006 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.debug.tests.breakpoints; import org.eclipse.debug.core.model.IBreakpoint; import org.eclipse.jdt.debug.core.IJavaDebugTarget; import org.eclipse.jdt.debug.core.IJavaExceptionBreakpoint; import org.eclipse.jdt.debug.core.IJavaLineBreakpoint; import org.eclipse.jdt.debug.core.IJavaStackFrame; import org.eclipse.jdt.debug.core.IJavaThread; import org.eclipse.jdt.debug.tests.AbstractDebugTest; /** * Tests exception breakpoints. */ public class ExceptionBreakpointTests extends AbstractDebugTest { /** * Constructor * @param name the name of the test */ public ExceptionBreakpointTests(String name) { super(name); } /** * tests that breakpoint suspends on caught exceptions * @throws Exception */ public void testCaughtException() throws Exception { String typeName = "ThrowsException"; IJavaExceptionBreakpoint ex = createExceptionBreakpoint("TestException", true, false); IJavaThread thread= null; try { thread= launchToBreakpoint(typeName); assertNotNull("Breakpoint not hit within timeout period", thread); IBreakpoint hit = getBreakpoint(thread); assertNotNull("suspended, but not by breakpoint", hit); assertEquals("suspended, but not by exception breakpoint", ex ,hit); ex.delete(); } finally { terminateAndRemove(thread); removeAllBreakpoints(); } } /** * tests that breakpoint suspends on uncaught exceptions * @throws Exception */ public void testUncaughtException() throws Exception { String typeName = "HitCountException"; IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", false, true); IJavaThread thread= null; try { thread= launchToBreakpoint(typeName); assertNotNull("Breakpoint not hit within timeout period", thread); IBreakpoint hit = getBreakpoint(thread); assertNotNull("suspended, but not by breakpoint", hit); assertEquals("suspended, but not by exception breakpoint", ex ,hit); IJavaStackFrame frame= (IJavaStackFrame)thread.getTopStackFrame(); assertTrue("Should have been suspended at line number 35, not " + frame.getLineNumber(), frame.getLineNumber() == 35); ex.delete(); } finally { terminateAndRemove(thread); removeAllBreakpoints(); } } /** * * @throws Exception */ public void testDisabledCaughtException() throws Exception { String typeName = "ThrowsNPE"; IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, false); ex.setEnabled(false); IJavaDebugTarget debugTarget= null; try { debugTarget= launchAndTerminate(typeName); ex.delete(); } finally { terminateAndRemove(debugTarget); removeAllBreakpoints(); } } /** * tests that the breakpoint does not suspend for disabled breakpoint set for uncaught exceptions * @throws Exception */ public void testDisabledUncaughtNPE() throws Exception { String typeName = "MultiThreadedException"; IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", false, true); ex.setEnabled(false); IJavaDebugTarget debugTarget= null; try { debugTarget= launchAndTerminate(typeName); ex.delete(); } finally { terminateAndRemove(debugTarget); removeAllBreakpoints(); } } /** * tests that the breakpoint will only suspend on a breakpoint in the inclusion filters * @throws Exception */ public void testInclusiveScopedException() throws Exception { String typeName = "ThrowsException"; IJavaExceptionBreakpoint ex = createExceptionBreakpoint("TestException", true, false); ex.setInclusionFilters(new String[] {"ThrowsException"}); IJavaThread thread= null; try { thread= launchToBreakpoint(typeName); assertNotNull("Breakpoint not hit within timeout period", thread); IBreakpoint hit = getBreakpoint(thread); assertNotNull("suspended, but not by breakpoint", hit); assertEquals("suspended, but not by exception breakpoint", ex ,hit); ex.delete(); } finally { terminateAndRemove(thread); removeAllBreakpoints(); } } /** * test that the breakpoint will not suspend as the class that throws the exception has been added to the exclusion filters * @throws Exception */ public void testExclusiveScopedException() throws Exception { String typeName = "ThrowsException"; IJavaExceptionBreakpoint ex = createExceptionBreakpoint("TestException", true, false); ex.setExclusionFilters(new String[] {"ThrowsException"}); IJavaDebugTarget debugTarget = null; try { debugTarget = launchAndTerminate(typeName); ex.delete(); } finally { terminateAndRemove(debugTarget); removeAllBreakpoints(); } } /** * tests the hit count of an exception breakpoint * @throws Exception */ public void testHitCountException() throws Exception { String typeName = "HitCountException"; IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, true); ex.setHitCount(2); IJavaThread thread= null; try { thread= launchToBreakpoint(typeName); IJavaStackFrame frame= (IJavaStackFrame)thread.getTopStackFrame(); assertEquals("Should have been suspended at linenumber", 35, frame.getLineNumber()); ex.delete(); } finally { terminateAndRemove(thread); removeAllBreakpoints(); } } /** * tests that the breakpoint will suspend at an NPE with more than one exclusion filter, just not suspend in either * of the classes for the exclusion filter * @throws Exception */ public void testMultiExclusiveScopedExceptionHit() throws Exception { String typeName = "ThrowsNPE"; IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, false); ex.setExclusionFilters(new String[] {"TestIO", "Breakpoints"}); IJavaThread thread = null; try { thread = launchToBreakpoint(typeName); assertNotNull("Did not suspend", thread); assertEquals("Should have suspended at NPE", ex, thread.getBreakpoints()[0]); ex.delete(); } finally { terminateAndRemove(thread); removeAllBreakpoints(); } } /** * tests that the breakpoint does not suspend for multiple exclusion filters * @throws Exception */ public void testMultiExclusiveScopedExceptionMissed() throws Exception { String typeName = "ThrowsException"; IJavaExceptionBreakpoint ex = createExceptionBreakpoint("TestException", true, false); ex.setExclusionFilters(new String[] {"ThrowsException2", "ThrowsException"}); IJavaDebugTarget target= null; try { target = launchAndTerminate(typeName); ex.delete(); } finally { terminateAndRemove(target); removeAllBreakpoints(); } } /** * tests that a breakpoint is hit with multiple inclusion filters set * @throws Exception */ public void testMultiInclusiveScopedExceptionHit() throws Exception { String typeName = "ThrowsNPE"; IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, false); ex.setInclusionFilters(new String[] {"ThrowsNPE", "Breakpoints"}); IJavaThread thread = null; try { thread = launchToBreakpoint(typeName); assertNotNull("Did not suspend", thread); assertEquals("Should have suspended at NPE", ex, thread.getBreakpoints()[0]); ex.delete(); } finally { terminateAndRemove(thread); removeAllBreakpoints(); } } /** * tests that the breakpoint does not suspend with multiple inclusion filters * @throws Exception */ public void testMultiInclusiveScopedExceptionMissed() throws Exception { String typeName = "ThrowsNPE"; IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, false); ex.setInclusionFilters(new String[] {"TestIO", "Breakpoints"}); IJavaDebugTarget target= null; try { target = launchAndTerminate(typeName); ex.delete(); } finally { terminateAndRemove(target); removeAllBreakpoints(); } } /** * test that breakpoint suspends with multi inclusion and exclusion filters * @throws Exception */ public void testMultiInclusiveExclusiveScopedExceptionHit() throws Exception { String typeName = "ThrowsNPE"; IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, false); ex.setInclusionFilters(new String[] {"ThrowsNPE", "Breakpoints"}); ex.setExclusionFilters(new String[] {"HitCountException", "MethodLoop"}); IJavaThread thread = null; try { thread = launchToBreakpoint(typeName); assertNotNull("Did not suspend", thread); assertEquals("Should have suspended at NPE", ex, thread.getBreakpoints()[0]); ex.delete(); } finally { terminateAndRemove(thread); removeAllBreakpoints(); } } /** * tests that breakpoint does not suspend with multi inclusion and exclusion filters * @throws Exception */ public void testMultiInclusiveExclusiveScopedExceptionMissed() throws Exception { String typeName = "ThrowsNPE"; IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.NullPointerException", true, false); ex.setInclusionFilters(new String[] {"TestIO", "Breakpoints"}); ex.setExclusionFilters(new String[] {"ThrowsNPE", "MethodLoop"}); IJavaDebugTarget target= null; try { target = launchAndTerminate(typeName); ex.delete(); } finally { terminateAndRemove(target); removeAllBreakpoints(); } } /** * tests that breakpoint is skipped when told to do so * @throws Exception */ public void testSkipExceptionBreakpoint() throws Exception { String typeName = "ThrowsNPE"; createExceptionBreakpoint("java.lang.NullPointerException", true, false); IJavaLineBreakpoint lineBreakpoint = createLineBreakpoint(15, typeName); IJavaThread thread= null; try { thread= launchToLineBreakpoint(typeName, lineBreakpoint); assertNotNull("Breakpoint not hit within timeout period", thread); getBreakpointManager().setEnabled(false); resumeAndExit(thread); } finally { terminateAndRemove(thread); removeAllBreakpoints(); getBreakpointManager().setEnabled(true); } } }