1 /*******************************************************************************
2 * Copyright (c) 2009, 2013 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
.linuxtools
.tmf
.core
.tests
.component
;
16 import static org
.junit
.Assert
.*;
18 import java
.io
.IOException
;
19 import java
.util
.Vector
;
21 import org
.eclipse
.linuxtools
.internal
.tmf
.core
.component
.TmfProviderManager
;
22 import org
.eclipse
.linuxtools
.tmf
.core
.component
.ITmfDataProvider
;
23 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfEvent
;
24 import org
.eclipse
.linuxtools
.tmf
.core
.request
.TmfEventRequest
;
25 import org
.eclipse
.linuxtools
.tmf
.core
.request
.ITmfDataRequest
.ExecutionType
;
26 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfEndSynchSignal
;
27 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfStartSynchSignal
;
28 import org
.eclipse
.linuxtools
.tmf
.core
.timestamp
.TmfTimeRange
;
29 import org
.eclipse
.linuxtools
.tmf
.core
.timestamp
.TmfTimestamp
;
30 import org
.eclipse
.linuxtools
.tmf
.tests
.stubs
.component
.TmfEventProviderStub
;
31 import org
.eclipse
.linuxtools
.tmf
.tests
.stubs
.component
.TmfSyntheticEventProviderStub
;
32 import org
.eclipse
.linuxtools
.tmf
.tests
.stubs
.event
.TmfSyntheticEventStub
;
33 import org
.eclipse
.linuxtools
.tmf
.tests
.stubs
.trace
.TmfTraceStub
;
34 import org
.junit
.After
;
35 import org
.junit
.Before
;
36 import org
.junit
.Test
;
39 * Test suite for the TmfEventProvider class.
41 public class TmfEventProviderTest
{
43 private TmfEventProviderStub fEventProvider
;
44 private TmfSyntheticEventProviderStub fSyntheticEventProvider
;
50 * If we can't find the test trace (they are committed in the
51 * tree, so it shouldn't happen).
54 public void setUp() throws IOException
{
55 fEventProvider
= new TmfEventProviderStub();
56 fSyntheticEventProvider
= new TmfSyntheticEventProviderStub();
63 public void tearDown() {
64 fEventProvider
.dispose();
65 fSyntheticEventProvider
.dispose();
68 // ------------------------------------------------------------------------
69 // getProviders (more a sanity check than a test)
70 // ------------------------------------------------------------------------
76 public void testGetProviders() {
77 // There should be 2 TmfEvent providers: a TmfTraceStub and a
78 // TmfEventProviderStub
79 ITmfDataProvider
[] eventProviders
= TmfProviderManager
.getProviders(ITmfEvent
.class);
80 assertEquals("getProviders", 2, eventProviders
.length
);
82 eventProviders
= TmfProviderManager
.getProviders(ITmfEvent
.class, TmfTraceStub
.class);
83 assertEquals("getProviders", 1, eventProviders
.length
);
85 eventProviders
= TmfProviderManager
.getProviders(ITmfEvent
.class, TmfEventProviderStub
.class);
86 assertEquals("getProviders", 1, eventProviders
.length
);
88 // There should be 1 TmfSyntheticEventStub provider
89 eventProviders
= TmfProviderManager
.getProviders(TmfSyntheticEventStub
.class);
90 assertEquals("getProviders", 1, eventProviders
.length
);
93 // ------------------------------------------------------------------------
95 // ------------------------------------------------------------------------
101 public void testGetPlainEvents() {
102 final int NB_EVENTS
= 1000;
103 final Vector
<ITmfEvent
> requestedEvents
= new Vector
<ITmfEvent
>();
105 // Get the TmfSyntheticEventStub provider
106 ITmfDataProvider
[] eventProviders
= TmfProviderManager
.getProviders(ITmfEvent
.class,
107 TmfEventProviderStub
.class);
108 ITmfDataProvider provider
= eventProviders
[0];
110 TmfTimeRange range
= new TmfTimeRange(TmfTimestamp
.BIG_BANG
, TmfTimestamp
.BIG_CRUNCH
);
111 final TmfEventRequest request
= new TmfEventRequest(ITmfEvent
.class,
112 range
, 0, NB_EVENTS
, ExecutionType
.FOREGROUND
) {
114 public void handleData(ITmfEvent event
) {
115 super.handleData(event
);
116 requestedEvents
.add(event
);
120 provider
.sendRequest(request
);
122 request
.waitForCompletion();
123 assertEquals("nbEvents", NB_EVENTS
, requestedEvents
.size());
124 assertTrue("isCompleted", request
.isCompleted());
125 assertFalse("isCancelled", request
.isCancelled());
127 // Make that we have distinct events.
128 // Don't go overboard: we are not validating the stub!
129 for (int i
= 0; i
< NB_EVENTS
; i
++) {
130 assertEquals("Distinct events", i
+ 1, requestedEvents
.get(i
).getTimestamp().getValue());
132 } catch (InterruptedException e
) {
138 * Test canceling requests.
141 public void testCancelRequests() {
142 final int NB_EVENTS
= 1000;
143 final int NUMBER_EVENTS_BEFORE_CANCEL_REQ1
= 10;
144 final int NUMBER_EVENTS_BEFORE_CANCEL_REQ2
= 800;
146 final Vector
<ITmfEvent
> requestedEventsReq1
= new Vector
<ITmfEvent
>();
147 final Vector
<ITmfEvent
> requestedEventsReq2
= new Vector
<ITmfEvent
>();
149 // Get the TmfSyntheticEventStub provider
150 ITmfDataProvider
[] eventProviders
= TmfProviderManager
.getProviders(ITmfEvent
.class,
151 TmfEventProviderStub
.class);
152 ITmfDataProvider provider
= eventProviders
[0];
154 TmfTimeRange range
= new TmfTimeRange(TmfTimestamp
.BIG_BANG
, TmfTimestamp
.BIG_CRUNCH
);
156 // Create first request
157 final TmfEventRequest request1
= new TmfEventRequest(ITmfEvent
.class,
158 range
, 0, NB_EVENTS
, ExecutionType
.FOREGROUND
) {
160 public void handleData(ITmfEvent event
) {
161 super.handleData(event
);
162 requestedEventsReq1
.add(event
);
164 // cancel sub request
165 if (getNbRead() == NUMBER_EVENTS_BEFORE_CANCEL_REQ1
) {
171 // Synchronize requests
172 ((TmfEventProviderStub
) provider
).startSynch(new TmfStartSynchSignal(0));
174 // Additionally, notify provider for up-coming requests
175 provider
.notifyPendingRequest(true);
177 // Call sendRequest, which will create a coalescing request, but it
178 // doesn't send request1 yet
179 provider
.sendRequest(request1
);
181 // Check if request1 is not running yet.
182 assertFalse("isRunning", request1
.isRunning());
184 // Create second request
185 final TmfEventRequest request2
= new TmfEventRequest(ITmfEvent
.class,
186 range
, 0, NB_EVENTS
, ExecutionType
.FOREGROUND
) {
188 public void handleData(ITmfEvent event
) {
189 super.handleData(event
);
190 requestedEventsReq2
.add(event
);
192 // cancel sub request which will cancel also main request
193 if (getNbRead() == NUMBER_EVENTS_BEFORE_CANCEL_REQ2
) {
199 // Call sendRequest, which will create a coalescing request, but it
200 // doesn't send request2 yet
201 provider
.sendRequest(request2
);
203 // Check if request1/2 is not running yet.
204 assertFalse("isRunning", request1
.isRunning());
205 assertFalse("isRunning", request2
.isRunning());
207 // Send end synch signal, however requests won't be sent
208 ((TmfEventProviderStub
) provider
).endSynch(new TmfEndSynchSignal(0));
210 // Check if request1/2 is not running yet.
211 assertFalse("isRunning", request1
.isRunning());
212 assertFalse("isRunning", request2
.isRunning());
214 // Finally, trigger sending of requests
215 provider
.notifyPendingRequest(false);
219 // Wait until requests start
220 request1
.waitForStart();
221 request2
.waitForStart();
223 // // Verify that the requests are running
224 // assertTrue("isRunning", request1.isRunning());
225 // assertTrue("isRunning", request2.isRunning());
227 request1
.waitForCompletion();
229 // // Check if request2 is still running
230 // assertTrue("isRunning", request2.isRunning());
232 // Verify result (request1)
233 assertEquals("nbEvents", NUMBER_EVENTS_BEFORE_CANCEL_REQ1
, requestedEventsReq1
.size());
234 assertTrue("isCompleted", request1
.isCompleted());
235 assertTrue("isCancelled", request1
.isCancelled());
237 request2
.waitForCompletion();
239 // Verify result (request2)
240 assertEquals("nbEvents", NUMBER_EVENTS_BEFORE_CANCEL_REQ2
, requestedEventsReq2
.size());
241 assertTrue("isCompleted", request2
.isCompleted());
242 assertTrue("isCancelled", request2
.isCancelled());
244 } catch (InterruptedException e
) {
249 private static void getSyntheticData(final TmfTimeRange range
,
250 final int nbEvents
) throws InterruptedException
{
252 final Vector
<ITmfEvent
> requestedEvents
= new Vector
<ITmfEvent
>();
254 // Get the event provider
255 ITmfDataProvider
[] eventProviders
= TmfProviderManager
256 .getProviders(TmfSyntheticEventStub
.class);
257 ITmfDataProvider provider
= eventProviders
[0];
259 final TmfEventRequest request
= new TmfEventRequest(TmfSyntheticEventStub
.class, range
,
260 0, nbEvents
, ExecutionType
.FOREGROUND
) {
262 public void handleData(ITmfEvent event
) {
263 super.handleData(event
);
264 requestedEvents
.add(event
);
267 provider
.sendRequest(request
);
269 request
.waitForCompletion();
270 if (nbEvents
!= -1) {
271 assertEquals("nbEvents", nbEvents
, requestedEvents
.size());
273 assertTrue("isCompleted", request
.isCompleted());
274 assertFalse("isCancelled", request
.isCancelled());
276 // For each base event, the stub will queue 2 identical synthetic events
277 // Ensure that the events are queued properly.
278 // Don't go overboard: we are not validating the stub!
279 for (int i
= 0; i
< (nbEvents
/ 2); i
++) {
280 assertEquals("Distinct events", i
+ 1, requestedEvents
.get(2 * i
+ 0).getTimestamp().getValue());
281 assertEquals("Distinct events", i
+ 1, requestedEvents
.get(2 * i
+ 1).getTimestamp().getValue());
286 * Test getSyntheticEvents for equal block sizes.
289 public void testGetSyntheticEvents_EqualBlockSizes() {
290 TmfTimeRange range
= new TmfTimeRange(TmfTimestamp
.BIG_BANG
, TmfTimestamp
.BIG_CRUNCH
);
292 getSyntheticData(range
, 1000);
293 } catch (InterruptedException e
) {
299 * Test getSyntheticEvents
302 public void testGetSyntheticEvents_TimeRange() {
303 TmfTimestamp start
= new TmfTimestamp(1, (byte) -3, 0);
304 TmfTimestamp end
= new TmfTimestamp(1000, (byte) -3, 0);
305 TmfTimeRange range
= new TmfTimeRange(start
, end
);
307 getSyntheticData(range
, -1);
308 } catch (InterruptedException e
) {
313 // public void testGetSyntheticEvents_WeirdTimeRange1() {
314 // TmfTimestamp start = TmfTimestamp.BigBang;
315 // TmfTimestamp end = TmfTimestamp.Zero; // new TmfTimestamp(0, (byte) -3,
317 // TmfTimeRange range = new TmfTimeRange(start, end);
319 // getSyntheticData(range, -1, TmfSyntheticEventProviderStub.BLOCK_SIZE);
320 // } catch (InterruptedException e) {
325 // public void testGetSyntheticEvents_WeirdTimeRange2() {
326 // TmfTimestamp start = TmfTimestamp.Zero; // new TmfTimestamp(0, (byte)
328 // TmfTimestamp end = TmfTimestamp.BigCrunch;
329 // TmfTimeRange range = new TmfTimeRange(start, end);
331 // getSyntheticData(range, -1, TmfSyntheticEventProviderStub.BLOCK_SIZE);
332 // } catch (InterruptedException e) {
338 * Test getProviders (more a sanity check than a test)
341 public void testGetProviders2() {
343 // There should be 2 TmfEvent providers: a TmfTraceStub and a
344 // TmfEventProviderStub
345 ITmfDataProvider
[] eventProviders
= TmfProviderManager
.getProviders(ITmfEvent
.class);
346 assertEquals("getProviders", 2, eventProviders
.length
);
348 eventProviders
= TmfProviderManager
.getProviders(ITmfEvent
.class, TmfTraceStub
.class);
349 assertEquals("getProviders", 1, eventProviders
.length
);
351 eventProviders
= TmfProviderManager
.getProviders(ITmfEvent
.class, TmfEventProviderStub
.class);
352 assertEquals("getProviders", 1, eventProviders
.length
);
354 // There should be 1 TmfSyntheticEventStub provider
355 eventProviders
= TmfProviderManager
.getProviders(TmfSyntheticEventStub
.class);
356 assertEquals("getProviders", 1, eventProviders
.length
);