1 /*******************************************************************************
2 * Copyright (c) 2016 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
8 *******************************************************************************/
10 package org
.eclipse
.tracecompass
.analysis
.os
.linux
.ui
.tests
.view
.resources
;
12 import static org
.junit
.Assert
.assertEquals
;
14 import java
.util
.ArrayList
;
15 import java
.util
.Comparator
;
16 import java
.util
.Iterator
;
17 import java
.util
.List
;
19 import org
.eclipse
.jdt
.annotation
.NonNull
;
20 import org
.eclipse
.jdt
.annotation
.NonNullByDefault
;
21 import org
.eclipse
.tracecompass
.analysis
.os
.linux
.ui
.views
.resources
.AggregateEventIterator
;
22 import org
.eclipse
.tracecompass
.tmf
.ui
.widgets
.timegraph
.model
.ITimeEvent
;
23 import org
.eclipse
.tracecompass
.tmf
.ui
.widgets
.timegraph
.model
.ITimeGraphEntry
;
24 import org
.eclipse
.tracecompass
.tmf
.ui
.widgets
.timegraph
.model
.NullTimeEvent
;
25 import org
.eclipse
.tracecompass
.tmf
.ui
.widgets
.timegraph
.model
.TimeEvent
;
26 import org
.eclipse
.tracecompass
.tmf
.ui
.widgets
.timegraph
.model
.TimeGraphEntry
;
27 import org
.junit
.Test
;
29 import com
.google
.common
.collect
.ImmutableList
;
30 import com
.google
.common
.collect
.Iterables
;
31 import com
.google
.common
.collect
.Iterators
;
34 * Test class to verify the main cases of the aggregate iterator
36 * @author Matthew Khouzam
40 public class AggregateIteratorTest
{
44 * ----------X---------
47 private final ITimeGraphEntry t1
= new StubTimeGraphEntry(ImmutableList
.of(
48 new NullTimeEvent(null, 0, 10),
49 new TimeEvent(null, 10, 1, 1),
50 new NullTimeEvent(null, 11, 9)));
53 * -----------X--------
56 private final ITimeGraphEntry t2
= new StubTimeGraphEntry(ImmutableList
.of(
57 new NullTimeEvent(null, 0, 12),
58 new TimeEvent(null, 12, 1, 1),
59 new NullTimeEvent(null, 13, 7)));
62 * --------X-----------
65 private final ITimeGraphEntry t3
= new StubTimeGraphEntry(ImmutableList
.of(
66 new NullTimeEvent(null, 0, 9),
67 new TimeEvent(null, 9, 1, 1),
68 new NullTimeEvent(null, 10, 10)));
72 * --------XXX---------
75 private final ITimeGraphEntry t4
= new StubTimeGraphEntry(ImmutableList
.of(
76 new NullTimeEvent(null, 0, 9),
77 new TimeEvent(null, 9, 3, 1),
78 new NullTimeEvent(null, 12, 8)));
82 * ----------XXX-------
85 private final ITimeGraphEntry t5
= new StubTimeGraphEntry(ImmutableList
.of(
86 new NullTimeEvent(null, 0, 10),
87 new TimeEvent(null, 10, 3, 1),
88 new NullTimeEvent(null, 13, 7)));
92 * ----------XXX-------
95 private final ITimeGraphEntry t6
= new StubTimeGraphEntry(ImmutableList
.of(
96 new NullTimeEvent(null, 0, 10),
97 new TimeEvent(null, 10, 3, 1),
98 new NullTimeEvent(null, 13, 7)));
102 * XXXXXXXXXXXXXXXXXXXX
105 private final ITimeGraphEntry t7
= new StubTimeGraphEntry(ImmutableList
.of(
106 new TimeEvent(null, 0, 20, 1)));
109 * Test non-overlapping intervals
112 public void testNoOverlap() {
113 List
<ITimeEvent
> expected
= ImmutableList
.of(new NullTimeEvent(null, 0, 9), new TimeEvent(null, 9, 1, 1), new TimeEvent(null, 10, 1, 1), new NullTimeEvent(null, 11, 1), new TimeEvent(null, 12, 1, 1), new NullTimeEvent(null, 13, 7));
114 AggregateEventIterator fixture
= new AggregateEventIterator(ImmutableList
.of(t1
, t2
, t3
), COMPARATOR
);
115 runTest(expected
, fixture
);
119 * Test intervals with 2 events that partially overlap
122 public void testPartialOverlap() {
123 List
<ITimeEvent
> expected
= ImmutableList
.of(new NullTimeEvent(null, 0, 9), new TimeEvent(null, 9, 1, 1), new TimeEvent(null, 10, 2, 1), new TimeEvent(null, 12, 1, 1), new NullTimeEvent(null, 13, 7));
124 AggregateEventIterator fixture
= new AggregateEventIterator(ImmutableList
.of(t4
, t5
), COMPARATOR
);
125 runTest(expected
, fixture
);
129 * Test two iterators that are identical, it will give the same result
132 public void testFullOverlap() {
133 List
<ITimeEvent
> expected
= ImmutableList
.of(new NullTimeEvent(null, 0, 10), new TimeEvent(null, 10, 3, 1), new NullTimeEvent(null, 13, 7));
134 AggregateEventIterator fixture
= new AggregateEventIterator(ImmutableList
.of(t6
, t5
), COMPARATOR
);
135 runTest(expected
, fixture
);
139 * Test two iterators that are identical, it will give the same result
142 public void testSameStartOverlap() {
143 List
<ITimeEvent
> expected
= ImmutableList
.of(new NullTimeEvent(null, 0, 9), new TimeEvent(null, 9, 1, 1), new TimeEvent(null, 10, 2, 1), new NullTimeEvent(null, 12, 8));
144 AggregateEventIterator fixture
= new AggregateEventIterator(ImmutableList
.of(t3
, t4
), COMPARATOR
);
145 runTest(expected
, fixture
);
149 * Test two iterators that are identical, it will give the same result
152 public void testSameEndOverlap() {
153 List
<ITimeEvent
> expected
= ImmutableList
.of(new NullTimeEvent(null, 0, 10), new TimeEvent(null, 10, 2, 1), new TimeEvent(null, 12, 1, 1), new NullTimeEvent(null, 13, 7));
154 AggregateEventIterator fixture
= new AggregateEventIterator(ImmutableList
.of(t5
, t2
), COMPARATOR
);
155 runTest(expected
, fixture
);
159 * Test two iterators where one only has one HUGE event
162 public void testOverlapEnglobing() {
163 List
<ITimeEvent
> expected
= ImmutableList
.of(new TimeEvent(null, 0, 10, 1), new TimeEvent(null, 10, 1, 1), new TimeEvent(null, 11, 9, 1));
164 AggregateEventIterator fixture
= new AggregateEventIterator(ImmutableList
.of(t1
, t7
), COMPARATOR
);
165 runTest(expected
, fixture
);
168 private static void runTest(List
<ITimeEvent
> expected
, AggregateEventIterator fixture
) {
169 List
<ITimeEvent
> results
= new ArrayList
<>();
170 Iterators
.addAll(results
, fixture
);
171 assertEquals(expected
.size(), results
.size());
172 for (int i
= 0; i
< expected
.size(); i
++) {
173 final @NonNull TimeEvent actual
= (@NonNull TimeEvent
) results
.get(i
);
174 final @NonNull TimeEvent expected2
= (@NonNull TimeEvent
) expected
.get(i
);
175 final @NonNull String name
= Integer
.toString(i
);
176 assertEquals(name
, expected2
.getClass(), actual
.getClass());
177 assertEquals(name
, expected2
.getDuration(), actual
.getDuration());
178 assertEquals(name
, expected2
.getTime(), actual
.getTime());
179 assertEquals(name
, expected2
.getEntry(), actual
.getEntry());
180 assertEquals(name
, expected2
.getValue(), actual
.getValue());
184 static class StubTimeGraphEntry
extends TimeGraphEntry
{
186 private final Iterable
<@NonNull ITimeEvent
> fEvents
;
188 public StubTimeGraphEntry(Iterable
<ITimeEvent
> events
) {
189 super("stub", Long
.MIN_VALUE
, Long
.MAX_VALUE
);
194 public boolean hasTimeEvents() {
195 return !Iterables
.isEmpty(fEvents
);
198 // for a stub, not worth making it work.
199 @SuppressWarnings("null")
201 public Iterator
<@NonNull ITimeEvent
> getTimeEventsIterator() {
202 return fEvents
.iterator();
206 public Iterator
<@NonNull ITimeEvent
> getTimeEventsIterator(long startTime
, long stopTime
, long visibleDuration
) {
207 if (startTime
!= Long
.MIN_VALUE
|| stopTime
!= Long
.MAX_VALUE
) {
208 throw new IllegalArgumentException("startTime must be Long.MIN_VALUE, stopTime must be Long.MAX_VALUE");
210 return getTimeEventsIterator();
216 * Same as in AggregateResourcesEntry but we want a snapshot and to not
217 * update the tests at every new mode of resources view
219 private static final Comparator
<ITimeEvent
> COMPARATOR
= new Comparator
<ITimeEvent
>() {
221 public int compare(ITimeEvent o1
, ITimeEvent o2
) {
223 return Integer
.compare(getValue(o2
), getValue(o1
));
226 private int getValue(ITimeEvent element
) {
227 return (element
instanceof TimeEvent
) ?
((TimeEvent
) element
).getValue() : Integer
.MIN_VALUE
;