1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-06 17:26:01 +02:00

Bug 456959 - Unit tests for bp after restart bug

Change-Id: Id25d6a6c7c2e094b5308ca42e2f1fa24c260f6af
Signed-off-by: Marc Khouzam <marc.khouzam@ericsson.com>
This commit is contained in:
Marc Khouzam 2015-01-07 14:49:09 -05:00 committed by Gerrit Code Review @ Eclipse.org
parent 686ad904b2
commit 8855a845a3

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2007, 2014 Ericsson and others.
* Copyright (c) 2007, 2015 Ericsson 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
@ -18,9 +18,12 @@ import static org.junit.Assert.assertTrue;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
import org.eclipse.cdt.debug.core.model.ICBreakpoint;
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor;
import org.eclipse.cdt.dsf.concurrent.Query;
import org.eclipse.cdt.dsf.concurrent.RequestMonitor;
import org.eclipse.cdt.dsf.datamodel.DMContexts;
import org.eclipse.cdt.dsf.datamodel.IDMContext;
@ -40,6 +43,7 @@ import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext;
import org.eclipse.cdt.dsf.debug.service.IStack.IFrameDMContext;
import org.eclipse.cdt.dsf.gdb.internal.GdbDebugOptions;
import org.eclipse.cdt.dsf.gdb.internal.GdbPlugin;
import org.eclipse.cdt.dsf.gdb.service.command.IGDBControl;
import org.eclipse.cdt.dsf.mi.service.MIBreakpointDMData;
import org.eclipse.cdt.dsf.mi.service.MIBreakpoints;
import org.eclipse.cdt.dsf.mi.service.MIBreakpoints.MIBreakpointDMContext;
@ -48,6 +52,7 @@ import org.eclipse.cdt.dsf.mi.service.command.events.MIBreakpointHitEvent;
import org.eclipse.cdt.dsf.mi.service.command.events.MIStoppedEvent;
import org.eclipse.cdt.dsf.mi.service.command.events.MIWatchpointScopeEvent;
import org.eclipse.cdt.dsf.mi.service.command.events.MIWatchpointTriggerEvent;
import org.eclipse.cdt.dsf.mi.service.command.output.MIInfo;
import org.eclipse.cdt.dsf.service.DsfServiceEventHandler;
import org.eclipse.cdt.dsf.service.DsfServicesTracker;
import org.eclipse.cdt.dsf.service.DsfSession;
@ -56,6 +61,9 @@ import org.eclipse.cdt.tests.dsf.gdb.framework.BackgroundRunner;
import org.eclipse.cdt.tests.dsf.gdb.framework.BaseTestCase;
import org.eclipse.cdt.tests.dsf.gdb.framework.SyncUtil;
import org.eclipse.cdt.tests.dsf.gdb.launching.TestsPlugin;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IBreakpointManager;
import org.eclipse.debug.core.model.IBreakpoint;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@ -94,6 +102,7 @@ public class MIBreakpointsTest extends BaseTestCase {
protected MIRunControl fRunControl;
protected IBreakpoints fBreakpointService;
protected IExpressions fExpressionService;
protected IGDBControl fCommandControl;
// Event Management
protected static Boolean lock = true;
@ -192,6 +201,9 @@ public class MIBreakpointsTest extends BaseTestCase {
fExpressionService = fServicesTracker.getService(IExpressions.class);
assert(fExpressionService != null);
fCommandControl = fServicesTracker.getService(IGDBControl.class);
assert(fCommandControl != null);
// Register to breakpoint events
fRunControl.getSession().addServiceEventListener(MIBreakpointsTest.this, null);
@ -2799,6 +2811,118 @@ public class MIBreakpointsTest extends BaseTestCase {
assertTrue("Did not stop because of the correct breakpoint at line " + LINE_NUMBER_5,
((MIBreakpointHitEvent)event).getNumber() == breakpoint1.getReference());
}
private void queueConsoleCommand(final String command) throws Throwable {
Query<MIInfo> query = new Query<MIInfo>() {
@Override
protected void execute(DataRequestMonitor<MIInfo> rm) {
fCommandControl.queueCommand(
fCommandControl.getCommandFactory().createMIInterpreterExecConsole(
fCommandControl.getContext(),
command),
rm);
}
};
fSession.getExecutor().execute(query);
query.get(20000, TimeUnit.MILLISECONDS);
}
private void deleteAllPlatformBreakpoints() throws Exception {
IBreakpointManager bm = DebugPlugin.getDefault().getBreakpointManager();
for (IBreakpoint b : bm.getBreakpoints()) {
bm.removeBreakpoint(b, true);
}
}
// ------------------------------------------------------------------------
// Bug 456959
// updateBreakpoint_AfterRestart
// Create a platform breakpoint and see that it gets hit.
// Then restart the execution, do some modification to the breakpoint
// to force an update, and verify it still hits.
// ------------------------------------------------------------------------
@Test
public void updateBreakpoint_AfterRestart() throws Throwable {
try {
// Create a line breakpoint in the platform. To do that, create a bp from
// the gdb console and let CDT create the corresponding platform bp.
queueConsoleCommand(String.format("break %s:%d", SOURCE_NAME, LINE_NUMBER_5));
IBreakpointDMContext[] bps = getBreakpoints(fBreakpointsDmc);
assertEquals(1, bps.length);
// Ensure that right BreakpointEvents were received
waitForBreakpointEvent(2);
assertTrue("BreakpointEvent problem: expected " + 2 + " BREAKPOINT event(s), received "
+ fBreakpointEventCount, fBreakpointEventCount == 2);
assertTrue("BreakpointEvent problem: expected " + 1 + " BREAKPOINT_ADDED event(s), received "
+ getBreakpointEventCount(BP_ADDED), getBreakpointEventCount(BP_ADDED) == 1);
assertTrue("BreakpointEvent problem: expected " + 1 + " BREAKPOINT_UPDATED event(s), received "
+ getBreakpointEventCount(BP_UPDATED), getBreakpointEventCount(BP_UPDATED) == 1);
clearEventCounters();
// Run the program
SyncUtil.resume();
// Wait for breakpoint to hit and for the expected number of breakpoint events to have occurred
MIStoppedEvent event = SyncUtil.waitForStop(3000);
assertTrue("Did not stop on our enabled breakpoint!",
event instanceof MIBreakpointHitEvent);
MIBreakpointDMData bpData = (MIBreakpointDMData)getBreakpoint(bps[0]);
assertTrue("Did not stop because of the correct breakpoint at line " + LINE_NUMBER_5,
((MIBreakpointHitEvent)event).getNumber() == bpData.getReference());
// Ensure that right BreakpointEvents were received
waitForBreakpointEvent(1);
assertTrue("BreakpointEvent problem: expected " + 1 + " BREAKPOINT event(s), received "
+ fBreakpointEventCount, fBreakpointEventCount == 1);
assertTrue("BreakpointEvent problem: expected " + 1 + " BREAKPOINT_HIT event(s), received "
+ getBreakpointEventCount(BP_HIT), getBreakpointEventCount(BP_HIT) == 1);
clearEventCounters();
// Restart the program
SyncUtil.restart(getGDBLaunch());
clearEventCounters();// Clear after restart to ignore the bp hit at main
bps = getBreakpoints(fBreakpointsDmc);
assertEquals(1, bps.length);
IBreakpointManager bm = DebugPlugin.getDefault().getBreakpointManager();
IBreakpoint[] breakpoints = bm.getBreakpoints();
assertEquals(1, breakpoints.length);
breakpoints[0].getMarker().setAttribute(ICBreakpoint.CONDITION, "1==1");
// Ensure that right BreakpointEvents were received
waitForBreakpointEvent(1);
assertTrue("BreakpointEvent problem: expected " + 1 + " BREAKPOINT event(s), received "
+ fBreakpointEventCount, fBreakpointEventCount == 1);
assertTrue("BreakpointEvent problem: expected " + 1 + " BREAKPOINT_UPDATED event(s), received "
+ getBreakpointEventCount(BP_UPDATED), getBreakpointEventCount(BP_UPDATED) == 1);
clearEventCounters();
// Run the program
SyncUtil.resume();
// Wait for breakpoint to hit and for the expected number of breakpoint events to have occurred
event = SyncUtil.waitForStop(3000);
assertTrue("Did not stop on our enabled breakpoint!",
event instanceof MIBreakpointHitEvent);
bpData = (MIBreakpointDMData) getBreakpoint(bps[0]);
assertTrue("Did not stop because of the correct breakpoint at line " + LINE_NUMBER_5,
((MIBreakpointHitEvent)event).getNumber() == bpData.getReference());
// Ensure that right BreakpointEvents were received
waitForBreakpointEvent(1);
assertTrue("BreakpointEvent problem: expected " + 1 + " BREAKPOINT event(s), received "
+ fBreakpointEventCount, fBreakpointEventCount == 1);
assertTrue("BreakpointEvent problem: expected " + 1 + " BREAKPOINT_HIT event(s), received "
+ getBreakpointEventCount(BP_HIT), getBreakpointEventCount(BP_HIT) == 1);
clearEventCounters();
} finally {
deleteAllPlatformBreakpoints();
}
}
///////////////////////////////////////////////////////////////////////////
// Breakpoint Hit tests
///////////////////////////////////////////////////////////////////////////