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
9 * Matthew Khouzam - Initial API and implementation
10 *******************************************************************************/
12 package org
.eclipse
.tracecompass
.ctf
.core
.tests
.trace
;
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
;
19 import java
.nio
.ByteBuffer
;
20 import java
.util
.Collections
;
21 import java
.util
.List
;
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
;
42 * Unit tests for ctf packet reader: this tests creation and reading.
44 * @author Matthew Khouzam
47 public class CTFPacketReaderTest
{
49 private static final StructDeclaration EMPTY_STRUCT
= new StructDeclaration(8);
51 private static @NonNull BitBuffer
createBitBuffer(byte[] bytes
) {
52 return new BitBuffer(ByteBuffer
.wrap(bytes
));
56 * Test a packet with fields and a header (a normal packet)
58 * @throws CTFException
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
);
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());
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());
99 * Test a packet with fields, a context and a header (a mostly normal
102 * @throws CTFException
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
);
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());
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());
145 * Test a packet with fields and no header (a odd but acceptable packet)
147 * @throws CTFException
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
);
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());
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());
186 * Test a packet with fields and no header (a odd but acceptable packet)
188 * @throws CTFException
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
);
212 assertTrue(cpr
.hasMoreEvents());
213 EventDefinition event
= cpr
.readNextEvent();
214 assertEquals(0L, event
.getTimestamp());
215 assertEquals(1L, ((IntegerDefinition
) event
.getFields().getDefinition("field")).getValue());
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());