1 /*******************************************************************************
2 * Copyright (c) 2013, 2014 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 *******************************************************************************/
13 package org
.eclipse
.linuxtools
.tmf
.core
.tests
.ctfadaptor
;
15 import static org
.junit
.Assert
.assertArrayEquals
;
16 import static org
.junit
.Assert
.assertEquals
;
17 import static org
.junit
.Assume
.assumeTrue
;
19 import org
.eclipse
.linuxtools
.tmf
.core
.ctfadaptor
.CtfEnumPair
;
20 import org
.eclipse
.linuxtools
.tmf
.core
.ctfadaptor
.CtfTmfEvent
;
21 import org
.eclipse
.linuxtools
.tmf
.core
.ctfadaptor
.CtfTmfTrace
;
22 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfEvent
;
23 import org
.eclipse
.linuxtools
.tmf
.core
.event
.ITmfEventField
;
24 import org
.eclipse
.linuxtools
.tmf
.core
.request
.TmfEventRequest
;
25 import org
.eclipse
.linuxtools
.tmf
.core
.tests
.shared
.CtfTmfTestTrace
;
26 import org
.eclipse
.linuxtools
.tmf
.core
.timestamp
.TmfTimeRange
;
27 import org
.junit
.After
;
28 import org
.junit
.Before
;
29 import org
.junit
.Rule
;
30 import org
.junit
.Test
;
31 import org
.junit
.rules
.TestRule
;
32 import org
.junit
.rules
.Timeout
;
35 * More advanced CTF tests using "funky_trace", a trace generated with the
36 * Babeltrace CTF writer API, which has lots of fun things like different
37 * integer/float sizes and non-standard struct alignments.
39 * @author Alexandre Montplaisir
41 public class FunkyTraceTest
{
43 /** Time-out tests after 20 seconds */
45 public TestRule globalTimeout
= new Timeout(20000);
47 // ------------------------------------------------------------------------
49 // ------------------------------------------------------------------------
51 private static final CtfTmfTestTrace testTrace
= CtfTmfTestTrace
.FUNKY_TRACE
;
52 private static final double DELTA
= 0.0000001;
54 private CtfTmfTrace fTrace
;
56 // ------------------------------------------------------------------------
58 // ------------------------------------------------------------------------
65 assumeTrue(testTrace
.exists());
66 fTrace
= testTrace
.getTrace();
67 fTrace
.indexTrace(true);
74 public void tearDown() {
80 // ------------------------------------------------------------------------
82 // ------------------------------------------------------------------------
85 * Verify the contents of the first event
88 public void testFirstEvent() {
89 CtfTmfEvent event
= getEvent(0);
90 assertEquals("Simple Event", event
.getType().getName());
91 assertEquals(1234567, event
.getTimestamp().getValue());
92 assertEquals(42, ((Long
) event
.getContent().getField("integer_field").getValue()).intValue());
93 assertEquals(3.1415, ((Double
) event
.getContent().getField("float_field").getValue()).doubleValue(), DELTA
);
97 * Verify the contents of the second event (the first "spammy event")
100 public void testSecondEvent() {
101 CtfTmfEvent event
= getEvent(1);
102 assertEquals("Spammy_Event", event
.getType().getName());
103 assertEquals(1234568, event
.getTimestamp().getValue());
104 assertEquals(0, ((Long
) event
.getContent().getField("field_1").getValue()).intValue());
105 assertEquals("This is a test", event
.getContent().getField("a_string").getValue());
109 * Verify the contents of the last "spammy event"
112 public void testSecondToLastEvent() {
113 CtfTmfEvent event
= getEvent(100000);
114 assertEquals("Spammy_Event", event
.getType().getName());
115 assertEquals(1334567, event
.getTimestamp().getValue());
116 assertEquals(99999, ((Long
) event
.getContent().getField("field_1").getValue()).intValue());
117 assertEquals("This is a test", event
.getContent().getField("a_string").getValue());
121 * Verify the contents of the last, complex event
124 public void testLastEvent() {
126 * Last event as seen in Babeltrace:
127 * [19:00:00.001334568] (+0.000000001) Complex Test Event: { }, {
128 * uint_35 = 0xDDF00D,
130 * complex_structure = {
131 * variant_selector = ( INT16_TYPE : container = 1 ),
132 * a_string = "Test string",
133 * variant_value = { INT16_TYPE = -200 },
134 * inner_structure = {
136 * a_sequence = [ [0] = 4, [1] = 3, [2] = 2, [3] = 1, [4] = 0, [5] = -1, [6] = -2, [7] = -3, [8] = -4, [9] = -5 ]
142 CtfTmfEvent event
= getEvent(100001);
143 assertEquals("Complex Test Event", event
.getType().getName());
144 assertEquals(1334568, event
.getTimestamp().getValue());
145 assertEquals(0xddf00d, ((Long
) event
.getContent().getField("uint_35").getValue()).intValue());
146 assertEquals(-12345, ((Long
) event
.getContent().getField("int_16").getValue()).intValue());
148 ITmfEventField
[] complexStruct
=
149 (ITmfEventField
[]) event
.getContent().getField("complex_structure").getValue();
151 assertEquals("variant_selector", complexStruct
[0].getName());
152 CtfEnumPair variant1
= (CtfEnumPair
) complexStruct
[0].getValue();
153 assertEquals("INT16_TYPE", variant1
.getStringValue());
154 assertEquals(Long
.valueOf(1), variant1
.getLongValue());
156 assertEquals("a_string", complexStruct
[1].getName());
157 assertEquals("Test string", complexStruct
[1].getValue());
159 assertEquals("variant_value", complexStruct
[2].getName());
160 ITmfEventField variantField
= (ITmfEventField
) complexStruct
[2].getValue();
161 assertEquals("INT16_TYPE", variantField
.getName());
162 assertEquals(Long
.valueOf(-200), variantField
.getValue());
164 ITmfEventField
[] innerStruct
= (ITmfEventField
[]) complexStruct
[3].getValue();
166 assertEquals("seq_len", innerStruct
[0].getName());
167 assertEquals(Long
.valueOf(10), innerStruct
[0].getValue());
169 assertEquals("a_sequence", innerStruct
[1].getName());
170 long[] seqValues
= (long[]) innerStruct
[1].getValue();
171 long[] expectedValues
= { 4, 3, 2, 1, 0, -1, -2, -3, -4, -5 };
172 assertArrayEquals(expectedValues
, seqValues
);
175 // ------------------------------------------------------------------------
177 // ------------------------------------------------------------------------
179 private synchronized CtfTmfEvent
getEvent(long index
) {
180 TestEventRequest req
= new TestEventRequest(index
);
181 fTrace
.sendRequest(req
);
183 req
.waitForCompletion();
184 } catch (InterruptedException e
) {
187 return req
.getEvent();
190 private class TestEventRequest
extends TmfEventRequest
{
192 private CtfTmfEvent fRetEvent
= null;
194 public TestEventRequest(long index
) {
195 super(CtfTmfEvent
.class,
196 TmfTimeRange
.ETERNITY
,
199 ExecutionType
.FOREGROUND
);
203 public void handleData(ITmfEvent event
) {
204 fRetEvent
= (CtfTmfEvent
) event
;
207 public CtfTmfEvent
getEvent() {