blob: 39c127bfb880874b0c1f2cd4bd08b336680c4479 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2020 Paul Pazderski 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:
* Paul Pazderski - initial API and implementation
*******************************************************************************/
package org.eclipse.debug.tests.breakpoint;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.commands.operations.IOperationHistory;
import org.eclipse.core.commands.operations.IUndoContext;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IBreakpointManager;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.internal.core.BreakpointManager;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.internal.ui.views.breakpoints.BreakpointsView;
import org.eclipse.debug.tests.AbstractDebugTest;
import org.eclipse.debug.tests.TestUtil;
import org.eclipse.debug.ui.DebugUITools;
import org.eclipse.debug.ui.IDebugUIConstants;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.ui.PlatformUI;
import org.junit.Test;
public class BreakpointTests extends AbstractDebugTest {
private final IBreakpointManager bpm = DebugPlugin.getDefault().getBreakpointManager();
@Override
public void tearDown() throws Exception {
super.tearDown();
for (IBreakpoint bp : getTestBreakpoints()) {
bp.delete();
}
}
/**
* Get all {@link TestBreakpoint}s known by the default
* {@link BreakpointManager}.
*
* @return {@link TestBreakpoint}s or empty list
*/
private List<TestBreakpoint> getTestBreakpoints() {
List<TestBreakpoint> bps = new ArrayList<>();
for (IBreakpoint bp : bpm.getBreakpoints(TestBreakpoint.MODEL)) {
assertTrue(bp instanceof TestBreakpoint);
bps.add((TestBreakpoint) bp);
}
return bps;
}
/**
* Test for bug 424561 where a breakpoint is deleted and the sequence undo
* (recreate breakpoint), redo (delete again), undo (recreate breakpoint)
* does not recreate the breakpoint.
*/
@Test
public void testBug424561_undoRedoUndoGone() throws Exception {
boolean viewVisible = true;
BreakpointsView view = ((BreakpointsView) DebugUIPlugin.getActiveWorkbenchWindow().getActivePage().findView(IDebugUIConstants.ID_BREAKPOINT_VIEW));
if (view == null) {
viewVisible = false;
view = ((BreakpointsView) DebugUIPlugin.getActiveWorkbenchWindow().getActivePage().showView(IDebugUIConstants.ID_BREAKPOINT_VIEW));
}
assertNotNull("Failed to obtain breakpoint view.", view);
try {
String content = "Bug 424561";
TestBreakpoint bp = new TestBreakpoint(content);
IOperationHistory operationHistory = PlatformUI.getWorkbench().getOperationSupport().getOperationHistory();
IUndoContext context = DebugUITools.getBreakpointsUndoContext();
bpm.addBreakpoint(bp);
TestUtil.waitWhile(c -> c.getTestBreakpoints().size() == 0, this, testTimeout, c -> "Breakpoint is not created");
assertTrue("Breakpoint marker missing", bp.getMarker().exists());
assertTrue("Breakpoint not registered", bp.isRegistered());
DebugUITools.deleteBreakpoints(new IBreakpoint[] {
bp }, null, null);
assertTrue(operationHistory.canUndo(context));
TestUtil.waitWhile(c -> c.getTestBreakpoints().size() > 0, this, testTimeout, c -> "Breakpoint is not deleted");
assertFalse("Breakpoint marker not removed", bp.getMarker().exists());
assertFalse("Breakpoint still registered", bp.isRegistered());
operationHistory.undo(context, null, null);
assertTrue(operationHistory.canRedo(context));
TestUtil.waitWhile(c -> c.getTestBreakpoints().size() == 0, this, testTimeout, c -> "Breakpoint is not recreated");
bp = getTestBreakpoints().get(0);
assertEquals("Breakpoint attributes not correctly restored", content, bp.getText());
assertTrue("Breakpoint marker missing", bp.getMarker().exists());
assertTrue("Breakpoint not registered", bp.isRegistered());
operationHistory.redo(context, null, null);
assertTrue(operationHistory.canUndo(context));
TestUtil.waitWhile(c -> c.getTestBreakpoints().size() > 0, this, testTimeout, c -> "Breakpoint is not deleted");
assertFalse("Breakpoint marker not removed", bp.getMarker().exists());
assertFalse("Breakpoint still registered", bp.isRegistered());
operationHistory.undo(context, null, null);
assertTrue(operationHistory.canRedo(context));
TestUtil.waitWhile(c -> c.getTestBreakpoints().size() == 0, this, testTimeout, c -> "Breakpoint is not recreated");
bp = getTestBreakpoints().get(0);
assertEquals("Breakpoint attributes not correctly restored", content, bp.getText());
assertTrue("Breakpoint marker missing", bp.getMarker().exists());
assertTrue("Breakpoint not registered", bp.isRegistered());
final BreakpointsView finalView = view;
final TestBreakpoint finalBp = bp;
TestUtil.waitWhile(c -> {
TreeItem item = (TreeItem) finalView.getTreeModelViewer().testFindItem(finalBp);
return item == null || item.getText() == null || !item.getText().contains(content);
}, this, testTimeout, c -> "Breakpoint not restored in view");
} finally {
if (!viewVisible) {
DebugUIPlugin.getActiveWorkbenchWindow().getActivePage().hideView(view);
}
}
}
}