diff --git a/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/MIRunControlTest.java b/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/MIRunControlTest.java index a8dd296312d..9399cfe828b 100644 --- a/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/MIRunControlTest.java +++ b/dsf-gdb/org.eclipse.cdt.tests.dsf.gdb/src/org/eclipse/cdt/tests/dsf/gdb/tests/MIRunControlTest.java @@ -11,17 +11,24 @@ package org.eclipse.cdt.tests.dsf.gdb.tests; +import static org.junit.Assert.assertTrue; + import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; +import java.util.Arrays; +import java.util.LinkedList; import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.RequestMonitor; -import org.eclipse.cdt.dsf.debug.service.IRunControl; +import org.eclipse.cdt.dsf.concurrent.ThreadSafeAndProhibitedFromDsfExecutor; +import org.eclipse.cdt.dsf.datamodel.DMContexts; +import org.eclipse.cdt.dsf.datamodel.IDMContext; import org.eclipse.cdt.dsf.debug.service.IProcesses.IProcessDMContext; import org.eclipse.cdt.dsf.debug.service.IProcesses.IThreadDMContext; +import org.eclipse.cdt.dsf.debug.service.IRunControl; import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext; import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMContext; import org.eclipse.cdt.dsf.debug.service.IRunControl.IExecutionDMData; @@ -32,6 +39,7 @@ import org.eclipse.cdt.dsf.debug.service.IRunControl.StateChangeReason; import org.eclipse.cdt.dsf.debug.service.IRunControl.StepType; import org.eclipse.cdt.dsf.gdb.service.command.IGDBControl; import org.eclipse.cdt.dsf.mi.service.IMIExecutionDMContext; +import org.eclipse.cdt.dsf.mi.service.IMIProcessDMContext; import org.eclipse.cdt.dsf.mi.service.IMIProcesses; import org.eclipse.cdt.dsf.mi.service.IMIRunControl; import org.eclipse.cdt.dsf.mi.service.MIProcesses; @@ -165,6 +173,43 @@ public class MIRunControlTest extends BaseTestCase { } } + /** + * Utility method to return the process DM context. These tests launch a + * single process, thus only one such context is available. + * + *

+ * This must not be called from the DSF executor. + * + * @return the process context + * @throws InterruptedException + */ + @ThreadSafeAndProhibitedFromDsfExecutor("fSession.getExecutor()") + private IProcessDMContext getProcessContext() throws InterruptedException { + assert !fRunCtrl.getExecutor().isInExecutorThread(); + + final AsyncCompletionWaitor waitor = new AsyncCompletionWaitor(); + + fProcService.getProcessesBeingDebugged(fGDBCtrl.getContext(), new DataRequestMonitor(fRunCtrl.getExecutor(), null) { + @Override + protected void handleCompleted() { + if (isSuccess()) { + IDMContext[] contexts = getData(); + Assert.assertNotNull("invalid return value from service", contexts); + Assert.assertEquals("unexpected number of processes", contexts.length, 1); + IDMContext context = contexts[0]; + IProcessDMContext processContext = DMContexts.getAncestorOfType(context, IProcessDMContext.class); + Assert.assertNotNull("unexpected process context type ", processContext); + waitor.setReturnInfo(processContext); + } + } + + }); + + waitor.waitUntilDone(TestsPlugin.massageTimeout(2000)); + Assert.assertTrue(waitor.getMessage(), waitor.isOK()); + return (IProcessDMContext) waitor.getReturnInfo(); + } + /* * For Multi-threaded application - In case of one thread, Thread id should start with 1. */ @@ -184,15 +229,15 @@ public class MIRunControlTest extends BaseTestCase { wait.waitFinished(getStatus()); } }; + + final IProcessDMContext processContext = getProcessContext(); /* * Test getExecutionContexts() when only one thread exist. */ fRunCtrl.getExecutor().submit(new Runnable() { public void run() { - String pid = MIProcesses.UNIQUE_GROUP_ID; - IProcessDMContext procDmc = fProcService.createProcessContext(fGDBCtrl.getContext(), pid); - IContainerDMContext containerDmc = fProcService.createContainerContext(procDmc, pid); + IContainerDMContext containerDmc = fProcService.createContainerContext(processContext, ((IMIProcessDMContext)processContext).getProcId()); fRunCtrl.getExecutionContexts(containerDmc, rm); } }); @@ -208,14 +253,17 @@ public class MIRunControlTest extends BaseTestCase { Assert.assertNotNull(ctxts); Assert.assertEquals("Unexpected number of threads for a simple program", sProgramIsCygwin ? 2 : 1, ctxts.length); - IMIExecutionDMContext dmc = (IMIExecutionDMContext) ctxts[0]; - // Thread id for the main thread should be one - Assert.assertEquals(1, dmc.getThreadId()); - if (sProgramIsCygwin) { - dmc = (IMIExecutionDMContext) ctxts[1]; - Assert.assertEquals(2, dmc.getThreadId()); - } + // The ordering of the contexts is not deterministic + LinkedList ids = new LinkedList(Arrays.asList(new Integer[] {1})); + if (sProgramIsCygwin) { + ids.add(new Integer(2)); + } + + assertTrue(ids.remove(new Integer(((IMIExecutionDMContext)ctxts[0]).getThreadId()))); + if (sProgramIsCygwin) { + assertTrue(ids.remove(new Integer(((IMIExecutionDMContext)ctxts[1]).getThreadId()))); + } wait.waitReset(); } @@ -270,14 +318,14 @@ public class MIRunControlTest extends BaseTestCase { Assert.assertEquals("Thread created event is for wrong thread id", sProgramIsCygwin ? 3 : 2, ((IMIExecutionDMContext)startedEvent.getDMContext()).getThreadId()); + final IProcessDMContext processContext = getProcessContext(); + /* * Test getExecutionContexts for a valid container DMC */ fRunCtrl.getExecutor().submit(new Runnable() { public void run() { - String pid = MIProcesses.UNIQUE_GROUP_ID; - IProcessDMContext procDmc = fProcService.createProcessContext(fGDBCtrl.getContext(), pid); - IContainerDMContext containerDmc = fProcService.createContainerContext(procDmc, pid); + IContainerDMContext containerDmc = fProcService.createContainerContext(processContext, ((IMIProcessDMContext)processContext).getProcId()); fRunCtrl.getExecutionContexts(containerDmc, rmExecutionCtxts); } }); @@ -294,14 +342,17 @@ public class MIRunControlTest extends BaseTestCase { Assert.assertNotNull(data); Assert.assertEquals("Unexpected number of threads", sProgramIsCygwin ? 3 : 2, data.length); - IMIExecutionDMContext dmc1 = (IMIExecutionDMContext)data[0]; - IMIExecutionDMContext dmc2 = (IMIExecutionDMContext)data[1]; - // Context ids should be 1 & 2 - Assert.assertTrue(dmc1.getThreadId()==1 && dmc2.getThreadId() == 2); - + + // The ordering of the contexts is not deterministic + LinkedList ids = new LinkedList(Arrays.asList(new Integer[] {1,2})); if (sProgramIsCygwin) { - IMIExecutionDMContext dmc3 = (IMIExecutionDMContext)data[2]; - Assert.assertTrue(dmc3.getThreadId()== 3); + ids.add(new Integer(3)); + } + + assertTrue(ids.remove(new Integer(((IMIExecutionDMContext)data[0]).getThreadId()))); + assertTrue(ids.remove(new Integer(((IMIExecutionDMContext)data[1]).getThreadId()))); + if (sProgramIsCygwin) { + assertTrue(ids.remove(new Integer(((IMIExecutionDMContext)data[2]).getThreadId()))); } } @@ -324,14 +375,15 @@ public class MIRunControlTest extends BaseTestCase { wait.waitFinished(getStatus()); } }; + + final IProcessDMContext processContext = getProcessContext(); + /* * Call getModelData for Execution DMC */ fRunCtrl.getExecutor().submit(new Runnable() { public void run() { - String pid = MIProcesses.UNIQUE_GROUP_ID; - IProcessDMContext procDmc = fProcService.createProcessContext(fGDBCtrl.getContext(), pid); - IContainerDMContext containerDmc = fProcService.createContainerContext(procDmc, pid); + IContainerDMContext containerDmc = fProcService.createContainerContext(processContext, ((IMIProcessDMContext)processContext).getProcId()); fRunCtrl.getExecutionData(((MIRunControl)fRunCtrl).createMIExecutionContext(containerDmc, 1), rm); } }); @@ -551,11 +603,11 @@ public class MIRunControlTest extends BaseTestCase { getGDBLaunch().getSession(), IResumedDMEvent.class); + final IProcessDMContext processContext = getProcessContext(); + fRunCtrl.getExecutor().submit(new Runnable() { public void run() { - String pid = MIProcesses.UNIQUE_GROUP_ID; - IProcessDMContext procDmc = fProcService.createProcessContext(fGDBCtrl.getContext(), pid); - IContainerDMContext containerDmc = fProcService.createContainerContext(procDmc, pid); + IContainerDMContext containerDmc = fProcService.createContainerContext(processContext, ((IMIProcessDMContext)processContext).getProcId()); fRunCtrl.resume(containerDmc, rm); } }); @@ -571,12 +623,10 @@ public class MIRunControlTest extends BaseTestCase { Assert.assertTrue(wait.getMessage(), wait.isOK()); wait.waitReset(); + fRunCtrl.getExecutor().submit(new Runnable() { public void run() { - String pid = MIProcesses.UNIQUE_GROUP_ID; - IProcessDMContext procDmc = fProcService.createProcessContext(fGDBCtrl.getContext(), pid); - IContainerDMContext containerDmc = fProcService.createContainerContext(procDmc, pid); - + IContainerDMContext containerDmc = fProcService.createContainerContext(processContext, ((IMIProcessDMContext)processContext).getProcId()); wait.setReturnInfo(fRunCtrl.isSuspended(containerDmc)); wait.waitFinished(); } @@ -623,12 +673,12 @@ public class MIRunControlTest extends BaseTestCase { Assert.assertTrue(wait.getMessage(), wait.isOK()); wait.waitReset(); + + final IProcessDMContext processContext = getProcessContext(); + fRunCtrl.getExecutor().submit(new Runnable() { public void run() { - String pid = MIProcesses.UNIQUE_GROUP_ID; - IProcessDMContext procDmc = fProcService.createProcessContext(fGDBCtrl.getContext(), pid); - IContainerDMContext containerDmc = fProcService.createContainerContext(procDmc, pid); - + IContainerDMContext containerDmc = fProcService.createContainerContext(processContext, ((IMIProcessDMContext)processContext).getProcId()); wait.setReturnInfo(fRunCtrl.isSuspended(containerDmc)); wait.waitFinished(); } @@ -670,12 +720,11 @@ public class MIRunControlTest extends BaseTestCase { return; } + final IProcessDMContext processContext = getProcessContext(); + fRunCtrl.getExecutor().submit(new Runnable() { public void run() { - String pid = MIProcesses.UNIQUE_GROUP_ID; - IProcessDMContext procDmc = fProcService.createProcessContext(fGDBCtrl.getContext(), pid); - IContainerDMContext containerDmc = fProcService.createContainerContext(procDmc, pid); - + IContainerDMContext containerDmc = fProcService.createContainerContext(processContext, ((IMIProcessDMContext)processContext).getProcId()); wait.setReturnInfo(fRunCtrl.isSuspended(containerDmc)); wait.waitFinished(); }