blob: ff30194c9e120bf2efd71366db0f4572ae4826ec [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2015 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.debug.tests.breakpoints;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.IMarkerDelta;
import org.eclipse.core.runtime.IPath;
import org.eclipse.debug.core.IBreakpointListener;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.sourcelookup.containers.LocalFileStorage;
import org.eclipse.debug.internal.ui.DebugUIPlugin;
import org.eclipse.debug.ui.actions.IToggleBreakpointsTarget;
import org.eclipse.debug.ui.actions.IToggleBreakpointsTargetExtension;
import org.eclipse.jdt.debug.testplugin.JavaTestPlugin;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
import org.eclipse.jdt.internal.debug.ui.LocalFileStorageEditorInput;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.ITextEditor;
/**
* Tests the Java debugger's 'toggle breakpoints target'.
*/
public abstract class AbstractToggleBreakpointsTarget extends AbstractDebugTest {
class Listener implements IBreakpointListener {
List<IBreakpoint> added = new ArrayList<>();
List<IBreakpoint> removed = new ArrayList<>();
@Override
public void breakpointAdded(IBreakpoint breakpoint) {
synchronized (added) {
added.add(breakpoint);
added.notifyAll();
}
}
@Override
public void breakpointRemoved(IBreakpoint breakpoint, IMarkerDelta delta) {
synchronized (removed) {
removed.add(breakpoint);
removed.notifyAll();
}
}
@Override
public void breakpointChanged(IBreakpoint breakpoint, IMarkerDelta delta) {
}
public IBreakpoint getAdded() throws Exception {
synchronized (added) {
if (added.isEmpty()) {
added.wait(DEFAULT_TIMEOUT);
}
}
assertFalse("Breakpoint not added", added.isEmpty());
return added.get(0);
}
public boolean isEmpty() throws Exception{
synchronized (added) {
if (added.isEmpty()) {
added.wait(DEFAULT_TIMEOUT);
return true;
}
}
return false;
}
public IBreakpoint getRemoved() throws Exception {
synchronized (removed) {
if (removed.isEmpty()) {
removed.wait(DEFAULT_TIMEOUT);
}
}
assertFalse("Breakpoint not removed", removed.isEmpty());
return removed.get(0);
}
}
public AbstractToggleBreakpointsTarget(String name) {
super(name);
}
/**
* Opens an editor on the given external file and toggles a breakpoint.
*
* @param externalFile path to external file in the test plug-in
* @param line line number (1 based)
* @throws Exception on failure
*/
protected void toggleBreakpoint(final IPath externalFile, final int line) throws Exception {
final Exception[] exs = new Exception[1];
DebugUIPlugin.getStandardDisplay().syncExec(new Runnable() {
@Override
public void run() {
try {
File file = JavaTestPlugin.getDefault().getFileInPlugin(externalFile);
LocalFileStorage storage = new LocalFileStorage(file);
IEditorPart editor = DebugUIPlugin.getActiveWorkbenchWindow().getActivePage().openEditor(new LocalFileStorageEditorInput(storage), JavaUI.ID_CU_EDITOR);
ITextEditor textEditor = (ITextEditor) editor;
IEditorInput editorInput = textEditor.getEditorInput();
IDocumentProvider documentProvider = textEditor.getDocumentProvider();
IDocument document = documentProvider.getDocument(editorInput);
int offset = document.getLineOffset(line);
IToggleBreakpointsTargetExtension toggle = (IToggleBreakpointsTargetExtension) editor.getAdapter(IToggleBreakpointsTarget.class);
toggle.toggleBreakpoints(editor, new TextSelection(document, offset, 0));
} catch (Exception e) {
exs[0] = e;
}
}
});
if (exs[0] != null) {
throw exs[0];
}
}
}