blob: 9d3f330fb38bc50f910f8953fa51ade564655328 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2005 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 org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.IValue;
import org.eclipse.jdt.debug.core.IJavaDebugTarget;
import org.eclipse.jdt.debug.core.IJavaExceptionBreakpoint;
import org.eclipse.jdt.debug.core.IJavaFieldVariable;
import org.eclipse.jdt.debug.core.IJavaLineBreakpoint;
import org.eclipse.jdt.debug.core.IJavaMethodBreakpoint;
import org.eclipse.jdt.debug.core.IJavaObject;
import org.eclipse.jdt.debug.core.IJavaStackFrame;
import org.eclipse.jdt.debug.core.IJavaThread;
import org.eclipse.jdt.debug.core.IJavaVariable;
import org.eclipse.jdt.debug.core.IJavaWatchpoint;
import org.eclipse.jdt.debug.tests.AbstractDebugTest;
/**
* Tests instance filters on breakpoints.
*
* These tests only "run" on VMs that support instance breakpoints,
* such as JDK 1.4.1.
*/
public class InstanceFilterTests extends AbstractDebugTest {
public InstanceFilterTests(String name) {
super(name);
}
/**
* Instance filter on a line breakpoint
*
* @throws Exception
*/
public void testLineBreakpoint() throws Exception {
String typeName = "InstanceFilterObject";
// main
IJavaLineBreakpoint mainBreakpoint = createLineBreakpoint(39, typeName);
// simpleMethod
IJavaLineBreakpoint simpleMethod = createLineBreakpoint(19, typeName);
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("hit wrong breakpoint", mainBreakpoint, hit);
// can only do test if the VM supports instance filters
if (supportsInstanceBreakpoints(thread)) {
// restrict breakpoint in simpleMethod to object 1
IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
assertNotNull(frame);
IJavaVariable var1 = findVariable(frame, "object1");
IJavaVariable var2 = findVariable(frame, "object2");
assertNotNull(var1);
assertNotNull(var2);
IJavaObject object1 = (IJavaObject)var1.getValue();
IJavaObject object2 = (IJavaObject)var2.getValue();
assertNotNull(object1);
assertNotNull(object2);
simpleMethod.addInstanceFilter(object1);
// resume the thread
thread= resume(thread);
IBreakpoint[] breakpoints = thread.getBreakpoints();
assertEquals("should be a breakpoint", 1, breakpoints.length);
assertEquals("should be in simpleMethod", simpleMethod, breakpoints[0]);
// receiver should be object1
frame = (IJavaStackFrame)thread.getTopStackFrame();
assertNotNull(frame);
IJavaObject receiver = frame.getThis();
assertEquals("should be in object1 context", object1, receiver);
}
} finally {
terminateAndRemove(thread);
removeAllBreakpoints();
}
}
/**
* Instance filter on a method entry breakpoint
*
* @throws Exception
*/
public void testMethodEntryBreakpoint() throws Exception {
String typeName = "InstanceFilterObject";
// main
IJavaLineBreakpoint mainBreakpoint = createLineBreakpoint(39, typeName);
// simpleMethod
IJavaMethodBreakpoint simpleMethod = createMethodBreakpoint(typeName, "simpleMethod", "()V", 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("hit wrong breakpoint", mainBreakpoint, hit);
// can only do test if the VM supports instance filters
if (supportsInstanceBreakpoints(thread)) {
// restrict breakpoint in simpleMethod to object 1
IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
assertNotNull(frame);
IJavaVariable var1 = findVariable(frame, "object1");
IJavaVariable var2 = findVariable(frame, "object2");
assertNotNull(var1);
assertNotNull(var2);
IJavaObject object1 = (IJavaObject)var1.getValue();
IJavaObject object2 = (IJavaObject)var2.getValue();
assertNotNull(object1);
assertNotNull(object2);
simpleMethod.addInstanceFilter(object1);
// resume the thread
thread= resume(thread);
IBreakpoint[] breakpoints = thread.getBreakpoints();
assertEquals("should be a breakpoint", 1, breakpoints.length);
assertEquals("should be in simpleMethod", simpleMethod, breakpoints[0]);
// receiver should be object1
frame = (IJavaStackFrame)thread.getTopStackFrame();
assertNotNull(frame);
IJavaObject receiver = frame.getThis();
assertEquals("should be in object1 context", object1, receiver);
// method should not have executed yet
IJavaFieldVariable boolVar = receiver.getField("executedSimpleMethod",false);
assertNotNull(boolVar);
IValue value = boolVar.getValue();
assertEquals("method should not have executed", ((IJavaDebugTarget)frame.getDebugTarget()).newValue(false), value);
}
} finally {
terminateAndRemove(thread);
removeAllBreakpoints();
}
}
/**
* Instance filter on a method exit breakpoint
*
* @throws Exception
*/
public void testMethodExitBreakpoint() throws Exception {
String typeName = "InstanceFilterObject";
// main
IJavaLineBreakpoint mainBreakpoint = createLineBreakpoint(39, typeName);
// simpleMethod
IJavaMethodBreakpoint simpleMethod = createMethodBreakpoint(typeName, "simpleMethod", "()V", 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("hit wrong breakpoint", mainBreakpoint, hit);
// can only do test if the VM supports instance filters
if (supportsInstanceBreakpoints(thread)) {
// restrict breakpoint in simpleMethod to object 1
IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
assertNotNull(frame);
IJavaVariable var1 = findVariable(frame, "object1");
IJavaVariable var2 = findVariable(frame, "object2");
assertNotNull(var1);
assertNotNull(var2);
IJavaObject object1 = (IJavaObject)var1.getValue();
IJavaObject object2 = (IJavaObject)var2.getValue();
assertNotNull(object1);
assertNotNull(object2);
simpleMethod.addInstanceFilter(object1);
// resume the thread
thread= resume(thread);
IBreakpoint[] breakpoints = thread.getBreakpoints();
assertEquals("should be a breakpoint", 1, breakpoints.length);
assertEquals("should be in simpleMethod", simpleMethod, breakpoints[0]);
// receiver should be object1
frame = (IJavaStackFrame)thread.getTopStackFrame();
assertNotNull(frame);
IJavaObject receiver = frame.getThis();
assertEquals("should be in object1 context", object1, receiver);
// method should have executed
IJavaFieldVariable boolVar = receiver.getField("executedSimpleMethod",false);
assertNotNull(boolVar);
IValue value = boolVar.getValue();
assertEquals("method should have executed", ((IJavaDebugTarget)frame.getDebugTarget()).newValue(true), value);
}
} finally {
terminateAndRemove(thread);
removeAllBreakpoints();
}
}
/**
* Instance filter on an exception breakpoint
*
* @throws Exception
*/
public void testExceptionBreakpoint() throws Exception {
String typeName = "InstanceFilterObject";
// main
IJavaLineBreakpoint mainBreakpoint = createLineBreakpoint(39, typeName);
// exception breakpoint
IJavaExceptionBreakpoint npe = createExceptionBreakpoint("java.lang.NullPointerException", true, 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("hit wrong breakpoint", mainBreakpoint, hit);
// can only do test if the VM supports instance filters
if (supportsInstanceBreakpoints(thread)) {
// restrict breakpoint in simpleMethod to object 1
IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
assertNotNull(frame);
IJavaVariable var1 = findVariable(frame, "object1");
IJavaVariable var2 = findVariable(frame, "object2");
assertNotNull(var1);
assertNotNull(var2);
IJavaObject object1 = (IJavaObject)var1.getValue();
IJavaObject object2 = (IJavaObject)var2.getValue();
assertNotNull(object1);
assertNotNull(object2);
npe.addInstanceFilter(object1);
// resume the thread
thread= resume(thread);
IBreakpoint[] breakpoints = thread.getBreakpoints();
assertEquals("should be a breakpoint", 1, breakpoints.length);
assertEquals("should be in throwNPE", npe, breakpoints[0]);
// receiver should be object1
frame = (IJavaStackFrame)thread.getTopStackFrame();
assertNotNull(frame);
IJavaObject receiver = frame.getThis();
assertEquals("should be in object1 context", object1, receiver);
}
} finally {
terminateAndRemove(thread);
removeAllBreakpoints();
}
}
/**
* Instance filter on an access watchpoint
*
* @throws Exception
*/
public void testAccessWatchpoint() throws Exception {
String typeName = "InstanceFilterObject";
// main
IJavaLineBreakpoint mainBreakpoint = createLineBreakpoint(39, typeName);
// exception breakpoint
IJavaWatchpoint watchpoint = createWatchpoint(typeName, "field", 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("hit wrong breakpoint", mainBreakpoint, hit);
// can only do test if the VM supports instance filters
if (supportsInstanceBreakpoints(thread)) {
// restrict breakpoint in simpleMethod to object 1
IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
assertNotNull(frame);
IJavaVariable var1 = findVariable(frame, "object1");
IJavaVariable var2 = findVariable(frame, "object2");
assertNotNull(var1);
assertNotNull(var2);
IJavaObject object1 = (IJavaObject)var1.getValue();
IJavaObject object2 = (IJavaObject)var2.getValue();
assertNotNull(object1);
assertNotNull(object2);
watchpoint.addInstanceFilter(object1);
// resume the thread
thread= resume(thread);
IBreakpoint[] breakpoints = thread.getBreakpoints();
assertEquals("should be a breakpoint", 1, breakpoints.length);
assertEquals("should be in access method", watchpoint, breakpoints[0]);
// in "accessField"
frame = (IJavaStackFrame)thread.getTopStackFrame();
assertNotNull(frame);
assertEquals("should be in access method", "accessField", frame.getMethodName());
// receiver should be object1
IJavaObject receiver = frame.getThis();
assertEquals("should be in object1 context", object1, receiver);
}
} finally {
terminateAndRemove(thread);
removeAllBreakpoints();
}
}
/**
* Instance filter on an modification watchpoint
*
* @throws Exception
*/
public void testModificationWatchpoint() throws Exception {
String typeName = "InstanceFilterObject";
// main
IJavaLineBreakpoint mainBreakpoint = createLineBreakpoint(39, typeName);
// exception breakpoint
IJavaWatchpoint watchpoint = createWatchpoint(typeName, "field", false, true);
// disable to avoid variable initializer
watchpoint.setEnabled(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("hit wrong breakpoint", mainBreakpoint, hit);
// can only do test if the VM supports instance filters
if (supportsInstanceBreakpoints(thread)) {
// restrict breakpoint in simpleMethod to object 1
IJavaStackFrame frame = (IJavaStackFrame)thread.getTopStackFrame();
assertNotNull(frame);
IJavaVariable var1 = findVariable(frame, "object1");
IJavaVariable var2 = findVariable(frame, "object2");
assertNotNull(var1);
assertNotNull(var2);
IJavaObject object1 = (IJavaObject)var1.getValue();
IJavaObject object2 = (IJavaObject)var2.getValue();
assertNotNull(object1);
assertNotNull(object2);
watchpoint.addInstanceFilter(object1);
// enable watchpoint
watchpoint.setEnabled(true);
// resume the thread
thread= resume(thread);
IBreakpoint[] breakpoints = thread.getBreakpoints();
assertEquals("should be a breakpoint", 1, breakpoints.length);
assertEquals("should be in modification method", watchpoint, breakpoints[0]);
// in "modifyField"
frame = (IJavaStackFrame)thread.getTopStackFrame();
assertNotNull(frame);
assertEquals("should be in modify method", "modifyField", frame.getMethodName());
// receiver should be object1
IJavaObject receiver = frame.getThis();
assertEquals("should be in object1 context", object1, receiver);
}
} finally {
terminateAndRemove(thread);
removeAllBreakpoints();
}
}
/**
* Returns whether the associated target supports instance breakpoints
*
* @param thread
* @return boolean
*/
private boolean supportsInstanceBreakpoints(IJavaThread thread) {
IJavaDebugTarget target = (IJavaDebugTarget)thread.getDebugTarget();
return target.supportsInstanceBreakpoints();
}
}