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