blob: fdc0fc2f64c87b8d7443bbbff700566609da483c [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 É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.assertTrue;
import static org.junit.Assert.fail;
import java.util.HashMap;
import java.util.Map;
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.building.TmfGraphBuilderModule;
import org.eclipse.tracecompass.analysis.graph.core.criticalpath.CriticalPathModule;
import org.eclipse.tracecompass.analysis.graph.core.tests.stubs.GraphOps;
import org.eclipse.tracecompass.analysis.os.linux.core.execution.graph.OsExecutionGraph;
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.ITmfEvent;
import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException;
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.eclipse.tracecompass.tmf.core.trace.experiment.TmfExperiment;
import org.junit.Test;
/**
* Test the distributed critical path, when traced machines communicate with one
* another through the network
*
* @author Geneviève Bastien
*/
public class DistributedCriticalPathTest {
private static final String EXPERIMENT = "CritPathExperiment";
private static int BLOCK_SIZE = 1000;
private static final @NonNull String TEST_ANALYSIS_ID = OsExecutionGraph.ANALYSIS_ID;
/**
* Setup the experiment for the tests
*
* @param traceFiles
* File names relative to this plugin for the trace files to load
* @return The experiment with its graph module executed
* @throws TmfTraceException
*/
private ITmfTrace setUpExperiment(String... traceFiles) throws TmfTraceException {
ITmfTrace[] traces = new ITmfTrace[traceFiles.length];
int i = 0;
for (String traceFile : traceFiles) {
TmfXmlKernelTraceStub trace = new TmfXmlKernelTraceStub();
IPath filePath = Activator.getAbsoluteFilePath(traceFile);
IStatus status = trace.validate(null, filePath.toOSString());
if (!status.isOK()) {
fail(status.getException().getMessage());
}
trace.initTrace(null, filePath.toOSString(), ITmfEvent.class);
traces[i++] = trace;
}
TmfExperiment experiment = new TmfExperiment(ITmfEvent.class, EXPERIMENT, traces, BLOCK_SIZE, null);
experiment.traceOpened(new TmfTraceOpenedSignal(this, experiment, null));
IAnalysisModule module = null;
for (IAnalysisModule mod : TmfTraceUtils.getAnalysisModulesOfClass(experiment, TmfGraphBuilderModule.class)) {
module = mod;
}
assertNotNull(module);
module.schedule();
assertTrue(module.waitForCompletion());
return experiment;
}
/**
* Test the graph building of a network exchange where one machine receives
* in a softirq and the other receives in a threaded IRQ, with new network
* reception events. The 2 traces include events to wrap IRQ and packet
* reception contexts
*
* @throws TmfTraceException
* Exception thrown by opening experiment
* @throws TmfAnalysisException
* Exception thrown by analyses
*/
@Test
public void testNetworkExchangeWithWifi() throws TmfTraceException, TmfAnalysisException {
ITmfTrace experiment = setUpExperiment("testfiles/graph/network_exchange_eth.xml", "testfiles/graph/network_exchange_wifi.xml");
assertNotNull(experiment);
try {
internalTestNetworkExchangeWithWifi(experiment);
} finally {
experiment.dispose();
}
}
private static void internalTestNetworkExchangeWithWifi(@NonNull ITmfTrace experiment) throws TmfAnalysisException {
TmfGraphBuilderModule module = TmfTraceUtils.getAnalysisModuleOfClass(experiment, TmfGraphBuilderModule.class, TEST_ANALYSIS_ID);
assertNotNull(module);
TmfGraph graph = module.getGraph();
assertNotNull(graph);
Set<IGraphWorker> workers = graph.getWorkers();
assertEquals(6, workers.size());
// Prepare a worker map
final int irqThread = 50;
final int clientThread = 200;
final int otherClient = 201;
final int serverThread = 100;
final int otherServer = 101;
final int kernelThread = -1;
Map<Integer, IGraphWorker> workerMap = new HashMap<>();
for (IGraphWorker worker : workers) {
workerMap.put(((OsWorker) worker).getHostThread().getTid(), worker);
}
// Build the expected graph
TmfGraph expected = new TmfGraph();
// other thread on client side
IGraphWorker worker = workerMap.get(otherClient);
assertNotNull(worker);
expected.add(worker, new TmfVertex(10));
expected.append(worker, new TmfVertex(15), EdgeType.PREEMPTED);
expected.append(worker, new TmfVertex(60), EdgeType.RUNNING);
// client thread
worker = workerMap.get(clientThread);
assertNotNull(worker);
expected.add(worker, new TmfVertex(10));
TmfVertex packet1Sent = new TmfVertex(13);
expected.append(worker, packet1Sent, EdgeType.RUNNING);
expected.append(worker, new TmfVertex(15), EdgeType.RUNNING);
TmfVertex packet2Received = new TmfVertex(70);
expected.append(worker, packet2Received, EdgeType.NETWORK, "irq/30-handler");
expected.append(worker, new TmfVertex(75), EdgeType.PREEMPTED);
// irq thread
worker = workerMap.get(irqThread);
assertNotNull(worker);
expected.add(worker, new TmfVertex(55));
expected.append(worker, new TmfVertex(60), EdgeType.PREEMPTED);
expected.append(worker, new TmfVertex(65), EdgeType.RUNNING);
expected.append(worker, new TmfVertex(75), EdgeType.RUNNING);
// Other thread on server side
worker = workerMap.get(otherServer);
assertNotNull(worker);
expected.add(worker, new TmfVertex(5));
expected.append(worker, new TmfVertex(40), EdgeType.RUNNING);
expected.append(worker, new TmfVertex(55), EdgeType.PREEMPTED);
// Server thread
worker = workerMap.get(serverThread);
assertNotNull(worker);
expected.add(worker, new TmfVertex(5));
TmfVertex packet1Received = new TmfVertex(35);
expected.append(worker, packet1Received, EdgeType.NETWORK);
expected.append(worker, new TmfVertex(40), EdgeType.PREEMPTED);
TmfVertex packet2Sent = new TmfVertex(45);
expected.append(worker, packet2Sent, EdgeType.RUNNING);
expected.append(worker, new TmfVertex(55), EdgeType.RUNNING);
// Create the vertical links
TmfEdge link = packet1Sent.linkVertical(packet1Received);
link.setType(EdgeType.NETWORK);
link = packet2Sent.linkVertical(packet2Received);
link.setType(EdgeType.NETWORK);
// kernel worker on server side
worker = workerMap.get(kernelThread);
assertNotNull(worker);
expected.add(worker, new TmfVertex(30));
expected.append(worker, new TmfVertex(33), EdgeType.RUNNING);
GraphOps.checkEquality(expected, graph);
/* Test the critical path */
// Build the expected critical path
expected = new TmfGraph();
// Client worker
worker = workerMap.get(clientThread);
assertNotNull(worker);
expected.add(worker, new TmfVertex(10));
expected.append(worker, new TmfVertex(13), EdgeType.RUNNING);
packet1Sent = new TmfVertex(15);
expected.append(worker, packet1Sent, EdgeType.RUNNING);
packet2Received = new TmfVertex(70);
expected.add(worker, packet2Received);
expected.append(worker, new TmfVertex(75), EdgeType.PREEMPTED);
// Server worker
worker = workerMap.get(serverThread);
assertNotNull(worker);
packet1Received = new TmfVertex(35);
expected.add(worker, packet1Received);
expected.append(worker, new TmfVertex(40), EdgeType.PREEMPTED);
packet2Sent = new TmfVertex(45);
expected.append(worker, packet2Sent, EdgeType.RUNNING);
link = packet1Sent.linkVertical(packet1Received);
link.setType(EdgeType.NETWORK);
link = packet2Sent.linkVertical(packet2Received);
link.setType(EdgeType.NETWORK);
// Execute the critical path module and compare equality
CriticalPathModule critPathModule = new CriticalPathModule(module);
try {
critPathModule.setTrace(experiment);
critPathModule.setParameter(CriticalPathModule.PARAM_WORKER, workerMap.get(clientThread));
critPathModule.schedule();
assertTrue(critPathModule.waitForCompletion());
TmfGraph criticalPath = critPathModule.getCriticalPath();
assertNotNull(criticalPath);
GraphOps.checkEquality(expected, criticalPath);
} finally {
critPathModule.dispose();
}
}
/**
* Test the graph building of a simple network exchange where both machines
* receive in softirqs, without packet reception and complete IRQ contexts
*
* @throws TmfTraceException
* Exception thrown by opening experiment
* @throws TmfAnalysisException
* Exception thrown by analyses
*/
@Test
public void testNetworkExchange() throws TmfTraceException, TmfAnalysisException {
ITmfTrace experiment = setUpExperiment("testfiles/graph/simple_network_server.xml", "testfiles/graph/simple_network_client.xml");
assertNotNull(experiment);
try {
internalTestNetworkExchange(experiment);
} finally {
experiment.dispose();
}
}
private static void internalTestNetworkExchange(@NonNull ITmfTrace experiment) throws TmfAnalysisException {
TmfGraphBuilderModule module = TmfTraceUtils.getAnalysisModuleOfClass(experiment, TmfGraphBuilderModule.class, TEST_ANALYSIS_ID);
assertNotNull(module);
TmfGraph graph = module.getGraph();
assertNotNull(graph);
Set<IGraphWorker> workers = graph.getWorkers();
assertEquals(7, workers.size());
// Prepare a worker map
final int clientThread = 200;
final int otherClient = 201;
final int depClient = 202;
final int serverThread = 100;
final int otherServer = 101;
OsWorker clientWorker = null;
OsWorker serverWorker = null;
Map<Integer, IGraphWorker> workerMap = new HashMap<>();
for (IGraphWorker worker : workers) {
OsWorker osWorker = (OsWorker) worker;
if (osWorker.getHostThread().getTid() < 0) {
if (osWorker.getHostId().equals("simple_network_server.xml")) {
serverWorker = osWorker;
} else {
clientWorker = osWorker;
}
}
workerMap.put(osWorker.getHostThread().getTid(), worker);
}
// Make the expected graph
TmfGraph expected = new TmfGraph();
// other thread on client side
IGraphWorker worker = workerMap.get(otherClient);
assertNotNull(worker);
expected.add(worker, new TmfVertex(7));
expected.append(worker, new TmfVertex(10), EdgeType.RUNNING);
expected.append(worker, new TmfVertex(15), EdgeType.PREEMPTED);
expected.append(worker, new TmfVertex(75), EdgeType.RUNNING);
// client thread
worker = workerMap.get(clientThread);
assertNotNull(worker);
expected.add(worker, new TmfVertex(10));
TmfVertex packet1Sent = new TmfVertex(13);
expected.append(worker, packet1Sent, EdgeType.RUNNING);
expected.append(worker, new TmfVertex(15), EdgeType.RUNNING);
TmfVertex packet2Received = new TmfVertex(70);
expected.append(worker, packet2Received, EdgeType.NETWORK);
expected.append(worker, new TmfVertex(75), EdgeType.PREEMPTED);
TmfVertex wakeupSource = new TmfVertex(90);
expected.append(worker, wakeupSource, EdgeType.RUNNING);
expected.append(worker, new TmfVertex(95), EdgeType.RUNNING);
// client kernel worker
worker = clientWorker;
assertNotNull(worker);
expected.add(worker, new TmfVertex(60));
expected.append(worker, new TmfVertex(65), EdgeType.RUNNING);
// thread on client waiting for client process
worker = workerMap.get(depClient);
assertNotNull(worker);
expected.add(worker, new TmfVertex(7));
TmfVertex wakeupTarget = new TmfVertex(90);
expected.append(worker, wakeupTarget, EdgeType.BLOCKED);
expected.append(worker, new TmfVertex(95), EdgeType.PREEMPTED);
wakeupSource.linkVertical(wakeupTarget);
// Other thread on server side
worker = workerMap.get(otherServer);
assertNotNull(worker);
expected.add(worker, new TmfVertex(5));
expected.append(worker, new TmfVertex(40), EdgeType.RUNNING);
expected.append(worker, new TmfVertex(55), EdgeType.PREEMPTED);
// Server thread
worker = workerMap.get(serverThread);
assertNotNull(worker);
expected.add(worker, new TmfVertex(5));
TmfVertex packet1Received = new TmfVertex(35);
expected.append(worker, packet1Received, EdgeType.NETWORK);
expected.append(worker, new TmfVertex(40), EdgeType.PREEMPTED);
TmfVertex packet2Sent = new TmfVertex(45);
expected.append(worker, packet2Sent, EdgeType.RUNNING);
expected.append(worker, new TmfVertex(55), EdgeType.RUNNING);
// Create the vertical links
TmfEdge link = packet1Sent.linkVertical(packet1Received);
link.setType(EdgeType.NETWORK);
link = packet2Sent.linkVertical(packet2Received);
link.setType(EdgeType.NETWORK);
// kernel worker on server side
worker = serverWorker;
assertNotNull(worker);
expected.add(worker, new TmfVertex(30));
expected.append(worker, new TmfVertex(33), EdgeType.RUNNING);
GraphOps.checkEquality(expected, graph);
/* Test the critical path */
// Build the expected critical path
expected = new TmfGraph();
// Client worker
worker = workerMap.get(clientThread);
assertNotNull(worker);
expected.add(worker, new TmfVertex(10));
expected.append(worker, new TmfVertex(13), EdgeType.RUNNING);
packet1Sent = new TmfVertex(15);
expected.append(worker, packet1Sent, EdgeType.RUNNING);
packet2Received = new TmfVertex(70);
expected.add(worker, packet2Received);
expected.append(worker, new TmfVertex(75), EdgeType.PREEMPTED);
expected.append(worker, new TmfVertex(90), EdgeType.RUNNING);
expected.append(worker, new TmfVertex(95), EdgeType.RUNNING);
// Server worker
worker = workerMap.get(serverThread);
assertNotNull(worker);
packet1Received = new TmfVertex(35);
expected.add(worker, packet1Received);
expected.append(worker, new TmfVertex(40), EdgeType.PREEMPTED);
packet2Sent = new TmfVertex(45);
expected.append(worker, packet2Sent, EdgeType.RUNNING);
link = packet1Sent.linkVertical(packet1Received);
link.setType(EdgeType.NETWORK);
link = packet2Sent.linkVertical(packet2Received);
link.setType(EdgeType.NETWORK);
// Execute the critical path module and compare equality
CriticalPathModule critPathModule = new CriticalPathModule(module);
try {
critPathModule.setTrace(experiment);
critPathModule.setParameter(CriticalPathModule.PARAM_WORKER, workerMap.get(clientThread));
critPathModule.schedule();
assertTrue(critPathModule.waitForCompletion());
TmfGraph criticalPath = critPathModule.getCriticalPath();
assertNotNull(criticalPath);
GraphOps.checkEquality(expected, criticalPath);
} finally {
critPathModule.dispose();
}
}
/**
* Test the graph building of a simple network exchange but without the
* other machine's trace. The process should be blocked by network
*
* @throws TmfTraceException
* Exception thrown by opening experiment
* @throws TmfAnalysisException
* Exception thrown by analyses
*/
@Test
public void testNetworkExchangeOneTrace() throws TmfTraceException, TmfAnalysisException {
ITmfTrace experiment = setUpExperiment("testfiles/graph/network_exchange_wifi.xml");
assertNotNull(experiment);
try {
internalTestNetworkExchangeOneTrace(experiment);
} finally {
experiment.dispose();
}
}
private static void internalTestNetworkExchangeOneTrace(@NonNull ITmfTrace experiment) throws TmfAnalysisException {
TmfGraphBuilderModule module = TmfTraceUtils.getAnalysisModuleOfClass(experiment, TmfGraphBuilderModule.class, TEST_ANALYSIS_ID);
assertNotNull(module);
TmfGraph graph = module.getGraph();
assertNotNull(graph);
Set<IGraphWorker> workers = graph.getWorkers();
assertEquals(3, workers.size());
// Prepare a worker map
final int irqThread = 50;
final int clientThread = 200;
final int otherClient = 201;
Map<Integer, IGraphWorker> workerMap = new HashMap<>();
for (IGraphWorker worker : workers) {
workerMap.put(((OsWorker) worker).getHostThread().getTid(), worker);
}
// Make the expected graph
TmfGraph expected = new TmfGraph();
// other thread on client side
IGraphWorker worker = workerMap.get(otherClient);
assertNotNull(worker);
expected.add(worker, new TmfVertex(10));
expected.append(worker, new TmfVertex(15), EdgeType.PREEMPTED);
expected.append(worker, new TmfVertex(60), EdgeType.RUNNING);
// client thread
worker = workerMap.get(clientThread);
assertNotNull(worker);
expected.add(worker, new TmfVertex(10));
TmfVertex packet1Sent = new TmfVertex(13);
expected.append(worker, packet1Sent, EdgeType.RUNNING);
expected.append(worker, new TmfVertex(15), EdgeType.RUNNING);
TmfVertex packet2Received = new TmfVertex(70);
expected.append(worker, packet2Received, EdgeType.NETWORK, "irq/30-handler");
expected.append(worker, new TmfVertex(75), EdgeType.PREEMPTED);
// irq thread
worker = workerMap.get(irqThread);
assertNotNull(worker);
expected.add(worker, new TmfVertex(55));
expected.append(worker, new TmfVertex(60), EdgeType.PREEMPTED);
expected.append(worker, new TmfVertex(65), EdgeType.RUNNING);
expected.append(worker, new TmfVertex(75), EdgeType.RUNNING);
GraphOps.checkEquality(expected, graph);
/* Test the critical path */
// Build the expected graph: it should be the client thread only
expected = new TmfGraph();
worker = workerMap.get(clientThread);
assertNotNull(worker);
for (TmfVertex vertex : graph.getNodesOf(worker)) {
expected.add(worker, vertex);
}
// Execute the critical path module and compare equality
CriticalPathModule critPathModule = new CriticalPathModule(module);
try {
critPathModule.setTrace(experiment);
critPathModule.setParameter(CriticalPathModule.PARAM_WORKER, workerMap.get(clientThread));
critPathModule.schedule();
assertTrue(critPathModule.waitForCompletion());
TmfGraph criticalPath = critPathModule.getCriticalPath();
assertNotNull(criticalPath);
GraphOps.checkEquality(expected, criticalPath);
} finally {
critPathModule.dispose();
}
}
/**
* Test the graph building of a simple network exchange but without the
* other machine's trace. The process should be blocked by network
*
* @throws TmfTraceException
* Exception thrown by opening experiment
* @throws TmfAnalysisException
* Exception thrown by analyses
*/
@Test
public void testNetworkExchangeOneTraceSoftirq() throws TmfTraceException, TmfAnalysisException {
ITmfTrace experiment = setUpExperiment("testfiles/graph/simple_network_client.xml");
assertNotNull(experiment);
try {
internalTestNetworkExchangeOneTraceSoftirq(experiment);
} finally {
experiment.dispose();
}
}
private static void internalTestNetworkExchangeOneTraceSoftirq(@NonNull ITmfTrace experiment) throws TmfAnalysisException {
TmfGraphBuilderModule module = TmfTraceUtils.getAnalysisModuleOfClass(experiment, TmfGraphBuilderModule.class, TEST_ANALYSIS_ID);
assertNotNull(module);
TmfGraph graph = module.getGraph();
assertNotNull(graph);
Set<IGraphWorker> workers = graph.getWorkers();
assertEquals(4, workers.size());
// Prepare a worker map
final int clientThread = 200;
final int otherClient = 201;
final int depClient = 202;
OsWorker clientWorker = null;
Map<Integer, IGraphWorker> workerMap = new HashMap<>();
for (IGraphWorker worker : workers) {
OsWorker osWorker = (OsWorker) worker;
if (osWorker.getHostThread().getTid() < 0) {
clientWorker = osWorker;
}
workerMap.put(osWorker.getHostThread().getTid(), worker);
}
// Make the expected graph
TmfGraph expected = new TmfGraph();
// other thread on client side
IGraphWorker worker = workerMap.get(otherClient);
assertNotNull(worker);
expected.add(worker, new TmfVertex(7));
expected.append(worker, new TmfVertex(10), EdgeType.RUNNING);
expected.append(worker, new TmfVertex(15), EdgeType.PREEMPTED);
expected.append(worker, new TmfVertex(75), EdgeType.RUNNING);
// client thread
worker = workerMap.get(clientThread);
assertNotNull(worker);
expected.add(worker, new TmfVertex(10));
TmfVertex packet1Sent = new TmfVertex(13);
expected.append(worker, packet1Sent, EdgeType.RUNNING);
expected.append(worker, new TmfVertex(15), EdgeType.RUNNING);
TmfVertex packet2Received = new TmfVertex(70);
expected.append(worker, packet2Received, EdgeType.NETWORK);
expected.append(worker, new TmfVertex(75), EdgeType.PREEMPTED);
TmfVertex wakeupSource = new TmfVertex(90);
expected.append(worker, wakeupSource, EdgeType.RUNNING);
expected.append(worker, new TmfVertex(95), EdgeType.RUNNING);
// client kernel worker
worker = clientWorker;
assertNotNull(worker);
expected.add(worker, new TmfVertex(60));
expected.append(worker, new TmfVertex(65), EdgeType.RUNNING);
// thread on client waiting for client process
worker = workerMap.get(depClient);
assertNotNull(worker);
expected.add(worker, new TmfVertex(7));
TmfVertex wakeupTarget = new TmfVertex(90);
expected.append(worker, wakeupTarget, EdgeType.BLOCKED);
expected.append(worker, new TmfVertex(95), EdgeType.PREEMPTED);
wakeupSource.linkVertical(wakeupTarget);
GraphOps.checkEquality(expected, graph);
/* Test the critical path */
// Build the expected critical path
expected = new TmfGraph();
// Client worker
IGraphWorker cWorker = workerMap.get(clientThread);
assertNotNull(cWorker);
expected.add(cWorker, new TmfVertex(10));
expected.append(cWorker, new TmfVertex(13), EdgeType.RUNNING);
packet1Sent = new TmfVertex(15);
expected.append(cWorker, packet1Sent, EdgeType.RUNNING);
packet2Received = new TmfVertex(70);
expected.append(cWorker, packet2Received, EdgeType.NETWORK);
expected.append(cWorker, new TmfVertex(75), EdgeType.PREEMPTED);
wakeupSource = new TmfVertex(90);
expected.append(cWorker, wakeupSource, EdgeType.RUNNING);
expected.append(cWorker, new TmfVertex(95), EdgeType.RUNNING);
// Execute the critical path module and compare equality
CriticalPathModule critPathModule = new CriticalPathModule(module);
try {
critPathModule.setTrace(experiment);
critPathModule.setParameter(CriticalPathModule.PARAM_WORKER, cWorker);
critPathModule.schedule();
assertTrue(critPathModule.waitForCompletion());
TmfGraph criticalPath = critPathModule.getCriticalPath();
assertNotNull(criticalPath);
GraphOps.checkEquality(expected, criticalPath);
// Test the critical path for the dependent thread
// Critical path for the dependent worker
expected = new TmfGraph();
worker = workerMap.get(depClient);
assertNotNull(worker);
TmfVertex begin = new TmfVertex(7);
expected.add(worker, begin);
wakeupTarget = new TmfVertex(90);
expected.add(worker, wakeupTarget);
expected.append(worker, new TmfVertex(95), EdgeType.PREEMPTED);
// Copy the critical path of the client worker
TmfVertex start = new TmfVertex(7);
expected.add(cWorker, start);
expected.append(cWorker, new TmfVertex(10), EdgeType.UNKNOWN);
expected.append(cWorker, new TmfVertex(13), EdgeType.RUNNING);
packet1Sent = new TmfVertex(15);
expected.append(cWorker, packet1Sent, EdgeType.RUNNING);
packet2Received = new TmfVertex(70);
expected.append(cWorker, packet2Received, EdgeType.NETWORK);
expected.append(cWorker, new TmfVertex(75), EdgeType.PREEMPTED);
wakeupSource = new TmfVertex(90);
expected.append(cWorker, wakeupSource, EdgeType.RUNNING);
// Add the links
begin.linkVertical(start);
wakeupSource.linkVertical(wakeupTarget);
critPathModule.setParameter(CriticalPathModule.PARAM_WORKER, worker);
critPathModule.schedule();
assertTrue(critPathModule.waitForCompletion());
criticalPath = critPathModule.getCriticalPath();
assertNotNull(criticalPath);
GraphOps.checkEquality(expected, criticalPath);
} finally {
critPathModule.dispose();
}
}
}