/******************************************************************************* | |
* Copyright (c) 2010 Nokia 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: | |
* Nokia - Initial API and implementation | |
*******************************************************************************/ | |
package org.eclipse.cdt.debug.edc.debugger.tests; | |
import java.util.Map; | |
import java.util.concurrent.TimeUnit; | |
import org.eclipse.cdt.core.IAddress; | |
import org.eclipse.cdt.debug.edc.internal.EDCDebugger; | |
import org.eclipse.cdt.debug.edc.internal.services.dsf.Breakpoints; | |
import org.eclipse.cdt.debug.edc.services.EDCServicesTracker; | |
import org.eclipse.cdt.debug.edc.tests.EDCTestPlugin; | |
import org.eclipse.cdt.debug.edc.tests.TestReflectionHelper; | |
import org.eclipse.cdt.debug.edc.tests.TestUtils; | |
import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; | |
import org.eclipse.cdt.dsf.concurrent.Query; | |
import org.eclipse.cdt.dsf.datamodel.DMContexts; | |
import org.eclipse.cdt.dsf.debug.service.IBreakpoints; | |
import org.eclipse.core.resources.IMarker; | |
import org.eclipse.core.runtime.IStatus; | |
import org.eclipse.core.runtime.Status; | |
import org.eclipse.debug.core.model.ISourceLocator; | |
import org.junit.AfterClass; | |
import org.junit.Assert; | |
import org.junit.BeforeClass; | |
import org.junit.Test; | |
/** | |
* Test that we can recover expressions from stack frames other than the TOS | |
*/ | |
public class BreakpointsServiceTest { | |
private static final String dbg_derived_types_cpp | |
= "C:\\myprog\\BlackFlagWascana\\src\\dbg_derived_types.cpp"; //$NON-NLS-1$ | |
private static Breakpoints breakpointsService; | |
private static IBreakpoints.IBreakpointDMContext testUserBreakpoint; | |
private static IBreakpoints.IBreakpointsTargetDMContext breakDMC; | |
private static BaseLaunchTest simpleLaunch; | |
@BeforeClass | |
public static void setUpClass() throws Exception { | |
simpleLaunch = new BaseLaunchTest() { | |
@Override | |
protected String getExeFileName() { | |
// This is the executable built by Cygwin gcc 3.4.4 | |
// All source files are built from this folder: | |
// "C:\\myprog\\BlackFlagWascana\\src\\" | |
// Note we don't need any source file to perform the test. | |
// | |
// used because the locations of certain line numbers are known, | |
// not because there's no hardcoded break | |
return "BlackFlagMinGW_NoHardcodedBreak.exe"; //$NON-NLS-1$ | |
} | |
@Override | |
protected boolean getStopAtMain() { | |
return true; | |
} | |
}; | |
simpleLaunch.basicLaunch(); | |
EDCServicesTracker edcTracker | |
= new EDCServicesTracker( | |
EDCDebugger.getBundleContext(), simpleLaunch.session.getId()); | |
Assert.assertNotNull(edcTracker); | |
breakpointsService = edcTracker.getService(Breakpoints.class); | |
Assert.assertNotNull(breakpointsService); | |
breakDMC = DMContexts.getAncestorOfType(simpleLaunch.threadDMC, IBreakpoints.IBreakpointsTargetDMContext.class); | |
testUserBreakpoint = simpleLaunch.setUserBreakpoint(breakpointsService, dbg_derived_types_cpp, 57); | |
Assert.assertNotNull(testUserBreakpoint); | |
} | |
@AfterClass | |
public static void shutdown() { | |
TestUtils.shutdownDebugSession(simpleLaunch.launch, simpleLaunch.session); | |
breakDMC = null; | |
breakpointsService = null; | |
testUserBreakpoint = null; | |
simpleLaunch = null; | |
} | |
@Test | |
public void testBreakpointDMContextToString() { | |
Assert.assertTrue(testUserBreakpoint.toString().startsWith("BreakpointDMContext [id=")); | |
} | |
@Test | |
public void testGetBreakpointDMData() throws Exception { | |
Query<IBreakpoints.IBreakpointDMData> query = new Query<IBreakpoints.IBreakpointDMData>() { | |
@Override | |
protected void execute(final DataRequestMonitor<IBreakpoints.IBreakpointDMData> drm) { | |
breakpointsService.getBreakpointDMData(testUserBreakpoint, drm); | |
} | |
}; | |
simpleLaunch.session.getExecutor().execute(query); | |
IBreakpoints.IBreakpointDMData dmData = query.get(3, TimeUnit.SECONDS); | |
Assert.assertTrue(query.isDone()); | |
Assert.assertTrue(dmData instanceof Breakpoints.BreakpointDMData); | |
Breakpoints.BreakpointDMData breakData = (Breakpoints.BreakpointDMData)dmData; | |
IAddress testUserBreakpointAddress = simpleLaunch.waitGetLineAddress(dbg_derived_types_cpp, 57); | |
Assert.assertTrue(dmData.equals(breakpointsService.findBreakpoint(testUserBreakpointAddress))); | |
Assert.assertEquals(testUserBreakpointAddress, breakData.getAddresses()[0]); | |
Assert.assertEquals(Breakpoints.BREAKPOINT, breakData.getBreakpointType()); | |
Assert.assertEquals("", breakData.getCondition()); | |
Assert.assertSame(testUserBreakpoint, breakData.getContext()); | |
Assert.assertNull(breakData.getExpression()); | |
Assert.assertEquals(dbg_derived_types_cpp, breakData.getFileName()); | |
Assert.assertNull(breakData.getFunctionName()); | |
Assert.assertFalse(-1 == breakData.getID()); // yuck, a coverage call | |
Assert.assertEquals(0, breakData.getIgnoreCount()); | |
Assert.assertEquals(57, breakData.getLineNumber()); | |
if (! breakpointsService.usesTCFBreakpointService()) | |
Assert.assertNotNull(breakData.getOriginalInstruction()); | |
else | |
Assert.assertNull(breakData.getOriginalInstruction()); | |
Assert.assertEquals(dmData.hashCode(), breakData.hashCode()); | |
Assert.assertTrue(breakData.isEnabled()); | |
breakData.incrementHitCount(); | |
Assert.assertEquals(1, breakData.getHitCount()); | |
Map<String, Object> props = breakData.getProperties(); | |
props.put("BreakpointServiceTestKey", "BreakpointsServiceTestValue"); | |
breakData.setProperties(props); | |
Assert.assertEquals(props, breakData.getProperties()); | |
} | |
@Test | |
public void testGetBreakpoints() throws Exception { | |
Query<IBreakpoints.IBreakpointDMContext[]> query = new Query<IBreakpoints.IBreakpointDMContext[]>() { | |
@Override | |
protected void execute(final DataRequestMonitor<IBreakpoints.IBreakpointDMContext[]> drm) { | |
breakpointsService.getBreakpoints(breakDMC, drm); | |
} | |
}; | |
simpleLaunch.session.getExecutor().execute(query); | |
IBreakpoints.IBreakpointDMContext[] userBreakpoints | |
= query.get(3, TimeUnit.SECONDS); | |
Assert.assertTrue(query.isDone()); | |
Assert.assertEquals(1, userBreakpoints.length); | |
Assert.assertSame(testUserBreakpoint, userBreakpoints[0]); | |
} | |
/** | |
* TODO coverage test only | |
* - Breakpoints#addBreakpointProblemMarker() isn't yet properly set up to | |
* to create a problem marker for something that's not a platform breakpoint | |
* @throws Exception | |
*/ | |
@Test | |
public void coverageAddBreakpointProblemMarker() throws Exception { | |
final Object[] args | |
= new Object[] {testUserBreakpoint, "Test problem marker", IMarker.SEVERITY_INFO}; | |
final Class<?>[] argClasses | |
= new Class<?>[] { IBreakpoints.IBreakpointDMContext.class, String.class, int.class }; | |
Query<Boolean> query = new Query<Boolean>() { | |
@Override | |
protected void execute(final DataRequestMonitor<Boolean> drm) { | |
try { | |
TestReflectionHelper.objectFromPrivateFunctionWithArgs( | |
breakpointsService, "addBreakpointProblemMarker", | |
args, argClasses); | |
} catch (Exception e) { | |
drm.setStatus(new Status(IStatus.ERROR, EDCTestPlugin.PLUGIN_ID, | |
"exception thrown invoking Breakpoints#addBreakpointProblemMarker()"//$NON-NLS-1$ | |
+ e.getLocalizedMessage())); | |
} | |
drm.done(); | |
} | |
}; | |
simpleLaunch.session.getExecutor().execute(query); | |
query.get(3, TimeUnit.SECONDS); | |
Assert.assertTrue(query.isDone()); | |
} | |
/** | |
* TODO coverage test only | |
* - just see if it's the expected class on top for now | |
* @throws Exception | |
*/ | |
@Test | |
public void coverageGetSourceLocator() { | |
ISourceLocator sourceLocator = breakpointsService.getSourceLocator(); | |
Assert.assertEquals("class org.eclipse.cdt.dsf.debug.sourcelookup.DsfSourceLookupDirector", | |
sourceLocator.getClass().toString()); | |
} | |
/** | |
* TODO coverage test only | |
* - this does a little work, but it's really only a coverage test, | |
* the breakpoint really hasn't been updated, and even if the | |
* event is propagated, this test isn't equipped to tell how | |
* @throws Exception | |
*/ | |
@Test | |
public void coverageBreakpointsBreakpointUpdatedEvent() { | |
Breakpoints.BreakpointUpdatedEvent breakUpdated | |
= breakpointsService.new BreakpointUpdatedEvent(testUserBreakpoint); | |
IBreakpoints.IBreakpointDMContext[] eventBreakpoints = breakUpdated.getBreakpoints(); | |
Assert.assertEquals(1, eventBreakpoints.length); | |
Assert.assertSame(testUserBreakpoint, eventBreakpoints[0]); | |
Assert.assertSame(breakDMC, breakUpdated.getDMContext()); | |
} | |
/** | |
* TODO coverage test only | |
* - this does a little work, but it's really only a coverage test, | |
* the breakpoint really hasn't been removed, and even if the | |
* event is propagated, this test isn't equipped to tell how | |
* @throws Exception | |
*/ | |
@Test | |
public void coverageBreakpointsBreakpointRemovedEvent() { | |
Breakpoints.BreakpointRemovedEvent breakRemoved | |
= breakpointsService.new BreakpointRemovedEvent(testUserBreakpoint); | |
IBreakpoints.IBreakpointDMContext[] eventBreakpoints = breakRemoved.getBreakpoints(); | |
Assert.assertEquals(1, eventBreakpoints.length); | |
Assert.assertSame(testUserBreakpoint, eventBreakpoints[0]); | |
Assert.assertSame(breakDMC, breakRemoved.getDMContext()); | |
} | |
} |