blob: 1b8ae975f0041cd3d79fc08ec42d995c47c44615 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2019 École Polytechnique de Montréal
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.tracecompass.tmf.analysis.xml.core.tests.perf;
import java.io.File;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.test.performance.Dimension;
import org.eclipse.test.performance.Performance;
import org.eclipse.test.performance.PerformanceMeter;
import org.eclipse.tracecompass.tmf.analysis.xml.core.tests.common.TmfXmlTestUtils;
import org.eclipse.tracecompass.tmf.core.analysis.TmfAbstractAnalysisModule;
import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException;
import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
import org.eclipse.tracecompass.tmf.core.tests.shared.TmfTestHelper;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
import org.junit.Test;
/**
* Base class for XML analysis performance test
*
* @author Geneviève Bastien
*/
public abstract class XmlAnalysisPerfBenchmark {
private static final String TEST_ID = "org.eclipse.tracecompass.xml.analysis#XML analysis#%s (%s)";
/**
* Get the trace to run the analysis on. The test class will dispose of the
* trace at the end of each run of the analysis, so many instances of the
* trace will be created during test. The callee shouldn't keep any
* reference to it.
*
* @return The initialized trace
* @throws TmfTraceException
* Exception thrown by trace
*/
protected abstract @NonNull ITmfTrace getTrace() throws TmfTraceException;
private final String fTestName;
private final String fXmlFile;
private final @NonNull String fAnalysisId;
private final int fLoopCount;
/**
* Constructor
*
* @param testName
* A friently name for this test
* @param absoluteFilePath
* The absolute file path of the XML file to use
* @param moduleId
* The ID of the module to test
* @param loopCount
* The number of iterations
*/
public XmlAnalysisPerfBenchmark(String testName, String absoluteFilePath, @NonNull String moduleId, int loopCount) {
fTestName = testName;
fXmlFile = absoluteFilePath;
fAnalysisId = moduleId;
fLoopCount = loopCount;
}
/**
* Run the performance test
*
* @throws TmfTraceException
* Exceptions thrown by trace
* @throws TmfAnalysisException
* Exception thrown by setting the trace
*/
@Test
public void testAnalysisPerformance() throws TmfTraceException, TmfAnalysisException {
Performance perf = Performance.getDefault();
PerformanceMeter pm = perf.createPerformanceMeter(String.format(TEST_ID, fAnalysisId, fTestName));
perf.tagAsSummary(pm, "XML analysis: " + fAnalysisId + " " + fTestName, Dimension.CPU_TIME);
for (int i = 0; i < fLoopCount; i++) {
ITmfTrace trace = null;
TmfAbstractAnalysisModule module = null;
try {
trace = getTrace();
module = TmfXmlTestUtils.getModuleInFile(fXmlFile, fAnalysisId);
module.setTrace(trace);
pm.start();
TmfTestHelper.executeAnalysis(module);
pm.stop();
// Print properties for the first run, for debug purposes
if (i == 0) {
System.out.println(module.getProperties());
}
/*
* Delete the supplementary files, so that the next iteration
* rebuilds the state system.
*/
File suppDir = new File(TmfTraceManager.getSupplementaryFileDir(trace));
for (File file : suppDir.listFiles()) {
file.delete();
}
} finally {
if (trace != null) {
trace.dispose();
}
if (module != null) {
module.dispose();
}
}
}
pm.commit();
}
}