Commit | Line | Data |
---|---|---|
d18dd09b | 1 | /******************************************************************************* |
e31e01e8 | 2 | * Copyright (c) 2009, 2010 Ericsson |
d18dd09b ASL |
3 | * |
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 | * | |
9 | * Contributors: | |
10 | * Francois Chouinard - Initial API and implementation | |
11 | *******************************************************************************/ | |
12 | ||
13 | package org.eclipse.linuxtools.tmf.tests.trace; | |
14 | ||
15 | import java.io.File; | |
e31e01e8 FC |
16 | import java.io.IOException; |
17 | import java.net.URISyntaxException; | |
18 | import java.net.URL; | |
d18dd09b ASL |
19 | import java.util.Vector; |
20 | ||
e31e01e8 FC |
21 | import junit.framework.TestCase; |
22 | ||
23 | import org.eclipse.core.runtime.FileLocator; | |
24 | import org.eclipse.core.runtime.Path; | |
d18dd09b ASL |
25 | import org.eclipse.linuxtools.tmf.event.TmfEvent; |
26 | import org.eclipse.linuxtools.tmf.event.TmfTimeRange; | |
27 | import org.eclipse.linuxtools.tmf.event.TmfTimestamp; | |
e31e01e8 | 28 | import org.eclipse.linuxtools.tmf.experiment.TmfExperiment; |
9f584e4c | 29 | import org.eclipse.linuxtools.tmf.experiment.TmfExperimentContext; |
e31e01e8 FC |
30 | import org.eclipse.linuxtools.tmf.request.TmfEventRequest; |
31 | import org.eclipse.linuxtools.tmf.tests.TmfCoreTestPlugin; | |
d18dd09b | 32 | import org.eclipse.linuxtools.tmf.trace.ITmfTrace; |
d18dd09b ASL |
33 | import org.eclipse.linuxtools.tmf.trace.TmfTraceStub; |
34 | ||
35 | /** | |
36 | * <b><u>TmfExperimentTest</u></b> | |
37 | * <p> | |
38 | * TODO: Implement me. Please. | |
39 | */ | |
40 | public class TmfExperimentTest extends TestCase { | |
41 | ||
42 | private static final String DIRECTORY = "testfiles"; | |
85fb0e54 | 43 | private static final String TEST_STREAM = "A-Test-10K"; |
d18dd09b | 44 | private static final String EXPERIMENT = "MyExperiment"; |
e31e01e8 FC |
45 | private static int NB_EVENTS = 10000; |
46 | private static int fDefaultBlockSize = 1000; | |
d18dd09b | 47 | |
85fb0e54 | 48 | private static ITmfTrace[] fTrace; |
e31e01e8 | 49 | private static TmfExperiment<TmfEvent> fExperiment; |
d18dd09b | 50 | |
9f584e4c FC |
51 | private static byte SCALE = (byte) -3; |
52 | ||
e31e01e8 | 53 | // ------------------------------------------------------------------------ |
d18dd09b | 54 | // Housekeeping |
e31e01e8 FC |
55 | // ------------------------------------------------------------------------ |
56 | ||
85fb0e54 | 57 | private ITmfTrace[] setupTrace(String path) { |
e31e01e8 | 58 | if (fTrace == null) { |
85fb0e54 | 59 | fTrace = new ITmfTrace[1]; |
e31e01e8 FC |
60 | try { |
61 | URL location = FileLocator.find(TmfCoreTestPlugin.getPlugin().getBundle(), new Path(path), null); | |
62 | File test = new File(FileLocator.toFileURL(location).toURI()); | |
63 | TmfTraceStub trace = new TmfTraceStub(test.getPath(), true); | |
85fb0e54 | 64 | fTrace[0] = trace; |
e31e01e8 FC |
65 | } catch (URISyntaxException e) { |
66 | e.printStackTrace(); | |
67 | } catch (IOException e) { | |
68 | e.printStackTrace(); | |
69 | } | |
70 | } | |
71 | return fTrace; | |
72 | } | |
73 | ||
74 | private void setupExperiment() { | |
75 | if (fExperiment == null) { | |
85fb0e54 | 76 | fExperiment = new TmfExperiment<TmfEvent>(TmfEvent.class, EXPERIMENT, fTrace); |
e31e01e8 FC |
77 | fExperiment.indexExperiment(true); |
78 | } | |
79 | } | |
d18dd09b ASL |
80 | |
81 | public TmfExperimentTest(String name) throws Exception { | |
82 | super(name); | |
83 | } | |
84 | ||
85 | @Override | |
86 | protected void setUp() throws Exception { | |
87 | super.setUp(); | |
e31e01e8 FC |
88 | setupTrace(DIRECTORY + File.separator + TEST_STREAM); |
89 | setupExperiment(); | |
d18dd09b ASL |
90 | } |
91 | ||
92 | @Override | |
93 | protected void tearDown() throws Exception { | |
94 | super.tearDown(); | |
95 | } | |
96 | ||
e31e01e8 | 97 | // ------------------------------------------------------------------------ |
d18dd09b | 98 | // Constructor |
e31e01e8 | 99 | // ------------------------------------------------------------------------ |
d18dd09b | 100 | |
9f584e4c FC |
101 | public void testBasicTmfExperiment() { |
102 | assertEquals("GetId", EXPERIMENT, fExperiment.getName()); | |
e31e01e8 | 103 | assertEquals("GetEpoch", TmfTimestamp.Zero, fExperiment.getEpoch()); |
d18dd09b ASL |
104 | assertEquals("GetNbEvents", NB_EVENTS, fExperiment.getNbEvents()); |
105 | ||
106 | TmfTimeRange timeRange = fExperiment.getTimeRange(); | |
e31e01e8 FC |
107 | assertEquals("getStartTime", 1, timeRange.getStartTime().getValue()); |
108 | assertEquals("getEndTime", NB_EVENTS, timeRange.getEndTime().getValue()); | |
d18dd09b ASL |
109 | } |
110 | ||
9f584e4c FC |
111 | // ------------------------------------------------------------------------ |
112 | // seek | |
113 | // ------------------------------------------------------------------------ | |
114 | ||
85fb0e54 | 115 | public void testSeekOnCacheBoundary() throws Exception { |
9f584e4c FC |
116 | TmfExperimentContext context = fExperiment.seekLocation(null); |
117 | ||
118 | context = fExperiment.seekEvent(new TmfTimestamp(1, SCALE, 0)); | |
119 | TmfEvent event = fExperiment.getNextEvent(context); | |
120 | assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); | |
121 | assertEquals("Event rank", 1, context.getRank()); | |
122 | ||
123 | context = fExperiment.seekEvent(new TmfTimestamp(1001, SCALE, 0)); | |
124 | event = fExperiment.getNextEvent(context); | |
125 | assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); | |
126 | assertEquals("Event rank", 1001, context.getRank()); | |
127 | ||
128 | context = fExperiment.seekEvent(new TmfTimestamp(4001, SCALE, 0)); | |
129 | event = fExperiment.getNextEvent(context); | |
130 | assertEquals("Event timestamp", 4001, event.getTimestamp().getValue()); | |
131 | assertEquals("Event rank", 4001, context.getRank()); | |
132 | } | |
133 | ||
134 | public void testSeekNotOnCacheBoundary() throws Exception { | |
135 | TmfExperimentContext context = fExperiment.seekLocation(null); | |
136 | ||
137 | context = fExperiment.seekEvent(new TmfTimestamp(10, SCALE, 0)); | |
138 | TmfEvent event = fExperiment.getNextEvent(context); | |
139 | assertEquals("Event timestamp", 10, event.getTimestamp().getValue()); | |
140 | assertEquals("Event rank", 10, context.getRank()); | |
141 | ||
142 | context = fExperiment.seekEvent(new TmfTimestamp(999, SCALE, 0)); | |
143 | event = fExperiment.getNextEvent(context); | |
144 | assertEquals("Event timestamp", 999, event.getTimestamp().getValue()); | |
145 | assertEquals("Event rank", 999, context.getRank()); | |
146 | ||
147 | context = fExperiment.seekEvent(new TmfTimestamp(1001, SCALE, 0)); | |
148 | event = fExperiment.getNextEvent(context); | |
149 | assertEquals("Event timestamp", 1001, event.getTimestamp().getValue()); | |
150 | assertEquals("Event rank", 1001, context.getRank()); | |
151 | ||
152 | context = fExperiment.seekEvent(new TmfTimestamp(4499, SCALE, 0)); | |
153 | event = fExperiment.getNextEvent(context); | |
154 | assertEquals("Event timestamp", 4499, event.getTimestamp().getValue()); | |
155 | assertEquals("Event rank", 4499, context.getRank()); | |
156 | } | |
157 | ||
158 | public void testSeekForEventOutOfBounds() throws Exception { | |
159 | TmfExperimentContext context = fExperiment.seekLocation(null); | |
160 | ||
161 | // On lower bound, returns the first event (ts = 1) | |
162 | context = fExperiment.seekEvent(new TmfTimestamp(-1, SCALE, 0)); | |
163 | TmfEvent event = fExperiment.getNextEvent(context); | |
164 | assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); | |
165 | ||
166 | // On higher bound, returns null (no event) | |
167 | context = fExperiment.seekEvent(new TmfTimestamp(NB_EVENTS + 1, SCALE, 0)); | |
168 | event = fExperiment.getNextEvent(context); | |
169 | assertEquals("Event timestamp", null, event); | |
170 | } | |
171 | ||
172 | public void testSeekOnIndex() throws Exception { | |
173 | TmfExperimentContext context = fExperiment.seekLocation(null); | |
174 | ||
175 | // On lower bound, returns the first event (ts = 1) | |
176 | context = fExperiment.seekEvent(0); | |
177 | TmfEvent event = fExperiment.getNextEvent(context); | |
178 | assertEquals("Event timestamp", 1, event.getTimestamp().getValue()); | |
179 | ||
180 | // On higher bound | |
181 | context = fExperiment.seekEvent(NB_EVENTS - 1); | |
182 | event = fExperiment.getNextEvent(context); | |
183 | assertEquals("Event timestamp", NB_EVENTS, event.getTimestamp().getValue()); | |
184 | ||
185 | // Above high bound | |
186 | context = fExperiment.seekEvent(NB_EVENTS); | |
187 | event = fExperiment.getNextEvent(context); | |
188 | assertEquals("Event", null, event); | |
189 | } | |
190 | ||
e31e01e8 | 191 | // ------------------------------------------------------------------------ |
d18dd09b | 192 | // processRequest |
e31e01e8 | 193 | // ------------------------------------------------------------------------ |
d18dd09b ASL |
194 | |
195 | public void testProcessRequestForNbEvents() throws Exception { | |
196 | final int blockSize = 100; | |
e31e01e8 | 197 | final int nbEvents = 1000; |
d18dd09b ASL |
198 | final Vector<TmfEvent> requestedEvents = new Vector<TmfEvent>(); |
199 | ||
200 | TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); | |
e31e01e8 | 201 | final TmfEventRequest<TmfEvent> request = new TmfEventRequest<TmfEvent>(TmfEvent.class, range, nbEvents, blockSize) { |
d18dd09b ASL |
202 | @Override |
203 | public void handleData() { | |
204 | TmfEvent[] events = getData(); | |
205 | for (TmfEvent e : events) { | |
206 | requestedEvents.add(e); | |
207 | } | |
208 | } | |
209 | }; | |
951d134a FC |
210 | fExperiment.sendRequest(request); |
211 | request.waitForCompletion(); | |
d18dd09b ASL |
212 | |
213 | assertEquals("nbEvents", nbEvents, requestedEvents.size()); | |
214 | assertTrue("isCompleted", request.isCompleted()); | |
215 | assertFalse("isCancelled", request.isCancelled()); | |
216 | ||
217 | // Ensure that we have distinct events. | |
218 | // Don't go overboard: we are not validating the stub! | |
219 | for (int i = 0; i < nbEvents; i++) { | |
220 | assertEquals("Distinct events", i+1, requestedEvents.get(i).getTimestamp().getValue()); | |
221 | } | |
222 | } | |
223 | ||
224 | public void testProcessRequestForNbEvents2() throws Exception { | |
225 | final int blockSize = 2 * NB_EVENTS; | |
226 | final int nbEvents = 1000; | |
227 | final Vector<TmfEvent> requestedEvents = new Vector<TmfEvent>(); | |
228 | ||
229 | TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); | |
e31e01e8 | 230 | final TmfEventRequest<TmfEvent> request = new TmfEventRequest<TmfEvent>(TmfEvent.class, range, nbEvents, blockSize) { |
d18dd09b ASL |
231 | @Override |
232 | public void handleData() { | |
233 | TmfEvent[] events = getData(); | |
234 | for (TmfEvent e : events) { | |
235 | requestedEvents.add(e); | |
236 | } | |
237 | } | |
238 | }; | |
951d134a FC |
239 | fExperiment.sendRequest(request); |
240 | request.waitForCompletion(); | |
d18dd09b ASL |
241 | |
242 | assertEquals("nbEvents", nbEvents, requestedEvents.size()); | |
243 | assertTrue("isCompleted", request.isCompleted()); | |
244 | assertFalse("isCancelled", request.isCancelled()); | |
245 | ||
246 | // Ensure that we have distinct events. | |
247 | // Don't go overboard: we are not validating the stub! | |
248 | for (int i = 0; i < nbEvents; i++) { | |
249 | assertEquals("Distinct events", i+1, requestedEvents.get(i).getTimestamp().getValue()); | |
250 | } | |
251 | } | |
252 | ||
253 | public void testProcessRequestForAllEvents() throws Exception { | |
e31e01e8 | 254 | final int nbEvents = TmfEventRequest.ALL_DATA; |
d18dd09b ASL |
255 | final int blockSize = 1; |
256 | final Vector<TmfEvent> requestedEvents = new Vector<TmfEvent>(); | |
9f584e4c | 257 | long nbExpectedEvents = fExperiment.getNbEvents(); |
d18dd09b ASL |
258 | |
259 | TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); | |
e31e01e8 | 260 | final TmfEventRequest<TmfEvent> request = new TmfEventRequest<TmfEvent>(TmfEvent.class, range, nbEvents, blockSize) { |
d18dd09b ASL |
261 | @Override |
262 | public void handleData() { | |
263 | TmfEvent[] events = getData(); | |
264 | for (TmfEvent e : events) { | |
265 | requestedEvents.add(e); | |
266 | } | |
267 | } | |
268 | }; | |
951d134a FC |
269 | fExperiment.sendRequest(request); |
270 | request.waitForCompletion(); | |
d18dd09b ASL |
271 | |
272 | assertEquals("nbEvents", nbExpectedEvents, requestedEvents.size()); | |
273 | assertTrue("isCompleted", request.isCompleted()); | |
274 | assertFalse("isCancelled", request.isCancelled()); | |
275 | ||
276 | // Ensure that we have distinct events. | |
277 | // Don't go overboard: we are not validating the stub! | |
278 | for (int i = 0; i < nbExpectedEvents; i++) { | |
279 | assertEquals("Distinct events", i+1, requestedEvents.get(i).getTimestamp().getValue()); | |
280 | } | |
281 | } | |
282 | ||
e31e01e8 | 283 | // ------------------------------------------------------------------------ |
d18dd09b | 284 | // cancel |
e31e01e8 | 285 | // ------------------------------------------------------------------------ |
d18dd09b ASL |
286 | |
287 | public void testCancel() throws Exception { | |
288 | final int nbEvents = NB_EVENTS; | |
289 | final int blockSize = fDefaultBlockSize; | |
290 | final Vector<TmfEvent> requestedEvents = new Vector<TmfEvent>(); | |
291 | ||
292 | TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch); | |
e31e01e8 | 293 | final TmfEventRequest<TmfEvent> request = new TmfEventRequest<TmfEvent>(TmfEvent.class, range, nbEvents, blockSize) { |
d18dd09b ASL |
294 | @Override |
295 | public void handleData() { | |
296 | TmfEvent[] events = getData(); | |
297 | for (TmfEvent e : events) { | |
298 | requestedEvents.add(e); | |
299 | } | |
300 | // Cancel request after the first chunk is received | |
301 | cancel(); | |
302 | } | |
303 | }; | |
951d134a FC |
304 | fExperiment.sendRequest(request); |
305 | request.waitForCompletion(); | |
d18dd09b ASL |
306 | |
307 | assertEquals("nbEvents", blockSize, requestedEvents.size()); | |
308 | assertTrue("isCompleted", request.isCompleted()); | |
309 | assertTrue("isCancelled", request.isCancelled()); | |
310 | } | |
e31e01e8 FC |
311 | |
312 | // ------------------------------------------------------------------------ | |
313 | // getRank | |
314 | // ------------------------------------------------------------------------ | |
315 | ||
316 | public void testGetRank() throws Exception { | |
317 | assertEquals("getRank", 0, fExperiment.getRank(new TmfTimestamp())); | |
318 | assertEquals("getRank", 0, fExperiment.getRank(new TmfTimestamp( 1, (byte) -3))); | |
319 | assertEquals("getRank", 10, fExperiment.getRank(new TmfTimestamp( 11, (byte) -3))); | |
320 | assertEquals("getRank", 100, fExperiment.getRank(new TmfTimestamp( 101, (byte) -3))); | |
321 | assertEquals("getRank", 1000, fExperiment.getRank(new TmfTimestamp(1001, (byte) -3))); | |
322 | } | |
323 | ||
85fb0e54 FC |
324 | // ------------------------------------------------------------------------ |
325 | // getTimestamp | |
326 | // ------------------------------------------------------------------------ | |
327 | ||
328 | public void testGetTimestamp() throws Exception { | |
329 | assertTrue("getTimestamp", fExperiment.getTimestamp( 0).equals(new TmfTimestamp( 1, (byte) -3))); | |
330 | assertTrue("getTimestamp", fExperiment.getTimestamp( 10).equals(new TmfTimestamp( 11, (byte) -3))); | |
331 | assertTrue("getTimestamp", fExperiment.getTimestamp( 100).equals(new TmfTimestamp( 101, (byte) -3))); | |
332 | assertTrue("getTimestamp", fExperiment.getTimestamp(1000).equals(new TmfTimestamp(1001, (byte) -3))); | |
333 | } | |
334 | ||
e31e01e8 | 335 | } |