/******************************************************************************* * Copyright (c) 2016 EfficiOS Inc., Alexandre Montplaisir * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html *******************************************************************************/ package org.eclipse.tracecompass.tmf.ctf.core.tests.event; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import java.util.stream.Collectors; import java.util.stream.LongStream; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.tracecompass.internal.tmf.ctf.core.trace.iterator.CtfIterator; import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace; import org.eclipse.tracecompass.tmf.core.event.ITmfEventField; import org.eclipse.tracecompass.tmf.ctf.core.event.CtfTmfEvent; import org.eclipse.tracecompass.tmf.ctf.core.tests.shared.CtfTmfTestTraceUtils; import org.eclipse.tracecompass.tmf.ctf.core.trace.CtfTmfTrace; import org.junit.After; import org.junit.Before; import org.junit.Test; /** * Tests making sure sign extension sign extension of field values works * correctly. * * See: https://bugs.eclipse.org/bugs/show_bug.cgi?id=491382 * * @author Alexandre Montplaisir */ public class CtfTmfEventFieldSignExtensionTest { private static final @NonNull CtfTestTrace DEBUG_INFO_TRACE = CtfTestTrace.DEBUG_INFO3; private CtfTmfTrace trace; /** * Test setup */ @Before public void setUp() { trace = CtfTmfTestTraceUtils.getTrace(DEBUG_INFO_TRACE); } /** * Test teardown */ @After public void teardown() { if (trace != null) { trace.dispose(); } } /** * Test that signed 8-byte integers are printed correctly. */ @Test public void testUnsignedByte() { /* * Third event of the trace is printed like this by Babeltrace: * * [16:25:03.003427176] (+0.000001578) sonoshee lttng_ust_statedump:build_id: * { cpu_id = 0 }, { ip = 0x7F3BBEDDDE1E, vpid = 3520 }, * { baddr = 0x400000, _build_id_length = 20, build_id = [ [0] = 0x1, [1] = 0xC6, [2] = 0x5, [3] = 0xBC, [4] = 0xF3, [5] = 0x8D, [6] = 0x6, [7] = 0x8D, [8] = 0x77, [9] = 0xA6, [10] = 0xE0, [11] = 0xA0, [12] = 0x2C, [13] = 0xED, [14] = 0xE6, [15] = 0xA5, [16] = 0xC, [17] = 0x57, [18] = 0x50, [19] = 0xB5 ] } */ long[] expectedValues = new long[] { 0x1, 0xC6, 0x5, 0xBC, 0xF3, 0x8D, 0x6, 0x8D, 0x77, 0xA6, 0xE0, 0xA0, 0x2C, 0xED, 0xE6, 0xA5, 0xC, 0x57, 0x50, 0xB5 }; String expectedToString = LongStream.of(expectedValues) .mapToObj(i -> "0x" + Long.toHexString(i)) .collect(Collectors.joining(", ", "build_id=[", "]")); try (CtfIterator iter = (CtfIterator) trace.createIterator();) { /* Go to third event */ iter.advance(); iter.advance(); /* Retrieve the event's field called "build_id" */ CtfTmfEvent event = iter.getCurrentEvent(); ITmfEventField field = event.getContent().getField("build_id"); long[] values = (long[]) field.getValue(); assertArrayEquals(expectedValues, values); assertEquals(expectedToString, field.toString()); } } }