/*******************************************************************************
* Copyright (c) 2008, 2009 Red Hat, Inc.
* 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:
* Elliott Baron <ebaron@redhat.com> - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.valgrind.massif.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import org.eclipse.cdt.debug.core.ICDTLaunchConfigurationConstants;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.linuxtools.internal.valgrind.massif.MassifHeapTreeNode;
import org.eclipse.linuxtools.internal.valgrind.massif.MassifLaunchConstants;
import org.eclipse.linuxtools.internal.valgrind.massif.MassifSnapshot;
import org.eclipse.linuxtools.internal.valgrind.massif.MassifViewPart;
import org.eclipse.linuxtools.internal.valgrind.massif.charting.ChartEditor;
import org.eclipse.linuxtools.internal.valgrind.massif.charting.ChartEditorInput;
import org.eclipse.linuxtools.internal.valgrind.massif.charting.ChartLocationsDialog;
import org.eclipse.linuxtools.internal.valgrind.massif.charting.HeapChart;
import org.eclipse.linuxtools.internal.valgrind.massif.charting.Messages;
import org.eclipse.linuxtools.internal.valgrind.ui.ValgrindUIPlugin;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PlatformUI;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.swtchart.Chart;
import org.swtchart.ILineSeries;
public class ChartTests extends AbstractMassifTest {
@Before
public void prep() throws Exception {
proj = createProjectAndBuild("alloctest"); //$NON-NLS-1$
}
@Override
@After
public void tearDown() throws CoreException {
deleteProject(proj);
super.tearDown();
}
@Test
public void testEditorName() throws Exception {
ILaunchConfiguration config = createConfiguration(proj.getProject());
doLaunch(config, "testEditorName"); //$NON-NLS-1$
IAction chartAction = getChartAction();
assertNotNull(chartAction);
chartAction.run();
IEditorPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getActivePage().getActiveEditor();
assertTrue(part.getTitle().startsWith("Heap Chart - alloctest")); //$NON-NLS-1$
}
@Test
public void testByteScalingKiB() throws Exception {
byteScalingHelper(1, 1, 1024 * 10, "testByteScalingKiB"); //$NON-NLS-1$
}
@Test
public void testByteScalingMiB() throws Exception {
byteScalingHelper(2, 1, 1024 * 1024 * 10, "testByteScalingMiB"); //$NON-NLS-1$
}
@Test
public void testByteScalingGiB() throws Exception {
byteScalingHelper(3, 1024, 1024 * 1024 * 10, "testByteScalingGiB"); //$NON-NLS-1$
}
@Test
public void testByteScalingTiB() throws Exception {
byteScalingHelper(4, 1024 * 1024, 1024 * 1024 * 10,
"testByteScalingTiB"); //$NON-NLS-1$
}
@Test
public void testChartCallback() throws Exception {
ILaunchConfiguration config = createConfiguration(proj.getProject());
doLaunch(config, "testChartCallback"); //$NON-NLS-1$
IAction chartAction = getChartAction();
assertNotNull(chartAction);
chartAction.run();
IEditorPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getActivePage().getActiveEditor();
assertTrue(part instanceof ChartEditor);
Chart control = ((ChartEditor) part).getControl();
ILineSeries lsTotal = (ILineSeries) control.getSeriesSet().getSeries(
Messages.getString("HeapChart.Total_Heap")); //$NON-NLS-1$
Point p1 = lsTotal.getPixelCoordinates(4);
HeapChart heapChart = ((ChartEditorInput) ((ChartEditor) part)
.getEditorInput()).getChart();
int x = control.getAxisSet().getXAxis(0)
.getPixelCoordinate(heapChart.time[4]);
int y = control.getAxisSet().getYAxis(0)
.getPixelCoordinate(heapChart.dataTotal[4]);
assertEquals(x, p1.x);
assertEquals(y, p1.y);
}
@Test
public void testChartLocationsDialog() throws Exception {
ILaunchConfiguration config = createConfiguration(proj.getProject());
doLaunch(config, "testChartCallback"); //$NON-NLS-1$
MassifViewPart view = (MassifViewPart) ValgrindUIPlugin.getDefault()
.getView().getDynamicView();
MassifSnapshot snapshot = view.getSnapshots()[7]; // peak
assertTrue(snapshot.isDetailed());
Shell parent = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getShell();
ChartLocationsDialog dialog = new ChartLocationsDialog(parent);
dialog.setInput(snapshot);
dialog.setBlockOnOpen(false);
dialog.open();
MassifHeapTreeNode element = snapshot.getRoot().getChildren()[1];
dialog.getTableViewer().setSelection(new StructuredSelection(element));
dialog.getOkButton().notifyListeners(SWT.Selection, null);
dialog.openEditorForResult();
checkFile(proj.getProject(), element);
checkLine(element);
}
private void byteScalingHelper(int ix, long times, long bytes,
String testName) throws Exception {
ILaunchConfiguration config = createConfiguration(proj.getProject());
ILaunchConfigurationWorkingCopy wc = config.getWorkingCopy();
wc.setAttribute(
ICDTLaunchConfigurationConstants.ATTR_PROGRAM_ARGUMENTS,
String.valueOf(bytes) + " " + String.valueOf(times)); //$NON-NLS-1$
wc.setAttribute(MassifLaunchConstants.ATTR_MASSIF_TIMEUNIT,
MassifLaunchConstants.TIME_B);
config = wc.doSave();
doLaunch(config, testName);
IAction chartAction = getChartAction();
assertNotNull(chartAction);
chartAction.run();
IEditorPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow()
.getActivePage().getActiveEditor();
assertTrue(part.getEditorInput() instanceof ChartEditorInput);
ChartEditorInput input = (ChartEditorInput) part.getEditorInput();
HeapChart chart = input.getChart();
assertEquals(HeapChart.getByteUnits()[ix], chart.getXUnits());
}
private IAction getChartAction() {
return getToolbarAction(MassifViewPart.CHART_ACTION);
}
}