blob: e9194178d40c1042b35ec4090df7fc3acbee3551 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 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
*******************************************************************************/
package org.eclipse.tracecompass.tmf.analysis.xml.core.tests.model;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.pattern.stateprovider.XmlPatternAnalysis;
import org.eclipse.tracecompass.internal.tmf.analysis.xml.core.segment.TmfXmlPatternSegment;
import org.eclipse.tracecompass.segmentstore.core.ISegment;
import org.eclipse.tracecompass.segmentstore.core.ISegmentStore;
import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem;
import org.eclipse.tracecompass.statesystem.core.exceptions.AttributeNotFoundException;
import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException;
import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval;
import org.eclipse.tracecompass.tmf.analysis.xml.core.tests.PatternAnalysisTestUtils;
import org.eclipse.tracecompass.tmf.analysis.xml.core.tests.common.TmfXmlTestFiles;
import org.eclipse.tracecompass.tmf.analysis.xml.core.tests.module.XmlUtilsTest;
import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException;
import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Test the pattern analysis fsm
*
* @author Jean-Christian Kouame
*/
public class FsmTest {
private static final int END_TIME = 7;
private static final @NonNull String TEST_TRACE = "test_traces/testTrace4.xml";
private static final String TEST_SEGMENT_NEW = "NEW";
private static final TmfXmlTestFiles TEST_FILE_1 = TmfXmlTestFiles.INITIAL_STATE_ELEMENT_TEST_FILE_1;
private static final TmfXmlTestFiles TEST_FILE_2 = TmfXmlTestFiles.INITIAL_STATE_ELEMENT_TEST_FILE_2;
private static XmlPatternAnalysis fModule;
private static XmlPatternAnalysis fModule2;
private static ITmfTrace fTrace;
/**
* End the test suite
*/
@AfterClass
public static void tearDown() {
if (fModule != null) {
fModule.dispose();
}
if (fModule2 != null) {
fModule2.dispose();
}
if (fTrace != null) {
fTrace.dispose();
}
}
/**
* Before the test suite
*/
@BeforeClass
public static void before() {
ITmfTrace trace = XmlUtilsTest.initializeTrace(TEST_TRACE);
fTrace = trace;
//Create first module
fModule = PatternAnalysisTestUtils.initModule(TEST_FILE_1);
try {
fModule.setTrace(trace);
fModule.schedule();
assertTrue(fModule.waitForCompletion(new NullProgressMonitor()));
} catch (TmfAnalysisException e) {
fail("Cannot execute analyses " + e.getMessage());
}
//Create second module
fModule2 = PatternAnalysisTestUtils.initModule(TEST_FILE_2);
try {
fModule2.setTrace(trace);
fModule2.schedule();
assertTrue(fModule2.waitForCompletion(new NullProgressMonitor()));
} catch (TmfAnalysisException e) {
fail("Cannot execute analyses " + e.getMessage());
}
}
/**
* Compare the execution of two state machines that do the same job, one
* using the initial element, the second one using the initialState element.
* The result should be the same for both state machines
*/
@Test
public void testInitialStateDeclaration() {
ITmfStateSystem stateSystem = fModule.getStateSystem(fModule.getId());
assertNotNull("state system exist", stateSystem);
try {
int quark = stateSystem.getQuarkAbsolute("fsm1");
@NonNull ITmfStateInterval interval = stateSystem.querySingleState(END_TIME, quark);
long count1 = interval.getStateValue().unboxLong();
quark = stateSystem.getQuarkAbsolute("fsm2");
interval = stateSystem.querySingleState(END_TIME, quark);
long count2 = interval.getStateValue().unboxLong();
assertEquals("Test the count value", count1, count2);
} catch (AttributeNotFoundException | StateSystemDisposedException e) {
fail("Failed to query the state system");
}
}
/**
* Compare the execution of two state machines doing the same job, the tid
* condition is ignored with the initial element and used with the
* initialState element. The result should be different.
*/
@Test
public void testInitialStateWithCondition() {
ITmfStateSystem stateSystem = fModule.getStateSystem(fModule.getId());
assertNotNull("state system exist", stateSystem);
try {
int quark = stateSystem.getQuarkAbsolute("fsm1");
@NonNull ITmfStateInterval interval = stateSystem.querySingleState(END_TIME, quark);
long count1 = interval.getStateValue().unboxLong();
quark = stateSystem.getQuarkAbsolute("fsm3");
interval = stateSystem.querySingleState(END_TIME, quark);
long count3 = interval.getStateValue().unboxLong();
assertTrue("Test the count value", count1 > count3);
} catch (AttributeNotFoundException | StateSystemDisposedException e) {
fail("Failed to query the state system");
}
}
/**
* Execute one pattern, with the two types of initial state initialization,
* then test that the new behavior is prioritized and that preconditions are
* ignored with initialState element
*
* @throws AttributeNotFoundException
* Exceptions thrown querying the state system
* @throws StateSystemDisposedException
* Exceptions thrown querying the state system
*/
@Test
public void testTwoInitialStates() throws AttributeNotFoundException, StateSystemDisposedException {
// Test segment store
ISegmentStore<@NonNull ISegment> ss = fModule2.getSegmentStore();
assertNotNull("segment store exist", ss);
assertTrue("Segment store not empty", ss.size() == 1);
Object item = ss.iterator().next();
assertTrue(item instanceof TmfXmlPatternSegment);
assertTrue(((TmfXmlPatternSegment) item).getName().equals(TEST_SEGMENT_NEW));
// Test state system
ITmfStateSystem stateSystem = fModule2.getStateSystem(fModule2.getId());
assertNotNull("state system exist", stateSystem);
int quark = stateSystem.getQuarkAbsolute("count_new");
ITmfStateInterval interval = stateSystem.querySingleState(END_TIME, quark);
int count = interval.getStateValue().unboxInt();
assertTrue("Test the count value", count > 0);
quark = stateSystem.optQuarkAbsolute("precond");
assertEquals(ITmfStateSystem.INVALID_ATTRIBUTE, quark);
}
}