package org.eclipse.tracecompass.tmf.core.tests.parsers.custom;
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.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Date;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.tracecompass.tmf.core.event.ITmfEvent;
+import org.eclipse.tracecompass.tmf.core.event.aspect.ITmfEventAspect;
+import org.eclipse.tracecompass.tmf.core.event.aspect.TmfBaseAspects;
import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException;
+import org.eclipse.tracecompass.tmf.core.parsers.custom.CustomTraceDefinition;
+import org.eclipse.tracecompass.tmf.core.parsers.custom.CustomTraceDefinition.Tag;
import org.eclipse.tracecompass.tmf.core.parsers.custom.CustomTxtEvent;
import org.eclipse.tracecompass.tmf.core.parsers.custom.CustomTxtTrace;
import org.eclipse.tracecompass.tmf.core.parsers.custom.CustomTxtTraceDefinition;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
+import com.google.common.collect.Lists;
+
/**
* Test the events parsed by a custom txt trace
*
/**
* Constructor
*
- * @param name The name of the test
- * @param data The test data
+ * @param name
+ * The name of the test
+ * @param data
+ * The test data
*/
public CustomTxtTraceDataTest(String name, @NonNull ICustomTestData data) {
super(data);
}
-
private static CustomTxtTraceDefinition getDefinition(int index) {
CustomTxtTraceDefinition[] definitions = CustomTxtTraceDefinition.loadAll(new File(DEFINITION_PATH).toString());
return definitions[index];
private static final int NB_EVENTS = 10;
private CustomTxtTraceDefinition fDefinition;
+ private ITmfEventAspect<?> fTimestampAspect;
@Override
public ITmfTrace getTrace() throws IOException, TmfTraceException {
final File file = new File(TRACE_PATH);
try (BufferedWriter writer = new BufferedWriter(new FileWriter(file));) {
for (int i = 0; i < NB_EVENTS; ++i) {
- String eventStr = i + " hello world\n";
+ SimpleDateFormat f = new SimpleDateFormat(TIMESTAMP_FORMAT);
+ String eventStr = f.format(new Date(i)) + " hello world\n";
writer.write(eventStr);
int extra = i % 3;
for (int j = 0; j < extra; j++) {
}
}
}
- return new CustomTxtTrace(null, fDefinition, file.getPath(), BLOCK_SIZE);
+ ITmfTrace trace = new CustomTxtTrace(null, fDefinition, file.getPath(), BLOCK_SIZE);
+ ArrayList<@NonNull ITmfEventAspect<?>> aspects = Lists.newArrayList(trace.getEventAspects());
+ fTimestampAspect = aspects.stream().filter(aspect -> aspect.getName().equals("Timestamp")).findFirst().get();
+ return trace;
}
@Override
String name = fDefinition.definitionName;
assertEquals("Event name", name, event.getName());
assertEquals("Event name and type", event.getType().getName(), event.getName());
+ assertEquals("Timestamp", Long.toString(event.getTimestamp().toNanos()), fTimestampAspect.resolve(event));
}
@Override
private static final String ODD_EVENT = "OddName";
private static final String EVEN_EVENT = "EvenName";
private CustomTxtTraceDefinition fDefinition;
+ private ITmfEventAspect<?> fTimestampAspect;
@Override
public ITmfTrace getTrace() throws IOException, TmfTraceException {
}
}
}
- return new CustomTxtTrace(null, fDefinition, file.getPath(), BLOCK_SIZE);
+ ITmfTrace trace = new CustomTxtTrace(null, fDefinition, file.getPath(), BLOCK_SIZE);
+ ArrayList<@NonNull ITmfEventAspect<?>> aspects = Lists.newArrayList(trace.getEventAspects());
+ fTimestampAspect = aspects.stream().filter(aspect -> aspect.getName().equals("Timestamp")).findFirst().get();
+ return trace;
}
@Override
assertEquals("Event name", ODD_EVENT, event.getName());
}
assertEquals("Event name and type", event.getType().getName(), event.getName());
+ assertEquals("Timestamp", TmfBaseAspects.getTimestampAspect().resolve(event), fTimestampAspect.resolve(event));
+ }
+
+ @Override
+ public void validateEventCount(int eventCount) {
+ assertEquals("Event count", NB_EVENTS, eventCount);
+ }
+
+ };
+
+ private static final ICustomTestData CUSTOM_TXT_EXTRA_FIELDS = new ICustomTestData() {
+
+ private static final int NB_EVENTS = 6;
+ private static final String FOO = "foo";
+ private static final String BAR = "bar";
+ private static final String BAZ = "baz";
+ private static final String MESSAGE = "message";
+ private CustomTxtTraceDefinition fDefinition;
+
+ @Override
+ public ITmfTrace getTrace() throws IOException, TmfTraceException {
+ fDefinition = getDefinition(2);
+ final File file = new File(TRACE_PATH);
+ try (BufferedWriter writer = new BufferedWriter(new FileWriter(file));) {
+ // Event with one field to set
+ String eventStr = String.format("1 %s %s=%s\n", MESSAGE, FOO, BAR);
+ writer.write(eventStr);
+ // Event with 2 different fields and different values
+ eventStr = String.format("2 %s %s=%s %s=%s\n", MESSAGE, FOO, BAR, BAR, FOO);
+ writer.write(eventStr);
+ // Event with an extra field that conflicts with a built-in field
+ eventStr = String.format("3 %s Message=%s\n", MESSAGE, FOO);
+ writer.write(eventStr);
+ // Event with 2 extra fields with same name where the values
+ // should be appended
+ eventStr = String.format("4 %s %s=%s %s=%s\n", MESSAGE, FOO, BAR, FOO, BAZ);
+ writer.write(eventStr);
+ // Event with 2 extra fields with same name, where the values
+ // should be set
+ eventStr = String.format("5 %s %s=%s %s=%s %s=%s\n", MESSAGE, FOO, BAR, FOO, BAZ, BAR, BAZ);
+ writer.write(eventStr);
+ // Event with 2 non matching number extra field names/values
+ eventStr = String.format("6 %s %s=%s other %s\n", MESSAGE, FOO, BAR, BAZ);
+ writer.write(eventStr);
+ }
+ return new CustomTxtTrace(null, fDefinition, file.getPath(), BLOCK_SIZE);
+ }
+
+ @Override
+ public void validateEvent(ITmfEvent event) {
+ assertTrue(event instanceof CustomTxtEvent);
+ long ts = event.getTimestamp().getValue();
+ switch ((int) ts) {
+ case 1:
+ assertNotNull(event.getContent().getField(FOO));
+ assertEquals(BAR, event.getContent().getField(FOO).getValue());
+ assertNull(event.getContent().getField(BAR));
+ break;
+ case 2:
+ assertNotNull(event.getContent().getField(FOO));
+ assertEquals(BAR, event.getContent().getField(FOO).getValue());
+ assertNotNull(event.getContent().getField(BAR));
+ assertEquals(FOO, event.getContent().getField(BAR).getValue());
+ break;
+ case 3:
+ assertNotNull(event.getContent().getField(Tag.MESSAGE.toString()));
+ assertEquals(MESSAGE, event.getContent().getField(Tag.MESSAGE.toString()).getValue());
+ break;
+ case 4:
+ assertNotNull(event.getContent().getField(FOO));
+ assertEquals(BAR + CustomTraceDefinition.SEPARATOR + BAZ, event.getContent().getField(FOO).getValue());
+ assertNull(event.getContent().getField(BAR));
+ break;
+ case 5:
+ assertNotNull(event.getContent().getField(FOO));
+ assertEquals(BAZ, event.getContent().getField(FOO).getValue());
+ assertNotNull(event.getContent().getField(BAR));
+ assertEquals(BAZ, event.getContent().getField(BAR).getValue());
+ break;
+ case 6:
+ assertNotNull(event.getContent().getField(FOO));
+ assertEquals(BAR + CustomTraceDefinition.SEPARATOR + BAZ, event.getContent().getField(FOO).getValue());
+ assertNull(event.getContent().getField(BAR));
+ break;
+ default:
+ fail("unknown timestamp " + ts);
+ }
+ assertEquals("Event name and type", event.getType().getName(), event.getName());
}
@Override
public static Iterable<Object[]> getParameters() {
return Arrays.asList(new Object[][] {
{ "Base parser", CUSTOM_TXT },
- { "Parse with event name", CUSTOM_TXT_EVENT_NAME }
+ { "Parse with event name", CUSTOM_TXT_EVENT_NAME },
+ { "Parse with extra fields", CUSTOM_TXT_EXTRA_FIELDS }
});
}