1 /*******************************************************************************
2 * Copyright (c) 2009, 2015 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
.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
.tracecompass
.internal
.tmf
.core
.component
.TmfProviderManager
;
29 import org
.eclipse
.tracecompass
.internal
.tmf
.core
.request
.TmfCoalescedEventRequest
;
30 import org
.eclipse
.tracecompass
.tmf
.core
.component
.ITmfEventProvider
;
31 import org
.eclipse
.tracecompass
.tmf
.core
.event
.ITmfEvent
;
32 import org
.eclipse
.tracecompass
.tmf
.core
.exceptions
.TmfTraceException
;
33 import org
.eclipse
.tracecompass
.tmf
.core
.request
.ITmfEventRequest
.ExecutionType
;
34 import org
.eclipse
.tracecompass
.tmf
.core
.request
.TmfEventRequest
;
35 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSignal
;
36 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSignalHandler
;
37 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSignalManager
;
38 import org
.eclipse
.tracecompass
.tmf
.core
.tests
.TmfCoreTestPlugin
;
39 import org
.eclipse
.tracecompass
.tmf
.core
.tests
.shared
.TmfTestTrace
;
40 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfTimeRange
;
41 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfTimestamp
;
42 import org
.eclipse
.tracecompass
.tmf
.tests
.stubs
.request
.TmfEventRequestStub
;
43 import org
.eclipse
.tracecompass
.tmf
.tests
.stubs
.trace
.TmfTraceStub
;
44 import org
.junit
.Before
;
45 import org
.junit
.Test
;
48 * Test suite for the TmfCoalescedEventRequest class.
50 @SuppressWarnings("javadoc")
51 public class TmfCoalescedEventRequestTest
{
53 // ------------------------------------------------------------------------
55 // ------------------------------------------------------------------------
57 private final TmfTimeRange range1
= TmfTimeRange
.ETERNITY
;
58 private final TmfTimeRange range2
= new TmfTimeRange(new TmfTimestamp(), TmfTimestamp
.BIG_CRUNCH
);
60 private TmfCoalescedEventRequest fRequest1
;
61 private TmfCoalescedEventRequest fRequest2
;
62 private TmfCoalescedEventRequest fRequest3
;
63 private TmfCoalescedEventRequest fRequest4
;
65 private TmfCoalescedEventRequest fRequest1c
;
67 private int fRequestCount
;
69 // ------------------------------------------------------------------------
71 // ------------------------------------------------------------------------
75 fRequest1
= new TmfCoalescedEventRequest(ITmfEvent
.class, range1
, 0, 100, ExecutionType
.FOREGROUND
);
76 fRequest2
= new TmfCoalescedEventRequest(ITmfEvent
.class, range2
, 0, 100, ExecutionType
.FOREGROUND
);
77 fRequest3
= new TmfCoalescedEventRequest(ITmfEvent
.class, range2
, 0, 200, ExecutionType
.FOREGROUND
);
78 fRequest4
= new TmfCoalescedEventRequest(ITmfEvent
.class, range2
, 0, 200, ExecutionType
.FOREGROUND
);
80 fRequest1c
= new TmfCoalescedEventRequest(ITmfEvent
.class, range1
, 0, 100, ExecutionType
.FOREGROUND
);
82 fRequestCount
= fRequest1c
.getRequestId() + 1;
85 private TmfCoalescedEventRequest
setupTestRequest(final boolean[] flags
) {
87 TmfCoalescedEventRequest request
= new TmfCoalescedEventRequest(ITmfEvent
.class, range1
, 0, 100, ExecutionType
.FOREGROUND
) {
89 public void handleCompleted() {
90 super.handleCompleted();
95 public void handleSuccess() {
96 super.handleSuccess();
101 public void handleFailure() {
102 super.handleFailure();
107 public void handleCancel() {
108 super.handleCancel();
115 // ------------------------------------------------------------------------
117 // ------------------------------------------------------------------------
120 public void testTmfCoalescedEventRequestIndexNbEventsBlocksize() {
121 TmfCoalescedEventRequest request
= new TmfCoalescedEventRequest(ITmfEvent
.class, range1
, 0, 100, ExecutionType
.FOREGROUND
);
123 assertEquals("getRequestId", fRequestCount
++, request
.getRequestId());
124 assertEquals("getDataType", ITmfEvent
.class, request
.getDataType());
126 assertEquals("getRange", range1
, request
.getRange());
127 assertEquals("getNbRequestedEvents", 100, request
.getNbRequested());
129 assertFalse("isCompleted", request
.isCompleted());
130 assertFalse("isFailed", request
.isFailed());
131 assertFalse("isCancelled", request
.isCancelled());
133 assertEquals("getNbRead", 0, request
.getNbRead());
136 // ------------------------------------------------------------------------
138 // ------------------------------------------------------------------------
141 public void testEquals() {
143 * No two different requests should be "equal", even if they used the
144 * same constructor parameters.
146 assertTrue(fRequest1
.equals(fRequest1
));
147 assertFalse(fRequest1
.equals(fRequest2
));
148 assertFalse(fRequest1
.equals(fRequest3
));
149 assertFalse(fRequest1
.equals(fRequest4
));
152 // ------------------------------------------------------------------------
154 // ------------------------------------------------------------------------
157 public void testToString() {
158 String expected1
= "[TmfCoalescedEventRequest(" + fRequest1
.getRequestId() + ",ITmfEvent,FOREGROUND," + range1
+ ",0,100, [])]";
159 String expected2
= "[TmfCoalescedEventRequest(" + fRequest2
.getRequestId() + ",ITmfEvent,FOREGROUND," + range2
+ ",0,100, [])]";
160 String expected3
= "[TmfCoalescedEventRequest(" + fRequest3
.getRequestId() + ",ITmfEvent,FOREGROUND," + range2
+ ",0,200, [])]";
161 String expected4
= "[TmfCoalescedEventRequest(" + fRequest4
.getRequestId() + ",ITmfEvent,FOREGROUND," + range2
+ ",0,200, [])]";
163 assertEquals("toString", expected1
, fRequest1
.toString());
164 assertEquals("toString", expected2
, fRequest2
.toString());
165 assertEquals("toString", expected3
, fRequest3
.toString());
166 assertEquals("toString", expected4
, fRequest4
.toString());
169 // ------------------------------------------------------------------------
171 // ------------------------------------------------------------------------
174 public void testIsCompatible() {
175 TmfCoalescedEventRequest coalescedRequest
= new TmfCoalescedEventRequest(ITmfEvent
.class, range1
, 0, 100, ExecutionType
.FOREGROUND
);
176 TmfEventRequest req1
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 100, 200);
177 TmfEventRequest req2
= new TmfEventRequestStub(ITmfEvent
.class, range2
, 100, 200);
178 TmfEventRequest req3
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 101, 200);
180 assertTrue("isCompatible", coalescedRequest
.isCompatible(req1
));
181 assertTrue("isCompatible", coalescedRequest
.isCompatible(req2
));
182 assertTrue("isCompatible", coalescedRequest
.isCompatible(req3
));
185 // ------------------------------------------------------------------------
187 // ------------------------------------------------------------------------
190 public void testAddEvent1() {
191 TmfCoalescedEventRequest coalescedRequest
= new TmfCoalescedEventRequest(ITmfEvent
.class, range1
, 0, 2147483647, ExecutionType
.FOREGROUND
);
192 TmfEventRequest req1
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 0, 2147483647, 200);
193 TmfEventRequest req2
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 1, 2147483647, 200);
195 assertTrue("isCompatible", coalescedRequest
.isCompatible(req1
));
196 assertTrue("isCompatible", coalescedRequest
.isCompatible(req2
));
198 coalescedRequest
.addRequest(req1
);
199 coalescedRequest
.addRequest(req2
);
201 assertEquals("addRequest", 0, coalescedRequest
.getIndex());
202 assertEquals("addRequest", 2147483647, coalescedRequest
.getNbRequested());
206 public void testAddEvent2() {
207 TmfCoalescedEventRequest coalescedRequest
= new TmfCoalescedEventRequest(ITmfEvent
.class, range1
, 1, 2147483647, ExecutionType
.FOREGROUND
);
208 TmfEventRequest req1
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 1, 2147483647, 200);
209 TmfEventRequest req2
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 0, 2147483647, 200);
211 assertTrue("isCompatible", coalescedRequest
.isCompatible(req1
));
212 assertTrue("isCompatible", coalescedRequest
.isCompatible(req2
));
214 coalescedRequest
.addRequest(req1
);
215 coalescedRequest
.addRequest(req2
);
217 assertEquals("addRequest", 0, coalescedRequest
.getIndex());
218 assertEquals("addRequest", 2147483647, coalescedRequest
.getNbRequested());
221 // ------------------------------------------------------------------------
223 // ------------------------------------------------------------------------
226 public void testDone() {
228 final boolean[] crFlags
= new boolean[4];
229 TmfCoalescedEventRequest request
= setupTestRequest(crFlags
);
230 TmfEventRequest subRequest1
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 100, 200);
231 TmfEventRequest subRequest2
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 100, 200);
232 request
.addRequest(subRequest1
);
233 request
.addRequest(subRequest2
);
237 // Validate the coalescing request
238 assertTrue("isCompleted", request
.isCompleted());
239 assertFalse("isFailed", request
.isFailed());
240 assertFalse("isCancelled", request
.isCancelled());
242 assertTrue("handleCompleted", crFlags
[0]);
243 assertTrue("handleSuccess", crFlags
[1]);
244 assertFalse("handleFailure", crFlags
[2]);
245 assertFalse("handleCancel", crFlags
[3]);
247 // Validate the first coalesced request
248 assertTrue("isCompleted", subRequest1
.isCompleted());
249 assertFalse("isFailed", subRequest1
.isFailed());
250 assertFalse("isCancelled", subRequest1
.isCancelled());
252 // Validate the second coalesced request
253 assertTrue("isCompleted", subRequest2
.isCompleted());
254 assertFalse("isFailed", subRequest2
.isFailed());
255 assertFalse("isCancelled", subRequest2
.isCancelled());
258 // ------------------------------------------------------------------------
260 // ------------------------------------------------------------------------
263 public void testFail() {
264 final boolean[] crFlags
= new boolean[4];
265 TmfCoalescedEventRequest request
= setupTestRequest(crFlags
);
266 TmfEventRequest subRequest1
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 100, 200);
267 TmfEventRequest subRequest2
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 100, 200);
268 request
.addRequest(subRequest1
);
269 request
.addRequest(subRequest2
);
273 // Validate the coalescing request
274 assertTrue("isCompleted", request
.isCompleted());
275 assertTrue("isFailed", request
.isFailed());
276 assertFalse("isCancelled", request
.isCancelled());
278 assertTrue("handleCompleted", crFlags
[0]);
279 assertFalse("handleSuccess", crFlags
[1]);
280 assertTrue("handleFailure", crFlags
[2]);
281 assertFalse("handleCancel", crFlags
[3]);
283 // Validate the first coalesced request
284 assertTrue("isCompleted", subRequest1
.isCompleted());
285 assertTrue("isFailed", subRequest1
.isFailed());
286 assertFalse("isCancelled", subRequest1
.isCancelled());
288 // Validate the second coalesced request
289 assertTrue("isCompleted", subRequest2
.isCompleted());
290 assertTrue("isFailed", subRequest2
.isFailed());
291 assertFalse("isCancelled", subRequest2
.isCancelled());
294 // ------------------------------------------------------------------------
296 // ------------------------------------------------------------------------
299 public void testCancel() {
300 final boolean[] crFlags
= new boolean[4];
301 TmfCoalescedEventRequest request
= setupTestRequest(crFlags
);
302 TmfEventRequest subRequest1
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 100, 200);
303 TmfEventRequest subRequest2
= new TmfEventRequestStub(ITmfEvent
.class, range1
, 100, 200);
304 request
.addRequest(subRequest1
);
305 request
.addRequest(subRequest2
);
309 // Validate the coalescing request
310 assertTrue("isCompleted", request
.isCompleted());
311 assertFalse("isFailed", request
.isFailed());
312 assertTrue("isCancelled", request
.isCancelled());
314 assertTrue("handleCompleted", crFlags
[0]);
315 assertFalse("handleSuccess", crFlags
[1]);
316 assertFalse("handleFailure", crFlags
[2]);
317 assertTrue("handleCancel", crFlags
[3]);
319 // Validate the first coalesced request
320 assertTrue("isCompleted", subRequest1
.isCompleted());
321 assertFalse("isFailed", subRequest1
.isFailed());
322 assertTrue("isCancelled", subRequest1
.isCancelled());
324 // Validate the second coalesced request
325 assertTrue("isCompleted", subRequest2
.isCompleted());
326 assertFalse("isFailed", subRequest2
.isFailed());
327 assertTrue("isCancelled", subRequest2
.isCancelled());
330 // ------------------------------------------------------------------------
332 // ------------------------------------------------------------------------
334 private static final TmfTestTrace TEST_TRACE
= TmfTestTrace
.A_TEST_10K
;
335 private static final int NB_EVENTS
= 5000;
337 // Initialize the test trace
338 private TmfTraceStub fTrace
= null;
340 private synchronized TmfTraceStub
setupTrace(String path
) {
341 if (fTrace
== null) {
343 URL location
= FileLocator
.find(TmfCoreTestPlugin
.getDefault().getBundle(), new Path(path
), null);
344 File test
= new File(FileLocator
.toFileURL(location
).toURI());
345 fTrace
= new TmfTraceStub(test
.getPath(), 500, false, null);
346 } catch (TmfTraceException e
) {
348 } catch (URISyntaxException e
) {
350 } catch (IOException e
) {
357 Vector
<ITmfEvent
> requestedEvents1
;
358 Vector
<ITmfEvent
> requestedEvents2
;
359 Vector
<ITmfEvent
> requestedEvents3
;
361 TmfEventRequest request1
;
362 TmfEventRequest request2
;
363 TmfEventRequest request3
;
365 ITmfEventProvider
[] providers
;
367 private static class TmfTestTriggerSignal
extends TmfSignal
{
368 public final boolean forceCancel
;
369 public final long fIndex
;
371 public TmfTestTriggerSignal(Object source
, long index
, boolean cancel
) {
373 forceCancel
= cancel
;
378 private static class TmfTestTriggerSignal2
extends TmfSignal
{
379 public TmfTestTriggerSignal2(Object source
) {
385 public void trigger(final TmfTestTriggerSignal signal
) {
387 TmfTimeRange range
= new TmfTimeRange(TmfTimestamp
.BIG_BANG
, TmfTimestamp
.BIG_CRUNCH
);
388 final long REQUEST_OFFSET
= 1000;
390 requestedEvents1
= new Vector
<>();
391 request1
= new TmfEventRequest(ITmfEvent
.class, range
, signal
.fIndex
,
392 NB_EVENTS
, ExecutionType
.FOREGROUND
) {
394 public void handleData(ITmfEvent event
) {
395 super.handleData(event
);
396 if (!isCompleted()) {
397 requestedEvents1
.add(event
);
398 if (signal
.forceCancel
) {
405 requestedEvents2
= new Vector
<>();
406 request2
= new TmfEventRequest(ITmfEvent
.class, range
,
407 signal
.fIndex
+ REQUEST_OFFSET
, NB_EVENTS
, ExecutionType
.FOREGROUND
) {
409 public void handleData(ITmfEvent event
) {
410 super.handleData(event
);
411 if (!isCompleted()) {
412 requestedEvents2
.add(event
);
417 requestedEvents3
= new Vector
<>();
418 request3
= new TmfEventRequest(ITmfEvent
.class, range
,
419 signal
.fIndex
+ 2 * REQUEST_OFFSET
, NB_EVENTS
, ExecutionType
.FOREGROUND
) {
421 public void handleData(ITmfEvent event
) {
422 super.handleData(event
);
423 if (!isCompleted()) {
424 requestedEvents3
.add(event
);
429 providers
= TmfProviderManager
.getProviders(ITmfEvent
.class, TmfTraceStub
.class);
430 providers
[0].sendRequest(request1
);
431 providers
[0].sendRequest(request2
);
432 providers
[0].sendRequest(request3
);
440 public void trigger(final TmfTestTriggerSignal2 signal
) {
441 TmfTimeRange range
= new TmfTimeRange(new TmfTimestamp(100, -3), TmfTimestamp
.BIG_CRUNCH
);
442 requestedEvents1
= new Vector
<>();
443 request1
= new TmfEventRequest(ITmfEvent
.class, range
, 0, 1, ExecutionType
.FOREGROUND
) {
445 public void handleData(ITmfEvent event
) {
446 super.handleData(event
);
447 if (!isCompleted()) {
448 requestedEvents1
.add(event
);
452 providers
= TmfProviderManager
.getProviders(ITmfEvent
.class, TmfTraceStub
.class);
453 providers
[0].sendRequest(request1
);
456 public void runCoalescedRequest(long startIndex
) throws InterruptedException
{
458 fTrace
= setupTrace(TEST_TRACE
.getFullPath());
460 TmfSignalManager
.register(this);
461 TmfTestTriggerSignal signal
= new TmfTestTriggerSignal(this, startIndex
, false);
462 TmfSignalManager
.dispatchSignal(signal
);
464 request1
.waitForCompletion();
465 request2
.waitForCompletion();
466 request3
.waitForCompletion();
469 assertEquals("Request1: nbEvents", NB_EVENTS
, requestedEvents1
.size());
470 assertTrue("Request1: isCompleted", request1
.isCompleted());
471 assertFalse("Request1: isCancelled", request1
.isCancelled());
473 assertEquals("Request2: nbEvents", NB_EVENTS
, requestedEvents2
.size());
474 assertTrue("Request2: isCompleted", request2
.isCompleted());
475 assertFalse("Request2: isCancelled", request2
.isCancelled());
477 assertEquals("Request3: nbEvents", NB_EVENTS
, requestedEvents3
.size());
478 assertTrue("Request3: isCompleted", request3
.isCompleted());
479 assertFalse("Request3: isCancelled", request3
.isCancelled());
481 // Ensure that we have distinct events.
482 // Don't go overboard: we are not validating the stub!
483 for (int i
= 0; i
< NB_EVENTS
; i
++) {
484 assertEquals("Distinct events", i
+ 1 + request1
.getIndex(), requestedEvents1
.get(i
).getTimestamp().getValue());
485 assertEquals("Distinct events", i
+ 1 + request2
.getIndex(), requestedEvents2
.get(i
).getTimestamp().getValue());
486 assertEquals("Distinct events", i
+ 1 + request3
.getIndex(), requestedEvents3
.get(i
).getTimestamp().getValue());
489 TmfSignalManager
.deregister(this);
496 public void testCoalescedRequest() throws InterruptedException
{
497 runCoalescedRequest(0);
498 runCoalescedRequest(1);
499 runCoalescedRequest(5);
503 public void testCancelCoalescedRequest() throws InterruptedException
{
505 fTrace
= setupTrace(TEST_TRACE
.getFullPath());
507 TmfSignalManager
.register(this);
508 TmfTestTriggerSignal signal
= new TmfTestTriggerSignal(this, 0, true);
509 TmfSignalManager
.dispatchSignal(signal
);
511 request1
.waitForCompletion();
512 request2
.waitForCompletion();
513 request3
.waitForCompletion();
515 assertTrue("Request1: isCompleted", request1
.isCompleted());
516 assertTrue("Request1: isCancelled", request1
.isCancelled());
518 assertEquals("Request2: nbEvents", NB_EVENTS
, requestedEvents2
.size());
519 assertTrue("Request2: isCompleted", request2
.isCompleted());
520 assertFalse("Request2: isCancelled", request2
.isCancelled());
522 assertEquals("Request3: nbEvents", NB_EVENTS
, requestedEvents3
.size());
523 assertTrue("Request3: isCompleted", request3
.isCompleted());
524 assertFalse("Request3: isCancelled", request3
.isCancelled());
526 // Ensure that we have distinct events.
527 // Don't go overboard: we are not validating the stub!
528 for (int i
= 0; i
< NB_EVENTS
; i
++) {
529 assertEquals("Distinct events", i
+ 1 + request2
.getIndex(), requestedEvents2
.get(i
).getTimestamp().getValue());
530 assertEquals("Distinct events", i
+ 1 + request3
.getIndex(), requestedEvents3
.get(i
).getTimestamp().getValue());
533 TmfSignalManager
.deregister(this);
539 public void testSingleTimeRequest() throws InterruptedException
{
541 fTrace
= setupTrace(TEST_TRACE
.getFullPath());
543 TmfSignalManager
.register(this);
544 TmfTestTriggerSignal2 signal
= new TmfTestTriggerSignal2(this);
545 TmfSignalManager
.dispatchSignal(signal
);
547 request1
.waitForCompletion();
549 assertTrue("Request1: isCompleted", request1
.isCompleted());
551 // We have to have one event processed
552 assertEquals("Request1: nbEvents", 1, requestedEvents1
.size());
554 TmfSignalManager
.deregister(this);