blob: 2ba676988a34e577170701376ef68c7efa080b2b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2017 Ericsson
*
* 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:
* Alexandre Montplaisir - Initial API and implementation
*******************************************************************************/
package org.eclipse.tracecompass.tmf.core.tests.trace;
import static org.junit.Assert.assertEquals;
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.Collection;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.analysis.counters.core.aspects.CounterAspect;
import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
import org.eclipse.tracecompass.tmf.core.event.aspect.ITmfEventAspect;
import org.eclipse.tracecompass.tmf.core.event.aspect.TmfCpuAspect;
import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
import org.eclipse.tracecompass.tmf.core.signal.TmfSignalManager;
import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
import org.eclipse.tracecompass.tmf.core.tests.analysis.AnalysisManagerTest;
import org.eclipse.tracecompass.tmf.core.tests.shared.TmfTestTrace;
import org.eclipse.tracecompass.tmf.core.trace.ITmfContext;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.eclipse.tracecompass.tmf.core.trace.TmfTrace;
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils;
import org.eclipse.tracecompass.tmf.tests.stubs.analysis.TestAnalysis;
import org.eclipse.tracecompass.tmf.tests.stubs.trace.TmfTraceStub;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
/**
* Test suite for {@link TmfTraceUtils}
*/
public class TmfTraceUtilsTest {
private static final @NonNull TestEventAspect TEST_ASPECT = new TestEventAspect();
private static final TmfTestTrace TEST_TRACE = TmfTestTrace.A_TEST_10K;
private TmfTrace fTrace;
// ------------------------------------------------------------------------
// Test trace class definition
// ------------------------------------------------------------------------
private static final @NonNull Collection<ITmfEventAspect<?>> EVENT_ASPECTS;
static {
ImmutableList.Builder<ITmfEventAspect<?>> builder = ImmutableList.builder();
builder.add(new TmfCpuAspect() {
@Override
public Integer resolve(ITmfEvent event) {
return 1;
}
});
builder.addAll(TmfTrace.BASE_ASPECTS);
EVENT_ASPECTS = builder.build();
}
private static class TmfTraceStubWithAspects extends TmfTraceStub {
public TmfTraceStubWithAspects(String path) throws TmfTraceException {
super(path, ITmfTrace.DEFAULT_TRACE_CACHE_SIZE, false, null);
}
@Override
public Iterable<ITmfEventAspect<?>> getEventAspects() {
return EVENT_ASPECTS;
}
}
private static class TestEventAspect implements ITmfEventAspect<@NonNull Integer> {
public static final Integer RESOLVED_VALUE = 2;
public static final @NonNull String ASPECT_NAME = "test";
@Override
public @NonNull String getName() {
return ASPECT_NAME;
}
@Override
public @NonNull String getHelpText() {
return ASPECT_NAME;
}
@Override
public @Nullable Integer resolve(@NonNull ITmfEvent event) {
return RESOLVED_VALUE;
}
}
// ------------------------------------------------------------------------
// Housekeeping
// ------------------------------------------------------------------------
/**
* Test setup
*/
@Before
public void setUp() {
try {
fTrace = new TmfTraceStubWithAspects(TEST_TRACE.getFullPath());
TmfSignalManager.deregister(fTrace);
fTrace.indexTrace(true);
} catch (final TmfTraceException e) {
fail(e.getMessage());
}
}
/**
* Test cleanup
*/
@After
public void tearDown() {
fTrace.dispose();
fTrace = null;
}
// ------------------------------------------------------------------------
// Test methods
// ------------------------------------------------------------------------
/**
* Test the {@link TmfTraceUtils#getAnalysisModuleOfClass} method.
*/
@Test
public void testGetModulesByClass() {
TmfTrace trace = fTrace;
assertNotNull(trace);
/* Open the trace, the modules should be populated */
trace.traceOpened(new TmfTraceOpenedSignal(this, trace, null));
Iterable<TestAnalysis> testModules = TmfTraceUtils.getAnalysisModulesOfClass(trace, TestAnalysis.class);
assertTrue(testModules.iterator().hasNext());
/*
* FIXME: The exact count depends on the context the test is run (full test
* suite or this file only), but there must be at least 2 modules
*/
assertTrue(Iterables.size(testModules) >= 2);
TestAnalysis module = TmfTraceUtils.getAnalysisModuleOfClass(trace, TestAnalysis.class, AnalysisManagerTest.MODULE_PARAM);
assertNotNull(module);
IAnalysisModule traceModule = trace.getAnalysisModule(AnalysisManagerTest.MODULE_PARAM);
assertNotNull(traceModule);
assertEquals(module, traceModule);
}
/**
* Test the {@link TmfTraceUtils#getAnalysisModuleOfClass} method.
*/
@Test
public void testGetModulesByClassForHost() {
TmfTrace trace = fTrace;
assertNotNull(trace);
/*
* Open the trace, the modules should be populated and make sure the signal is
* received by the trace manager
*/
TmfTraceOpenedSignal signal = new TmfTraceOpenedSignal(this, trace, null);
trace.traceOpened(signal);
TmfTraceManager.getInstance().traceOpened(signal);
Iterable<TestAnalysis> testModules = TmfTraceUtils.getAnalysisModulesOfClass(trace.getHostId(), TestAnalysis.class);
assertTrue(testModules.iterator().hasNext());
/*
* FIXME: The exact count depends on the context the test is run (full test
* suite or this file only), but there must be at least 2 modules
*/
assertTrue(Iterables.size(testModules) >= 2);
}
/**
* Test the
* {@link TmfTraceUtils#resolveEventAspectOfClassForEvent(ITmfTrace, Class, ITmfEvent)}
* method.
*/
@Test
public void testResolveEventAspectsOfClassForEvent() {
TmfTrace trace = fTrace;
assertNotNull(trace);
ITmfContext context = trace.seekEvent(0L);
ITmfEvent event = trace.getNext(context);
assertNotNull(event);
/* Make sure the CPU aspect returns the expected value */
Object cpuObj = TmfTraceUtils.resolveEventAspectOfClassForEvent(trace, TmfCpuAspect.class, event);
assertNotNull(cpuObj);
assertEquals(1, cpuObj);
}
/**
* Test the
* {@link TmfTraceUtils#resolveAspectOfNameForEvent(ITmfTrace, String, ITmfEvent)}
* method.
*/
@Test
public void testResolveEventAspectsOfNameForEvent() {
TmfTrace trace = fTrace;
assertNotNull(trace);
ITmfContext context = trace.seekEvent(0L);
ITmfEvent event = trace.getNext(context);
assertNotNull(event);
/* Make sure the CPU aspect returns the expected value */
Object cpuObj = TmfTraceUtils.resolveAspectOfNameForEvent(trace, "cpu", event);
assertNotNull(cpuObj);
assertEquals(1, cpuObj);
}
/**
* Test the {@link TmfTraceUtils#getEventAspects(ITmfTrace, Class)} method
*/
@Test
public void testGetAspects() {
TmfTrace trace = fTrace;
assertNotNull(trace);
Iterable<@NonNull ITmfEventAspect<?>> aspect = TmfTraceUtils.getEventAspects(trace, TestEventAspect.class);
assertNotNull(aspect);
assertEquals(1, Iterables.size(aspect));
assertTrue(Iterables.contains(aspect, TEST_ASPECT));
Iterable<@NonNull ITmfEventAspect<?>> cpuAspect = TmfTraceUtils.getEventAspects(trace, TmfCpuAspect.class);
assertNotNull(cpuAspect);
assertEquals("CPU", cpuAspect.iterator().next().getName());
Iterable<@NonNull ITmfEventAspect<?>> badAspect = TmfTraceUtils.getEventAspects(trace, CounterAspect.class);
assertNotNull(badAspect);
assertTrue(Iterables.isEmpty(badAspect));
}
/**
* Test the {@link TmfTraceUtils#registerEventAspect(ITmfEventAspect)} method
*/
@Test
public void testAdditionalAspects() {
TmfTrace trace = fTrace;
assertNotNull(trace);
ITmfContext context = trace.seekEvent(0L);
ITmfEvent event = trace.getNext(context);
assertNotNull(event);
// Make sure the aspect is not resolved
Object obj = TmfTraceUtils.resolveEventAspectOfClassForEvent(trace, TestEventAspect.class, event);
assertNull(obj);
obj = TmfTraceUtils.resolveAspectOfNameForEvent(trace, TestEventAspect.ASPECT_NAME, event);
assertNull(obj);
Integer val = TmfTraceUtils.resolveIntEventAspectOfClassForEvent(trace, TestEventAspect.class, event);
assertNull(val);
// Register the aspect
TmfTraceUtils.registerEventAspect(TEST_ASPECT);
// See that the aspect is resolved now
obj = TmfTraceUtils.resolveEventAspectOfClassForEvent(trace, TestEventAspect.class, event);
assertNotNull(obj);
assertEquals(TestEventAspect.RESOLVED_VALUE, obj);
// See if it is resolved by name as well
obj = TmfTraceUtils.resolveAspectOfNameForEvent(trace, TestEventAspect.ASPECT_NAME, event);
assertNotNull(obj);
assertEquals(TestEventAspect.RESOLVED_VALUE, obj);
// See if it is resolved by Integer type as well
val = TmfTraceUtils.resolveIntEventAspectOfClassForEvent(trace, TestEventAspect.class, event);
assertNotNull(val);
assertEquals(TestEventAspect.RESOLVED_VALUE, val);
}
}