blob: dfdcc5a8389d33a76afc27afce045f0d6a32431d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2020 GK Software SE and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Stephan Herrmann - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.debug.tests.breakpoints;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.jdt.debug.core.IJavaExceptionBreakpoint;
import org.eclipse.jdt.debug.core.IJavaExceptionBreakpoint.SuspendOnRecurrenceStrategy;
import org.eclipse.jdt.debug.core.IJavaStackFrame;
import org.eclipse.jdt.debug.core.IJavaThread;
import org.eclipse.jdt.debug.core.JDIDebugModel;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
import org.eclipse.jdt.internal.debug.core.JDIDebugPlugin;
import org.eclipse.jdt.internal.debug.ui.IJDIPreferencesConstants;
import org.eclipse.jdt.internal.debug.ui.JDIDebugUIPlugin;
import org.eclipse.jdt.internal.debug.ui.JavaDebugOptionsManager;
import org.eclipse.jface.preference.IPreferenceStore;
public class SpecialExceptionBreakpointTests extends AbstractDebugTest {
private boolean fDefaultSuspendOnUncaught;
private boolean fDefaultSuspendOnCompilationErrors;
private SuspendOnRecurrenceStrategy fDefaultRecurrenceStrategy;
public SpecialExceptionBreakpointTests(String name) {
super(name);
}
@Override
protected void setUp() throws Exception {
super.setUp();
IPreferenceStore uiPrefStore = JDIDebugUIPlugin.getDefault().getPreferenceStore();
fDefaultSuspendOnUncaught = uiPrefStore.getBoolean(IJDIPreferencesConstants.PREF_SUSPEND_ON_UNCAUGHT_EXCEPTIONS);
fDefaultSuspendOnCompilationErrors = uiPrefStore.getBoolean(IJDIPreferencesConstants.PREF_SUSPEND_ON_COMPILATION_ERRORS);
IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(JDIDebugPlugin.getUniqueIdentifier());
String val = prefs.get(JDIDebugModel.PREF_SUSPEND_ON_RECURRENCE_STRATEGY, SuspendOnRecurrenceStrategy.RECURRENCE_UNCONFIGURED.name());
fDefaultRecurrenceStrategy = SuspendOnRecurrenceStrategy.valueOf(val);
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
setPreferences(fDefaultSuspendOnUncaught, fDefaultSuspendOnCompilationErrors, fDefaultRecurrenceStrategy);
}
void setPreferences(boolean suspUncaught, boolean suspCompErr, SuspendOnRecurrenceStrategy recurr) {
IPreferenceStore uiPrefStore = JDIDebugUIPlugin.getDefault().getPreferenceStore();
uiPrefStore.setValue(IJDIPreferencesConstants.PREF_SUSPEND_ON_UNCAUGHT_EXCEPTIONS, suspUncaught);
uiPrefStore.setValue(IJDIPreferencesConstants.PREF_SUSPEND_ON_COMPILATION_ERRORS, suspCompErr);
IEclipsePreferences prefs = InstanceScope.INSTANCE.getNode(JDIDebugPlugin.getUniqueIdentifier());
prefs.put(JDIDebugModel.PREF_SUSPEND_ON_RECURRENCE_STRATEGY, recurr.name());
}
public void testCaughtException_compErr() throws Exception {
caughtException(true);
}
public void testCaughtException() throws Exception {
caughtException(false);
}
void caughtException(boolean suspendOnCompErr) throws Exception {
setPreferences(true, suspendOnCompErr, SuspendOnRecurrenceStrategy.SUSPEND_ALWAYS);
String typeName = "ErrorRecurrence";
IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.Error", true, true);
IJavaThread thread = null;
try {
thread = launchToBreakpoint(typeName);
assertNotNull("1. Breakpoint not hit within timeout period", thread);
assertEquals("Line of 1. suspend", 26, thread.getTopStackFrame().getLineNumber());
assertExceptionBreakpointHit(thread, ex);
thread = resume(thread);
assertExceptionBreakpointHit(thread, ex);
assertNotNull("2. Breakpoint not hit within timeout period", thread);
assertEquals("Line of 2. suspend", 20, thread.getTopStackFrame().getLineNumber());
thread = resume(thread);
assertExceptionBreakpointHit(thread, ex);
assertNotNull("3. Breakpoint not hit within timeout period", thread);
assertEquals("Line of 3. suspend", 12, thread.getTopStackFrame().getLineNumber());
resumeAndExit(thread);
ex.delete();
} finally {
terminateAndRemove(thread);
removeAllBreakpoints();
}
}
public void testCaughtExceptionSkip_uncaught_compErr() throws Exception {
caughtExceptionSkip_uncaught(true);
}
public void testCaughtExceptionSkip_uncaught() throws Exception {
caughtExceptionSkip_uncaught(false);
}
void caughtExceptionSkip_uncaught(boolean suspendOnCompErr) throws Exception {
setPreferences(true, suspendOnCompErr, SuspendOnRecurrenceStrategy.SKIP_RECURRENCES);
String typeName = "ErrorRecurrence";
IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.Error", true, true);
IJavaThread thread = null;
try {
thread = launchToBreakpoint(typeName);
assertNotNull("1. Breakpoint not hit within timeout period", thread);
assertEquals("Line of 1. suspend", 26, thread.getTopStackFrame().getLineNumber());
assertExceptionBreakpointHit(thread, ex);
// L20 skipped recurrence
// L12: uncaught:
thread = resume(thread);
assertExceptionBreakpointHit(thread, ex);
assertNotNull("2. Breakpoint not hit within timeout period", thread);
assertEquals("Line of 2. suspend", 12, thread.getTopStackFrame().getLineNumber());
resumeAndExit(thread);
ex.delete();
} finally {
terminateAndRemove(thread);
removeAllBreakpoints();
}
}
public void testCaughtExceptionSkip_compErr() throws Exception {
caughtExceptionSkip(true);
}
public void testCaughtExceptionSkip() throws Exception {
caughtExceptionSkip(false);
}
void caughtExceptionSkip(boolean suspendOnCompErr) throws Exception {
setPreferences(false, suspendOnCompErr, SuspendOnRecurrenceStrategy.SKIP_RECURRENCES);
String typeName = "ErrorRecurrence";
IJavaExceptionBreakpoint ex = createExceptionBreakpoint("java.lang.Error", true, true);
IJavaThread thread = null;
try {
thread = launchToBreakpoint(typeName);
assertNotNull("1. Breakpoint not hit within timeout period", thread);
assertEquals("Line of 1. suspend", 26, thread.getTopStackFrame().getLineNumber());
assertExceptionBreakpointHit(thread, ex);
// L20 skipped recurrence
// L12 suspend on uncaught disabled
resumeAndExit(thread);
ex.delete();
} finally {
terminateAndRemove(thread);
removeAllBreakpoints();
}
}
private void assertExceptionBreakpointHit(IJavaThread thread, IJavaExceptionBreakpoint ex) throws DebugException {
IMarker problem = JavaDebugOptionsManager.getDefault().getProblem((IJavaStackFrame) thread.getTopStackFrame());
if (problem != null) {
fail("unexpected problem marker "+problem);
}
IBreakpoint hit = getBreakpoint(thread);
assertNotNull("suspended, but not by breakpoint", hit);
assertEquals("suspended, but not by expected exception", ex.getExceptionTypeName(), ((IJavaExceptionBreakpoint) hit).getExceptionTypeName());
}
}