blob: 1920d6b7c71d46142f9667d444f2e365659e7cf6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 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
*******************************************************************************/
package org.eclipse.tracecompass.lttng2.kernel.core.tests.analysis.graph;
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.List;
import java.util.Set;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.tracecompass.analysis.graph.core.base.IGraphWorker;
import org.eclipse.tracecompass.analysis.graph.core.base.TmfEdge;
import org.eclipse.tracecompass.analysis.graph.core.base.TmfEdge.EdgeType;
import org.eclipse.tracecompass.analysis.graph.core.base.TmfGraph;
import org.eclipse.tracecompass.analysis.graph.core.base.TmfVertex;
import org.eclipse.tracecompass.analysis.graph.core.base.TmfVertex.EdgeDirection;
import org.eclipse.tracecompass.analysis.graph.core.building.TmfGraphBuilderModule;
import org.eclipse.tracecompass.analysis.os.linux.core.execution.graph.OsWorker;
import org.eclipse.tracecompass.analysis.os.linux.core.tests.stubs.trace.TmfXmlKernelTraceStub;
import org.eclipse.tracecompass.lttng2.kernel.core.tests.Activator;
import org.eclipse.tracecompass.tmf.core.analysis.IAnalysisModule;
import org.eclipse.tracecompass.tmf.core.event.TmfEvent;
import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
import org.eclipse.tracecompass.tmf.core.signal.TmfTraceOpenedSignal;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.eclipse.tracecompass.tmf.core.trace.TmfTraceUtils;
import org.junit.Test;
/**
* Test that the execution graph is built correctly
*
* @author Geneviève Bastien
*/
public class LttngExecutionGraphTest {
private static final @NonNull String TEST_ANALYSIS_ID = "org.eclipse.tracecompass.analysis.os.linux.execgraph";
/**
* Setup the trace for the tests
*
* @param traceFile
* File name relative to this plugin for the trace file to load
* @return The trace with its graph module executed
*/
public ITmfTrace setUpTrace(String traceFile) {
TmfXmlKernelTraceStub trace = new TmfXmlKernelTraceStub();
IPath filePath = Activator.getAbsoluteFilePath(traceFile);
IStatus status = trace.validate(null, filePath.toOSString());
if (!status.isOK()) {
fail(status.getException().getMessage());
}
try {
trace.initTrace(null, filePath.toOSString(), TmfEvent.class);
} catch (TmfTraceException e) {
fail(e.getMessage());
}
trace.traceOpened(new TmfTraceOpenedSignal(this, trace, null));
IAnalysisModule module = null;
for (IAnalysisModule mod : TmfTraceUtils.getAnalysisModulesOfClass(trace, TmfGraphBuilderModule.class)) {
module = mod;
}
assertNotNull(module);
module.schedule();
module.waitForCompletion();
return trace;
}
/**
* Test the graph building with sched events only
*
* TODO: Add wakeup events to this test case
*/
@Test
public void testSchedEvents() {
ITmfTrace trace = setUpTrace("testfiles/graph/sched_only.xml");
assertNotNull(trace);
TmfGraphBuilderModule module = TmfTraceUtils.getAnalysisModuleOfClass(trace, TmfGraphBuilderModule.class, TEST_ANALYSIS_ID);
assertNotNull(module);
module.schedule();
assertTrue(module.waitForCompletion());
TmfGraph graph = module.getGraph();
assertNotNull(graph);
Set<IGraphWorker> workers = graph.getWorkers();
assertEquals(2, workers.size());
for (IGraphWorker worker: workers) {
assertTrue(worker instanceof OsWorker);
OsWorker lttngWorker = (OsWorker) worker;
switch(lttngWorker.getHostThread().getTid()) {
case 1:
{
List<TmfVertex> nodesOf = graph.getNodesOf(lttngWorker);
assertEquals(4, nodesOf.size());
/* Check first vertice has outgoing edge preempted */
TmfVertex v = nodesOf.get(0);
assertEquals(10, v.getTs());
assertNull(v.getEdge(EdgeDirection.INCOMING_HORIZONTAL_EDGE));
assertNull(v.getEdge(EdgeDirection.INCOMING_VERTICAL_EDGE));
assertNull(v.getEdge(EdgeDirection.OUTGOING_VERTICAL_EDGE));
TmfEdge edge = v.getEdge(EdgeDirection.OUTGOING_HORIZONTAL_EDGE);
assertNotNull(edge);
assertEquals(EdgeType.PREEMPTED, edge.getType());
v = nodesOf.get(1);
assertEquals(v, edge.getVertexTo());
/* Check second vertice has outgoing edge running */
assertEquals(20, v.getTs());
assertNull(v.getEdge(EdgeDirection.INCOMING_VERTICAL_EDGE));
assertNull(v.getEdge(EdgeDirection.OUTGOING_VERTICAL_EDGE));
assertNotNull(v.getEdge(EdgeDirection.INCOMING_HORIZONTAL_EDGE));
edge = v.getEdge(EdgeDirection.OUTGOING_HORIZONTAL_EDGE);
assertNotNull(edge);
assertEquals(EdgeType.RUNNING, edge.getType());
v = nodesOf.get(2);
assertEquals(v, edge.getVertexTo());
/* Check third vertice has outgoing edge preempted */
assertEquals(30, v.getTs());
assertNull(v.getEdge(EdgeDirection.INCOMING_VERTICAL_EDGE));
assertNull(v.getEdge(EdgeDirection.OUTGOING_VERTICAL_EDGE));
assertNotNull(v.getEdge(EdgeDirection.INCOMING_HORIZONTAL_EDGE));
edge = v.getEdge(EdgeDirection.OUTGOING_HORIZONTAL_EDGE);
assertNotNull(edge);
assertEquals(EdgeType.PREEMPTED, edge.getType());
v = nodesOf.get(3);
assertEquals(v, edge.getVertexTo());
/* Check 4th vertice */
assertEquals(40, v.getTs());
assertNull(v.getEdge(EdgeDirection.INCOMING_VERTICAL_EDGE));
assertNull(v.getEdge(EdgeDirection.OUTGOING_VERTICAL_EDGE));
assertNotNull(v.getEdge(EdgeDirection.INCOMING_HORIZONTAL_EDGE));
assertNull(v.getEdge(EdgeDirection.OUTGOING_HORIZONTAL_EDGE));
}
break;
case 2:
{
List<TmfVertex> nodesOf = graph.getNodesOf(lttngWorker);
assertEquals(4, nodesOf.size());
/* Check first vertice has outgoing edge preempted */
TmfVertex v = nodesOf.get(0);
assertEquals(10, v.getTs());
assertNull(v.getEdge(EdgeDirection.INCOMING_HORIZONTAL_EDGE));
assertNull(v.getEdge(EdgeDirection.INCOMING_VERTICAL_EDGE));
assertNull(v.getEdge(EdgeDirection.OUTGOING_VERTICAL_EDGE));
TmfEdge edge = v.getEdge(EdgeDirection.OUTGOING_HORIZONTAL_EDGE);
assertNotNull(edge);
assertEquals(EdgeType.RUNNING, edge.getType());
v = nodesOf.get(1);
assertEquals(v, edge.getVertexTo());
/* Check second vertice has outgoing edge running */
assertEquals(20, v.getTs());
assertNull(v.getEdge(EdgeDirection.INCOMING_VERTICAL_EDGE));
assertNull(v.getEdge(EdgeDirection.OUTGOING_VERTICAL_EDGE));
assertNotNull(v.getEdge(EdgeDirection.INCOMING_HORIZONTAL_EDGE));
edge = v.getEdge(EdgeDirection.OUTGOING_HORIZONTAL_EDGE);
assertNotNull(edge);
assertEquals(EdgeType.BLOCKED, edge.getType());
v = nodesOf.get(2);
assertEquals(v, edge.getVertexTo());
/* Check third vertice has outgoing edge preempted */
assertEquals(30, v.getTs());
assertNull(v.getEdge(EdgeDirection.INCOMING_VERTICAL_EDGE));
assertNull(v.getEdge(EdgeDirection.OUTGOING_VERTICAL_EDGE));
assertNotNull(v.getEdge(EdgeDirection.INCOMING_HORIZONTAL_EDGE));
edge = v.getEdge(EdgeDirection.OUTGOING_HORIZONTAL_EDGE);
assertNotNull(edge);
assertEquals(EdgeType.RUNNING, edge.getType());
v = nodesOf.get(3);
assertEquals(v, edge.getVertexTo());
/* Check 4th vertice */
assertEquals(40, v.getTs());
assertNull(v.getEdge(EdgeDirection.INCOMING_VERTICAL_EDGE));
assertNull(v.getEdge(EdgeDirection.OUTGOING_VERTICAL_EDGE));
assertNotNull(v.getEdge(EdgeDirection.INCOMING_HORIZONTAL_EDGE));
assertNull(v.getEdge(EdgeDirection.OUTGOING_HORIZONTAL_EDGE));
}
break;
default:
fail("Unknown worker");
break;
}
}
trace.dispose();
}
}