blob: b17819fa6b5bdca6938cd2c41649feb134cfbd08 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2019 École Polytechnique de Montréal
*
* 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
*******************************************************************************/
package org.eclipse.tracecompass.tmf.analysis.xml.core.tests.fsm.compile;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import javax.xml.parsers.ParserConfigurationException;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.compile.AnalysisCompilationData;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.compile.TmfXmlActionCu;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.model.DataDrivenAction;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.model.DataDrivenActionSegment;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.model.values.DataDrivenValue;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.model.values.DataDrivenValueConstant;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.model.values.DataDrivenValueEventField;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.fsm.model.values.DataDrivenValueTypedWrapper;
import org.eclipse.tracecompass.statesystem.core.statevalue.ITmfStateValue;
import org.eclipse.tracecompass.tmf.analysis.xml.core.module.TmfXmlStrings;
import org.eclipse.tracecompass.tmf.analysis.xml.core.tests.common.TmfXmlTestUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;
/**
* Test the DataDrivenAction compilation from XML
*
* @author Geneviève Bastien
*/
@RunWith(Parameterized.class)
public class TmfXmlActionCuTest {
private static final @NonNull String ACTION_START = "<action id=\"%s\">";
private static final @NonNull String ACTION_END = "</action>";
private static final @NonNull String SEGMENT_TYPE = "<segType>" +
" <segName> " +
" <stateValue type=\"string\" value=\"seg1\"/>" +
" </segName>" +
"</segType> ";
private static final @NonNull String SEGMENT_START = "<begin type=\"eventField\" value=\"timestamp\"/>";
private static final @NonNull String SEGMENT_END = "<end type=\"eventField\" value=\"testField\" />";
private static final @NonNull String SEGMENT_DURATION = "<duration type=\"eventField\" value=\"testField\" />";
// Common values
private static final @NonNull DataDrivenValue SEGMENT_START_VALUE = new DataDrivenValueTypedWrapper(new DataDrivenValueEventField(null, ITmfStateValue.Type.NULL, "timestamp"), ITmfStateValue.Type.LONG);
private static final @NonNull DataDrivenValue SEGMENT_TIME_VALUE = new DataDrivenValueTypedWrapper(new DataDrivenValueEventField(null, ITmfStateValue.Type.NULL, "testField"), ITmfStateValue.Type.LONG);
private static abstract class CompilationResult {
public abstract @NonNull String getName();
public abstract @NonNull String getXmlString();
public abstract @Nullable DataDrivenAction getResult();
@Override
public String toString() {
return getName();
}
}
// Valid test cases
private static final @NonNull CompilationResult SEGMENT_TYPE_WITH_END = new CompilationResult() {
@Override
public String getName() {
return "type_and_end";
}
@Override
public String getXmlString() {
return String.format(ACTION_START, getName()) +
" <segment>" + SEGMENT_TYPE +
" <segTime>" + SEGMENT_START + SEGMENT_END + "</segTime>" +
" </segment>" +
ACTION_END;
}
@Override
public DataDrivenAction getResult() {
return new DataDrivenActionSegment(new DataDrivenValueConstant(null, ITmfStateValue.Type.NULL, "seg1"),
SEGMENT_START_VALUE,
null,
SEGMENT_TIME_VALUE,
Collections.emptyMap());
}
};
private static final @NonNull CompilationResult SEGMENT_TYPE_NO_TIME = new CompilationResult() {
@Override
public String getName() {
return "just_type";
}
@Override
public String getXmlString() {
return String.format(ACTION_START, getName()) +
" <segment>" + SEGMENT_TYPE + "</segment>" +
ACTION_END;
}
@Override
public DataDrivenAction getResult() {
return new DataDrivenActionSegment(new DataDrivenValueConstant(null, ITmfStateValue.Type.NULL, "seg1"),
null,
null,
null,
Collections.emptyMap());
}
};
private static final @NonNull CompilationResult SEGMENT_TYPE_WITH_DURATION = new CompilationResult() {
@Override
public String getName() {
return "type_and_duration";
}
@Override
public String getXmlString() {
return String.format(ACTION_START, getName()) +
" <segment>" + SEGMENT_TYPE +
" <segTime>" + SEGMENT_START + SEGMENT_DURATION + "</segTime>" +
" </segment>" +
ACTION_END;
}
@Override
public DataDrivenAction getResult() {
return new DataDrivenActionSegment(new DataDrivenValueConstant(null, ITmfStateValue.Type.NULL, "seg1"),
SEGMENT_START_VALUE,
SEGMENT_TIME_VALUE,
null,
Collections.emptyMap());
}
};
private static final @NonNull CompilationResult SEGMENT_INLINE_TYPE = new CompilationResult() {
@Override
public String getName() {
return "inline_name";
}
@Override
public String getXmlString() {
return String.format(ACTION_START, getName()) +
"<segment><segType segName=\"seg2\" /></segment>" +
ACTION_END;
}
@Override
public DataDrivenAction getResult() {
return new DataDrivenActionSegment(new DataDrivenValueConstant(null, ITmfStateValue.Type.NULL, "seg2"),
null,
null,
null,
Collections.emptyMap());
}
};
// Test some invalid use cases
private static final @NonNull CompilationResult SEGMENT_END_AND_DURATION = new CompilationResult() {
@Override
public String getName() {
return "invalid_segment_and_duration";
}
@Override
public String getXmlString() {
return String.format(ACTION_START, getName()) +
" <segment>" + SEGMENT_TYPE +
" <segTime>" + SEGMENT_START + SEGMENT_DURATION + SEGMENT_END + "</segTime>" +
" </segment>" +
ACTION_END;
}
@Override
public DataDrivenAction getResult() {
// Invalid
return null;
}
};
/**
* @return The arrays of parameters
*/
@Parameters(name = "{index}: {0}")
public static Iterable<Object[]> getParameters() {
return Arrays.asList(new Object[][] {
{ SEGMENT_TYPE_WITH_END },
{ SEGMENT_TYPE_NO_TIME },
{ SEGMENT_TYPE_WITH_DURATION },
{ SEGMENT_INLINE_TYPE },
{ SEGMENT_END_AND_DURATION },
});
}
private final CompilationResult fExpected;
/**
* Constructor
*
* @param expected
* The expected result
*/
public TmfXmlActionCuTest(CompilationResult expected) {
fExpected = expected;
}
/**
* Test the compilation of a valid action strings
*
* @throws SAXException
* Exception thrown by parser
* @throws IOException
* Exception thrown by parser
* @throws ParserConfigurationException
* Exception thrown by parser
*/
@Test
public void testAction() throws SAXException, IOException, ParserConfigurationException {
AnalysisCompilationData data = new AnalysisCompilationData();
Element xmlElement = TmfXmlTestUtils.getXmlElement(TmfXmlStrings.ACTION, fExpected.getXmlString());
assertNotNull(xmlElement);
TmfXmlActionCu compiledAction = TmfXmlActionCu.compileNamedAction(data, xmlElement);
if (fExpected.getResult() == null) {
assertNull("Expected null action" + fExpected.getName(), compiledAction);
} else {
assertNotNull("Expected non null " + fExpected.getName(), compiledAction);
assertEquals(fExpected.getName() + " generated", fExpected.getResult(), compiledAction.generate());
}
}
}