1 /*******************************************************************************
2 * Copyright (c) 2013, 2015 Ericsson
4 * All rights reserved. This program and the accompanying materials are
5 * made available under the terms of the Eclipse Public License v1.0 which
6 * accompanies this distribution, and is available at
7 * http://www.eclipse.org/legal/epl-v10.html
10 * Alexandre Montplaisir - Initial API and implementation
11 *******************************************************************************/
13 package org
.eclipse
.tracecompass
.tmf
.ctf
.core
.tests
.event
;
15 import static org
.junit
.Assert
.assertEquals
;
16 import static org
.junit
.Assert
.assertFalse
;
17 import static org
.junit
.Assert
.assertTrue
;
19 import org
.eclipse
.jdt
.annotation
.NonNull
;
20 import org
.eclipse
.tracecompass
.testtraces
.ctf
.CtfTestTrace
;
21 import org
.eclipse
.tracecompass
.tmf
.core
.event
.ITmfEvent
;
22 import org
.eclipse
.tracecompass
.tmf
.core
.event
.ITmfLostEvent
;
23 import org
.eclipse
.tracecompass
.tmf
.core
.request
.ITmfEventRequest
;
24 import org
.eclipse
.tracecompass
.tmf
.core
.request
.TmfEventRequest
;
25 import org
.eclipse
.tracecompass
.tmf
.core
.synchronization
.TimestampTransformFactory
;
26 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.ITmfTimestamp
;
27 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfNanoTimestamp
;
28 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfTimeRange
;
29 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfContext
;
30 import org
.eclipse
.tracecompass
.tmf
.ctf
.core
.event
.CtfTmfEvent
;
31 import org
.eclipse
.tracecompass
.tmf
.ctf
.core
.tests
.shared
.CtfTmfTestTraceUtils
;
32 import org
.eclipse
.tracecompass
.tmf
.ctf
.core
.trace
.CtfTmfTrace
;
33 import org
.junit
.After
;
34 import org
.junit
.Before
;
35 import org
.junit
.Test
;
38 * Tests to verify that lost events are handled correctly.
40 * Be wary if you are using Babeltrace to cross-check those values. There could
41 * be a bug in Babeltrace with regards to lost events. See
42 * http://bugs.lttng.org/issues/589
44 * It's not 100% sure at this point which implementation is correct, so for now
45 * these tests assume the Java implementation is the right one.
47 * @author Alexandre Montplaisir
49 public class CtfTmfLostEventsTest
{
51 private static final @NonNull CtfTestTrace testTrace
= CtfTestTrace
.HELLO_LOST
;
53 private CtfTmfTrace fixture
= null;
60 fixture
= CtfTmfTestTraceUtils
.getTrace(testTrace
);
61 fixture
.indexTrace(true);
68 public void tearDown() {
69 if (fixture
!= null) {
74 // ------------------------------------------------------------------------
76 // ------------------------------------------------------------------------
79 * Test that the number of events is reported correctly (a range of lost
80 * events is counted as one event).
83 public void testNbEvents() {
84 final long expectedReal
= 32300;
85 final long expectedLost
= 562;
87 EventCountRequest req
= new EventCountRequest();
88 fixture
.sendRequest(req
);
90 req
.waitForCompletion();
91 } catch (InterruptedException e
) {
95 assertEquals(expectedReal
, req
.getReal());
96 assertEquals(expectedLost
, req
.getLost());
100 * Test that the number of events is reported correctly (a range of lost
101 * events is counted as one event). Events could be wrongly counted as lost
102 * events in certain situations.
105 public void testNbEventsBug475007() {
106 final CtfTestTrace tmfTestTrace
= CtfTestTrace
.DYNSCOPE
;
107 CtfTmfTrace trace
= CtfTmfTestTraceUtils
.getTrace(tmfTestTrace
);
108 trace
.indexTrace(true);
110 final long expectedReal
= 100003;
111 final long expectedLost
= 1;
113 EventCountRequest req
= new EventCountRequest();
114 trace
.sendRequest(req
);
116 req
.waitForCompletion();
117 } catch (InterruptedException e
) {
121 assertEquals(expectedReal
, req
.getReal());
122 assertEquals(expectedLost
, req
.getLost());
128 * Test getting the first lost event from the trace.
131 public void testFirstLostEvent() {
132 final long rank
= 190;
133 final ITmfTimestamp start
= new TmfNanoTimestamp(1376592664828900165L);
134 final ITmfTimestamp end
= new TmfNanoTimestamp(1376592664829403076L);
135 final long nbLost
= 859;
137 final CtfTmfEvent ev
= getOneEventTime(start
);
138 /* Make sure seeking by rank yields the same event */
139 final CtfTmfEvent ev2
= getOneEventRank(rank
);
140 assertEquals(ev
, ev2
);
142 assertTrue(ev
instanceof ITmfLostEvent
);
143 ITmfLostEvent event
= (ITmfLostEvent
) ev
;
145 assertEquals(start
, event
.getTimestamp());
146 assertEquals(start
, event
.getTimeRange().getStartTime());
147 assertEquals(end
, event
.getTimeRange().getEndTime());
148 assertEquals(nbLost
, event
.getNbLostEvents());
152 * Test getting the second lost event from the trace.
155 public void testSecondLostEvent() {
156 final long rank
= 229;
157 final ITmfTimestamp start
= new TmfNanoTimestamp(1376592664829477058L);
158 final ITmfTimestamp end
= new TmfNanoTimestamp(1376592664829824514L);
159 final long nbLost
= 488;
161 final CtfTmfEvent ev
= getOneEventTime(start
);
162 /* Make sure seeking by rank yields the same event */
163 final CtfTmfEvent ev2
= getOneEventRank(rank
);
164 assertEquals(ev
, ev2
);
166 assertTrue(ev
instanceof ITmfLostEvent
);
167 ITmfLostEvent event
= (ITmfLostEvent
) ev
;
169 assertEquals(start
, event
.getTimestamp());
170 assertEquals(start
, event
.getTimeRange().getStartTime());
171 assertEquals(end
, event
.getTimeRange().getEndTime());
172 assertEquals(nbLost
, event
.getNbLostEvents());
176 * Test getting one normal event from the trace (lost events should not
180 public void testNormalEvent() {
181 final long rank
= 200;
182 final ITmfTimestamp ts
= new TmfNanoTimestamp(1376592664829425780L);
184 final CtfTmfEvent event
= getOneEventTime(ts
);
185 /* Make sure seeking by rank yields the same event */
186 final CtfTmfEvent event2
= getOneEventRank(rank
);
187 assertEquals(event
, event2
);
189 assertFalse(event
instanceof ITmfLostEvent
);
190 assertEquals(ts
, event
.getTimestamp());
194 * Test getting a lost event from a trace that has a timestamp transform.
197 public void testLostEventWithTransform() {
198 CtfTmfTrace trace
= CtfTmfTestTraceUtils
.getTrace(testTrace
);
199 long offset
= 1234567890L;
200 trace
.setTimestampTransform(TimestampTransformFactory
.createWithOffset(offset
));
201 trace
.indexTrace(true);
203 final long rank
= 190;
204 final ITmfTimestamp start
= new TmfNanoTimestamp(1376592664828900165L + offset
);
205 final ITmfTimestamp end
= new TmfNanoTimestamp(1376592664829403076L + offset
);
206 final long nbLost
= 859;
208 ITmfContext context
= trace
.seekEvent(rank
);
209 final CtfTmfEvent ev
= trace
.getNext(context
);
212 assertTrue(ev
instanceof ITmfLostEvent
);
213 ITmfLostEvent event
= (ITmfLostEvent
) ev
;
215 assertEquals(start
, event
.getTimestamp());
216 assertEquals(start
, event
.getTimeRange().getStartTime());
217 assertEquals(end
, event
.getTimeRange().getEndTime());
218 assertEquals(nbLost
, event
.getNbLostEvents());
220 trace
.setTimestampTransform(null);
224 // ------------------------------------------------------------------------
226 // ------------------------------------------------------------------------
228 private CtfTmfEvent
getOneEventRank(long rank
) {
229 OneEventRequestPerRank req
= new OneEventRequestPerRank(rank
);
230 fixture
.sendRequest(req
);
232 req
.waitForCompletion();
233 } catch (InterruptedException e
) {
236 return req
.getEvent();
239 private CtfTmfEvent
getOneEventTime(@NonNull ITmfTimestamp ts
) {
240 OneEventRequestPerTs req
= new OneEventRequestPerTs(ts
);
241 fixture
.sendRequest(req
);
243 req
.waitForCompletion();
244 } catch (InterruptedException e
) {
247 return req
.getEvent();
250 private class OneEventRequestPerRank
extends TmfEventRequest
{
252 private CtfTmfEvent event
= null;
254 public OneEventRequestPerRank(long rank
) {
255 super(CtfTmfEvent
.class, TmfTimeRange
.ETERNITY
, rank
, 1, ExecutionType
.FOREGROUND
);
259 public void handleData(ITmfEvent ev
) {
260 /* Type is checked by the request, cast should be safe */
261 event
= (CtfTmfEvent
) ev
;
264 public CtfTmfEvent
getEvent() {
269 private class OneEventRequestPerTs
extends TmfEventRequest
{
271 private CtfTmfEvent event
= null;
273 public OneEventRequestPerTs(@NonNull ITmfTimestamp ts
) {
274 super(CtfTmfEvent
.class,
275 new TmfTimeRange(ts
, ts
),
276 0, ITmfEventRequest
.ALL_DATA
, ExecutionType
.FOREGROUND
);
280 public void handleData(ITmfEvent ev
) {
281 event
= (CtfTmfEvent
) ev
;
284 public CtfTmfEvent
getEvent() {
289 private class EventCountRequest
extends TmfEventRequest
{
291 private long nbReal
= 0;
292 private long nbLost
= 0;
294 public EventCountRequest() {
295 super(CtfTmfEvent
.class, TmfTimeRange
.ETERNITY
, 0,
296 ITmfEventRequest
.ALL_DATA
, ExecutionType
.FOREGROUND
);
300 public void handleData(ITmfEvent event
) {
301 if (event
instanceof ITmfLostEvent
) {
308 public long getReal() {
312 public long getLost() {