1 /*******************************************************************************
2 * Copyright (c) 2009, 2010 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 *******************************************************************************/
13 package org
.eclipse
.linuxtools
.tmf
.core
.tests
.component
;
15 import java
.util
.Vector
;
17 import junit
.framework
.TestCase
;
19 import org
.eclipse
.linuxtools
.internal
.tmf
.core
.component
.TmfProviderManager
;
20 import org
.eclipse
.linuxtools
.tmf
.core
.component
.ITmfDataProvider
;
21 import org
.eclipse
.linuxtools
.tmf
.core
.event
.TmfEvent
;
22 import org
.eclipse
.linuxtools
.tmf
.core
.event
.TmfTimeRange
;
23 import org
.eclipse
.linuxtools
.tmf
.core
.event
.TmfTimestamp
;
24 import org
.eclipse
.linuxtools
.tmf
.core
.request
.TmfEventRequest
;
25 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfEndSynchSignal
;
26 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfStartSynchSignal
;
27 import org
.eclipse
.linuxtools
.tmf
.tests
.stubs
.component
.TmfEventProviderStub
;
28 import org
.eclipse
.linuxtools
.tmf
.tests
.stubs
.component
.TmfSyntheticEventProviderStub
;
29 import org
.eclipse
.linuxtools
.tmf
.tests
.stubs
.event
.TmfSyntheticEventStub
;
30 import org
.eclipse
.linuxtools
.tmf
.tests
.stubs
.trace
.TmfTraceStub
;
33 * <b><u>TmfClientTest</u></b>
35 * Test suite for the TmfEventProvider class.
37 @SuppressWarnings({ "nls" })
38 public class TmfEventProviderTest
extends TestCase
{
40 TmfEventProviderStub fEventProvider
;
41 TmfSyntheticEventProviderStub fSyntheticEventProvider
;
44 * @param name the test anme
46 public TmfEventProviderTest(String name
) {
51 protected void setUp() throws Exception
{
53 fEventProvider
= new TmfEventProviderStub();
54 fSyntheticEventProvider
= new TmfSyntheticEventProviderStub();
58 protected void tearDown() throws Exception
{
60 fEventProvider
.dispose();
61 fSyntheticEventProvider
.dispose();
64 // ------------------------------------------------------------------------
65 // getProviders (more a sanity check than a test)
66 // ------------------------------------------------------------------------
71 public void testGetProviders() {
73 // There should be 2 TmfEvent providers: a TmfTraceStub and a
74 // TmfEventProviderStub
75 ITmfDataProvider
<TmfEvent
>[] eventProviders
= (ITmfDataProvider
<TmfEvent
>[]) TmfProviderManager
.getProviders(TmfEvent
.class);
76 assertEquals("getProviders", 2, eventProviders
.length
);
78 eventProviders
= (ITmfDataProvider
<TmfEvent
>[]) TmfProviderManager
.getProviders(TmfEvent
.class, TmfTraceStub
.class);
79 assertEquals("getProviders", 1, eventProviders
.length
);
81 eventProviders
= (ITmfDataProvider
<TmfEvent
>[]) TmfProviderManager
.getProviders(TmfEvent
.class, TmfEventProviderStub
.class);
82 assertEquals("getProviders", 1, eventProviders
.length
);
84 // There should be 1 TmfSyntheticEventStub provider
85 eventProviders
= (ITmfDataProvider
<TmfEvent
>[]) TmfProviderManager
.getProviders(TmfSyntheticEventStub
.class);
86 assertEquals("getProviders", 1, eventProviders
.length
);
89 // ------------------------------------------------------------------------
91 // ------------------------------------------------------------------------
96 public void testGetPlainEvents() {
98 final int BLOCK_SIZE
= 100;
99 final int NB_EVENTS
= 1000;
100 final Vector
<TmfEvent
> requestedEvents
= new Vector
<TmfEvent
>();
102 // Get the TmfSyntheticEventStub provider
103 ITmfDataProvider
<TmfEvent
>[] eventProviders
= (ITmfDataProvider
<TmfEvent
>[]) TmfProviderManager
.getProviders(TmfEvent
.class,
104 TmfEventProviderStub
.class);
105 ITmfDataProvider
<TmfEvent
> provider
= eventProviders
[0];
107 TmfTimeRange range
= new TmfTimeRange(TmfTimestamp
.BIG_BANG
, TmfTimestamp
.BIG_CRUNCH
);
108 final TmfEventRequest
<TmfEvent
> request
= new TmfEventRequest
<TmfEvent
>(TmfEvent
.class, range
, NB_EVENTS
, BLOCK_SIZE
) {
110 public void handleData(TmfEvent event
) {
111 super.handleData(event
);
112 requestedEvents
.add(event
);
116 provider
.sendRequest(request
);
118 request
.waitForCompletion();
119 assertEquals("nbEvents", NB_EVENTS
, requestedEvents
.size());
120 assertTrue("isCompleted", request
.isCompleted());
121 assertFalse("isCancelled", request
.isCancelled());
123 // Make that we have distinct events.
124 // Don't go overboard: we are not validating the stub!
125 for (int i
= 0; i
< NB_EVENTS
; i
++) {
126 assertEquals("Distinct events", i
+ 1, requestedEvents
.get(i
).getTimestamp().getValue());
128 } catch (InterruptedException e
) {
136 public void testCancelRequests() {
138 final int BLOCK_SIZE
= 100;
139 final int NB_EVENTS
= 1000;
140 final int NUMBER_EVENTS_BEFORE_CANCEL_REQ1
= 10;
141 final int NUMBER_EVENTS_BEFORE_CANCEL_REQ2
= 800;
143 final Vector
<TmfEvent
> requestedEventsReq1
= new Vector
<TmfEvent
>();
144 final Vector
<TmfEvent
> requestedEventsReq2
= new Vector
<TmfEvent
>();
146 // Get the TmfSyntheticEventStub provider
147 ITmfDataProvider
<TmfEvent
>[] eventProviders
= (ITmfDataProvider
<TmfEvent
>[]) TmfProviderManager
.getProviders(TmfEvent
.class,
148 TmfEventProviderStub
.class);
149 ITmfDataProvider
<TmfEvent
> provider
= eventProviders
[0];
151 TmfTimeRange range
= new TmfTimeRange(TmfTimestamp
.BIG_BANG
, TmfTimestamp
.BIG_CRUNCH
);
153 // Create first request
154 final TmfEventRequest
<TmfEvent
> request1
= new TmfEventRequest
<TmfEvent
>(TmfEvent
.class, range
, NB_EVENTS
, BLOCK_SIZE
) {
156 public void handleData(TmfEvent event
) {
157 super.handleData(event
);
158 requestedEventsReq1
.add(event
);
160 // cancel sub request
161 if (getNbRead() == NUMBER_EVENTS_BEFORE_CANCEL_REQ1
) {
167 // Synchronize requests
168 ((TmfEventProviderStub
) provider
).startSynch(new TmfStartSynchSignal(0));
170 // Additionally, notify provider for up-coming requests
171 provider
.notifyPendingRequest(true);
173 // Call sendRequest, which will create a coalescing request, but it
174 // doesn't send request1 yet
175 provider
.sendRequest(request1
);
177 // Check if request1 is not running yet.
178 assertFalse("isRunning", request1
.isRunning());
180 // Create second request
181 final TmfEventRequest
<TmfEvent
> request2
= new TmfEventRequest
<TmfEvent
>(TmfEvent
.class, range
, NB_EVENTS
, BLOCK_SIZE
) {
183 public void handleData(TmfEvent event
) {
184 super.handleData(event
);
185 requestedEventsReq2
.add(event
);
187 // cancel sub request which will cancel also main request
188 if (getNbRead() == NUMBER_EVENTS_BEFORE_CANCEL_REQ2
) {
194 // Call sendRequest, which will create a coalescing request, but it
195 // doesn't send request2 yet
196 provider
.sendRequest(request2
);
198 // Check if request1/2 is not running yet.
199 assertFalse("isRunning", request1
.isRunning());
200 assertFalse("isRunning", request2
.isRunning());
202 // Send end synch signal, however requests won't be sent
203 ((TmfEventProviderStub
) provider
).endSynch(new TmfEndSynchSignal(0));
205 // Check if request1/2 is not running yet.
206 assertFalse("isRunning", request1
.isRunning());
207 assertFalse("isRunning", request2
.isRunning());
209 // Finally, trigger sending of requests
210 provider
.notifyPendingRequest(false);
214 // Wait until requests start
215 request1
.waitForStart();
216 request2
.waitForStart();
218 // // Verify that the requests are running
219 // assertTrue("isRunning", request1.isRunning());
220 // assertTrue("isRunning", request2.isRunning());
222 request1
.waitForCompletion();
224 // // Check if request2 is still running
225 // assertTrue("isRunning", request2.isRunning());
227 // Verify result (request1)
228 assertEquals("nbEvents", NUMBER_EVENTS_BEFORE_CANCEL_REQ1
, requestedEventsReq1
.size());
229 assertTrue("isCompleted", request1
.isCompleted());
230 assertTrue("isCancelled", request1
.isCancelled());
232 request2
.waitForCompletion();
234 // Verify result (request2)
235 assertEquals("nbEvents", NUMBER_EVENTS_BEFORE_CANCEL_REQ2
, requestedEventsReq2
.size());
236 assertTrue("isCompleted", request2
.isCompleted());
237 assertTrue("isCancelled", request2
.isCancelled());
239 } catch (InterruptedException e
) {
244 private static void getSyntheticData(final TmfTimeRange range
,
245 final int nbEvents
, final int blockSize
) throws InterruptedException
{
247 final Vector
<TmfSyntheticEventStub
> requestedEvents
= new Vector
<TmfSyntheticEventStub
>();
249 // Get the event provider
250 ITmfDataProvider
<TmfSyntheticEventStub
>[] eventProviders
= (ITmfDataProvider
<TmfSyntheticEventStub
>[]) TmfProviderManager
251 .getProviders(TmfSyntheticEventStub
.class);
252 ITmfDataProvider
<TmfSyntheticEventStub
> provider
= eventProviders
[0];
254 final TmfEventRequest
<TmfSyntheticEventStub
> request
= new TmfEventRequest
<TmfSyntheticEventStub
>(TmfSyntheticEventStub
.class, range
,
255 nbEvents
, blockSize
) {
257 public void handleData(TmfSyntheticEventStub event
) {
258 super.handleData(event
);
259 requestedEvents
.add(event
);
262 provider
.sendRequest(request
);
264 request
.waitForCompletion();
265 if (nbEvents
!= -1) {
266 assertEquals("nbEvents", nbEvents
, requestedEvents
.size());
268 assertTrue("isCompleted", request
.isCompleted());
269 assertFalse("isCancelled", request
.isCancelled());
271 // For each base event, the stub will queue 2 identical synthetic events
272 // Ensure that the events are queued properly.
273 // Don't go overboard: we are not validating the stub!
274 for (int i
= 0; i
< (nbEvents
/ 2); i
++) {
275 assertEquals("Distinct events", i
+ 1, requestedEvents
.get(2 * i
+ 0).getTimestamp().getValue());
276 assertEquals("Distinct events", i
+ 1, requestedEvents
.get(2 * i
+ 1).getTimestamp().getValue());
283 // The following tests are the same but for the size of the requested blocks
284 // with regards to the size of the TmfSyntheticEventProviderStub block
285 public void testGetSyntheticEvents_EqualBlockSizes() {
286 TmfTimeRange range
= new TmfTimeRange(TmfTimestamp
.BIG_BANG
, TmfTimestamp
.BIG_CRUNCH
);
288 getSyntheticData(range
, 1000, TmfSyntheticEventProviderStub
.BLOCK_SIZE
);
289 } catch (InterruptedException e
) {
297 public void testGetSyntheticEvents_SmallerBlock() {
298 TmfTimeRange range
= new TmfTimeRange(TmfTimestamp
.BIG_BANG
, TmfTimestamp
.BIG_CRUNCH
);
300 getSyntheticData(range
, 1000, TmfSyntheticEventProviderStub
.BLOCK_SIZE
/ 2);
301 } catch (InterruptedException e
) {
309 public void testGetSyntheticEvents_LargerBlock() {
310 TmfTimeRange range
= new TmfTimeRange(TmfTimestamp
.BIG_BANG
, TmfTimestamp
.BIG_CRUNCH
);
312 getSyntheticData(range
, 1000, TmfSyntheticEventProviderStub
.BLOCK_SIZE
* 2);
313 } catch (InterruptedException e
) {
321 public void testGetSyntheticEvents_TimeRange() {
322 TmfTimestamp start
= new TmfTimestamp(1, (byte) -3, 0);
323 TmfTimestamp end
= new TmfTimestamp(1000, (byte) -3, 0);
324 TmfTimeRange range
= new TmfTimeRange(start
, end
);
326 getSyntheticData(range
, -1, TmfSyntheticEventProviderStub
.BLOCK_SIZE
);
327 } catch (InterruptedException e
) {
332 // public void testGetSyntheticEvents_WeirdTimeRange1() {
333 // TmfTimestamp start = TmfTimestamp.BigBang;
334 // TmfTimestamp end = TmfTimestamp.Zero; // new TmfTimestamp(0, (byte) -3,
336 // TmfTimeRange range = new TmfTimeRange(start, end);
338 // getSyntheticData(range, -1, TmfSyntheticEventProviderStub.BLOCK_SIZE);
339 // } catch (InterruptedException e) {
344 // public void testGetSyntheticEvents_WeirdTimeRange2() {
345 // TmfTimestamp start = TmfTimestamp.Zero; // new TmfTimestamp(0, (byte)
347 // TmfTimestamp end = TmfTimestamp.BigCrunch;
348 // TmfTimeRange range = new TmfTimeRange(start, end);
350 // getSyntheticData(range, -1, TmfSyntheticEventProviderStub.BLOCK_SIZE);
351 // } catch (InterruptedException e) {
356 // ------------------------------------------------------------------------
357 // getProviders (more a sanity check than a test)
358 // ------------------------------------------------------------------------
363 public void testGetProviders2() {
365 // There should be 2 TmfEvent providers: a TmfTraceStub and a
366 // TmfEventProviderStub
367 ITmfDataProvider
<TmfEvent
>[] eventProviders
= (ITmfDataProvider
<TmfEvent
>[]) TmfProviderManager
.getProviders(TmfEvent
.class);
368 assertEquals("getProviders", 2, eventProviders
.length
);
370 eventProviders
= (ITmfDataProvider
<TmfEvent
>[]) TmfProviderManager
.getProviders(TmfEvent
.class, TmfTraceStub
.class);
371 assertEquals("getProviders", 1, eventProviders
.length
);
373 eventProviders
= (ITmfDataProvider
<TmfEvent
>[]) TmfProviderManager
.getProviders(TmfEvent
.class, TmfEventProviderStub
.class);
374 assertEquals("getProviders", 1, eventProviders
.length
);
376 // There should be 1 TmfSyntheticEventStub provider
377 eventProviders
= (ITmfDataProvider
<TmfEvent
>[]) TmfProviderManager
.getProviders(TmfSyntheticEventStub
.class);
378 assertEquals("getProviders", 1, eventProviders
.length
);