ctf: Disable NLS warnings in test plugin
[deliverable/tracecompass.git] / org.eclipse.linuxtools.ctf.core.tests / src / org / eclipse / linuxtools / ctf / core / tests / trace / IOstructgenTest.java
CommitLineData
4bd7f2db
AM
1/*******************************************************************************
2 * Copyright (c) 2013 Ericsson
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 * Matthew Khouzam - Initial API and implementation
10 *******************************************************************************/
11
791072b0
MK
12package org.eclipse.linuxtools.ctf.core.tests.trace;
13
14import static org.junit.Assert.*;
15
16import java.io.File;
17import java.io.FileOutputStream;
18import java.io.FileWriter;
19import java.io.IOException;
8e964be1 20import java.util.HashMap;
791072b0 21
8e964be1 22import org.eclipse.linuxtools.ctf.core.event.IEventDeclaration;
791072b0
MK
23import org.eclipse.linuxtools.ctf.core.trace.CTFReaderException;
24import org.eclipse.linuxtools.ctf.core.trace.CTFTrace;
8e964be1 25import org.eclipse.linuxtools.internal.ctf.core.event.EventDeclaration;
791072b0
MK
26import org.eclipse.linuxtools.internal.ctf.core.event.metadata.IOStructGen;
27import org.junit.Test;
28
29/**
30 * Unit tests for {@link IOStructGen}
791072b0 31 *
4bd7f2db 32 * @author Matthew Khouzam
791072b0 33 */
791072b0
MK
34public class IOstructgenTest {
35
36
37 private static final String metadataDecs = "typealias integer { size = 8; align = 8; signed = false; } := uint8_t;\n"
38 + "typealias integer { size = 16; align = 8; signed = false; } := uint16_t;\n"
39 + "typealias integer { size = 32; align = 8; signed = false; } := uint32_t;\n"
40 + "typealias integer { size = 64; align = 8; signed = false; } := uint64_t;\n"
41 + "typealias integer { size = 64; align = 8; signed = false; } := unsigned long;\n"
42 + "typealias integer { size = 5; align = 1; signed = false; } := uint5_t;\n"
43 + "typealias integer { size = 27; align = 1; signed = false; } := uint27_t;\n"
44 + "typealias integer { size = 32; align = 1; signed = true; base = decimal; } := int32_t;\n"
45 + "typealias integer { size = 31; align = 1; signed = true; base = dec; } := int31_t;\n"
46 + "typealias integer { size = 30; align = 1; signed = true; base = d; } := int30_t;\n"
47 + "typealias integer { size = 29; align = 1; signed = true; base = i; } := int29_t;\n"
48 + "typealias integer { size = 28; align = 1; signed = true; base = u; } := int28_t;\n"
49 + "typealias integer { size = 27; align = 1; signed = true; base = hexadecimal; } := int27_t;\n"
50 + "typealias integer { size = 26; align = 1; signed = true; base = hex; } := int26_t;\n"
51 + "typealias integer { size = 25; align = 1; signed = true; base = x; } := int25_t;\n"
52 + "typealias integer { size = 24; align = 1; signed = true; base = X; } := int24_t;\n"
53 + "typealias integer { size = 23; align = 1; signed = true; base = p; } := int23_t;\n"
54 + "typealias integer { size = 22; align = 1; signed = true; base = 16; } := int22_t;\n"
55 + "typealias integer { size = 21; align = 1; signed = true; base = oct; } := int21_t;\n"
56 + "typealias integer { size = 20; align = 1; signed = true; base = b; } := int20_t;\n"
57 + "typealias integer { size = 19; align = 1; signed = true; base = octal; } := int19_t;\n"
58 + "typealias integer { size = 18; align = 1; signed = true; base = o; } := int18_t;\n"
59 + "typealias integer { size = 17; align = 1; signed = true; base = binary; } := int17_t;\n"
60 + "\n"
61 + "trace {\n"
62 + " major = 1;\n"
63 + " minor = 8;\n"
64 + " uuid = \"b04d391b-e736-44c1-8d89-4bb438857f8d\";\n"
65 + " byte_order = le;\n"
66 + " packet.header := struct {\n"
67 + " uint32_t magic;\n"
68 + " uint8_t uuid[16];\n"
69 + " uint32_t stream_id;\n" + " };\n" + "};\n" + "\n";
70 private static final String environmentMD = "env {\n"
71 + " hostname = \"DemoSystem\";\n"
72 + " vpid = 1337;\n"
73 + " procname = \"demo\";\n"
74 + " domain = \"autogenerated\";\n"
75 + " tracer_name = \"tmf\";\n"
76 + " tracer_major = 2;\n"
77 + " tracer_minor = 0x01;\n"
78 + " tracer_patchlevel = 0;\n"
79 + "};\n" + "\n";
80 private static final String clockMD = "clock {\n" + " name = monotonic;\n"
81 + " uuid = \"cbf9f42e-9be7-4798-a96f-11db556e2ebb\";\n"
82 + " description = \"Monotonic Clock\";\n"
83 + " freq = 1000000000; /* Frequency, in Hz */\n"
84 + " /* clock value offset from Epoch is: offset * (1/freq) */\n"
85 + " offset = 1350310657466295832;\n" + "};\n"
86 + "\n";
87
88 private static final String ctfStart =
89 "typealias integer {\n"
90 + " size = 27; align = 1; signed = false;\n"
91 + " map = clock.monotonic.value;\n"
92 + "} := uint27_clock_monotonic_t;\n"
93 + "\n"
94 + "typealias integer {\n"
95 + " size = 32; align = 8; signed = false;\n"
96 + " map = clock.monotonic.value;\n"
97 + "} := uint32_clock_monotonic_t;\n"
98 + "\n"
99 + "typealias integer {\n"
100 + " size = 64; align = 8; signed = false;\n"
101 + " map = clock.monotonic.value;\n"
102 + "} := uint64_clock_monotonic_t;\n"
103 + "\n";
104
105
106 private static final String ctfHeaders =
107 "struct packet_context {\n"
108 + " uint64_clock_monotonic_t timestamp_begin;\n"
109 + " uint64_clock_monotonic_t timestamp_end;\n"
110 + " uint64_t content_size;\n"
111 + " uint64_t packet_size;\n"
112 + " unsigned long events_discarded;\n"
113 + " uint32_t cpu_id;\n"
114 + "};\n"
115 + "\n"
116 + "struct event_header_compact {\n"
117 + " enum : uint5_t { compact = 0 ... 30, extended = 31 } id;\n"
118 + " variant <id> {\n"
119 + " struct {\n"
120 + " uint27_clock_monotonic_t timestamp;\n"
121 + " } compact;\n"
122 + " struct {\n"
123 + " uint32_t id;\n"
124 + " uint64_clock_monotonic_t timestamp;\n"
125 + " } extended;\n"
126 + " } v;\n"
127 + "} align(8);\n"
128 + "\n"
129 + "struct event_header_large {\n"
130 + " enum : uint16_t { compact = 0 ... 65534, extended = 65535 } id;\n"
131 + " variant <id> {\n" + " struct {\n"
132 + " uint32_clock_monotonic_t timestamp;\n"
133 + " } compact;\n" + " struct {\n"
134 + " uint32_t id;\n"
135 + " uint64_clock_monotonic_t timestamp;\n"
136 + " } extended;\n" + " } v;\n" + "} align(8);\n" + "\n";
137
138 private static final String ctfBody = "stream {\n"
139 + " id = 0;\n"
140 + " event.header := struct event_header_compact;\n"
141 + " packet.context := struct packet_context;\n"
142 + " event.context := struct {\n"
143 + " integer { size = 64; align = 8; signed = 0; encoding = none; base = 16; } _ip;\n"
144 + " };\n"
145 + "};\n"
146 + "\n"
147 + "event {\n"
148 + " name = \"ust_tests_demo3:done\";\n"
149 + " id = 0;\n"
150 + " stream_id = 0;\n"
151 + " loglevel = 4;\n"
152 + " fields := struct {\n"
153 + " integer { size = 32; align = 8; signed = 1; encoding = none; base = 10; } _value;\n"
154 + " };\n"
155 + "};\n"
156 + "\n"
157 + "event {\n"
158 + " name = \"ust_tests_demo:starting\";\n"
159 + " id = 1;\n"
160 + " stream_id = 0;\n"
161 + " loglevel = 2;\n"
162 + " model.emf.uri = \"http://example.com/path_to_model?q=ust_tests_demo:starting\";\n"
163 + " fields := struct {\n"
164 + " integer { size = 32; align = 8; signed = 1; encoding = none; base = 10; } _value;\n"
165 + " };\n"
166 + "};\n"
167 + "\n"
168 + "event {\n"
169 + " name = \"ust_tests_demo:done\";\n"
170 + " id = 2;\n"
171 + " stream_id = 0;\n"
172 + " loglevel = 2;\n"
173 + " model.emf.uri = \"http://example.com/path_to_model?q=ust_tests_demo:done\";\n"
174 + " fields := struct {\n"
175 + " integer { size = 32; align = 8; signed = 1; encoding = none; base = 10; } _value;\n"
176 + " };\n"
177 + "};\n"
178 + "\n"
179 + "event {\n"
180 + " name = \"ust_tests_demo2:loop\";\n"
181 + " id = 3;\n"
182 + " stream_id = 0;\n"
183 + " loglevel = 4;\n"
184 + " fields := struct {\n"
185 + " integer { size = 32; align = 8; signed = 1; encoding = none; base = 10; } _intfield;\n"
186 + " integer { size = 32; align = 8; signed = 1; encoding = none; base = 16; } _intfield2;\n"
187 + " integer { size = 64; align = 8; signed = 1; encoding = none; base = 10; } _longfield;\n"
188 + " integer { size = 32; align = 8; signed = 1; encoding = none; base = 10; byte_order = be; } _netintfield;\n"
189 + " integer { size = 32; align = 8; signed = 1; encoding = none; base = 16; byte_order = be; } _netintfieldhex;\n"
190 + " integer { size = 64; align = 8; signed = 1; encoding = none; base = 10; } _arrfield1[3];\n"
191 + " integer { size = 8; align = 8; signed = 1; encoding = UTF8; base = 10; } _arrfield2[10];\n"
192 + " integer { size = 64; align = 8; signed = 0; encoding = none; base = 10; } __seqfield1_length;\n"
193 + " integer { size = 8; align = 8; signed = 1; encoding = none; base = 10; } _seqfield1[ __seqfield1_length ];\n"
194 + " integer { size = 64; align = 8; signed = 0; encoding = none; base = 10; } __seqfield2_length;\n"
195 + " integer { size = 8; align = 8; signed = 1; encoding = UTF8; base = 10; } _seqfield2[ __seqfield2_length ];\n"
196 + " string _stringfield;\n"
197 + " floating_point { exp_dig = 8; mant_dig = 24; align = 8; } _floatfield;\n"
198 + " floating_point { exp_dig = 11; mant_dig = 53; align = 8; } _doublefield;\n"
199 + " };\n"
200 + "};\n"
201 + "\n";
202
203 private static final String enumMd =
204 "typealias integer { size = 32; align = 8; signed = false; } := int;\n"
205 + "typealias enum { ONE = 0, a,b,c=10, d} := useless_enum;\n"
206 + "struct useless{ \n"
207 + " enum : uint8_t { A=0, \"B\",} enum3;\n"
208 + " useless_enum enum2;"
209 + " enum { C, D, E } enum4;\n"
210 + " uint16_t val;\n"
211 + "} ;\n"
212 + "\n"
213 + "event {\n"
214 + " name = \"enumEvent\";\n"
215 + " id = 6;\n"
216 + " stream_id = 0;\n"
217 + " loglevel = 5;\n"
218 + " fields := struct{\n"
219 + " uint16_t _some_field;\n"
220// + " useless junk;\n"
221// + " bad_enum a;\n"
222 + " enum {A, B, C = 3 , } _other_enum;\n"
223 + " };\n"
224 + "};\n"
225 + "\n";
226
227 private final static String contextMD =
228 "event {\n" +
229 " name = \"someOtherEvent\";\n" +
230 " id = 5;\n" +
231 " stream_id = 0;\n" +
232 " loglevel = 5;\n" +
233 " context := struct{\n" +
234 " uint16_t _someContext;\n" +
235 " };\n" +
236 " fields := struct{\n" +
237 " uint16_t _somefield;\n" +
238 " };\n" +
239 "};\n " +
240 "\n" ;
241
242 private static final String callsiteMD =
243 "callsite {\n"
244 + " name = \"ust_tests_demo2:loop\";\n"
245 + " func = \"main\";\n" + " ip = 0x400a29;\n"
246 + " file = \"demo.c\";\n" + " line = 59;\n" + "};\n" + "\n"
247 + "callsite {\n" + " name = \"ust_tests_demo3:done\";\n"
248 + " func = \"main\";\n" + " ip = 0x400a6c;\n"
249 + " file = \"demo.c\";\n" + " line = 62;\n" + "};\n" + "\n"
250 + "callsite {\n" + " name = \"ust_tests_demo:done\";\n"
251 + " func = \"main\";\n" + " ip = 0x400aaf;\n"
252 + " file = \"demo.c\";\n" + " line = 61;\n" + "};\n" + "\n"
253 + "callsite {\n" + " name = \"ust_tests_demo:starting\";\n"
254 + " func = \"main\";\n" + " ip = 0x400af2;\n"
255 + " file = \"demo.c\";\n" + " line = 55;\n" + "};\n";
256
257 private static final String simpleTSDL = metadataDecs + ctfStart + ctfHeaders
258 + ctfBody;
259 private static final String enumTSDL = metadataDecs + ctfStart + ctfHeaders
260 + ctfBody + enumMd;
261 private static final String clockTSDL = metadataDecs + clockMD + ctfStart
262 + ctfHeaders + ctfBody;
263 private static final String envTSDL = metadataDecs + environmentMD + ctfStart
264 + ctfHeaders + ctfBody;
265 private static final String contextTSDL = metadataDecs + environmentMD + ctfStart
266 + ctfHeaders + ctfBody +contextMD;
267 private static final String callsiteTSDL = metadataDecs + ctfStart + ctfHeaders
268 + ctfBody + callsiteMD;
269 private static final String allDressedTSDL = metadataDecs + environmentMD + clockMD
270 + ctfStart + ctfHeaders + ctfBody +enumMd+ callsiteMD;
271
272 static final String tempTraceDir = System.getProperty("java.io.tmpdir")
273 + "/" + "tempTrace";
274
275 private static void deltree(File f) {
276 for (File elem : f.listFiles()) {
277 if (elem.isDirectory()) {
278 deltree(elem);
279 }
280 elem.delete();
281 }
282 f.delete();
283 }
284
285 private static void createDummyTrace(String metadata) {
286
287 File f;
288 try {
289 f = new File(tempTraceDir);
290 if (f.exists()) {
291 deltree(f);
292 }
293 f.mkdirs();
4a9c1f07 294 f = new File(tempTraceDir + "/metadata");
791072b0
MK
295 FileWriter fw = new FileWriter(f);
296 fw.write(metadata);
297 fw.close();
298 f.createNewFile();
299
300 byte magicLE[] = { (byte) 0xC1, (byte) 0x1F, (byte) 0xFC, (byte) 0xC1 };
301 byte uuid[] = { (byte) 0xb0, 0x4d, 0x39, 0x1b, (byte) 0xe7, 0x36,
302 0x44, (byte) 0xc1, (byte) 0x8d, (byte) 0x89, 0x4b,
303 (byte) 0xb4, 0x38, (byte) 0x85, 0x7f, (byte) 0x8d };
304 final int size = 4096;
305 byte[] data = new byte[size];
306 for (int i = 0; i < size; i++) {
307 data[i] = 0x00;
308 }
4a9c1f07 309 f = new File(tempTraceDir + "/dummyChan");
791072b0
MK
310 fw = new FileWriter(f);
311 FileOutputStream fos = new FileOutputStream(f);
312 fos.write(magicLE);
313 fos.write(uuid);
314 fos.write(data);
315 fos.close();
316 fw.close();
317 f.createNewFile();
318 } catch (IOException e) {
319 e.printStackTrace();
320 } finally {
321 f = null;
322 }
323
324 }
325
326 /**
327 * Simple test (only the minimum)
328 * @throws CTFReaderException something wrong happened
329 */
330 @Test
331 public void TSDLSimpleTest() throws CTFReaderException {
332 createDummyTrace(simpleTSDL);
333 CTFTrace trace = new CTFTrace(tempTraceDir);
334 assertNotNull(trace);
335
336 }
337
338 /**
339 * Test with environment variables
340 * @throws CTFReaderException something wrong happened
341 */
342 @Test
343 public void TSDLEnvironmentTest() throws CTFReaderException {
344 createDummyTrace(envTSDL);
345 CTFTrace trace = new CTFTrace(tempTraceDir);
346 assertNotNull(trace);
347 }
348
349 /**
350 * Test with Clocks
351 * @throws CTFReaderException something wrong happened
352 */
353 @Test
354 public void TSDLEnumTest() throws CTFReaderException {
355 createDummyTrace(enumTSDL);
356 CTFTrace trace = new CTFTrace(tempTraceDir);
357 assertNotNull(trace);
358 }
359
360 /**
361 * Test with Clocks
362 * @throws CTFReaderException something wrong happened
363 */
364 @Test
365 public void TSDLClockTest() throws CTFReaderException {
366 createDummyTrace(clockTSDL);
367 CTFTrace trace = new CTFTrace(tempTraceDir);
368 assertNotNull(trace);
369 }
370
371 /**
372 * Test with Contexts
373 * @throws CTFReaderException something wrong happened
374 */
375 @Test
376 public void TSDLContextTest() throws CTFReaderException {
377 createDummyTrace(contextTSDL);
378 CTFTrace trace = new CTFTrace(tempTraceDir);
379 assertNotNull(trace);
380 }
381
382 /**
383 * Test with Callsites
384 * @throws CTFReaderException something wrong happened
385 */
386 @Test
387 public void TSDLCallsiteTest() throws CTFReaderException {
388 createDummyTrace(callsiteTSDL);
389 CTFTrace trace = new CTFTrace(tempTraceDir);
390 assertNotNull(trace);
391 }
392
393 /**
394 * Test everything
395 * @throws CTFReaderException something wrong happened
396 */
397 @Test
398 public void TSDLAllTest() throws CTFReaderException {
399 createDummyTrace(allDressedTSDL);
400 CTFTrace trace = new CTFTrace(tempTraceDir);
401 assertNotNull(trace);
8e964be1
MK
402
403 HashMap<Long, IEventDeclaration> events = trace.getEvents(0L);
404 final EventDeclaration eventDeclaration = (EventDeclaration) events.get(2L);
405 assertEquals("http://example.com/path_to_model?q=ust_tests_demo:done",
406 eventDeclaration.getCustomAttribute("model.emf.uri"));
791072b0
MK
407 }
408
409}
This page took 0.070779 seconds and 5 git commands to generate.