blob: a473f7bee155e2181f70e6d52b2dddbef63ff22e [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.analysis.os.linux.core.tests.network;
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.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.analysis.os.linux.core.tests.Activator;
import org.eclipse.tracecompass.analysis.os.linux.core.tests.stubs.trace.StubEventMatching;
import org.eclipse.tracecompass.analysis.os.linux.core.tests.stubs.trace.TmfXmlKernelTraceStub;
import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
import org.eclipse.tracecompass.tmf.core.event.matching.IEventMatchingKey;
import org.eclipse.tracecompass.tmf.core.event.matching.IMatchProcessingUnit;
import org.eclipse.tracecompass.tmf.core.event.matching.TmfEventDependency;
import org.eclipse.tracecompass.tmf.core.event.matching.TmfEventMatching;
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.experiment.TmfExperiment;
import org.junit.Test;
/**
* Test event matching for kernel traces
*
* @author Geneviève Bastien
*/
public class EventMatchingTest {
private static @NonNull ITmfTrace getKernelXmlTrace(String traceFile) throws TmfTraceException {
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);
return trace;
}
private static class TestMatchPu implements IMatchProcessingUnit {
private List<TmfEventDependency> fMatches = new ArrayList<>();
@Override
public void init(@NonNull Collection<@NonNull ITmfTrace> fTraces) {
}
@Override
public void addMatch(@NonNull TmfEventDependency match) {
fMatches.add(match);
}
@Override
public void matchingEnded() {
}
@Override
public int countMatches() {
return fMatches.size();
}
public List<TmfEventDependency> getMatches() {
return fMatches;
}
}
/**
* Testing the packet matching
*
* @throws TmfTraceException
* Exception thrown when initializing trace
*/
@Test
public void testMatching() throws TmfTraceException {
String trace1File = "client.xml";
String trace2File = "server.xml";
testEventMatching(trace1File, trace2File);
}
private static void validateMatch(TmfEventDependency match, String source, String destination, long sourceTs, long destTs) {
String title = source + '(' + sourceTs + ") -> " + destination + '(' + destTs + ')';
assertNotNull(match);
assertEquals("Source: " + title, source, match.getSource().getTrace().getHostId());
assertEquals("Source ts: " + title, sourceTs, match.getSource().getTimestamp().getValue());
assertEquals("Destination: " + title, destination, match.getDestination().getTrace().getHostId());
assertEquals("Destination ts: " + title, destTs, match.getDestination().getTimestamp().getValue());
}
/**
* Testing the packet matching when multiple matches apply to a same event.
*
* @throws TmfTraceException
* Exception thrown when initializing trace
*/
@Test
public void testMatchingMultiMatchers() throws TmfTraceException {
String trace1File = "client.xml";
// This trace has another field name for matching, so StubEventMatching
// should not be able to match these events
String trace2File = "server2.xml";
// Register a second event matching class for the other field
TmfEventMatching.registerMatchObject(new StubEventMatching() {
@Override
public @Nullable IEventMatchingKey getEventKey(@Nullable ITmfEvent event) {
if (event == null) {
return null;
}
Integer fieldValue = event.getContent().getFieldValue(Integer.class, "otherMsgField");
if (fieldValue == null) {
return null;
}
return new StubEventKey(fieldValue);
}
});
testEventMatching(trace1File, trace2File);
}
private void testEventMatching(String trace1File, String trace2File) throws TmfTraceException {
ITmfTrace trace1 = null;
ITmfTrace trace2 = null;
TmfExperiment experiment = null;
try {
trace1 = getKernelXmlTrace("testfiles/network/" + trace1File);
trace2 = getKernelXmlTrace("testfiles/network/" + trace2File);
ITmfTrace[] traces = { trace1, trace2 };
experiment = new TmfExperiment(ITmfEvent.class, "experiment", traces, 1000, null);
experiment.traceOpened(new TmfTraceOpenedSignal(this, experiment, null));
TestMatchPu testMatchPu = new TestMatchPu();
TmfEventMatching twoTraceMatch = new TmfEventMatching(Collections.singleton(experiment), testMatchPu);
assertTrue(twoTraceMatch.matchEvents());
List<TmfEventDependency> matches = testMatchPu.getMatches();
assertEquals(4, matches.size());
// Test the 3 matches
validateMatch(matches.get(0), trace1File, trace1File, 15, 20);
validateMatch(matches.get(1), trace1File, trace2File, 30, 50);
validateMatch(matches.get(2), trace2File, trace1File, 70, 100);
validateMatch(matches.get(3), trace1File, trace1File, 105, 115);
} finally {
if (experiment != null) {
experiment.dispose();
}
if (trace1 != null) {
trace1.dispose();
}
if (trace2 != null) {
trace2.dispose();
}
}
}
}