/*******************************************************************************
* Copyright (c) 2013, 2015 Ericsson
*
* 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
*
* Contributors:
* Alexandre Montplaisir - Initial API and implementation
******************************************************************************/
package org.eclipse.tracecompass.lttng2.kernel.core.tests.analysis.kernel.statesystem;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.List;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.tracecompass.analysis.os.linux.core.kernel.KernelAnalysisModule;
import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem;
import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval;
import org.eclipse.tracecompass.statesystem.core.statevalue.ITmfStateValue;
import org.eclipse.tracecompass.testtraces.ctf.CtfTestTrace;
import org.eclipse.tracecompass.tmf.core.statesystem.TmfStateSystemAnalysisModule;
import org.eclipse.tracecompass.tmf.ctf.core.tests.shared.CtfTmfTestTraceUtils;
import org.eclipse.tracecompass.tmf.ctf.core.trace.CtfTmfTrace;
import org.junit.Test;
/**
* Small program to regenerate the values used in "TestValues.java" from the
* current LTTng-kernel state provider.
*
* It will write its output the a file called 'TestValues<something>.java' in
* your temporary files directory.
*
* @author Alexandre Montplaisir
*/
public class GenerateTestValues {
private static @NonNull CtfTestTrace testTrace = CtfTestTrace.TRACE2;
private static final long targetTimestamp = 18670067372290L + 1331649577946812237L;
private static final String INDENT = " ";
/**
* Test wrapper to run main properly
*
* @throws Exception
* we're messing with exception
*/
@Test
public void test() throws Exception {
main(null);
}
/**
* Run the program
*
* @param args
* Command-line arguments, unused.
* @throws Exception
* I'm messing with Exception. Come at me bro!
*/
public static void main(String[] args) throws Exception {
/* Prepare the files */
File logFile = File.createTempFile("TestValues", ".java");
try (PrintWriter writer = new PrintWriter(new FileWriter(logFile), true);) {
/* Build and query the state system */
final CtfTmfTrace trace = CtfTmfTestTraceUtils.getTrace(testTrace);
TmfStateSystemAnalysisModule module = new KernelAnalysisModule() {
@Override
protected String getSsFileName() {
return "test-values";
}
};
if (!module.setTrace(trace)) {
throw new IllegalStateException();
}
module.setId("test-values");
module.schedule();
module.waitForCompletion();
ITmfStateSystem ssq = module.getStateSystem();
if (ssq == null) {
throw new IllegalStateException();
}
List<ITmfStateInterval> fullState = ssq.queryFullState(targetTimestamp);
/* Start printing the java file's contents */
writer.println("interface TestValues {");
writer.println();
writer.println(INDENT + "int size = " + fullState.size() + ";");
writer.println();
/* Print the array contents */
writer.println(INDENT + "long[] startTimes = {");
for (ITmfStateInterval interval : fullState) {
writer.println(INDENT + INDENT + String.valueOf(interval.getStartTime()) + "L,");
}
writer.println(INDENT + "};");
writer.println();
writer.println(INDENT + "long[] endTimes = {");
for (ITmfStateInterval interval : fullState) {
writer.println(INDENT + INDENT + String.valueOf(interval.getEndTime()) + "L,");
}
writer.println(INDENT + "};");
writer.println();
writer.println(INDENT + "ITmfStateValue[] values = {");
for (ITmfStateInterval interval : fullState) {
ITmfStateValue val = interval.getStateValue();
writer.print(INDENT + INDENT);
switch (val.getType()) {
case NULL:
writer.println("TmfStateValue.nullValue(),");
break;
case INTEGER:
writer.println("TmfStateValue.newValueInt(" + val.unboxInt() + "),");
break;
case LONG:
writer.println("TmfStateValue.newValueLong(" + val.unboxLong() + "),");
break;
case DOUBLE:
writer.println("TmfStateValue.newValueDouble(" + val.unboxDouble() + "),");
break;
case STRING:
writer.println("TmfStateValue.newValueString(\"" + val.unboxStr() + "\"),");
break;
case CUSTOM:
default:
writer.println(val.toString());
break;
}
}
writer.println(INDENT + "};");
writer.println("}");
writer.println();
module.dispose();
trace.dispose();
}
System.exit(0);
}
}