blob: 41667aab392f9e59e15e5e296d5af3be802dd051 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 STMicroelectronics.
* 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:
* Xavier Raynaud <xavier.raynaud@st.com> - initial API and implementation
*******************************************************************************/
package org.eclipse.linuxtools.internal.gprof.test;
import static org.eclipse.linuxtools.internal.gprof.test.STJunitUtils.BINARY_FILE;
import static org.eclipse.linuxtools.internal.gprof.test.STJunitUtils.OUTPUT_FILE;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.cdt.core.IBinaryParser.IBinaryObject;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.linuxtools.binutils.utils.STSymbolManager;
import org.eclipse.linuxtools.dataviewers.abstractviewers.AbstractSTTreeViewer;
import org.eclipse.linuxtools.internal.gprof.action.SwitchContentProviderAction;
import org.eclipse.linuxtools.internal.gprof.action.SwitchSampleTimeAction;
import org.eclipse.linuxtools.internal.gprof.parser.GmonDecoder;
import org.eclipse.linuxtools.internal.gprof.view.CallGraphContentProvider;
import org.eclipse.linuxtools.internal.gprof.view.FileHistogramContentProvider;
import org.eclipse.linuxtools.internal.gprof.view.FlatHistogramContentProvider;
import org.eclipse.linuxtools.internal.gprof.view.FunctionHistogramContentProvider;
import org.eclipse.linuxtools.internal.gprof.view.GmonView;
import org.eclipse.linuxtools.internal.gprof.view.fields.SampleProfField;
import org.eclipse.swt.widgets.TreeColumn;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
/**
* @author Xavier Raynaud <xavier.raynaud@st.com>
*/
@RunWith(Parameterized.class)
public class GprofTest {
@Parameters
public static Collection<Object[]> data() {
List<Object[]> params = new ArrayList<>();
boolean addr2line2_16 = false;
try {
Process p = Runtime.getRuntime().exec("addr2line --version");
InputStream is = p.getInputStream();
LineNumberReader reader = new LineNumberReader(
new InputStreamReader(is));
String line;
while ((line = reader.readLine()) != null) {
if (line.contains("addr2line 2.16.")) {
addr2line2_16 = true;
break;
}
}
} catch (IOException _) {
}
for (File testDir : STJunitUtils.getTestDirs()) {
final File gmonFile = new File(testDir, OUTPUT_FILE);
final File binaryFile = new File(testDir, BINARY_FILE);
File view_cg_RefFile_default = new File(testDir,
"testCallgraphView.ref");
File view_cg_RefFile_alternate = new File(testDir,
"testCallgraphView.ref.binutils-2.16");
File view_cg2_RefFile_default = new File(testDir,
"testCallgraphTimeView.ref");
File view_cg2_RefFile_alternate = new File(testDir,
"testCallgraphTimeView.ref.binutils-2.16");
final File view_cg_RefFile;
final File view_cg2_RefFile;
if (addr2line2_16 && view_cg_RefFile_alternate.exists()) {
view_cg_RefFile = view_cg_RefFile_alternate;
} else {
view_cg_RefFile = view_cg_RefFile_default;
}
if (addr2line2_16 && view_cg2_RefFile_alternate.exists()) {
view_cg2_RefFile = view_cg2_RefFile_alternate;
} else {
view_cg2_RefFile = view_cg2_RefFile_default;
}
final File view_cg2_DumpFile = new File(testDir,
"testCallgraphTimeView.dump");
final File view_cg_DumpFile = new File(testDir,
"testCallgraphView.dump");
final File view_samplesFile_RefFile = new File(testDir,
"testSampleView.ref");
final File view_samplesFile_DumpFile = new File(testDir,
"testSampleView.dump");
final File view_samplesFileT_RefFile = new File(testDir,
"testTimeView.ref");
final File view_samplesFileT_DumpFile = new File(testDir,
"testTimeView.dump");
final File view_samplesFunction_RefFile = new File(testDir,
"testFunctionSampleView.ref");
final File view_samplesFunction_DumpFile = new File(testDir,
"testFunctionSampleView.dump");
final File view_samplesFunctionT_RefFile = new File(testDir,
"testFunctionTimeView.ref");
final File view_samplesFunctionT_DumpFile = new File(testDir,
"testFunctionTimeView.dump");
final File view_samplesFlat_RefFile = new File(testDir,
"testFlatSampleView.ref");
final File view_samplesFlat_DumpFile = new File(testDir,
"testFlatSampleView.dump");
final File view_samplesFlatT_RefFile = new File(testDir,
"testFlatTimeView.ref");
final File view_samplesFlatT_DumpFile = new File(testDir,
"testFlatTimeView.dump");
IBinaryObject binary = STSymbolManager.sharedInstance
.getBinaryObject(new Path(binaryFile.getAbsolutePath()));
final GmonDecoder gd = new GmonDecoder(binary, null);
try {
gd.read(gmonFile.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
}
params.add(new Object[] { gmonFile, gd, view_cg_RefFile,
view_cg_DumpFile, CallGraphContentProvider.sharedInstance,
false });
params.add(new Object[] { gmonFile, gd, view_cg2_RefFile,
view_cg2_DumpFile, CallGraphContentProvider.sharedInstance,
true });
params.add(new Object[] { gmonFile, gd, view_samplesFile_RefFile,
view_samplesFile_DumpFile,
FileHistogramContentProvider.sharedInstance, false });
params.add(new Object[] { gmonFile, gd, view_samplesFileT_RefFile,
view_samplesFileT_DumpFile,
FileHistogramContentProvider.sharedInstance, true });
params.add(new Object[] { gmonFile, gd,
view_samplesFunction_RefFile,
view_samplesFunction_DumpFile,
FunctionHistogramContentProvider.sharedInstance, false });
params.add(new Object[] { gmonFile, gd,
view_samplesFunctionT_RefFile,
view_samplesFunctionT_DumpFile,
FunctionHistogramContentProvider.sharedInstance, true });
params.add(new Object[] { gmonFile, gd, view_samplesFlat_RefFile,
view_samplesFlat_DumpFile,
FlatHistogramContentProvider.sharedInstance, false });
params.add(new Object[] { gmonFile, gd, view_samplesFlatT_RefFile,
view_samplesFlatT_DumpFile,
FlatHistogramContentProvider.sharedInstance, true });
}
return params;
}
private File gmonFile;
private GmonDecoder gd;
private File refFile;
private File dumpFile;
private ITreeContentProvider contentProvider;
private boolean timeMode;
public GprofTest(File gmonFile, GmonDecoder gd, File refFile,
File dumpFile, ITreeContentProvider contentProvider,
boolean timeMode) {
this.gmonFile = gmonFile;
this.gd = gd;
this.refFile = refFile;
this.dumpFile = dumpFile;
this.contentProvider = contentProvider;
this.timeMode = timeMode;
}
private void changeMode(GmonView view, boolean timeModeRequested) {
AbstractSTTreeViewer gmonViewer = (AbstractSTTreeViewer) view
.getSTViewer();
GmonDecoder decoder = (GmonDecoder) gmonViewer.getInput();
int prof_rate = decoder.getHistogramDecoder().getProfRate();
if (prof_rate == 0) {
return;
}
TreeColumn tc = gmonViewer.getViewer().getTree().getColumn(1);
SampleProfField spf = (SampleProfField) tc.getData();
if (spf.getColumnHeaderText().endsWith("Samples") ^ !timeModeRequested) {
new SwitchSampleTimeAction(view).run();
}
}
@Test
public void testView() {
GmonView view = GmonView.displayGprofView(gd,
gmonFile.getAbsolutePath());
SwitchContentProviderAction action = new SwitchContentProviderAction(
"testAction", "icons/ch_callees.png" /* to avoid error */, view
.getSTViewer().getViewer(), contentProvider);
action.run();
changeMode(view, timeMode);
STJunitUtils.testCSVExport(view, dumpFile.getAbsolutePath(),
refFile.getAbsolutePath());
}
}