/******************************************************************************* * Copyright (c) 2008, 2015 Wind River Systems 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: * Wind River Systems - initial API and implementation *******************************************************************************/ package org.eclipse.cdt.tests.dsf.debug.vm.launch; import java.io.File; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.eclipse.cdt.dsf.concurrent.DataRequestMonitor; import org.eclipse.cdt.dsf.concurrent.Query; import org.eclipse.cdt.dsf.debug.service.IRunControl.IContainerDMContext; import org.eclipse.cdt.dsf.debug.ui.viewmodel.launch.ILaunchVMConstants; import org.eclipse.cdt.dsf.ui.viewmodel.datamodel.IDMVMContext; import org.eclipse.cdt.dsf.ui.viewmodel.properties.IElementPropertiesProvider; import org.eclipse.cdt.dsf.ui.viewmodel.properties.VMPropertiesUpdate; import org.eclipse.cdt.examples.dsf.pda.PDAPlugin; import org.eclipse.cdt.tests.dsf.IViewerUpdatesListenerConstants; import org.eclipse.cdt.tests.dsf.vm.TestModelUpdatesListener; import org.eclipse.core.runtime.Path; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelChangedListener; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDelta; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelDeltaVisitor; import org.eclipse.debug.internal.ui.viewers.model.provisional.IModelProxy; import org.eclipse.debug.internal.ui.viewers.model.provisional.PresentationContext; import org.eclipse.debug.internal.ui.viewers.model.provisional.VirtualTreeModelViewer; import org.eclipse.debug.ui.IDebugUIConstants; import org.eclipse.jface.viewers.TreePath; import org.eclipse.swt.widgets.Display; import org.junit.Assert; import org.junit.Test; /** * */ public class VMTest1 extends VMTestBase implements IViewerUpdatesListenerConstants { @Override protected String getProgramPath() { File programFile = PDAPlugin.getFileInPlugin(new Path("samples/example.pda")); return programFile.getPath(); } @Test public void testRun() throws Throwable { Display display = Display.getDefault(); final VirtualTreeModelViewer dv = new VirtualTreeModelViewer( display, 0, new PresentationContext(IDebugUIConstants.ID_DEBUG_VIEW)); TestModelUpdatesListener listener = new TestModelUpdatesListener(dv, false, false); // Wait for container expand delta, sent by the model upon DV install event. final boolean[] containerExpandReceived = new boolean[1]; containerExpandReceived[0] = false; dv.addModelChangedListener(new IModelChangedListener() { @Override public void modelChanged(IModelDelta delta, IModelProxy proxy) { delta.accept(new IModelDeltaVisitor() { @Override public boolean visit(IModelDelta delta, int depth) { if (delta.getElement() instanceof IDMVMContext && ((IDMVMContext)delta.getElement()).getDMContext() instanceof IContainerDMContext && (delta.getFlags() & IModelDelta.EXPAND) != 0) { containerExpandReceived[0] = true; return false; } return true; } }); } }); dv.setInput(DebugPlugin.getDefault().getLaunchManager()); while(!containerExpandReceived[0]) { if (!display.readAndDispatch()) display.sleep(); } listener.reset(); // TODO: need to wait for the install delta for the launch to be processed while (!listener.isFinished(CONTENT_SEQUENCE_COMPLETE)) { if (!display.readAndDispatch()) display.sleep(); } // Find our launch int launchIdx = dv.findElementIndex(TreePath.EMPTY, getLaunch()); Assert.assertTrue(-1 != launchIdx); // Find the debug container TreePath launchPath = TreePath.EMPTY.createChildPath(getLaunch()); int launchChildCount = dv.getChildCount(launchPath); IDMVMContext _containerVMC = null; for (int i = 0; i < launchChildCount; i++) { Object launchChild = dv.getChildElement(launchPath, i); if (launchChild instanceof IDMVMContext && ((IDMVMContext)launchChild).getDMContext() instanceof IContainerDMContext) { _containerVMC = (IDMVMContext)launchChild; } } Assert.assertNotNull(_containerVMC); final IDMVMContext containerVMC = _containerVMC; final TreePath containerPath = launchPath.createChildPath(containerVMC); final IElementPropertiesProvider containerPropProvider = containerVMC.getAdapter(IElementPropertiesProvider.class); Assert.assertNotNull(containerPropProvider); // Check if container is suspended. Query<Map<String,Object>> suspendedQuery = new Query<Map<String,Object>>() { @Override protected void execute(DataRequestMonitor<Map<String, Object>> rm) { Set<String> properties = new HashSet<String>(); properties.add(ILaunchVMConstants.PROP_IS_SUSPENDED); containerPropProvider.update( new VMPropertiesUpdate[] { new VMPropertiesUpdate(properties, containerPath, dv.getInput(), dv.getPresentationContext(), rm) }); } }; suspendedQuery.run(); // Wait for the properties update to complete while (!suspendedQuery.isDone()) { if (!display.readAndDispatch()) display.sleep(); } Map<String,Object> properties = suspendedQuery.get(); Assert.assertEquals(Boolean.TRUE, properties.get(ILaunchVMConstants.PROP_IS_SUSPENDED)); } }