blob: b6b3e0798921cd4923777e3e6580ae5b538cc1d3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007 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.core;
import static org.junit.Assert.assertNotEquals;
import java.lang.reflect.Method;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.debug.core.IJavaDebugTarget;
import org.eclipse.jdt.debug.core.IJavaLineBreakpoint;
import org.eclipse.jdt.debug.core.IJavaThread;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
import org.eclipse.jdt.internal.debug.core.model.JDIDebugTarget;
/**
* Tests IJavaDebugTarget API
*
* @since 3.4
*/
public class JavaDebugTargetTests extends AbstractDebugTest {
public JavaDebugTargetTests(String name) {
super(name);
}
public void testGetVMName() throws Exception {
String typeName = "Breakpoints";
createLineBreakpoint(52, typeName);
IJavaThread thread= null;
try {
// do not register launch - see bug 130911
thread= launchToBreakpoint(typeName, false);
assertNotNull("Breakpoint not hit within timeout period", thread);
IJavaDebugTarget target = (IJavaDebugTarget) thread.getDebugTarget();
String name = target.getVMName();
assertNotNull("Missing VM name", name);
} finally {
terminateAndRemove(thread);
removeAllBreakpoints();
}
}
public void testGetVersion() throws Exception {
String typeName = "Breakpoints";
createLineBreakpoint(52, typeName);
IJavaThread thread= null;
try {
// do not register launch - see bug 130911
thread= launchToBreakpoint(typeName, false);
assertNotNull("Breakpoint not hit within timeout period", thread);
IJavaDebugTarget target = (IJavaDebugTarget) thread.getDebugTarget();
String version = target.getVersion();
assertNotNull("Missing version property", version);
} finally {
terminateAndRemove(thread);
removeAllBreakpoints();
}
}
public void testIsAvailable() throws Exception {
String typeName = "Breakpoints";
createLineBreakpoint(52, typeName);
IJavaThread thread = null;
try {
// do not register launch - see bug 130911
thread = launchToBreakpoint(typeName, false);
assertNotNull("Breakpoint not hit within timeout period", thread);
JDIDebugTarget target = (JDIDebugTarget) thread.getDebugTarget();
assertTrue(target.isAvailable());
JDIDebugTargetProxy proxy = new JDIDebugTargetProxy(target);
assertTrue(proxy.isAvailable());
assertFalse(proxy.isDisconnecting());
assertFalse(proxy.isTerminating());
proxy.setDisconnecting(true);
assertFalse(proxy.isAvailable());
assertTrue(proxy.isDisconnecting());
assertFalse(proxy.isTerminating());
proxy.setDisconnecting(false);
assertTrue(proxy.isAvailable());
assertFalse(proxy.isDisconnecting());
assertFalse(proxy.isTerminating());
proxy.setTerminating(true);
assertFalse(proxy.isAvailable());
assertFalse(proxy.isDisconnecting());
assertTrue(proxy.isTerminating());
proxy.setTerminating(false);
assertTrue(proxy.isAvailable());
assertFalse(proxy.isDisconnecting());
assertFalse(proxy.isTerminating());
terminateAndRemove(thread);
assertFalse(proxy.isAvailable());
assertFalse(proxy.isDisconnecting());
assertFalse(proxy.isTerminating());
}
finally {
terminateAndRemove(thread);
removeAllBreakpoints();
}
}
/**
* Tests that debug target ignores breakpoints from unrelated projects, see bugs 5188 and 508524
*/
public void testSupportsResource() throws Exception {
String typeName = "org.eclipse.debug.tests.targets.HcrClass";
IJavaProject project1 = get14Project();
IJavaProject project2 = get15Project();
IType type1 = project1.findType(typeName);
IType type2 = project2.findType(typeName);
assertNotEquals(type1, type2);
// Types FQNs are same
assertEquals(type1.getFullyQualifiedName(), type2.getFullyQualifiedName());
// Paths are same, except the project part
assertEquals(type1.getResource().getFullPath().removeFirstSegments(1), type2.getResource().getFullPath().removeFirstSegments(1));
final int lineNumber = 21;
IJavaLineBreakpoint bp1 = createLineBreakpoint(type1, lineNumber);
IJavaLineBreakpoint bp2 = createLineBreakpoint(type2, lineNumber);
assertNotEquals(bp1, bp2);
IJavaThread thread = null;
try {
// Launch the first project config: the breakpoint from second one shouldn't be supported
thread = launchToBreakpoint(project1, typeName, typeName, true);
assertNotNull("Breakpoint not hit within timeout period", thread);
JDIDebugTarget target = (JDIDebugTarget) thread.getDebugTarget();
assertTrue(target.isAvailable());
assertEquals(1, target.getBreakpoints().size());
assertEquals(bp1, target.getBreakpoints().get(0));
assertTrue(target.supportsResource(() -> typeName, type1.getResource()));
assertFalse(target.supportsResource(() -> typeName, type2.getResource()));
terminateAndRemove(thread);
// Line above *deletes all breakpoints!*
bp1 = createLineBreakpoint(type1, lineNumber);
bp2 = createLineBreakpoint(type2, lineNumber);
assertNotEquals(bp1, bp2);
// Launch the second project config: the breakpoint from first one shouldn't be supported
thread = launchToBreakpoint(project2, typeName, typeName + CLONE_SUFFIX, true);
assertNotNull("Breakpoint not hit within timeout period", thread);
target = (JDIDebugTarget) thread.getDebugTarget();
assertTrue(target.isAvailable());
assertEquals(1, target.getBreakpoints().size());
assertEquals(bp2, target.getBreakpoints().get(0));
assertFalse(target.supportsResource(() -> typeName, type1.getResource()));
assertTrue(target.supportsResource(() -> typeName, type2.getResource()));
}
finally {
terminateAndRemove(thread);
removeAllBreakpoints();
}
}
static private class JDIDebugTargetProxy {
private JDIDebugTarget target;
public JDIDebugTargetProxy(JDIDebugTarget target) {
this.target = target;
}
public boolean isAvailable() {
return target.isAvailable();
}
public boolean isTerminating() throws Exception {
return callBooleanGetMethod("isTerminating");
}
public boolean isDisconnecting() throws Exception {
return callBooleanGetMethod("isDisconnecting");
}
public void setTerminating(boolean terminating) throws Exception {
callBooleanSetMethod("setTerminating", terminating);
}
public void setDisconnecting(boolean disconnecting) throws Exception {
callBooleanSetMethod("setDisconnecting", disconnecting);
}
private boolean callBooleanGetMethod(String name) throws Exception {
Method method = JDIDebugTarget.class.getDeclaredMethod(name);
method.setAccessible(true);
return (Boolean) method.invoke(target);
}
private void callBooleanSetMethod(String name, boolean arg) throws Exception {
Method method = JDIDebugTarget.class.getDeclaredMethod(name, boolean.class);
method.setAccessible(true);
method.invoke(target, Boolean.valueOf(arg));
}
}
}