ctf: Introduce IEventDefinition
[deliverable/tracecompass.git] / ctf / org.eclipse.tracecompass.ctf.core.tests / src / org / eclipse / tracecompass / ctf / core / tests / trace / CTFPacketReaderTest.java
1 /*******************************************************************************
2 * Copyright (c) 2015 Ericsson
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 * Matthew Khouzam - Initial API and implementation
10 *******************************************************************************/
11
12 package org.eclipse.tracecompass.ctf.core.tests.trace;
13
14 import static org.junit.Assert.assertEquals;
15 import static org.junit.Assert.assertFalse;
16 import static org.junit.Assert.assertNotNull;
17 import static org.junit.Assert.assertTrue;
18
19 import java.nio.ByteBuffer;
20 import java.util.Collections;
21 import java.util.List;
22
23 import org.eclipse.jdt.annotation.NonNull;
24 import org.eclipse.jdt.annotation.Nullable;
25 import org.eclipse.tracecompass.ctf.core.CTFException;
26 import org.eclipse.tracecompass.ctf.core.CTFStrings;
27 import org.eclipse.tracecompass.ctf.core.event.IEventDeclaration;
28 import org.eclipse.tracecompass.ctf.core.event.io.BitBuffer;
29 import org.eclipse.tracecompass.ctf.core.event.scope.ILexicalScope;
30 import org.eclipse.tracecompass.ctf.core.event.types.IntegerDeclaration;
31 import org.eclipse.tracecompass.ctf.core.event.types.IntegerDefinition;
32 import org.eclipse.tracecompass.ctf.core.event.types.StructDeclaration;
33 import org.eclipse.tracecompass.ctf.core.trace.CTFTrace;
34 import org.eclipse.tracecompass.ctf.core.trace.ICTFPacketDescriptor;
35 import org.eclipse.tracecompass.internal.ctf.core.event.EventDeclaration;
36 import org.eclipse.tracecompass.internal.ctf.core.event.EventDefinition;
37 import org.eclipse.tracecompass.internal.ctf.core.trace.CTFPacketReader;
38 import org.eclipse.tracecompass.internal.ctf.core.trace.StreamInputPacketIndexEntry;
39 import org.junit.Test;
40
41 /**
42 * Unit tests for ctf packet reader: this tests creation and reading.
43 *
44 * @author Matthew Khouzam
45 *
46 */
47 public class CTFPacketReaderTest {
48
49 private static final StructDeclaration EMPTY_STRUCT = new StructDeclaration(8);
50
51 private static @NonNull BitBuffer createBitBuffer(byte[] bytes) {
52 return new BitBuffer(ByteBuffer.wrap(bytes));
53 }
54
55 /**
56 * Test a packet with fields and a header (a normal packet)
57 *
58 * @throws CTFException
59 * won't happen
60 */
61 @Test
62 public void testPacket() throws CTFException {
63 // step 1: create in memory CTF trace
64 byte[] bytes = { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0xff, (byte) 0xff, (byte) 0xa5 };
65 BitBuffer input = createBitBuffer(bytes);
66 // step 2, create the packet context
67 ICTFPacketDescriptor packetContext = new StreamInputPacketIndexEntry(0, EMPTY_STRUCT.createDefinition(null, ILexicalScope.TRACE, new BitBuffer()), 8, 0, 0);
68 // step 3 create the event header
69 StructDeclaration eventHeaderDeclaration = new StructDeclaration(8);
70 eventHeaderDeclaration.addField("timestamp", IntegerDeclaration.INT_8_DECL);
71 // step 4 create an event declaration, and only one!
72 final EventDeclaration eventDec = new EventDeclaration();
73 eventDec.setName("Hello");
74 StructDeclaration fields = new StructDeclaration(8);
75 fields.addField("field1", IntegerDeclaration.UINT_16L_DECL);
76 fields.addField("field2", IntegerDeclaration.UINT_8_DECL);
77 eventDec.setFields(fields);
78 eventDec.setLogLevel(4);
79 List<@Nullable IEventDeclaration> declarations = Collections.singletonList(eventDec);
80 // step 5: give this event a context
81 CTFTrace trace = new CTFTrace();
82 CTFPacketReader cpr = new CTFPacketReader(input, packetContext, declarations, eventHeaderDeclaration, null, null, trace);
83 assertNotNull(cpr);
84 assertTrue(cpr.hasMoreEvents());
85 EventDefinition event = cpr.readNextEvent();
86 assertEquals(0L, event.getTimestamp());
87 assertEquals(0L, ((IntegerDefinition) event.getFields().getDefinition("field1")).getValue());
88 assertEquals(0L, ((IntegerDefinition) event.getFields().getDefinition("field2")).getValue());
89 assertNotNull(cpr);
90 assertTrue(cpr.hasMoreEvents());
91 event = cpr.readNextEvent();
92 assertEquals(1L, event.getTimestamp());
93 assertEquals(65535L, ((IntegerDefinition) event.getFields().getDefinition("field1")).getValue());
94 assertEquals(0xa5, ((IntegerDefinition) event.getFields().getDefinition("field2")).getValue());
95 assertFalse(cpr.hasMoreEvents());
96 }
97
98 /**
99 * Test a packet with fields, a context and a header (a mostly normal
100 * packet)
101 *
102 * @throws CTFException
103 * won't happen
104 */
105 @Test
106 public void testPacketWithContext() throws CTFException {
107 // step 1: create in memory CTF trace
108 byte[] bytes = { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0xff, (byte) 0xff, (byte) 0xa5 };
109 BitBuffer input = createBitBuffer(bytes);
110 // step 2, create the packet context
111 ICTFPacketDescriptor packetContext = new StreamInputPacketIndexEntry(0, EMPTY_STRUCT.createDefinition(null, ILexicalScope.TRACE, new BitBuffer()), 8, 0, 0);
112 // step 3 create the event header
113 StructDeclaration eventHeaderDeclaration = new StructDeclaration(8);
114 eventHeaderDeclaration.addField("timestamp", IntegerDeclaration.INT_8_DECL);
115 // step 4 create an event declaration, and only one!
116 final EventDeclaration eventDec = new EventDeclaration();
117 eventDec.setName("Hello");
118 StructDeclaration context = new StructDeclaration(8);
119 context.addField("field1", IntegerDeclaration.UINT_16L_DECL);
120 StructDeclaration fields = new StructDeclaration(8);
121 fields.addField("field2", IntegerDeclaration.UINT_8_DECL);
122 eventDec.setContext(context);
123 eventDec.setFields(fields);
124 eventDec.setLogLevel(5);// I guess?
125 List<@Nullable IEventDeclaration> declarations = Collections.singletonList(eventDec);
126 // step 5: give this event a context
127 CTFTrace trace = new CTFTrace();
128 CTFPacketReader cpr = new CTFPacketReader(input, packetContext, declarations, eventHeaderDeclaration, null, null, trace);
129 assertNotNull(cpr);
130 assertTrue(cpr.hasMoreEvents());
131 EventDefinition event = cpr.readNextEvent();
132 assertEquals(0L, event.getTimestamp());
133 assertEquals(0L, ((IntegerDefinition) event.getContext().getDefinition("field1")).getValue());
134 assertEquals(0L, ((IntegerDefinition) event.getFields().getDefinition("field2")).getValue());
135 assertNotNull(cpr);
136 assertTrue(cpr.hasMoreEvents());
137 event = cpr.readNextEvent();
138 assertEquals(1L, event.getTimestamp());
139 assertEquals(65535L, ((IntegerDefinition) event.getContext().getDefinition("field1")).getValue());
140 assertEquals(0xa5, ((IntegerDefinition) event.getFields().getDefinition("field2")).getValue());
141 assertFalse(cpr.hasMoreEvents());
142 }
143
144 /**
145 * Test a packet with fields and no header (a odd but acceptable packet)
146 *
147 * @throws CTFException
148 * won't happen
149 */
150 @Test
151 public void testPacketNoHeader() throws CTFException {
152 // step 1: create in memory CTF trace
153 byte[] bytes = { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0xff, (byte) 0xff, (byte) 0xa5 };
154 BitBuffer input = createBitBuffer(bytes);
155 // step 2, create the packet context
156 ICTFPacketDescriptor packetContext = new StreamInputPacketIndexEntry(0, new StructDeclaration(8).createDefinition(null, ILexicalScope.TRACE, new BitBuffer()), 8, 0, 0);
157 // step 3 create the event header
158 // step 4 create an event declaration, and only one!
159 final EventDeclaration eventDec = new EventDeclaration();
160 eventDec.setName("Hello");
161 StructDeclaration fields = new StructDeclaration(8);
162 fields.addField("timestamp", IntegerDeclaration.INT_8_DECL);
163 fields.addField("field1", IntegerDeclaration.UINT_16L_DECL);
164 fields.addField("field2", IntegerDeclaration.UINT_8_DECL);
165 eventDec.setFields(fields);
166 List<@Nullable IEventDeclaration> declarations = Collections.singletonList(eventDec);
167 // step 5: give this event a context
168 CTFTrace trace = new CTFTrace();
169 CTFPacketReader cpr = new CTFPacketReader(input, packetContext, declarations, null, null, null, trace);
170 assertNotNull(cpr);
171 assertTrue(cpr.hasMoreEvents());
172 EventDefinition event = cpr.readNextEvent();
173 assertEquals(0L, event.getTimestamp());
174 assertEquals(0L, ((IntegerDefinition) event.getFields().getDefinition("field1")).getValue());
175 assertEquals(0L, ((IntegerDefinition) event.getFields().getDefinition("field2")).getValue());
176 assertNotNull(cpr);
177 assertTrue(cpr.hasMoreEvents());
178 event = cpr.readNextEvent();
179 assertEquals(1L, event.getTimestamp());
180 assertEquals(65535L, ((IntegerDefinition) event.getFields().getDefinition("field1")).getValue());
181 assertEquals(0xa5, ((IntegerDefinition) event.getFields().getDefinition("field2")).getValue());
182 assertFalse(cpr.hasMoreEvents());
183 }
184
185 /**
186 * Test a packet with fields and no header (a odd but acceptable packet)
187 *
188 * @throws CTFException
189 * won't happen
190 */
191 @Test
192 public void testPacketWithPacketContextAndLostEvents() throws CTFException {
193 // step 1: create in memory CTF trace
194 byte[] bytes = { (byte) 0x00, (byte) 0x02, (byte) 0x00, (byte) 0x00, (byte) 0x01, (byte) 0x00, (byte) 0x01, (byte) 0x5a };
195 BitBuffer input = createBitBuffer(bytes);
196 // step 2, create the packet context
197 final StructDeclaration packetHeader = new StructDeclaration(8);
198 packetHeader.addField(CTFStrings.EVENTS_DISCARDED, IntegerDeclaration.UINT_16L_DECL);
199 ICTFPacketDescriptor packetContext = new StreamInputPacketIndexEntry(0, packetHeader.createDefinition(null, ILexicalScope.TRACE, input), 8, 0, 16);
200 // step 4 create an event declaration, and only one!
201 final EventDeclaration eventDec = new EventDeclaration();
202 eventDec.setName("Hello");
203 StructDeclaration fields = new StructDeclaration(8);
204 fields.addField("timestamp", IntegerDeclaration.UINT_16L_DECL);
205 fields.addField("field", IntegerDeclaration.UINT_8_DECL);
206 eventDec.setFields(fields);
207 List<@Nullable IEventDeclaration> declarations = Collections.singletonList(eventDec);
208 // step 5: give this event a context
209 CTFTrace trace = new CTFTrace();
210 CTFPacketReader cpr = new CTFPacketReader(input, packetContext, declarations, null, null, null, trace);
211 assertNotNull(cpr);
212 assertTrue(cpr.hasMoreEvents());
213 EventDefinition event = cpr.readNextEvent();
214 assertEquals(0L, event.getTimestamp());
215 assertEquals(1L, ((IntegerDefinition) event.getFields().getDefinition("field")).getValue());
216 assertNotNull(cpr);
217 assertTrue(cpr.hasMoreEvents());
218 event = cpr.readNextEvent();
219 assertEquals(256L, event.getTimestamp());
220 assertEquals(0x5a, ((IntegerDefinition) event.getFields().getDefinition("field")).getValue());
221 assertTrue(cpr.hasMoreEvents());
222 event = cpr.readNextEvent();
223 assertEquals(256L, event.getTimestamp());
224 assertEquals(event.getDeclaration().getName(), CTFStrings.LOST_EVENT_NAME);
225 assertEquals(512L, ((IntegerDefinition) event.getFields().getDefinition(CTFStrings.LOST_EVENTS_FIELD)).getValue());
226 assertFalse(cpr.hasMoreEvents());
227 }
228
229 }
This page took 0.047663 seconds and 5 git commands to generate.