1 /*******************************************************************************
2 * Copyright (c) 2013, 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 * Alexandre Montplaisir - Initial API and implementation
11 * Patrick Tasse - Support selection range
12 *******************************************************************************/
14 package org
.eclipse
.tracecompass
.tmf
.ctf
.core
.tests
.temp
.tracemanager
;
16 import static org
.junit
.Assert
.assertEquals
;
17 import static org
.junit
.Assert
.assertNotNull
;
18 import static org
.junit
.Assert
.assertSame
;
19 import static org
.junit
.Assume
.assumeTrue
;
22 import java
.util
.Collection
;
23 import java
.util
.Collections
;
25 import org
.eclipse
.jdt
.annotation
.NonNull
;
26 import org
.eclipse
.tracecompass
.tmf
.core
.event
.ITmfEvent
;
27 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfRangeSynchSignal
;
28 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfSignalManager
;
29 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfTimeSynchSignal
;
30 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfTraceClosedSignal
;
31 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfTraceOpenedSignal
;
32 import org
.eclipse
.tracecompass
.tmf
.core
.signal
.TmfTraceSelectedSignal
;
33 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.ITmfTimestamp
;
34 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfTimeRange
;
35 import org
.eclipse
.tracecompass
.tmf
.core
.timestamp
.TmfTimestamp
;
36 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.ITmfTrace
;
37 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.TmfTraceManager
;
38 import org
.eclipse
.tracecompass
.tmf
.core
.trace
.experiment
.TmfExperiment
;
39 import org
.eclipse
.tracecompass
.tmf
.ctf
.core
.tests
.shared
.CtfTmfTestTrace
;
40 import org
.junit
.After
;
41 import org
.junit
.AfterClass
;
42 import org
.junit
.Before
;
43 import org
.junit
.BeforeClass
;
44 import org
.junit
.Test
;
46 import com
.google
.common
.collect
.ImmutableSet
;
49 * Test suite for the {@link TmfTraceManager}.
51 * @author Alexandre Montplaisir
53 public class TmfTraceManagerTest
{
55 private static final int SCALE
= ITmfTimestamp
.NANOSECOND_SCALE
;
57 private static ITmfTrace trace1
;
58 private static final long t1start
= 1331668247314038062L;
59 private static final long t1end
= 1331668259054285979L;
61 private static ITmfTrace trace2
;
62 private static final long t2start
= 1332170682440133097L;
63 private static final long t2end
= 1332170692664579801L;
65 private static final long ONE_SECOND
= 1000000000L;
67 private TmfTraceManager tm
;
71 * Test class initialization
74 public static void setUpClass() {
75 assumeTrue(CtfTmfTestTrace
.TRACE2
.exists());
76 assumeTrue(CtfTmfTestTrace
.KERNEL
.exists());
77 trace1
= CtfTmfTestTrace
.TRACE2
.getTrace();
78 trace2
= CtfTmfTestTrace
.KERNEL
.getTrace();
80 trace1
.indexTrace(true);
81 trace2
.indexTrace(true);
83 // Deregister traces from signal manager so that they don't
84 // interfere with the TmfTraceManager tests
85 TmfSignalManager
.deregister(trace1
);
86 TmfSignalManager
.deregister(trace2
);
94 tm
= TmfTraceManager
.getInstance();
101 public void tearDown() {
102 while (tm
.getActiveTrace() != null) {
103 closeTrace(tm
.getActiveTrace());
108 * Test class clean-up
111 public static void tearDownClass() {
112 CtfTmfTestTrace
.TRACE2
.dispose();
113 CtfTmfTestTrace
.KERNEL
.dispose();
116 // ------------------------------------------------------------------------
117 // Dummy actions (fake signals)
118 // ------------------------------------------------------------------------
120 private void openTrace(ITmfTrace trace
) {
122 throw new IllegalArgumentException();
124 TmfSignalManager
.dispatchSignal(new TmfTraceOpenedSignal(this, trace
, null));
128 private void closeTrace(ITmfTrace trace
) {
130 throw new IllegalArgumentException();
132 TmfSignalManager
.dispatchSignal(new TmfTraceClosedSignal(this, trace
));
134 * In TMF, the next tab would now be selected (if there are some), which
135 * would select another trace automatically.
137 if (tm
.getOpenedTraces().size() > 0) {
138 selectTrace(tm
.getOpenedTraces().toArray(new ITmfTrace
[0])[0]);
142 private void selectTrace(ITmfTrace trace
) {
143 TmfSignalManager
.dispatchSignal(new TmfTraceSelectedSignal(this, trace
));
146 private void selectTimestamp(@NonNull ITmfTimestamp ts
) {
147 TmfSignalManager
.dispatchSignal(new TmfTimeSynchSignal(this, ts
));
150 private void selectTimeRange(TmfTimeRange tr
) {
151 TmfSignalManager
.dispatchSignal(new TmfRangeSynchSignal(this, tr
));
154 // ------------------------------------------------------------------------
156 // ------------------------------------------------------------------------
159 * Test that the manager is correctly initialized
162 public void testInitialize() {
163 TmfTraceManager mgr
= TmfTraceManager
.getInstance();
169 * Test the contents of a trace set with one trace.
172 public void testTraceSet() {
177 Collection
<ITmfTrace
> expected
= Collections
.singleton(trace2
);
178 Collection
<ITmfTrace
> actual
= tm
.getActiveTraceSet();
180 assertEquals(1, actual
.size());
181 assertEquals(expected
, actual
);
185 * Test the contents of a trace set with an experiment.
188 public void testTraceSetExperiment() {
189 TmfExperiment exp
= createExperiment(trace1
, trace2
);
193 Collection
<ITmfTrace
> expected
= ImmutableSet
.of(trace1
, trace2
);
194 Collection
<ITmfTrace
> actual
= tm
.getActiveTraceSet();
196 assertEquals(2, actual
.size());
197 assertEquals(expected
, actual
);
201 * Test the contents of the complete trace set.
204 public void testTraceSetWithExperiment() {
205 /* Test with a trace */
206 Collection
<ITmfTrace
> expected
= Collections
.singleton(trace1
);
207 Collection
<ITmfTrace
> actual
= TmfTraceManager
.getTraceSetWithExperiment(trace1
);
208 assertEquals(1, actual
.size());
209 assertEquals(expected
, actual
);
211 /* Test with an experiment */
212 TmfExperiment exp
= createExperiment(trace1
, trace2
);
213 expected
= ImmutableSet
.of(trace1
, trace2
, exp
);
214 actual
= TmfTraceManager
.getTraceSetWithExperiment(exp
);
215 assertEquals(3, actual
.size());
216 assertEquals(expected
, actual
);
220 * Test the {@link TmfTraceManager#getSupplementaryFileDir} method.
223 public void testSupplementaryFileDir() {
224 String name1
= trace1
.getName();
225 String name2
= trace2
.getName();
226 String basePath
= TmfTraceManager
.getTemporaryDirPath() + File
.separator
;
228 String expected1
= basePath
+ name1
+ File
.separator
;
229 String expected2
= basePath
+ name2
+ File
.separator
;
231 assertEquals(expected1
, TmfTraceManager
.getSupplementaryFileDir(trace1
));
232 assertEquals(expected2
, TmfTraceManager
.getSupplementaryFileDir(trace2
));
235 // ------------------------------------------------------------------------
236 // Test a single trace
237 // ------------------------------------------------------------------------
240 * Test the initial range of a single trace.
243 public void testTraceInitialRange() {
245 final TmfTimeRange expectedRange
= new TmfTimeRange(
246 trace2
.getStartTime(),
247 calculateOffset(trace2
.getStartTime(), trace2
.getInitialRangeOffset()));
248 TmfTimeRange actualRange
= tm
.getCurrentRange();
249 assertEquals(expectedRange
, actualRange
);
253 * Try selecting a timestamp contained inside the trace's range. The trace's
254 * current time should get updated correctly.
257 public void testNewTimestamp() {
259 ITmfTimestamp ts
= new TmfTimestamp(t2start
+ ONE_SECOND
, SCALE
);
262 ITmfTimestamp afterTs
= tm
.getSelectionBeginTime();
263 assertEquals(ts
, afterTs
);
264 afterTs
= tm
.getSelectionEndTime();
265 assertEquals(ts
, afterTs
);
269 * Try selecting a timestamp happening before the trace's start. The change
273 public void testTimestampBefore() {
275 ITmfTimestamp beforeTs
= tm
.getSelectionBeginTime();
276 ITmfTimestamp ts
= new TmfTimestamp(t2start
- ONE_SECOND
, SCALE
);
279 ITmfTimestamp curTs
= tm
.getSelectionBeginTime();
280 assertEquals(beforeTs
, curTs
);
281 curTs
= tm
.getSelectionEndTime();
282 assertEquals(beforeTs
, curTs
);
286 * Try selecting a timestamp happening after the trace's end. The change
290 public void testTimestampAfter() {
292 ITmfTimestamp beforeTs
= tm
.getSelectionBeginTime();
293 ITmfTimestamp ts
= new TmfTimestamp(t2end
+ ONE_SECOND
, SCALE
);
296 ITmfTimestamp curTs
= tm
.getSelectionBeginTime();
297 assertEquals(beforeTs
, curTs
);
298 curTs
= tm
.getSelectionEndTime();
299 assertEquals(beforeTs
, curTs
);
303 * Test selecting a normal sub-range of a single trace.
306 public void testTraceNewTimeRange() {
308 TmfTimeRange range
= new TmfTimeRange(
309 new TmfTimestamp(t2start
+ ONE_SECOND
, SCALE
),
310 new TmfTimestamp(t2end
- ONE_SECOND
, SCALE
));
311 selectTimeRange(range
);
313 TmfTimeRange curRange
= tm
.getCurrentRange();
314 assertEquals(range
.getStartTime(), curRange
.getStartTime());
315 assertEquals(range
.getEndTime(), curRange
.getEndTime());
319 * Test selecting a range whose start time is before the trace's start time.
320 * The selected range should get clamped to the trace's range.
323 public void testTraceTimeRangeClampingStart() {
325 TmfTimeRange range
= new TmfTimeRange(
326 new TmfTimestamp(t2start
- ONE_SECOND
, SCALE
), // minus here
327 new TmfTimestamp(t2end
- ONE_SECOND
, SCALE
));
328 selectTimeRange(range
);
330 TmfTimeRange curRange
= tm
.getCurrentRange();
331 assertEquals(t2start
, curRange
.getStartTime().getValue());
332 assertEquals(range
.getEndTime(), curRange
.getEndTime());
336 * Test selecting a range whose end time is after the trace's end time.
337 * The selected range should get clamped to the trace's range.
340 public void testTraceTimeRangeClampingEnd() {
342 TmfTimeRange range
= new TmfTimeRange(
343 new TmfTimestamp(t2start
+ ONE_SECOND
, SCALE
),
344 new TmfTimestamp(t2end
+ ONE_SECOND
, SCALE
)); // plus here
345 selectTimeRange(range
);
347 TmfTimeRange curRange
= tm
.getCurrentRange();
348 assertEquals(range
.getStartTime(), curRange
.getStartTime());
349 assertEquals(t2end
, curRange
.getEndTime().getValue());
353 * Test selecting a range whose both start and end times are outside of the
354 * trace's range. The selected range should get clamped to the trace's
358 public void testTraceTimeRangeClampingBoth() {
360 TmfTimeRange range
= new TmfTimeRange(
361 new TmfTimestamp(t2start
- ONE_SECOND
, SCALE
), // minus here
362 new TmfTimestamp(t2end
+ ONE_SECOND
, SCALE
)); // plus here
363 selectTimeRange(range
);
365 TmfTimeRange curRange
= tm
.getCurrentRange();
366 assertEquals(t2start
, curRange
.getStartTime().getValue());
367 assertEquals(t2end
, curRange
.getEndTime().getValue());
370 // ------------------------------------------------------------------------
371 // Test multiple, non-overlapping traces in parallel
372 // ------------------------------------------------------------------------
375 * Test, with two traces in parallel, when we select a timestamp that is
376 * part of the first trace.
378 * The first trace's timestamp should be updated, but the second trace's one
382 public void testTwoTracesTimestampValid() {
386 TmfTimestamp ts
= new TmfTimestamp(t1start
+ ONE_SECOND
, SCALE
);
389 /* Timestamp of trace1 should have been updated */
390 assertEquals(ts
, tm
.getSelectionBeginTime());
391 assertEquals(ts
, tm
.getSelectionEndTime());
393 /* Timestamp of trace2 should not have changed */
395 assertEquals(trace2
.getStartTime(), tm
.getSelectionBeginTime());
396 assertEquals(trace2
.getStartTime(), tm
.getSelectionEndTime());
400 * Test, with two traces in parallel, when we select a timestamp that is
401 * between two traces.
403 * None of the trace's timestamps should be updated (we are not in an
407 public void testTwoTracesTimestampInBetween() {
411 TmfTimestamp ts
= new TmfTimestamp(t1end
+ ONE_SECOND
, SCALE
);
414 /* Timestamp of trace1 should not have changed */
415 assertEquals(trace1
.getStartTime(), tm
.getSelectionBeginTime());
416 assertEquals(trace1
.getStartTime(), tm
.getSelectionEndTime());
418 /* Timestamp of trace2 should not have changed */
420 assertEquals(trace2
.getStartTime(), tm
.getSelectionBeginTime());
421 assertEquals(trace2
.getStartTime(), tm
.getSelectionEndTime());
425 * Test, with two traces in parallel, when we select a timestamp that is
426 * completely out of the trace's range.
428 * None of the trace's timestamps should be updated.
431 public void testTwoTracesTimestampInvalid() {
435 TmfTimestamp ts
= new TmfTimestamp(t2end
+ ONE_SECOND
, SCALE
);
438 /* Timestamp of trace1 should not have changed */
439 assertEquals(trace1
.getStartTime(), tm
.getSelectionBeginTime());
440 assertEquals(trace1
.getStartTime(), tm
.getSelectionEndTime());
442 /* Timestamp of trace2 should not have changed */
444 assertEquals(trace2
.getStartTime(), tm
.getSelectionBeginTime());
445 assertEquals(trace2
.getStartTime(), tm
.getSelectionEndTime());
449 * Test, with two traces opened in parallel (not in an experiment), if we
450 * select a time range valid in one of them. That trace's time range should
451 * be updated, but not the other one.
454 public void testTwoTracesTimeRangeAllInOne() {
458 TmfTimeRange range
= new TmfTimeRange(
459 new TmfTimestamp(t1start
+ ONE_SECOND
, SCALE
),
460 new TmfTimestamp(t1end
- ONE_SECOND
, SCALE
));
461 selectTimeRange(range
);
463 /* Range of trace1 should be equal to the requested one */
464 assertEquals(range
, tm
.getCurrentRange());
466 /* The range of trace 2 should not have changed */
468 assertEquals(getInitialRange(trace2
), tm
.getCurrentRange());
472 * Test, with two traces in parallel, when we select a time range that is
473 * only partially valid for one of the traces.
475 * The first trace's time range should be clamped to a valid range, and the
476 * second one's should not change.
479 public void testTwoTracesTimeRangePartiallyInOne() {
483 TmfTimeRange range
= new TmfTimeRange(
484 new TmfTimestamp(t1start
+ ONE_SECOND
, SCALE
),
485 new TmfTimestamp(t1end
+ ONE_SECOND
, SCALE
));
486 selectTimeRange(range
);
488 /* Range of trace1 should get clamped to its end time */
489 TmfTimeRange expectedRange
= new TmfTimeRange(
490 new TmfTimestamp(t1start
+ ONE_SECOND
, SCALE
),
491 new TmfTimestamp(t1end
, SCALE
));
492 assertEquals(expectedRange
, tm
.getCurrentRange());
494 /* Range of trace2 should not have changed */
496 assertEquals(getInitialRange(trace2
), tm
.getCurrentRange());
500 * Test, with two traces in parallel, when we select a time range that is
501 * only partially valid for both traces.
503 * Each trace's time range should get clamped to respectively valid ranges.
506 public void testTwoTracesTimeRangeInBoth() {
510 TmfTimeRange range
= new TmfTimeRange(
511 new TmfTimestamp(t1end
- ONE_SECOND
, SCALE
),
512 new TmfTimestamp(t2start
+ ONE_SECOND
, SCALE
));
513 selectTimeRange(range
);
515 /* Range of trace1 should be clamped to its end time */
516 TmfTimeRange expectedRange
= new TmfTimeRange(
517 new TmfTimestamp(t1end
- ONE_SECOND
, SCALE
),
518 new TmfTimestamp(t1end
, SCALE
));
519 assertEquals(expectedRange
, tm
.getCurrentRange());
521 /* Range of trace2 should be clamped to its start time */
523 expectedRange
= new TmfTimeRange(
524 new TmfTimestamp(t2start
, SCALE
),
525 new TmfTimestamp(t2start
+ ONE_SECOND
, SCALE
));
526 assertEquals(expectedRange
, tm
.getCurrentRange());
530 * Test, with two traces in parallel, when we select a time range that is
531 * not valid for any trace.
533 * Each trace's time range should not be modified.
536 public void testTwoTracesTimeRangeInBetween() {
540 TmfTimeRange range
= new TmfTimeRange(
541 new TmfTimestamp(t1end
+ ONE_SECOND
, SCALE
),
542 new TmfTimestamp(t1end
- ONE_SECOND
, SCALE
));
543 selectTimeRange(range
);
545 /* Range of trace1 should not have changed */
546 TmfTimeRange expectedRange
= getInitialRange(trace1
);
547 TmfTimeRange curRange
= tm
.getCurrentRange();
548 assertEquals(expectedRange
.getStartTime(), curRange
.getStartTime());
549 assertEquals(expectedRange
.getEndTime(), curRange
.getEndTime());
551 /* Range of trace2 should not have changed */
553 expectedRange
= getInitialRange(trace2
);
554 curRange
= tm
.getCurrentRange();
555 assertEquals(expectedRange
.getStartTime(), curRange
.getStartTime());
556 assertEquals(expectedRange
.getEndTime(), curRange
.getEndTime());
559 // ------------------------------------------------------------------------
560 // Test an experiment
561 // ------------------------------------------------------------------------
564 * Test in an experiment when we select a timestamp that is part of one of
565 * the experiment's traces.
567 * The experiment's current time should be correctly updated.
570 public void testExperimentTimestampInTrace() {
571 TmfExperiment exp
= createExperiment(trace1
, trace2
);
573 TmfTimestamp ts
= new TmfTimestamp(t1start
+ ONE_SECOND
, SCALE
);
576 /* The experiment's current time should be updated. */
577 assertEquals(ts
, tm
.getSelectionBeginTime());
578 assertEquals(ts
, tm
.getSelectionEndTime());
582 * Test in an experiment when we select a timestamp that is between two
583 * traces in the experiment.
585 * The experiment's current time should still be updated, since the
586 * timestamp is valid in the experiment itself.
589 public void testExperimentTimestampInBetween() {
590 TmfExperiment exp
= createExperiment(trace1
, trace2
);
592 TmfTimestamp ts
= new TmfTimestamp(t1end
+ ONE_SECOND
, SCALE
);
595 /* The experiment's current time should be updated. */
596 assertEquals(ts
, tm
.getSelectionBeginTime());
597 assertEquals(ts
, tm
.getSelectionEndTime());
601 * Test in an experiment when we select a timestamp that is outside of the
602 * total range of the experiment.
604 * The experiment's current time should not be updated.
607 public void testExperimentTimestampInvalid() {
608 TmfExperiment exp
= createExperiment(trace1
, trace2
);
610 TmfTimestamp ts
= new TmfTimestamp(t2end
+ ONE_SECOND
, SCALE
);
613 /* The experiment's current time should NOT be updated. */
614 assertEquals(trace1
.getStartTime(), tm
.getSelectionBeginTime());
615 assertEquals(trace1
.getStartTime(), tm
.getSelectionEndTime());
619 * Test the initial range of an experiment.
622 public void testExperimentInitialRange() {
623 TmfExperiment exp
= createExperiment(trace1
, trace2
);
626 * The initial range should be == to the initial range of the earliest
627 * trace (here trace1).
629 final TmfTimeRange actualRange
= tm
.getCurrentRange();
631 assertEquals(getInitialRange(trace1
), actualRange
);
632 assertEquals(getInitialRange(exp
), actualRange
);
636 * Test the range clamping with the start time of the range outside of the
637 * earliest trace's range. Only that start time should get clamped.
640 public void testExperimentRangeClampingOne() {
641 TmfExperiment exp
= createExperiment(trace1
, trace2
);
644 final TmfTimeRange range
= new TmfTimeRange(
645 new TmfTimestamp(t1start
- ONE_SECOND
, SCALE
),
646 new TmfTimestamp(t1end
- ONE_SECOND
, SCALE
));
647 selectTimeRange(range
);
649 TmfTimeRange actualRange
= tm
.getCurrentRange();
650 assertEquals(t1start
, actualRange
.getStartTime().getValue());
651 assertEquals(t1end
- ONE_SECOND
, actualRange
.getEndTime().getValue());
655 * Test the range clamping when both the start and end times of the signal's
656 * range are outside of the trace's range. The range should clamp to the
657 * experiment's range.
660 public void testExperimentRangeClampingBoth() {
661 TmfExperiment exp
= createExperiment(trace1
, trace2
);
664 final TmfTimeRange range
= new TmfTimeRange(
665 new TmfTimestamp(t1start
- ONE_SECOND
, SCALE
),
666 new TmfTimestamp(t2end
+ ONE_SECOND
, SCALE
));
667 selectTimeRange(range
);
669 TmfTimeRange actualRange
= tm
.getCurrentRange();
670 assertEquals(t1start
, actualRange
.getStartTime().getValue());
671 assertEquals(t2end
, actualRange
.getEndTime().getValue());
675 * Test selecting a range in-between two disjoint traces in an experiment.
676 * The range should still get correctly selected, even if no trace has any
677 * events in that range.
680 public void testExperimentRangeInBetween() {
681 TmfExperiment exp
= createExperiment(trace1
, trace2
);
684 final TmfTimeRange range
= new TmfTimeRange(
685 new TmfTimestamp(t1end
+ ONE_SECOND
, SCALE
),
686 new TmfTimestamp(t2start
- ONE_SECOND
, SCALE
));
687 selectTimeRange(range
);
689 TmfTimeRange actualRange
= tm
.getCurrentRange();
690 assertEquals(range
, actualRange
);
693 // ------------------------------------------------------------------------
695 // ------------------------------------------------------------------------
697 private static TmfExperiment
createExperiment(ITmfTrace t1
, ITmfTrace t2
) {
698 ITmfTrace
[] traces
= new ITmfTrace
[] { t1
, t2
};
699 TmfExperiment exp
= new TmfExperiment(ITmfEvent
.class, "test-exp", traces
,
700 TmfExperiment
.DEFAULT_INDEX_PAGE_SIZE
, null);
701 exp
.indexTrace(true);
702 // Deregister experiment from signal manager so that it doesn't
703 // interfere with the TmfTraceManager tests
704 TmfSignalManager
.deregister(exp
);
708 private static TmfTimeRange
getInitialRange(ITmfTrace trace
) {
709 return new TmfTimeRange(
710 trace
.getStartTime(),
711 calculateOffset(trace
.getStartTime(), trace
.getInitialRangeOffset()));
715 * Basically a "initial + offset" operation, but for ITmfTimetamp objects.
717 private static @NonNull ITmfTimestamp
calculateOffset(ITmfTimestamp initialTs
, ITmfTimestamp offsetTs
) {
718 long start
= initialTs
.normalize(0, SCALE
).getValue();
719 long offset
= offsetTs
.normalize(0, SCALE
).getValue();
720 return new TmfTimestamp(start
+ offset
, SCALE
);