1 /*******************************************************************************
2 * Copyright (c) 2009, 2014 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 * Francois Chouinard - Initial API and implementation
11 * Alexandre Montplaisir - Port to JUnit4
12 *******************************************************************************/
14 package org
.eclipse
.tracecompass
.tmf
.core
.tests
.component
;
16 import static org
.junit
.Assert
.assertEquals
;
17 import static org
.junit
.Assert
.assertFalse
;
18 import static org
.junit
.Assert
.assertTrue
;
19 import static org
.junit
.Assert
.fail
;
21 import java
.io
.IOException
;
22 import java
.util
.Vector
;
24 import org
.eclipse
.tracecompass
.internal
.tmf
.core
.component
.TmfProviderManager
;
25 import org
.eclipse
.tracecompass
.tmf
.core
.component
.ITmfEventProvider
;
26 import org
.eclipse
.tracecompass
.tmf
.core
.event
.ITmfEvent
;
27 import org
.eclipse
.tracecompass
.tmf
.core
.request
.ITmfEventRequest
.ExecutionType
;
28 import org
.eclipse
.tracecompass
.tmf
.core
.request
.TmfEventRequest
;
29 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfEndSynchSignal
;
30 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfStartSynchSignal
;
31 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.ITmfTimestamp
;
32 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfTimeRange
;
33 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfTimestamp
;
34 import org
.eclipse
.tracecompass
.tmf
.tests
.stubs
.component
.TmfEventProviderStub
;
35 import org
.eclipse
.tracecompass
.tmf
.tests
.stubs
.component
.TmfSyntheticEventProviderStub
;
36 import org
.eclipse
.tracecompass
.tmf
.tests
.stubs
.event
.TmfSyntheticEventStub
;
37 import org
.eclipse
.tracecompass
.tmf
.tests
.stubs
.trace
.TmfTraceStub
;
38 import org
.junit
.After
;
39 import org
.junit
.Before
;
40 import org
.junit
.Test
;
43 * Test suite for the TmfEventProvider class.
45 public class TmfEventProviderTest
{
47 private TmfEventProviderStub fEventProvider
;
48 private TmfSyntheticEventProviderStub fSyntheticEventProvider
;
54 * If we can't find the test trace (they are committed in the
55 * tree, so it shouldn't happen).
58 public void setUp() throws IOException
{
59 fEventProvider
= new TmfEventProviderStub();
60 fSyntheticEventProvider
= new TmfSyntheticEventProviderStub();
67 public void tearDown() {
68 fEventProvider
.dispose();
69 fSyntheticEventProvider
.dispose();
72 // ------------------------------------------------------------------------
73 // getProviders (more a sanity check than a test)
74 // ------------------------------------------------------------------------
80 public void testGetProviders() {
81 // There should be 2 TmfEvent providers: a TmfTraceStub and a
82 // TmfEventProviderStub
83 ITmfEventProvider
[] eventProviders
= TmfProviderManager
.getProviders(ITmfEvent
.class);
84 assertEquals("getProviders", 2, eventProviders
.length
);
86 eventProviders
= TmfProviderManager
.getProviders(ITmfEvent
.class, TmfTraceStub
.class);
87 assertEquals("getProviders", 1, eventProviders
.length
);
89 eventProviders
= TmfProviderManager
.getProviders(ITmfEvent
.class, TmfEventProviderStub
.class);
90 assertEquals("getProviders", 1, eventProviders
.length
);
92 // There should be 1 TmfSyntheticEventStub provider
93 eventProviders
= TmfProviderManager
.getProviders(TmfSyntheticEventStub
.class);
94 assertEquals("getProviders", 1, eventProviders
.length
);
97 // ------------------------------------------------------------------------
99 // ------------------------------------------------------------------------
102 * Test getPlainEvents
105 public void testGetPlainEvents() {
106 final int NB_EVENTS
= 1000;
107 final Vector
<ITmfEvent
> requestedEvents
= new Vector
<>();
109 // Get the TmfSyntheticEventStub provider
110 ITmfEventProvider
[] eventProviders
= TmfProviderManager
.getProviders(ITmfEvent
.class,
111 TmfEventProviderStub
.class);
112 ITmfEventProvider provider
= eventProviders
[0];
114 TmfTimeRange range
= new TmfTimeRange(TmfTimestamp
.BIG_BANG
, TmfTimestamp
.BIG_CRUNCH
);
115 final TmfEventRequest request
= new TmfEventRequest(ITmfEvent
.class,
116 range
, 0, NB_EVENTS
, ExecutionType
.FOREGROUND
) {
118 public void handleData(ITmfEvent event
) {
119 super.handleData(event
);
120 requestedEvents
.add(event
);
124 provider
.sendRequest(request
);
126 request
.waitForCompletion();
127 assertEquals("nbEvents", NB_EVENTS
, requestedEvents
.size());
128 assertTrue("isCompleted", request
.isCompleted());
129 assertFalse("isCancelled", request
.isCancelled());
131 // Make that we have distinct events.
132 // Don't go overboard: we are not validating the stub!
133 for (int i
= 0; i
< NB_EVENTS
; i
++) {
134 assertEquals("Distinct events", i
+ 1, requestedEvents
.get(i
).getTimestamp().getValue());
136 } catch (InterruptedException e
) {
142 * Test canceling requests.
145 public void testCancelRequests() {
146 final int NB_EVENTS
= 1000;
147 final int NUMBER_EVENTS_BEFORE_CANCEL_REQ1
= 10;
148 final int NUMBER_EVENTS_BEFORE_CANCEL_REQ2
= 800;
150 final Vector
<ITmfEvent
> requestedEventsReq1
= new Vector
<>();
151 final Vector
<ITmfEvent
> requestedEventsReq2
= new Vector
<>();
153 // Get the TmfSyntheticEventStub provider
154 ITmfEventProvider
[] eventProviders
= TmfProviderManager
.getProviders(ITmfEvent
.class,
155 TmfEventProviderStub
.class);
156 ITmfEventProvider provider
= eventProviders
[0];
158 TmfTimeRange range
= new TmfTimeRange(TmfTimestamp
.BIG_BANG
, TmfTimestamp
.BIG_CRUNCH
);
160 // Create first request
161 final TmfEventRequest request1
= new TmfEventRequest(ITmfEvent
.class,
162 range
, 0, NB_EVENTS
, ExecutionType
.FOREGROUND
) {
164 public void handleData(ITmfEvent event
) {
165 super.handleData(event
);
166 requestedEventsReq1
.add(event
);
168 // cancel sub request
169 if (getNbRead() == NUMBER_EVENTS_BEFORE_CANCEL_REQ1
) {
175 // Synchronize requests
176 ((TmfEventProviderStub
) provider
).startSynch(new TmfStartSynchSignal(0));
178 // Additionally, notify provider for up-coming requests
179 provider
.notifyPendingRequest(true);
181 // Call sendRequest, which will create a coalescing request, but it
182 // doesn't send request1 yet
183 provider
.sendRequest(request1
);
185 // Check if request1 is not running yet.
186 assertFalse("isRunning", request1
.isRunning());
188 // Create second request
189 final TmfEventRequest request2
= new TmfEventRequest(ITmfEvent
.class,
190 range
, 0, NB_EVENTS
, ExecutionType
.FOREGROUND
) {
192 public void handleData(ITmfEvent event
) {
193 super.handleData(event
);
194 requestedEventsReq2
.add(event
);
196 // cancel sub request which will cancel also main request
197 if (getNbRead() == NUMBER_EVENTS_BEFORE_CANCEL_REQ2
) {
203 // Call sendRequest, which will create a coalescing request, but it
204 // doesn't send request2 yet
205 provider
.sendRequest(request2
);
207 // Check if request1/2 is not running yet.
208 assertFalse("isRunning", request1
.isRunning());
209 assertFalse("isRunning", request2
.isRunning());
211 // Send end synch signal, however requests won't be sent
212 ((TmfEventProviderStub
) provider
).endSynch(new TmfEndSynchSignal(0));
214 // Check if request1/2 is not running yet.
215 assertFalse("isRunning", request1
.isRunning());
216 assertFalse("isRunning", request2
.isRunning());
218 // Finally, trigger sending of requests
219 provider
.notifyPendingRequest(false);
223 // Wait until requests start
224 request1
.waitForStart();
225 request2
.waitForStart();
227 // // Verify that the requests are running
228 // assertTrue("isRunning", request1.isRunning());
229 // assertTrue("isRunning", request2.isRunning());
231 request1
.waitForCompletion();
233 // // Check if request2 is still running
234 // assertTrue("isRunning", request2.isRunning());
236 // Verify result (request1)
237 assertEquals("nbEvents", NUMBER_EVENTS_BEFORE_CANCEL_REQ1
, requestedEventsReq1
.size());
238 assertTrue("isCompleted", request1
.isCompleted());
239 assertTrue("isCancelled", request1
.isCancelled());
241 request2
.waitForCompletion();
243 // Verify result (request2)
244 assertEquals("nbEvents", NUMBER_EVENTS_BEFORE_CANCEL_REQ2
, requestedEventsReq2
.size());
245 assertTrue("isCompleted", request2
.isCompleted());
246 assertTrue("isCancelled", request2
.isCancelled());
248 } catch (InterruptedException e
) {
253 private static void getSyntheticData(final TmfTimeRange range
,
254 final int nbEvents
) throws InterruptedException
{
256 final Vector
<ITmfEvent
> requestedEvents
= new Vector
<>();
258 // Get the event provider
259 ITmfEventProvider
[] eventProviders
= TmfProviderManager
260 .getProviders(TmfSyntheticEventStub
.class);
261 ITmfEventProvider provider
= eventProviders
[0];
263 final TmfEventRequest request
= new TmfEventRequest(TmfSyntheticEventStub
.class, range
,
264 0, nbEvents
, ExecutionType
.FOREGROUND
) {
266 public void handleData(ITmfEvent event
) {
267 super.handleData(event
);
268 requestedEvents
.add(event
);
271 provider
.sendRequest(request
);
273 request
.waitForCompletion();
274 if (nbEvents
!= -1) {
275 assertEquals("nbEvents", nbEvents
, requestedEvents
.size());
277 assertTrue("isCompleted", request
.isCompleted());
278 assertFalse("isCancelled", request
.isCancelled());
280 // For each base event, the stub will queue 2 identical synthetic events
281 // Ensure that the events are queued properly.
282 // Don't go overboard: we are not validating the stub!
283 for (int i
= 0; i
< (nbEvents
/ 2); i
++) {
284 assertEquals("Distinct events", i
+ 1, requestedEvents
.get(2 * i
+ 0).getTimestamp().getValue());
285 assertEquals("Distinct events", i
+ 1, requestedEvents
.get(2 * i
+ 1).getTimestamp().getValue());
290 * Test getSyntheticEvents for equal block sizes.
293 public void testGetSyntheticEvents_EqualBlockSizes() {
294 TmfTimeRange range
= new TmfTimeRange(TmfTimestamp
.BIG_BANG
, TmfTimestamp
.BIG_CRUNCH
);
296 getSyntheticData(range
, 1000);
297 } catch (InterruptedException e
) {
303 * Test getSyntheticEvents
306 public void testGetSyntheticEvents_TimeRange() {
307 ITmfTimestamp start
= TmfTimestamp
.create(1, (byte) -3);
308 ITmfTimestamp end
= TmfTimestamp
.create(1000, (byte) -3);
309 TmfTimeRange range
= new TmfTimeRange(start
, end
);
311 getSyntheticData(range
, -1);
312 } catch (InterruptedException e
) {
317 // public void testGetSyntheticEvents_WeirdTimeRange1() {
318 // TmfTimestamp start = TmfTimestamp.BigBang;
319 // TmfTimestamp end = TmfTimestamp.Zero; // TmfTimestamp.create(0, (byte) -3,
321 // TmfTimeRange range = new TmfTimeRange(start, end);
323 // getSyntheticData(range, -1, TmfSyntheticEventProviderStub.BLOCK_SIZE);
324 // } catch (InterruptedException e) {
329 // public void testGetSyntheticEvents_WeirdTimeRange2() {
330 // TmfTimestamp start = TmfTimestamp.Zero; // TmfTimestamp.create(0, (byte)
332 // TmfTimestamp end = TmfTimestamp.BigCrunch;
333 // TmfTimeRange range = new TmfTimeRange(start, end);
335 // getSyntheticData(range, -1, TmfSyntheticEventProviderStub.BLOCK_SIZE);
336 // } catch (InterruptedException e) {
342 * Test getProviders (more a sanity check than a test)
345 public void testGetProviders2() {
347 // There should be 2 TmfEvent providers: a TmfTraceStub and a
348 // TmfEventProviderStub
349 ITmfEventProvider
[] eventProviders
= TmfProviderManager
.getProviders(ITmfEvent
.class);
350 assertEquals("getProviders", 2, eventProviders
.length
);
352 eventProviders
= TmfProviderManager
.getProviders(ITmfEvent
.class, TmfTraceStub
.class);
353 assertEquals("getProviders", 1, eventProviders
.length
);
355 eventProviders
= TmfProviderManager
.getProviders(ITmfEvent
.class, TmfEventProviderStub
.class);
356 assertEquals("getProviders", 1, eventProviders
.length
);
358 // There should be 1 TmfSyntheticEventStub provider
359 eventProviders
= TmfProviderManager
.getProviders(TmfSyntheticEventStub
.class);
360 assertEquals("getProviders", 1, eventProviders
.length
);