blob: e52e9639c71d5c2dff84a95c7786dd60663c75d3 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013, 2014 É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
* Mathieu Rail - Added tests for getting a module's requirements
*******************************************************************************/
package org.eclipse.tracecompass.tmf.core.tests.analysis;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.util.Set;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModuleHelper;
import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisManager;
import org.eclipse.tracecompass.tmf.core.analysis.TmfAnalysisModuleHelperConfigElement;
import org.eclipse.tracecompass.tmf.core.analysis.requirements.TmfAbstractAnalysisRequirement;
import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException;
import org.eclipse.tracecompass.tmf.core.tests.shared.TmfTestTrace;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.eclipse.tracecompass.tmf.core.trace.TmfTrace;
import org.eclipse.tracecompass.tmf.core.trace.experiment.TmfExperiment;
import org.eclipse.tracecompass.tmf.tests.stubs.analysis.AnalysisRequirementFactory;
import org.eclipse.tracecompass.tmf.tests.stubs.analysis.TestAnalysis;
import org.eclipse.tracecompass.tmf.tests.stubs.analysis.TestAnalysis2;
import org.eclipse.tracecompass.tmf.tests.stubs.trace.TmfTraceStub;
import org.eclipse.tracecompass.tmf.tests.stubs.trace.TmfTraceStub2;
import org.eclipse.tracecompass.tmf.tests.stubs.trace.TmfTraceStub3;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.Bundle;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Multimap;
/**
* Test suite for the {@link TmfAnalysisModuleHelperConfigElement} class
*
* @author Geneviève Bastien
*/
public class AnalysisModuleHelperTest {
private static final @NonNull String ANALYSIS_TRACETYPE_ID = "org.eclipse.linuxtools.tmf.core.tests.analysis.testtracetype";
private IAnalysisModuleHelper fModule;
private IAnalysisModuleHelper fModuleOther;
private IAnalysisModuleHelper fReqModule;
private IAnalysisModuleHelper fTraceTypeModule;
private ITmfTrace fTrace;
private static IAnalysisModuleHelper getModuleHelper(@NonNull String moduleId) {
Multimap<String, IAnalysisModuleHelper> helpers = TmfAnalysisManager.getAnalysisModules();
assertEquals(1, helpers.get(moduleId).size());
return helpers.get(moduleId).iterator().next();
}
/**
* Gets the module helpers for 2 test modules
*/
@Before
public void getModules() {
fModule = getModuleHelper(AnalysisManagerTest.MODULE_PARAM);
assertNotNull(fModule);
assertTrue(fModule instanceof TmfAnalysisModuleHelperConfigElement);
fModuleOther = getModuleHelper(AnalysisManagerTest.MODULE_SECOND);
assertNotNull(fModuleOther);
assertTrue(fModuleOther instanceof TmfAnalysisModuleHelperConfigElement);
fReqModule = getModuleHelper(AnalysisManagerTest.MODULE_REQ);
assertNotNull(fReqModule);
assertTrue(fReqModule instanceof TmfAnalysisModuleHelperConfigElement);
fTraceTypeModule = getModuleHelper(ANALYSIS_TRACETYPE_ID);
assertNotNull(fTraceTypeModule);
assertTrue(fTraceTypeModule instanceof TmfAnalysisModuleHelperConfigElement);
fTrace = TmfTestTrace.A_TEST_10K2.getTraceAsStub2();
}
/**
* Some tests use traces, let's clean them here
*/
@After
public void cleanupTraces() {
TmfTestTrace.A_TEST_10K.dispose();
fTrace.dispose();
}
/**
* Test the helper's getters and setters
*/
@Test
public void testHelperGetters() {
/* With first module */
assertEquals(AnalysisManagerTest.MODULE_PARAM, fModule.getId());
assertEquals("Test analysis", fModule.getName());
assertFalse(fModule.isAutomatic());
Bundle helperbundle = fModule.getBundle();
Bundle thisbundle = Platform.getBundle("org.eclipse.tracecompass.tmf.core.tests");
assertNotNull(helperbundle);
assertEquals(thisbundle, helperbundle);
/* With other module */
assertEquals(AnalysisManagerTest.MODULE_SECOND, fModuleOther.getId());
assertEquals("Test other analysis", fModuleOther.getName());
assertTrue(fModuleOther.isAutomatic());
}
/**
* Test the
* {@link TmfAnalysisModuleHelperConfigElement#appliesToTraceType(Class)}
* method for the 2 modules
*/
@Test
public void testAppliesToTrace() {
/* stub module */
assertFalse(fModule.appliesToTraceType(TmfTrace.class));
assertTrue(fModule.appliesToTraceType(TmfTraceStub.class));
assertTrue(fModule.appliesToTraceType(TmfTraceStub2.class));
assertFalse(fModule.appliesToTraceType(TmfTraceStub3.class));
assertFalse(fModule.appliesToTraceType(TmfExperiment.class));
/* stub module 2 */
assertFalse(fModuleOther.appliesToTraceType(TmfTrace.class));
assertFalse(fModuleOther.appliesToTraceType(TmfTraceStub.class));
assertTrue(fModuleOther.appliesToTraceType(TmfTraceStub2.class));
assertTrue(fModuleOther.appliesToTraceType(TmfTraceStub3.class));
assertTrue(fModuleOther.appliesToTraceType(TmfExperiment.class));
/*
* tracetype module: It's been defined applying to TmfTraceStub, then external
* tracetypes definitions made it not apply, but apply to TmfTraceStub2
*/
assertFalse(fTraceTypeModule.appliesToTraceType(TmfTrace.class));
assertFalse(fTraceTypeModule.appliesToTraceType(TmfTraceStub.class));
assertTrue(fTraceTypeModule.appliesToTraceType(TmfTraceStub2.class));
assertFalse(fTraceTypeModule.appliesToTraceType(TmfTraceStub3.class));
assertFalse(fTraceTypeModule.appliesToTraceType(TmfExperiment.class));
}
/**
* Test the
* {@link TmfAnalysisModuleHelperConfigElement#newModule(ITmfTrace)} method
* for the 2 modules
*/
@Test
public void testNewModule() {
/* Test analysis module with traceStub */
IAnalysisModule module = null;
try {
module = fModule.newModule(TmfTestTrace.A_TEST_10K.getTrace());
assertNotNull(module);
assertTrue(module instanceof TestAnalysis);
} catch (TmfAnalysisException e) {
fail();
} finally {
if (module != null) {
module.dispose();
}
}
/* TestAnalysis2 module with trace, should return an exception */
try {
module = fModuleOther.newModule(TmfTestTrace.A_TEST_10K.getTrace());
assertNull(module);
} catch (TmfAnalysisException e) {
fail();
} finally {
if (module != null) {
module.dispose();
}
}
/* TestAnalysis2 module with a TraceStub2 */
ITmfTrace trace = fTrace;
assertNotNull(trace);
try {
module = fModuleOther.newModule(trace);
assertNotNull(module);
assertTrue(module instanceof TestAnalysis2);
} catch (TmfAnalysisException e) {
fail();
} finally {
if (module != null) {
module.dispose();
}
}
}
/**
* Test the analysis modules with a differing result for experiments
*/
@Test
public void testAppliesToExperiment() {
ITmfTrace trace1 = TmfTestTrace.A_TEST_10K.getTrace();
ITmfTrace trace2 = TmfTestTrace.A_TEST_10K2.getTrace();
ITmfTrace trace3 = TmfTestTrace.A_TEST_10K2.getTraceAsStub2();
/* Create an experiment with TmfTraceStub */
ITmfTrace[] tracesExp1 = { trace1, trace2 };
TmfExperiment exp1 = new TmfExperiment(tracesExp1[0].getEventType(), "Experiment 1", tracesExp1, TmfExperiment.DEFAULT_INDEX_PAGE_SIZE, null);
/* Create an experiment containing some TmfTraceStub2 */
ITmfTrace[] tracesExp2 = { trace1, trace3 };
TmfExperiment exp2 = new TmfExperiment(tracesExp2[0].getEventType(), "Experiment 1", tracesExp2, TmfExperiment.DEFAULT_INDEX_PAGE_SIZE, null);
try {
/* fModule should return null for both experiments */
IAnalysisModule module = null;
try {
module = fModule.newModule(exp1);
assertNull(module);
} catch (TmfAnalysisException e) {
fail();
} finally {
if (module != null) {
module.dispose();
}
}
try {
module = fModule.newModule(exp2);
assertNull(module);
} catch (TmfAnalysisException e) {
fail();
} finally {
if (module != null) {
module.dispose();
}
}
/* fModuleOther should throw exception for exp1, but not exp2 */
try {
module = fModuleOther.newModule(exp1);
assertNull(module);
} catch (TmfAnalysisException e) {
fail();
} finally {
if (module != null) {
module.dispose();
}
}
try {
module = fModuleOther.newModule(exp2);
assertNotNull(module);
} catch (TmfAnalysisException e) {
fail();
} finally {
if (module != null) {
module.dispose();
}
}
} finally {
exp2.dispose();
exp1.dispose();
}
}
/**
* Test for the initialization of parameters from the extension points
*/
@Test
public void testParameters() {
ITmfTrace trace = TmfTestTrace.A_TEST_10K.getTrace();
/*
* This analysis has a parameter, but no default value. we should be
* able to set the parameter
*/
IAnalysisModuleHelper helper = getModuleHelper(AnalysisManagerTest.MODULE_PARAM);
assertNotNull(helper);
IAnalysisModule module = null;
try {
module = helper.newModule(trace);
assertNotNull(module);
assertNull(module.getParameter(TestAnalysis.PARAM_TEST));
module.setParameter(TestAnalysis.PARAM_TEST, 1);
assertEquals(1, module.getParameter(TestAnalysis.PARAM_TEST));
} catch (TmfAnalysisException e1) {
fail(e1.getMessage());
return;
} finally {
if (module != null) {
module.dispose();
}
}
/* This module has a parameter with default value */
helper = getModuleHelper(AnalysisManagerTest.MODULE_PARAM_DEFAULT);
assertNotNull(helper);
try {
module = helper.newModule(trace);
assertNotNull(module);
assertEquals(3, module.getParameter(TestAnalysis.PARAM_TEST));
module.setParameter(TestAnalysis.PARAM_TEST, 1);
assertEquals(1, module.getParameter(TestAnalysis.PARAM_TEST));
} catch (TmfAnalysisException e1) {
fail(e1.getMessage());
return;
} finally {
if (module != null) {
module.dispose();
}
}
/*
* This module does not have a parameter so setting it should throw an
* error
*/
helper = getModuleHelper(AnalysisManagerTest.MODULE_SECOND);
assertNotNull(helper);
Exception exception = null;
trace = fTrace;
assertNotNull(trace);
try {
module = helper.newModule(trace);
assertNotNull(module);
assertNull(module.getParameter(TestAnalysis.PARAM_TEST));
try {
module.setParameter(TestAnalysis.PARAM_TEST, 1);
} catch (RuntimeException e) {
exception = e;
}
} catch (TmfAnalysisException e1) {
fail(e1.getMessage());
return;
} finally {
if (module != null) {
module.dispose();
}
}
assertNotNull(exception);
}
/**
* Test for the
* {@link TmfAnalysisModuleHelperConfigElement#getValidTraceTypes} method
*/
@Test
public void testGetValidTraceTypes() {
Set<Class<? extends ITmfTrace>> expected = ImmutableSet.of((Class<? extends ITmfTrace>) TmfTraceStub.class, TmfTraceStub2.class, TmfTraceStub3.class);
Iterable<Class<? extends ITmfTrace>> traceTypes = fReqModule.getValidTraceTypes();
assertEquals(expected, traceTypes);
}
/**
* Test for the
* {@link TmfAnalysisModuleHelperConfigElement#getAnalysisRequirements}
* method
*/
@Test
public void testGetRequirements() {
Iterable<TmfAbstractAnalysisRequirement> requirements = fReqModule.getAnalysisRequirements();
Set<TmfAbstractAnalysisRequirement> expected = ImmutableSet.of(
AnalysisRequirementFactory.REQUIREMENT_1,
AnalysisRequirementFactory.REQUIREMENT_3);
assertEquals(expected, requirements);
}
}