tmf: Fix regression in event requests
[deliverable/tracecompass.git] / org.eclipse.linuxtools.tmf.core.tests / src / org / eclipse / linuxtools / tmf / core / tests / component / TmfEventProviderTest.java
CommitLineData
d18dd09b
ASL
1/*******************************************************************************
2 * Copyright (c) 2009, 2010 Ericsson
9b749023 3 *
d18dd09b
ASL
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
9b749023 8 *
d18dd09b
ASL
9 * Contributors:
10 * Francois Chouinard - Initial API and implementation
11 *******************************************************************************/
12
6c13869b 13package org.eclipse.linuxtools.tmf.core.tests.component;
d18dd09b 14
d18dd09b
ASL
15import java.util.Vector;
16
17import junit.framework.TestCase;
18
8fd82db5 19import org.eclipse.linuxtools.internal.tmf.core.component.TmfProviderManager;
5419a136 20import org.eclipse.linuxtools.tmf.core.component.ITmfDataProvider;
6256d8ad 21import org.eclipse.linuxtools.tmf.core.event.ITmfEvent;
6c13869b
FC
22import org.eclipse.linuxtools.tmf.core.event.TmfEvent;
23import org.eclipse.linuxtools.tmf.core.event.TmfTimeRange;
24import org.eclipse.linuxtools.tmf.core.event.TmfTimestamp;
25import org.eclipse.linuxtools.tmf.core.request.TmfEventRequest;
26import org.eclipse.linuxtools.tmf.core.signal.TmfEndSynchSignal;
27import org.eclipse.linuxtools.tmf.core.signal.TmfStartSynchSignal;
4918b8f2
FC
28import org.eclipse.linuxtools.tmf.tests.stubs.component.TmfEventProviderStub;
29import org.eclipse.linuxtools.tmf.tests.stubs.component.TmfSyntheticEventProviderStub;
30import org.eclipse.linuxtools.tmf.tests.stubs.event.TmfSyntheticEventStub;
31import org.eclipse.linuxtools.tmf.tests.stubs.trace.TmfTraceStub;
d18dd09b
ASL
32
33/**
34 * <b><u>TmfClientTest</u></b>
35 * <p>
ff4ed569 36 * Test suite for the TmfEventProvider class.
d18dd09b 37 */
2d223a34 38@SuppressWarnings({ "nls" })
d18dd09b
ASL
39public class TmfEventProviderTest extends TestCase {
40
cf21ffe2
FC
41 TmfEventProviderStub fEventProvider;
42 TmfSyntheticEventProviderStub fSyntheticEventProvider;
d18dd09b 43
54a7a54c
FC
44 /**
45 * @param name the test anme
46 */
9b749023 47 public TmfEventProviderTest(String name) {
cf21ffe2
FC
48 super(name);
49 }
d18dd09b 50
cf21ffe2
FC
51 @Override
52 protected void setUp() throws Exception {
53 super.setUp();
54 fEventProvider = new TmfEventProviderStub();
55 fSyntheticEventProvider = new TmfSyntheticEventProviderStub();
56 }
d18dd09b 57
cf21ffe2
FC
58 @Override
59 protected void tearDown() throws Exception {
60 super.tearDown();
61 fEventProvider.dispose();
62 fSyntheticEventProvider.dispose();
63 }
d18dd09b 64
cf21ffe2
FC
65 // ------------------------------------------------------------------------
66 // getProviders (more a sanity check than a test)
67 // ------------------------------------------------------------------------
d18dd09b 68
54a7a54c
FC
69 /**
70 *
71 */
cf21ffe2 72 public void testGetProviders() {
d18dd09b 73
cf21ffe2
FC
74 // There should be 2 TmfEvent providers: a TmfTraceStub and a
75 // TmfEventProviderStub
5419a136 76 ITmfDataProvider[] eventProviders = TmfProviderManager.getProviders(TmfEvent.class);
cf21ffe2 77 assertEquals("getProviders", 2, eventProviders.length);
d18dd09b 78
6256d8ad 79 eventProviders = TmfProviderManager.getProviders(TmfEvent.class, TmfTraceStub.class);
cf21ffe2 80 assertEquals("getProviders", 1, eventProviders.length);
d18dd09b 81
6256d8ad 82 eventProviders = TmfProviderManager.getProviders(TmfEvent.class, TmfEventProviderStub.class);
cf21ffe2 83 assertEquals("getProviders", 1, eventProviders.length);
d18dd09b 84
cf21ffe2 85 // There should be 1 TmfSyntheticEventStub provider
6256d8ad 86 eventProviders = TmfProviderManager.getProviders(TmfSyntheticEventStub.class);
cf21ffe2
FC
87 assertEquals("getProviders", 1, eventProviders.length);
88 }
d18dd09b 89
cf21ffe2
FC
90 // ------------------------------------------------------------------------
91 // getSyntheticEvent
92 // ------------------------------------------------------------------------
d18dd09b 93
54a7a54c
FC
94 /**
95 *
96 */
cf21ffe2 97 public void testGetPlainEvents() {
d18dd09b
ASL
98
99 final int BLOCK_SIZE = 100;
cf21ffe2 100 final int NB_EVENTS = 1000;
6256d8ad 101 final Vector<ITmfEvent> requestedEvents = new Vector<ITmfEvent>();
d18dd09b
ASL
102
103 // Get the TmfSyntheticEventStub provider
5419a136
AM
104 ITmfDataProvider[] eventProviders = TmfProviderManager.getProviders(TmfEvent.class,
105 TmfEventProviderStub.class);
106 ITmfDataProvider provider = eventProviders[0];
d18dd09b 107
a4115405 108 TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BIG_BANG, TmfTimestamp.BIG_CRUNCH);
6256d8ad 109 final TmfEventRequest request = new TmfEventRequest(TmfEvent.class, range, NB_EVENTS, BLOCK_SIZE) {
cf21ffe2 110 @Override
6256d8ad 111 public void handleData(ITmfEvent event) {
cf21ffe2
FC
112 super.handleData(event);
113 requestedEvents.add(event);
114 }
f9673903 115 };
cf21ffe2 116
d18dd09b 117 provider.sendRequest(request);
cb866e08 118 try {
cf21ffe2
FC
119 request.waitForCompletion();
120 assertEquals("nbEvents", NB_EVENTS, requestedEvents.size());
121 assertTrue("isCompleted", request.isCompleted());
122 assertFalse("isCancelled", request.isCancelled());
123
124 // Make that we have distinct events.
125 // Don't go overboard: we are not validating the stub!
126 for (int i = 0; i < NB_EVENTS; i++) {
127 assertEquals("Distinct events", i + 1, requestedEvents.get(i).getTimestamp().getValue());
128 }
129 } catch (InterruptedException e) {
130 fail();
131 }
132 }
133
54a7a54c
FC
134 /**
135 *
136 */
cf21ffe2
FC
137 public void testCancelRequests() {
138
139 final int BLOCK_SIZE = 100;
140 final int NB_EVENTS = 1000;
141 final int NUMBER_EVENTS_BEFORE_CANCEL_REQ1 = 10;
142 final int NUMBER_EVENTS_BEFORE_CANCEL_REQ2 = 800;
143
6256d8ad
AM
144 final Vector<ITmfEvent> requestedEventsReq1 = new Vector<ITmfEvent>();
145 final Vector<ITmfEvent> requestedEventsReq2 = new Vector<ITmfEvent>();
cf21ffe2
FC
146
147 // Get the TmfSyntheticEventStub provider
5419a136
AM
148 ITmfDataProvider[] eventProviders = TmfProviderManager.getProviders(TmfEvent.class,
149 TmfEventProviderStub.class);
150 ITmfDataProvider provider = eventProviders[0];
cf21ffe2 151
a4115405 152 TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BIG_BANG, TmfTimestamp.BIG_CRUNCH);
cf21ffe2
FC
153
154 // Create first request
6256d8ad 155 final TmfEventRequest request1 = new TmfEventRequest(TmfEvent.class, range, NB_EVENTS, BLOCK_SIZE) {
cf21ffe2 156 @Override
6256d8ad 157 public void handleData(ITmfEvent event) {
cf21ffe2
FC
158 super.handleData(event);
159 requestedEventsReq1.add(event);
160
161 // cancel sub request
162 if (getNbRead() == NUMBER_EVENTS_BEFORE_CANCEL_REQ1) {
163 cancel();
164 }
165 }
166 };
167
168 // Synchronize requests
169 ((TmfEventProviderStub) provider).startSynch(new TmfStartSynchSignal(0));
170
171 // Additionally, notify provider for up-coming requests
172 provider.notifyPendingRequest(true);
173
174 // Call sendRequest, which will create a coalescing request, but it
175 // doesn't send request1 yet
176 provider.sendRequest(request1);
177
178 // Check if request1 is not running yet.
179 assertFalse("isRunning", request1.isRunning());
180
181 // Create second request
6256d8ad 182 final TmfEventRequest request2 = new TmfEventRequest(TmfEvent.class, range, NB_EVENTS, BLOCK_SIZE) {
cf21ffe2 183 @Override
6256d8ad 184 public void handleData(ITmfEvent event) {
cf21ffe2 185 super.handleData(event);
c1c69938
FC
186 requestedEventsReq2.add(event);
187
188 // cancel sub request which will cancel also main request
cf21ffe2
FC
189 if (getNbRead() == NUMBER_EVENTS_BEFORE_CANCEL_REQ2) {
190 cancel();
191 }
192 }
193 };
c1c69938 194
cf21ffe2
FC
195 // Call sendRequest, which will create a coalescing request, but it
196 // doesn't send request2 yet
c1c69938
FC
197 provider.sendRequest(request2);
198
199 // Check if request1/2 is not running yet.
cf21ffe2
FC
200 assertFalse("isRunning", request1.isRunning());
201 assertFalse("isRunning", request2.isRunning());
202
203 // Send end synch signal, however requests won't be sent
c1c69938
FC
204 ((TmfEventProviderStub) provider).endSynch(new TmfEndSynchSignal(0));
205
206 // Check if request1/2 is not running yet.
cf21ffe2
FC
207 assertFalse("isRunning", request1.isRunning());
208 assertFalse("isRunning", request2.isRunning());
c1c69938 209
cf21ffe2 210 // Finally, trigger sending of requests
c1c69938 211 provider.notifyPendingRequest(false);
c1c69938 212
cf21ffe2
FC
213 try {
214
215 // Wait until requests start
216 request1.waitForStart();
217 request2.waitForStart();
c1c69938 218
cf21ffe2
FC
219// // Verify that the requests are running
220// assertTrue("isRunning", request1.isRunning());
221// assertTrue("isRunning", request2.isRunning());
c1c69938 222
cf21ffe2 223 request1.waitForCompletion();
c1c69938 224
cf21ffe2
FC
225// // Check if request2 is still running
226// assertTrue("isRunning", request2.isRunning());
227
228 // Verify result (request1)
c1c69938 229 assertEquals("nbEvents", NUMBER_EVENTS_BEFORE_CANCEL_REQ1, requestedEventsReq1.size());
cf21ffe2
FC
230 assertTrue("isCompleted", request1.isCompleted());
231 assertTrue("isCancelled", request1.isCancelled());
232
233 request2.waitForCompletion();
234
235 // Verify result (request2)
236 assertEquals("nbEvents", NUMBER_EVENTS_BEFORE_CANCEL_REQ2, requestedEventsReq2.size());
237 assertTrue("isCompleted", request2.isCompleted());
238 assertTrue("isCancelled", request2.isCancelled());
239
240 } catch (InterruptedException e) {
241 fail();
242 }
243 }
244
9b749023
AM
245 private static void getSyntheticData(final TmfTimeRange range,
246 final int nbEvents, final int blockSize) throws InterruptedException {
d18dd09b 247
6256d8ad 248 final Vector<ITmfEvent> requestedEvents = new Vector<ITmfEvent>();
d18dd09b
ASL
249
250 // Get the event provider
5419a136
AM
251 ITmfDataProvider[] eventProviders = TmfProviderManager
252 .getProviders(TmfSyntheticEventStub.class);
253 ITmfDataProvider provider = eventProviders[0];
cf21ffe2 254
6256d8ad 255 final TmfEventRequest request = new TmfEventRequest(TmfSyntheticEventStub.class, range,
cf21ffe2
FC
256 nbEvents, blockSize) {
257 @Override
6256d8ad 258 public void handleData(ITmfEvent event) {
cf21ffe2
FC
259 super.handleData(event);
260 requestedEvents.add(event);
261 }
262 };
d18dd09b 263 provider.sendRequest(request);
d18dd09b 264
cb866e08 265 request.waitForCompletion();
9b749023 266 if (nbEvents != -1) {
cf21ffe2 267 assertEquals("nbEvents", nbEvents, requestedEvents.size());
9b749023 268 }
cf21ffe2
FC
269 assertTrue("isCompleted", request.isCompleted());
270 assertFalse("isCancelled", request.isCancelled());
271
272 // For each base event, the stub will queue 2 identical synthetic events
273 // Ensure that the events are queued properly.
274 // Don't go overboard: we are not validating the stub!
275 for (int i = 0; i < (nbEvents / 2); i++) {
276 assertEquals("Distinct events", i + 1, requestedEvents.get(2 * i + 0).getTimestamp().getValue());
277 assertEquals("Distinct events", i + 1, requestedEvents.get(2 * i + 1).getTimestamp().getValue());
278 }
279 }
280
54a7a54c
FC
281 /**
282 *
283 */
cf21ffe2
FC
284 // The following tests are the same but for the size of the requested blocks
285 // with regards to the size of the TmfSyntheticEventProviderStub block
cb866e08 286 public void testGetSyntheticEvents_EqualBlockSizes() {
a4115405 287 TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BIG_BANG, TmfTimestamp.BIG_CRUNCH);
cf21ffe2
FC
288 try {
289 getSyntheticData(range, 1000, TmfSyntheticEventProviderStub.BLOCK_SIZE);
290 } catch (InterruptedException e) {
291 fail();
292 }
293 }
294
54a7a54c
FC
295 /**
296 *
297 */
cf21ffe2 298 public void testGetSyntheticEvents_SmallerBlock() {
a4115405 299 TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BIG_BANG, TmfTimestamp.BIG_CRUNCH);
cf21ffe2
FC
300 try {
301 getSyntheticData(range, 1000, TmfSyntheticEventProviderStub.BLOCK_SIZE / 2);
302 } catch (InterruptedException e) {
303 fail();
304 }
305 }
306
54a7a54c
FC
307 /**
308 *
309 */
cf21ffe2 310 public void testGetSyntheticEvents_LargerBlock() {
a4115405 311 TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BIG_BANG, TmfTimestamp.BIG_CRUNCH);
cf21ffe2
FC
312 try {
313 getSyntheticData(range, 1000, TmfSyntheticEventProviderStub.BLOCK_SIZE * 2);
314 } catch (InterruptedException e) {
315 fail();
316 }
317 }
318
54a7a54c
FC
319 /**
320 *
321 */
cf21ffe2
FC
322 public void testGetSyntheticEvents_TimeRange() {
323 TmfTimestamp start = new TmfTimestamp(1, (byte) -3, 0);
324 TmfTimestamp end = new TmfTimestamp(1000, (byte) -3, 0);
d18dd09b 325 TmfTimeRange range = new TmfTimeRange(start, end);
cf21ffe2
FC
326 try {
327 getSyntheticData(range, -1, TmfSyntheticEventProviderStub.BLOCK_SIZE);
328 } catch (InterruptedException e) {
329 fail();
330 }
331 }
332
496a16a7
FC
333// public void testGetSyntheticEvents_WeirdTimeRange1() {
334// TmfTimestamp start = TmfTimestamp.BigBang;
335// TmfTimestamp end = TmfTimestamp.Zero; // new TmfTimestamp(0, (byte) -3,
336// // 0);
337// TmfTimeRange range = new TmfTimeRange(start, end);
338// try {
339// getSyntheticData(range, -1, TmfSyntheticEventProviderStub.BLOCK_SIZE);
340// } catch (InterruptedException e) {
341// fail();
342// }
343// }
344
345// public void testGetSyntheticEvents_WeirdTimeRange2() {
346// TmfTimestamp start = TmfTimestamp.Zero; // new TmfTimestamp(0, (byte)
347// // -3, 0);
348// TmfTimestamp end = TmfTimestamp.BigCrunch;
349// TmfTimeRange range = new TmfTimeRange(start, end);
350// try {
351// getSyntheticData(range, -1, TmfSyntheticEventProviderStub.BLOCK_SIZE);
352// } catch (InterruptedException e) {
353// fail();
354// }
355// }
cf21ffe2
FC
356
357 // ------------------------------------------------------------------------
358 // getProviders (more a sanity check than a test)
359 // ------------------------------------------------------------------------
360
54a7a54c
FC
361 /**
362 *
363 */
cf21ffe2
FC
364 public void testGetProviders2() {
365
366 // There should be 2 TmfEvent providers: a TmfTraceStub and a
367 // TmfEventProviderStub
5419a136 368 ITmfDataProvider[] eventProviders = TmfProviderManager.getProviders(TmfEvent.class);
cf21ffe2
FC
369 assertEquals("getProviders", 2, eventProviders.length);
370
6256d8ad 371 eventProviders = TmfProviderManager.getProviders(TmfEvent.class, TmfTraceStub.class);
cf21ffe2
FC
372 assertEquals("getProviders", 1, eventProviders.length);
373
6256d8ad 374 eventProviders = TmfProviderManager.getProviders(TmfEvent.class, TmfEventProviderStub.class);
cf21ffe2
FC
375 assertEquals("getProviders", 1, eventProviders.length);
376
377 // There should be 1 TmfSyntheticEventStub provider
6256d8ad 378 eventProviders = TmfProviderManager.getProviders(TmfSyntheticEventStub.class);
cf21ffe2
FC
379 assertEquals("getProviders", 1, eventProviders.length);
380 }
d18dd09b
ASL
381
382}
This page took 0.056013 seconds and 5 git commands to generate.