blob: ba283fd7043bf42dfcd000cac99d92aa69a84110 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 Ericsson
*
* 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
*******************************************************************************/
package org.eclipse.tracecompass.incubator.traceevent.core.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.tracecompass.incubator.internal.traceevent.core.analysis.objectlife.ObjectLifeAnalysis;
import org.eclipse.tracecompass.incubator.internal.traceevent.core.analysis.objectlife.ObjectLifeDataProvider;
import org.eclipse.tracecompass.incubator.internal.traceevent.core.trace.TraceEventTrace;
import org.eclipse.tracecompass.internal.tmf.core.model.filters.FetchParametersUtils;
import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
import org.eclipse.tracecompass.tmf.core.model.filters.SelectionTimeQueryFilter;
import org.eclipse.tracecompass.tmf.core.model.filters.TimeQueryFilter;
import org.eclipse.tracecompass.tmf.core.model.timegraph.ITimeGraphRowModel;
import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphEntryModel;
import org.eclipse.tracecompass.tmf.core.model.timegraph.TimeGraphModel;
import org.eclipse.tracecompass.tmf.core.model.tree.TmfTreeModel;
import org.eclipse.tracecompass.tmf.core.response.ITmfResponse.Status;
import org.eclipse.tracecompass.tmf.core.response.TmfModelResponse;
import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceManager;
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
/**
* Object Life Analysis test
*
* @author Matthew Khouzam
*/
public class ObjectLifeAnalysisTest {
ObjectLifeDataProvider fDataProvider = null;
private long fEnd;
private long fStart;
private TraceEventTrace fTrace;
private static void deleteSuppFiles(@NonNull ITmfTrace trace) {
/* Remove supplementary files */
File suppDir = new File(TmfTraceManager.getSupplementaryFileDir(trace));
for (File file : suppDir.listFiles()) {
file.delete();
}
}
/**
* Setup the trace for the tests
*
* @throws TmfTraceException
* trace open failed
*/
@Before
public void setUp() throws TmfTraceException {
TraceEventTrace trace = new TraceEventTrace();
fTrace = trace;
String path = "traces/object_alloc.json";
fTrace.initTrace(null, path, ITmfEvent.class);
deleteSuppFiles(fTrace);
fTrace.readStart();
fTrace.traceOpened(new TmfTraceOpenedSignal(this, trace, null));
ObjectLifeAnalysis module = TmfTraceUtils.getAnalysisModuleOfClass(trace, ObjectLifeAnalysis.class, ObjectLifeAnalysis.ID);
assertNotNull(module);
module.schedule();
module.waitForCompletion();
fStart = fTrace.getStartTime().toNanos();
fEnd = fTrace.getEndTime().toNanos();
fDataProvider = new ObjectLifeDataProvider(trace, module);
assertNotNull(fDataProvider);
}
/**
* Dispose the trace
*/
@After
public void after() {
TraceEventTrace trace = fTrace;
if (trace != null) {
trace.dispose();
}
}
/**
* Only test for object life.
*/
@Test
@SuppressWarnings("restriction")
public void test() {
TmfModelResponse<@NonNull TmfTreeModel<@NonNull TimeGraphEntryModel>> tree = fDataProvider.fetchTree(FetchParametersUtils.timeQueryToMap(new TimeQueryFilter(fStart, fEnd, 1000)), new NullProgressMonitor());
assertEquals(Status.COMPLETED, tree.getStatus());
TmfTreeModel<@NonNull TimeGraphEntryModel> treeModel = tree.getModel();
assertNotNull(treeModel);
TimeGraphEntryModel mufasaEntry = getValueEntry(treeModel.getEntries(), "Mufasa");
TimeGraphEntryModel sarabiEntry = getValueEntry(treeModel.getEntries(), "Sarabi");
TimeGraphEntryModel scarEntry = getValueEntry(treeModel.getEntries(), "Scar");
TimeGraphEntryModel simbaEntry = getValueEntry(treeModel.getEntries(), "Simba");
assertNotNull(mufasaEntry);
assertNotNull(sarabiEntry);
assertNotNull(scarEntry);
assertNotNull(simbaEntry);
List<@NonNull Long> items = Arrays.asList(mufasaEntry.getId(), sarabiEntry.getId(), scarEntry.getId(), simbaEntry.getId());
/*
* Remember, state system is in nanos, time range is known since we know the
* trace
*/
TmfModelResponse<@NonNull TimeGraphModel> resp = fDataProvider.fetchRowModel(FetchParametersUtils.selectionTimeQueryToMap(new SelectionTimeQueryFilter(100000L, 300000L, 200, items)), new NullProgressMonitor());
assertEquals(Status.COMPLETED, resp.getStatus());
TimeGraphModel model = resp.getModel();
assertNotNull(model);
List<@NonNull ITimeGraphRowModel> modelRows = model.getRows();
ImmutableMap<Long, @NonNull ITimeGraphRowModel> groupRowsById = Maps.uniqueIndex(modelRows, ITimeGraphRowModel::getEntryID);
ITimeGraphRowModel mufasaRow = groupRowsById.get(mufasaEntry.getId());
assertNotNull(mufasaRow);
assertEquals("", mufasaRow.getStates().get(0).getLabel());
assertEquals(null, mufasaRow.getStates().get(1).getLabel());
ITimeGraphRowModel sarabiRow = modelRows.get(1);
assertNotNull(sarabiRow);
assertEquals(null, sarabiRow.getStates().get(0).getLabel());
assertEquals("", sarabiRow.getStates().get(1).getLabel());
assertEquals(null, sarabiRow.getStates().get(2).getLabel());
ITimeGraphRowModel scarRow = modelRows.get(2);
assertNotNull(scarRow); // The bad guy
assertEquals(null, scarRow.getStates().get(0).getLabel());
assertEquals("", scarRow.getStates().get(1).getLabel());
ITimeGraphRowModel simbaRow = modelRows.get(3);
assertNotNull(simbaRow);
assertEquals(null, simbaRow.getStates().get(0).getLabel());
assertEquals("", simbaRow.getStates().get(1).getLabel());
}
private static TimeGraphEntryModel getValueEntry(List<@NonNull TimeGraphEntryModel> treeModel, String name) {
Long parentID = null;
for (TimeGraphEntryModel entryModel : treeModel) {
if (entryModel.getName().equals(name)) {
parentID = entryModel.getId();
break;
}
}
if (parentID == null) {
return null;
}
for (TimeGraphEntryModel entryModel : treeModel) {
if (entryModel.getParentId() == parentID) {
return entryModel;
}
}
return null;
}
}