blob: 45acfdf451b7a97fff1988aa46d375995b54158e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014 Ericsson
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Matthew Khouzam - Initial API and implementation
*******************************************************************************/
package org.eclipse.tracecompass.ctf.core.tests.trace;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.FileAttribute;
import java.util.UUID;
import org.eclipse.tracecompass.ctf.core.CTFException;
import org.eclipse.tracecompass.ctf.core.trace.CTFTrace;
import org.eclipse.tracecompass.ctf.core.trace.CTFTraceReader;
import org.junit.Before;
import org.junit.Test;
/**
* Tests growing streams
*
* @author Matthew Khouzam
*
*/
public class CTFTraceGrowingStreamTest {
private Path fCtfDirectory;
private File fGrowingStream;
private byte[][] fPackets;
private CTFTrace fFixture;
private UUID fUUID;
/**
* Run before every test
*
* @throws IOException won't happen
* @throws CTFException won't happen
*/
@Before
public void init() throws IOException, CTFException {
fCtfDirectory = Files.createTempDirectory("temptrace", new FileAttribute<?>[] {});
File metadata = new File(fCtfDirectory.toString() + "/" + "metadata");
fGrowingStream = new File(fCtfDirectory.toString() + "/" + "stream");
fUUID = UUID.randomUUID();
fPackets = new byte[2][];
fPackets[0] = new byte[32];
fPackets[1] = new byte[32];
try (PrintWriter pw = new PrintWriter(metadata)) {
pw.println("/*CTF 1.8*/");
pw.println("typealias integer { size = 8; align = 8; signed = false; base = 10; } := uint8_t;");
pw.println("typealias integer { size = 32; align = 32; signed = false; base = hex; } := uint32_t;");
pw.println("trace {");
pw.println(" major = 0;");
pw.println(" minor = 1;");
pw.println(" uuid = \"" + fUUID.toString() + "\";");
pw.println(" byte_order = le;");
pw.println(" packet.header := struct {");
pw.println(" uint32_t magic;");
pw.println(" uint8_t uuid[16];");
pw.println(" };");
pw.println("};");
pw.println("");
pw.println("stream {");
pw.println(" packet.context := struct {");
pw.println(" uint32_t packet_size;");
pw.println(" uint32_t content_size;");
pw.println(" };");
pw.println("};");
pw.println("");
pw.println("event {");
pw.println(" name = thing;");
pw.println(" fields := struct { uint32_t f; };");
pw.println("};");
pw.println("");
pw.close();
}
setupPacket(fPackets[0], 41);
setupPacket(fPackets[1], 0xbab4face);
try (FileOutputStream fos = new FileOutputStream(fGrowingStream)) {
fos.write(fPackets[0]);
}
fFixture = new CTFTrace(fCtfDirectory.toString());
}
private void setupPacket(byte data[], int value) {
ByteBuffer bb = ByteBuffer.wrap(data);
bb.clear();
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.putInt(0xc1fc1fc1);
bb.order(ByteOrder.BIG_ENDIAN);
bb.putLong(fUUID.getMostSignificantBits());
bb.putLong(fUUID.getLeastSignificantBits());
bb.order(ByteOrder.LITTLE_ENDIAN);
bb.putInt(256);
bb.putInt(256);
bb.putInt(value);
}
/**
* Test a growing stream
*
* @throws CTFException won't happen
* @throws IOException won't happen
* @throws FileNotFoundException won't happen
*/
@Test
public void testGrowingLive() throws CTFException, FileNotFoundException, IOException {
try (CTFTraceReader reader = new CTFTraceReader(fFixture);) {
reader.setLive(true);
assertEquals("0x29", reader.getCurrentEventDef().getFields().getDefinition("f").toString());
reader.advance();
try (FileOutputStream fos = new FileOutputStream(fGrowingStream, true)) {
fos.write(fPackets[1]);
}
reader.advance();
assertNotNull(reader.getCurrentEventDef());
assertEquals("0xbab4face", reader.getCurrentEventDef().getFields().getDefinition("f").toString());
}
}
/**
* Test a growing stream
*
* @throws CTFException won't happen
* @throws IOException won't happen
* @throws FileNotFoundException won't happen
*/
@Test
public void testGrowingNotLive() throws CTFException, FileNotFoundException, IOException {
try (CTFTraceReader reader = new CTFTraceReader(fFixture);) {
reader.setLive(false);
assertEquals("0x29", reader.getCurrentEventDef().getFields().getDefinition("f").toString());
reader.advance();
try (FileOutputStream fos = new FileOutputStream(fGrowingStream, true)) {
fos.write(fPackets[1]);
}
reader.advance();
assertNull(reader.getCurrentEventDef());
}
}
}