blob: 411ee89032fcba51ac9b79a46437ab9d9ecdbba4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2015 É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
*
* Contributors:
* Geneviève Bastien - Initial API and implementation
* Alexandre Montplaisir - Convert to org.eclipse.test.performance test
*******************************************************************************/
package org.eclipse.tracecompass.lttng2.kernel.core.tests.perf.analysis.kernel;
import static org.junit.Assert.fail;
import java.io.File;
import java.util.Arrays;
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.analysis.os.linux.core.kernel.KernelAnalysisModule;
import org.eclipse.tracecompass.lttng2.kernel.core.trace.LttngKernelTrace;
import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace;
import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
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.TmfTraceManager;
import org.eclipse.tracecompass.tmf.ctf.core.event.CtfTmfEvent;
import org.eclipse.tracecompass.tmf.ctf.core.tests.shared.CtfTmfTestTraceUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
/**
* This is a test of the time to build a kernel state system
*
* @author Genevieve Bastien
*/
@RunWith(Parameterized.class)
public class KernelAnalysisBenchmark {
/**
* Test test ID for kernel analysis benchmarks
*/
public static final String TEST_ID = "org.eclipse.linuxtools#LTTng kernel analysis#";
private static final int LOOP_COUNT = 25;
private final TestModule fTestModule;
private enum TestModule {
NORMAL_EXECUTION(""),
NULL_BACKEND("(Data not saved to disk)");
private final String fName;
private TestModule(String name) {
fName = name;
}
public String getTestNameString() {
return fName;
}
public static IAnalysisModule getNewModule(TestModule moduleType) {
switch (moduleType) {
case NORMAL_EXECUTION:
return new KernelAnalysisModule();
case NULL_BACKEND:
return new KernelAnalysisModuleNullBeStub();
default:
throw new IllegalStateException();
}
}
}
/**
* Constructor
*
* @param testName
* A name for the test, to display in the header
* @param module
* A test case parameter for this test
*/
public KernelAnalysisBenchmark(String testName, TestModule module) {
fTestModule = module;
}
/**
* @return The arrays of parameters
*/
@Parameters(name = "{index}: {0}")
public static Iterable<Object[]> getParameters() {
return Arrays.asList(new Object[][] {
{ TestModule.NORMAL_EXECUTION.name(), TestModule.NORMAL_EXECUTION },
{ TestModule.NULL_BACKEND.name(), TestModule.NULL_BACKEND }
});
}
/**
* Run the benchmark with "trace2"
*/
@Test
public void testTrace2() {
runTest(CtfTestTrace.TRACE2, "Trace2", fTestModule);
}
/**
* Run the benchmark with "many thread"
*/
@Test
public void testManyThreads() {
runTest(CtfTestTrace.MANY_THREADS, "Many Threads", fTestModule);
}
/**
* Run the benchmark with "django httpd"
*/
@Test
public void testDjangoHttpd() {
runTest(CtfTestTrace.DJANGO_HTTPD, "Django httpd", fTestModule);
}
private static void runTest(@NonNull CtfTestTrace testTrace, String testName, TestModule testModule) {
Performance perf = Performance.getDefault();
PerformanceMeter pm = perf.createPerformanceMeter(TEST_ID + testName + testModule.getTestNameString());
perf.tagAsSummary(pm, "LTTng Kernel Analysis: " + testName + testModule.getTestNameString(), Dimension.CPU_TIME);
if ((testTrace == CtfTestTrace.TRACE2) && (testModule == TestModule.NORMAL_EXECUTION)) {
/* Do not show all traces in the global summary */
perf.tagAsGlobalSummary(pm, "LTTng Kernel Analysis" + testModule.getTestNameString() + ": " + testName, Dimension.CPU_TIME);
}
for (int i = 0; i < LOOP_COUNT; i++) {
LttngKernelTrace trace = null;
IAnalysisModule module = null;
// TODO Allow the utility method to instantiate trace sub-types
// directly.
String path = CtfTmfTestTraceUtils.getTrace(testTrace).getPath();
try {
trace = new LttngKernelTrace();
module = TestModule.getNewModule(testModule);
module.setId("test");
trace.initTrace(null, path, CtfTmfEvent.class);
module.setTrace(trace);
pm.start();
TmfTestHelper.executeAnalysis(module);
pm.stop();
/*
* 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();
}
} catch (TmfAnalysisException | TmfTraceException e) {
fail(e.getMessage());
} finally {
if (module != null) {
module.dispose();
}
if (trace != null) {
trace.dispose();
}
}
}
pm.commit();
CtfTmfTestTraceUtils.dispose(testTrace);
}
}