Commit | Line | Data |
---|---|---|
32ea78ed MK |
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; | |
32ea78ed MK |
25 | import org.eclipse.tracecompass.ctf.core.CTFException; |
26 | import org.eclipse.tracecompass.ctf.core.CTFStrings; | |
32ea78ed MK |
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; | |
e8ece272 | 36 | import org.eclipse.tracecompass.internal.ctf.core.event.EventDefinition; |
32ea78ed MK |
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) { | |
56b1f7d4 | 52 | return new BitBuffer(ByteBuffer.wrap(bytes)); |
32ea78ed MK |
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()); | |
32ea78ed MK |
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()); | |
f450c256 PT |
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()); | |
32ea78ed MK |
226 | assertFalse(cpr.hasMoreEvents()); |
227 | } | |
228 | ||
229 | } |