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
.request
;
16 import static org
.junit
.Assert
.assertEquals
;
17 import static org
.junit
.Assert
.assertFalse
;
18 import static org
.junit
.Assert
.assertTrue
;
21 import java
.io
.IOException
;
22 import java
.net
.URISyntaxException
;
24 import java
.util
.Vector
;
26 import org
.eclipse
.core
.runtime
.FileLocator
;
27 import org
.eclipse
.core
.runtime
.Path
;
28 import org
.eclipse
.linuxtools
.internal
.tmf
.core
.component
.TmfProviderManager
;
29 import org
.eclipse
.linuxtools
.internal
.tmf
.core
.request
.TmfCoalescedDataRequest
;
30 import org
.eclipse
.linuxtools
.internal
.tmf
.core
.request
.TmfCoalescedEventRequest
;
31 import org
.eclipse
.linuxtools
.tmf
.core
.component
.ITmfDataProvider
;
32 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfEvent
;
33 import org
.eclipse
.linuxtools
.tmf
.core
.exceptions
.TmfTraceException
;
34 import org
.eclipse
.linuxtools
.tmf
.core
.request
.ITmfDataRequest
.ExecutionType
;
35 import org
.eclipse
.linuxtools
.tmf
.core
.request
.TmfDataRequest
;
36 import org
.eclipse
.linuxtools
.tmf
.core
.request
.TmfEventRequest
;
37 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfSignal
;
38 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfSignalHandler
;
39 import org
.eclipse
.linuxtools
.tmf
.core
.signal
.TmfSignalManager
;
40 import org
.eclipse
.linuxtools
.tmf
.core
.tests
.TmfCoreTestPlugin
;
41 import org
.eclipse
.linuxtools
.tmf
.core
.tests
.shared
.TmfTestTrace
;
42 import org
.eclipse
.linuxtools
.tmf
.core
.timestamp
.TmfTimeRange
;
43 import org
.eclipse
.linuxtools
.tmf
.core
.timestamp
.TmfTimestamp
;
44 import org
.eclipse
.linuxtools
.tmf
.tests
.stubs
.request
.TmfEventRequestStub
;
45 import org
.eclipse
.linuxtools
.tmf
.tests
.stubs
.trace
.TmfTraceStub
;
46 import org
.junit
.Before
;
47 import org
.junit
.Test
;
50 * Test suite for the TmfCoalescedEventRequest class.
52 @SuppressWarnings("javadoc")
53 public class TmfCoalescedEventRequestTest
{
55 // ------------------------------------------------------------------------
57 // ------------------------------------------------------------------------
59 private final TmfTimeRange range1
= new TmfTimeRange(TmfTimeRange
.ETERNITY
);
60 private final TmfTimeRange range2
= new TmfTimeRange(new TmfTimestamp(), TmfTimestamp
.BIG_CRUNCH
);
62 private TmfCoalescedEventRequest fRequest1
;
63 private TmfCoalescedEventRequest fRequest2
;
64 private TmfCoalescedEventRequest fRequest3
;
65 private TmfCoalescedEventRequest fRequest4
;
67 private TmfCoalescedEventRequest fRequest1b
;
68 private TmfCoalescedEventRequest fRequest1c
;
70 private int fRequestCount
;
72 // ------------------------------------------------------------------------
74 // ------------------------------------------------------------------------
78 TmfDataRequest
.reset();
79 fRequest1
= new TmfCoalescedEventRequest(ITmfEvent
.class, range1
, 0, 100, ExecutionType
.FOREGROUND
);
80 fRequest2
= new TmfCoalescedEventRequest(ITmfEvent
.class, range2
, 0, 100, ExecutionType
.FOREGROUND
);
81 fRequest3
= new TmfCoalescedEventRequest(ITmfEvent
.class, range2
, 0, 200, ExecutionType
.FOREGROUND
);
82 fRequest4
= new TmfCoalescedEventRequest(ITmfEvent
.class, range2
, 0, 200, ExecutionType
.FOREGROUND
);
84 fRequest1b
= new TmfCoalescedEventRequest(ITmfEvent
.class, range1
, 0, 100, ExecutionType
.FOREGROUND
);
85 fRequest1c
= new TmfCoalescedEventRequest(ITmfEvent
.class, range1
, 0, 100, ExecutionType
.FOREGROUND
);
87 fRequestCount
= fRequest1c
.getRequestId() + 1;
90 private TmfCoalescedEventRequest
setupTestRequest(final boolean[] flags
) {
92 TmfCoalescedEventRequest request
= new TmfCoalescedEventRequest(ITmfEvent
.class, range1
, 0, 100, ExecutionType
.FOREGROUND
) {
94 public void handleCompleted() {
95 super.handleCompleted();
100 public void handleSuccess() {
101 super.handleSuccess();
106 public void handleFailure() {
107 super.handleFailure();
112 public void handleCancel() {
113 super.handleCancel();
120 // ------------------------------------------------------------------------
122 // ------------------------------------------------------------------------
125 public void testTmfCoalescedEventRequestIndexNbEventsBlocksize() {
126 TmfCoalescedEventRequest request
= new TmfCoalescedEventRequest(ITmfEvent
.class, range1
, 0, 100, ExecutionType
.FOREGROUND
);
128 assertEquals("getRequestId", fRequestCount
++, request
.getRequestId());
129 assertEquals("getDataType", ITmfEvent
.class, request
.getDataType());
131 assertEquals("getRange", range1
, request
.getRange());
132 assertEquals("getNbRequestedEvents", 100, request
.getNbRequested());
134 assertFalse("isCompleted", request
.isCompleted());
135 assertFalse("isFailed", request
.isFailed());
136 assertFalse("isCancelled", request
.isCancelled());
138 assertEquals("getNbRead", 0, request
.getNbRead());
141 // ------------------------------------------------------------------------
143 // ------------------------------------------------------------------------
146 public void testEqualsReflexivity() {
147 assertTrue("equals", fRequest1
.equals(fRequest1
));
148 assertTrue("equals", fRequest2
.equals(fRequest2
));
150 assertFalse("equals", fRequest1
.equals(fRequest2
));
151 assertFalse("equals", fRequest2
.equals(fRequest1
));
155 public void testEqualsSymmetry() {
156 assertTrue("equals", fRequest1
.equals(fRequest1b
));
157 assertTrue("equals", fRequest1b
.equals(fRequest1
));
159 assertFalse("equals", fRequest1
.equals(fRequest3
));
160 assertFalse("equals", fRequest2
.equals(fRequest3
));
161 assertFalse("equals", fRequest3
.equals(fRequest1
));
162 assertFalse("equals", fRequest3
.equals(fRequest2
));
166 public void testEqualsTransivity() {
167 assertTrue("equals", fRequest1
.equals(fRequest1b
));
168 assertTrue("equals", fRequest1b
.equals(fRequest1c
));
169 assertTrue("equals", fRequest1
.equals(fRequest1c
));
173 public void testEqualsNull() {
174 assertFalse("equals", fRequest1
.equals(null));
175 assertFalse("equals", fRequest2
.equals(null));
179 public void testEqualsSuper() {
180 TmfCoalescedDataRequest dataRequest1
= new TmfCoalescedDataRequest(
181 fRequest1
.getDataType(),
182 fRequest1
.getIndex(),
183 fRequest1
.getNbRequested(),
184 ExecutionType
.FOREGROUND
);
185 TmfCoalescedDataRequest dataRequest2
= new TmfCoalescedDataRequest(
186 fRequest1
.getDataType(),
187 fRequest1
.getIndex(),
188 fRequest1
.getNbRequested(),
189 ExecutionType
.FOREGROUND
);
190 TmfCoalescedDataRequest dataRequest3
= new TmfCoalescedDataRequest(
191 fRequest3
.getDataType(),
192 fRequest3
.getIndex(),
193 fRequest3
.getNbRequested(),
194 ExecutionType
.FOREGROUND
);
196 assertTrue("equals", fRequest1
.equals(dataRequest2
));
197 assertTrue("equals", fRequest2
.equals(dataRequest1
));
198 assertFalse("equals", fRequest1
.equals(dataRequest3
));
199 assertFalse("equals", fRequest3
.equals(dataRequest1
));
202 // ------------------------------------------------------------------------
204 // ------------------------------------------------------------------------
207 public void testHashCode() {
208 assertTrue("hashCode", fRequest1
.hashCode() == fRequest1
.hashCode());
209 assertTrue("hashCode", fRequest2
.hashCode() == fRequest2
.hashCode());
210 assertTrue("hashCode", fRequest1
.hashCode() != fRequest2
.hashCode());
213 // ------------------------------------------------------------------------
215 // ------------------------------------------------------------------------
218 public void testToString() {
219 String expected1
= "[TmfCoalescedEventRequest(0,ITmfEvent,FOREGROUND," + range1
+ ",0,100, [])]";
220 String expected2
= "[TmfCoalescedEventRequest(1,ITmfEvent,FOREGROUND," + range2
+ ",0,100, [])]";
221 String expected3
= "[TmfCoalescedEventRequest(2,ITmfEvent,FOREGROUND," + range2
+ ",0,200, [])]";
222 String expected4
= "[TmfCoalescedEventRequest(3,ITmfEvent,FOREGROUND," + range2
+ ",0,200, [])]";
224 assertEquals("toString", expected1
, fRequest1
.toString());
225 assertEquals("toString", expected2
, fRequest2
.toString());
226 assertEquals("toString", expected3
, fRequest3
.toString());
227 assertEquals("toString", expected4
, fRequest4
.toString());
230 // ------------------------------------------------------------------------
232 // ------------------------------------------------------------------------
235 public void testIsCompatible() {
236 TmfCoalescedEventRequest coalescedRequest
= new TmfCoalescedEventRequest(ITmfEvent
.class, range1
, 0, 100, ExecutionType
.FOREGROUND
);
237 TmfEventRequest req1
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 100, 200);
238 TmfEventRequest req2
= new TmfEventRequestStub(ITmfEvent
.class, range2
, 100, 200);
239 TmfEventRequest req3
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 101, 200);
241 assertTrue("isCompatible", coalescedRequest
.isCompatible(req1
));
242 assertTrue("isCompatible", coalescedRequest
.isCompatible(req2
));
243 assertTrue("isCompatible", coalescedRequest
.isCompatible(req3
));
246 // ------------------------------------------------------------------------
248 // ------------------------------------------------------------------------
251 public void testAddEvent1() {
252 TmfCoalescedEventRequest coalescedRequest
= new TmfCoalescedEventRequest(ITmfEvent
.class, range1
, 0, 2147483647, ExecutionType
.FOREGROUND
);
253 TmfEventRequest req1
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 0, 2147483647, 200);
254 TmfEventRequest req2
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 1, 2147483647, 200);
256 assertTrue("isCompatible", coalescedRequest
.isCompatible(req1
));
257 assertTrue("isCompatible", coalescedRequest
.isCompatible(req2
));
259 coalescedRequest
.addRequest(req1
);
260 coalescedRequest
.addRequest(req2
);
262 assertEquals("addRequest", 0, coalescedRequest
.getIndex());
263 assertEquals("addRequest", 2147483647, coalescedRequest
.getNbRequested());
267 public void testAddEvent2() {
268 TmfCoalescedEventRequest coalescedRequest
= new TmfCoalescedEventRequest(ITmfEvent
.class, range1
, 1, 2147483647, ExecutionType
.FOREGROUND
);
269 TmfEventRequest req1
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 1, 2147483647, 200);
270 TmfEventRequest req2
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 0, 2147483647, 200);
272 assertTrue("isCompatible", coalescedRequest
.isCompatible(req1
));
273 assertTrue("isCompatible", coalescedRequest
.isCompatible(req2
));
275 coalescedRequest
.addRequest(req1
);
276 coalescedRequest
.addRequest(req2
);
278 assertEquals("addRequest", 0, coalescedRequest
.getIndex());
279 assertEquals("addRequest", 2147483647, coalescedRequest
.getNbRequested());
282 // ------------------------------------------------------------------------
284 // ------------------------------------------------------------------------
287 public void testDone() {
289 final boolean[] crFlags
= new boolean[4];
290 TmfCoalescedEventRequest request
= setupTestRequest(crFlags
);
291 TmfEventRequest subRequest1
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 100, 200);
292 TmfEventRequest subRequest2
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 100, 200);
293 request
.addRequest(subRequest1
);
294 request
.addRequest(subRequest2
);
298 // Validate the coalescing request
299 assertTrue("isCompleted", request
.isCompleted());
300 assertFalse("isFailed", request
.isFailed());
301 assertFalse("isCancelled", request
.isCancelled());
303 assertTrue("handleCompleted", crFlags
[0]);
304 assertTrue("handleSuccess", crFlags
[1]);
305 assertFalse("handleFailure", crFlags
[2]);
306 assertFalse("handleCancel", crFlags
[3]);
308 // Validate the first coalesced request
309 assertTrue("isCompleted", subRequest1
.isCompleted());
310 assertFalse("isFailed", subRequest1
.isFailed());
311 assertFalse("isCancelled", subRequest1
.isCancelled());
313 // Validate the second coalesced request
314 assertTrue("isCompleted", subRequest2
.isCompleted());
315 assertFalse("isFailed", subRequest2
.isFailed());
316 assertFalse("isCancelled", subRequest2
.isCancelled());
319 // ------------------------------------------------------------------------
321 // ------------------------------------------------------------------------
324 public void testFail() {
325 final boolean[] crFlags
= new boolean[4];
326 TmfCoalescedEventRequest request
= setupTestRequest(crFlags
);
327 TmfEventRequest subRequest1
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 100, 200);
328 TmfEventRequest subRequest2
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 100, 200);
329 request
.addRequest(subRequest1
);
330 request
.addRequest(subRequest2
);
334 // Validate the coalescing request
335 assertTrue("isCompleted", request
.isCompleted());
336 assertTrue("isFailed", request
.isFailed());
337 assertFalse("isCancelled", request
.isCancelled());
339 assertTrue("handleCompleted", crFlags
[0]);
340 assertFalse("handleSuccess", crFlags
[1]);
341 assertTrue("handleFailure", crFlags
[2]);
342 assertFalse("handleCancel", crFlags
[3]);
344 // Validate the first coalesced request
345 assertTrue("isCompleted", subRequest1
.isCompleted());
346 assertTrue("isFailed", subRequest1
.isFailed());
347 assertFalse("isCancelled", subRequest1
.isCancelled());
349 // Validate the second coalesced request
350 assertTrue("isCompleted", subRequest2
.isCompleted());
351 assertTrue("isFailed", subRequest2
.isFailed());
352 assertFalse("isCancelled", subRequest2
.isCancelled());
355 // ------------------------------------------------------------------------
357 // ------------------------------------------------------------------------
360 public void testCancel() {
361 final boolean[] crFlags
= new boolean[4];
362 TmfCoalescedEventRequest request
= setupTestRequest(crFlags
);
363 TmfEventRequest subRequest1
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 100, 200);
364 TmfEventRequest subRequest2
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 100, 200);
365 request
.addRequest(subRequest1
);
366 request
.addRequest(subRequest2
);
370 // Validate the coalescing request
371 assertTrue("isCompleted", request
.isCompleted());
372 assertFalse("isFailed", request
.isFailed());
373 assertTrue("isCancelled", request
.isCancelled());
375 assertTrue("handleCompleted", crFlags
[0]);
376 assertFalse("handleSuccess", crFlags
[1]);
377 assertFalse("handleFailure", crFlags
[2]);
378 assertTrue("handleCancel", crFlags
[3]);
380 // Validate the first coalesced request
381 assertTrue("isCompleted", subRequest1
.isCompleted());
382 assertFalse("isFailed", subRequest1
.isFailed());
383 assertTrue("isCancelled", subRequest1
.isCancelled());
385 // Validate the second coalesced request
386 assertTrue("isCompleted", subRequest2
.isCompleted());
387 assertFalse("isFailed", subRequest2
.isFailed());
388 assertTrue("isCancelled", subRequest2
.isCancelled());
391 // ------------------------------------------------------------------------
393 // ------------------------------------------------------------------------
395 private static final TmfTestTrace TEST_TRACE
= TmfTestTrace
.A_TEST_10K
;
396 private static final int NB_EVENTS
= 5000;
398 // Initialize the test trace
399 private TmfTraceStub fTrace
= null;
401 private synchronized TmfTraceStub
setupTrace(String path
) {
402 if (fTrace
== null) {
404 URL location
= FileLocator
.find(TmfCoreTestPlugin
.getDefault().getBundle(), new Path(path
), null);
405 File test
= new File(FileLocator
.toFileURL(location
).toURI());
406 fTrace
= new TmfTraceStub(test
.getPath(), 500, false, null, null);
407 } catch (TmfTraceException e
) {
409 } catch (URISyntaxException e
) {
411 } catch (IOException e
) {
418 Vector
<ITmfEvent
> requestedEvents1
;
419 Vector
<ITmfEvent
> requestedEvents2
;
420 Vector
<ITmfEvent
> requestedEvents3
;
422 TmfEventRequest request1
;
423 TmfEventRequest request2
;
424 TmfEventRequest request3
;
426 ITmfDataProvider
[] providers
;
428 private static class TmfTestTriggerSignal
extends TmfSignal
{
429 public final boolean forceCancel
;
430 public final long fIndex
;
432 public TmfTestTriggerSignal(Object source
, long index
, boolean cancel
) {
434 forceCancel
= cancel
;
440 public void trigger(final TmfTestTriggerSignal signal
) {
442 TmfTimeRange range
= new TmfTimeRange(TmfTimestamp
.BIG_BANG
, TmfTimestamp
.BIG_CRUNCH
);
443 final long REQUEST_OFFSET
= 1000;
445 requestedEvents1
= new Vector
<ITmfEvent
>();
446 request1
= new TmfEventRequest(ITmfEvent
.class, range
, signal
.fIndex
,
447 NB_EVENTS
, ExecutionType
.FOREGROUND
) {
449 public void handleData(ITmfEvent event
) {
450 super.handleData(event
);
451 if (!isCompleted()) {
452 requestedEvents1
.add(event
);
453 if (signal
.forceCancel
) {
460 requestedEvents2
= new Vector
<ITmfEvent
>();
461 request2
= new TmfEventRequest(ITmfEvent
.class, range
,
462 signal
.fIndex
+ REQUEST_OFFSET
, NB_EVENTS
, ExecutionType
.FOREGROUND
) {
464 public void handleData(ITmfEvent event
) {
465 super.handleData(event
);
466 if (!isCompleted()) {
467 requestedEvents2
.add(event
);
472 requestedEvents3
= new Vector
<ITmfEvent
>();
473 request3
= new TmfEventRequest(ITmfEvent
.class, range
,
474 signal
.fIndex
+ 2 * REQUEST_OFFSET
, NB_EVENTS
, ExecutionType
.FOREGROUND
) {
476 public void handleData(ITmfEvent event
) {
477 super.handleData(event
);
478 if (!isCompleted()) {
479 requestedEvents3
.add(event
);
484 providers
= TmfProviderManager
.getProviders(ITmfEvent
.class, TmfTraceStub
.class);
485 providers
[0].sendRequest(request1
);
486 providers
[0].sendRequest(request2
);
487 providers
[0].sendRequest(request3
);
490 public void runCoalescedRequest(long startIndex
) throws InterruptedException
{
492 fTrace
= setupTrace(TEST_TRACE
.getFullPath());
494 TmfSignalManager
.register(this);
495 TmfTestTriggerSignal signal
= new TmfTestTriggerSignal(this, startIndex
, false);
496 TmfSignalManager
.dispatchSignal(signal
);
498 request1
.waitForCompletion();
499 request2
.waitForCompletion();
500 request3
.waitForCompletion();
503 assertEquals("Request1: nbEvents", NB_EVENTS
, requestedEvents1
.size());
504 assertTrue("Request1: isCompleted", request1
.isCompleted());
505 assertFalse("Request1: isCancelled", request1
.isCancelled());
507 assertEquals("Request2: nbEvents", NB_EVENTS
, requestedEvents2
.size());
508 assertTrue("Request2: isCompleted", request2
.isCompleted());
509 assertFalse("Request2: isCancelled", request2
.isCancelled());
511 assertEquals("Request3: nbEvents", NB_EVENTS
, requestedEvents3
.size());
512 assertTrue("Request3: isCompleted", request3
.isCompleted());
513 assertFalse("Request3: isCancelled", request3
.isCancelled());
515 // Ensure that we have distinct events.
516 // Don't go overboard: we are not validating the stub!
517 for (int i
= 0; i
< NB_EVENTS
; i
++) {
518 assertEquals("Distinct events", i
+ 1 + request1
.getIndex(), requestedEvents1
.get(i
).getTimestamp().getValue());
519 assertEquals("Distinct events", i
+ 1 + request2
.getIndex(), requestedEvents2
.get(i
).getTimestamp().getValue());
520 assertEquals("Distinct events", i
+ 1 + request3
.getIndex(), requestedEvents3
.get(i
).getTimestamp().getValue());
523 TmfSignalManager
.deregister(this);
530 public void testCoalescedRequest() throws InterruptedException
{
531 runCoalescedRequest(0);
532 runCoalescedRequest(1);
533 runCoalescedRequest(5);
537 public void testCancelCoalescedRequest() throws InterruptedException
{
539 fTrace
= setupTrace(TEST_TRACE
.getFullPath());
541 TmfSignalManager
.register(this);
542 TmfTestTriggerSignal signal
= new TmfTestTriggerSignal(this, 0, true);
543 TmfSignalManager
.dispatchSignal(signal
);
545 request1
.waitForCompletion();
546 request2
.waitForCompletion();
547 request3
.waitForCompletion();
549 assertTrue("Request1: isCompleted", request1
.isCompleted());
550 assertTrue("Request1: isCancelled", request1
.isCancelled());
552 assertEquals("Request2: nbEvents", NB_EVENTS
, requestedEvents2
.size());
553 assertTrue("Request2: isCompleted", request2
.isCompleted());
554 assertFalse("Request2: isCancelled", request2
.isCancelled());
556 assertEquals("Request3: nbEvents", NB_EVENTS
, requestedEvents3
.size());
557 assertTrue("Request3: isCompleted", request3
.isCompleted());
558 assertFalse("Request3: isCancelled", request3
.isCancelled());
560 // Ensure that we have distinct events.
561 // Don't go overboard: we are not validating the stub!
562 for (int i
= 0; i
< NB_EVENTS
; i
++) {
563 assertEquals("Distinct events", i
+ 1 + request2
.getIndex(), requestedEvents2
.get(i
).getTimestamp().getValue());
564 assertEquals("Distinct events", i
+ 1 + request3
.getIndex(), requestedEvents3
.get(i
).getTimestamp().getValue());
567 TmfSignalManager
.deregister(this);