/*******************************************************************************
* Copyright (c) 2014 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
*
* Contributors:
* Matthew Khouzam - Initial API and implementation
*******************************************************************************/
package org.eclipse.tracecompass.ctf.core.tests.trace;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.junit.Assume.assumeTrue;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.eclipse.tracecompass.ctf.core.CTFException;
import org.eclipse.tracecompass.ctf.core.CTFStrings;
import org.eclipse.tracecompass.ctf.core.event.IEventDefinition;
import org.eclipse.tracecompass.ctf.core.event.types.IntegerDefinition;
import org.eclipse.tracecompass.ctf.core.tests.shared.CtfTestTraceUtils;
import org.eclipse.tracecompass.ctf.core.trace.CTFTraceReader;
import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestRule;
import org.junit.rules.Timeout;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
/**
* Read all the traces and verify some metrics. Nominally the event count and
* the duration of the trace (not the time to parse it).
*
* @author Matthew Khouzam
*/
@RunWith(Parameterized.class)
public class TraceReadAllTracesTest {
/** Time-out tests after 1 minute. */
@Rule
public TestRule globalTimeout = new Timeout(1, TimeUnit.MINUTES);
/**
* Get the list of traces
*
* @return the list of traces
*/
@Parameters(name = "{index}: {0}")
public static Iterable<Object[]> getTracePaths() {
CtfTestTrace[] values = CtfTestTrace.values();
List<Object[]> list = new ArrayList<>();
for (CtfTestTrace value : values) {
list.add(new Object[] { value.name(), value });
}
return list;
}
private final CtfTestTrace fTraceEnum;
/**
* Constructor
*
* @param name
* name of the enum
*
* @param traceEnum
* the enum to test
*/
public TraceReadAllTracesTest(String name, CtfTestTrace traceEnum) {
fTraceEnum = traceEnum;
}
/**
* Reads all the traces
*/
@Test
public void readTraces() {
if (fTraceEnum.getNbEvents() != -1) {
try (CTFTraceReader reader = new CTFTraceReader(CtfTestTraceUtils.getTrace(fTraceEnum))) {
IEventDefinition currentEventDef = reader.getCurrentEventDef();
double start = currentEventDef.getTimestamp();
long count = 0;
double end = start;
while (reader.hasMoreEvents()) {
reader.advance();
count++;
currentEventDef = reader.getCurrentEventDef();
if (currentEventDef != null) {
end = currentEventDef.getTimestamp();
if (currentEventDef.getDeclaration().getName().equals(CTFStrings.LOST_EVENT_NAME)) {
count += ((IntegerDefinition) currentEventDef.getFields().getDefinition(CTFStrings.LOST_EVENTS_FIELD)).getValue() - 1;
}
}
}
assertEquals("Event count", fTraceEnum.getNbEvents(), count);
assertEquals("Trace duration", fTraceEnum.getDuration(), (end - start) / 1000000000.0, 1.0);
} catch (CTFException e) {
fail(fTraceEnum.name() + " " + e.getMessage());
}
} else {
assumeTrue("Trace did not specify events count", false);
}
}
}