From d2e62865f276403ac05228c40bb326523cf94bcb Mon Sep 17 00:00:00 2001 From: =?utf8?q?Genevi=C3=A8ve=20Bastien?= Date: Wed, 12 Nov 2014 11:13:56 -0500 Subject: [PATCH] TMF: Add some XML basic test cases and fix a bug MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit A bug where if the previous value was not existent, it was unboxed at -1 while it should start at 0. Change-Id: I58fda5925010b675bcab15cf49b69b303e6e9a9e Signed-off-by: Geneviève Bastien Reviewed-on: https://git.eclipse.org/r/36344 Tested-by: Hudson CI Reviewed-by: Marc-Andre Laperle Tested-by: Marc-Andre Laperle --- .../META-INF/MANIFEST.MF | 3 +- .../core/tests/common/TmfXmlTestFiles.java | 4 +- .../core/tests/stateprovider/AllTests.java | 1 + .../stateprovider/StateProviderModelTest.java | 153 ++++++++++++++++++ .../test_traces/testTrace1.xml | 21 +++ .../test_valid/test_attributes.xml | 26 +++ .../readwrite/TmfXmlReadWriteStateValue.java | 6 +- .../META-INF/MANIFEST.MF | 3 +- 8 files changed, 212 insertions(+), 5 deletions(-) create mode 100644 org.eclipse.tracecompass.tmf.analysis.xml.core.tests/src/org/eclipse/tracecompass/tmf/analysis/xml/core/tests/stateprovider/StateProviderModelTest.java create mode 100644 org.eclipse.tracecompass.tmf.analysis.xml.core.tests/test_traces/testTrace1.xml create mode 100644 org.eclipse.tracecompass.tmf.analysis.xml.core.tests/test_xml_files/test_valid/test_attributes.xml diff --git a/org.eclipse.tracecompass.tmf.analysis.xml.core.tests/META-INF/MANIFEST.MF b/org.eclipse.tracecompass.tmf.analysis.xml.core.tests/META-INF/MANIFEST.MF index cac78c5ac4..230ec2d6e8 100644 --- a/org.eclipse.tracecompass.tmf.analysis.xml.core.tests/META-INF/MANIFEST.MF +++ b/org.eclipse.tracecompass.tmf.analysis.xml.core.tests/META-INF/MANIFEST.MF @@ -12,7 +12,8 @@ Require-Bundle: org.junit, org.eclipse.tracecompass.tmf.core, org.eclipse.tracecompass.tmf.core.tests, org.eclipse.tracecompass.tmf.ctf.core, - org.eclipse.tracecompass.tmf.ctf.core.tests + org.eclipse.tracecompass.tmf.ctf.core.tests, + org.eclipse.tracecompass.statesystem.core Bundle-RequiredExecutionEnvironment: JavaSE-1.7 Bundle-ActivationPolicy: lazy Import-Package: org.junit.runners diff --git a/org.eclipse.tracecompass.tmf.analysis.xml.core.tests/common/org/eclipse/tracecompass/tmf/analysis/xml/core/tests/common/TmfXmlTestFiles.java b/org.eclipse.tracecompass.tmf.analysis.xml.core.tests/common/org/eclipse/tracecompass/tmf/analysis/xml/core/tests/common/TmfXmlTestFiles.java index 60594b2281..c5151111cf 100644 --- a/org.eclipse.tracecompass.tmf.analysis.xml.core.tests/common/org/eclipse/tracecompass/tmf/analysis/xml/core/tests/common/TmfXmlTestFiles.java +++ b/org.eclipse.tracecompass.tmf.analysis.xml.core.tests/common/org/eclipse/tracecompass/tmf/analysis/xml/core/tests/common/TmfXmlTestFiles.java @@ -36,7 +36,9 @@ public enum TmfXmlTestFiles { /** A valid XML test file */ VALID_FILE("test_xml_files/test_valid/test_valid.xml"), /** An invalid test file */ - INVALID_FILE("test_xml_files/test_invalid/test_invalid.xml"); + INVALID_FILE("test_xml_files/test_invalid/test_invalid.xml"), + /** A valid file for state attribute tests */ + ATTRIBUTE_FILE("test_xml_files/test_valid/test_attributes.xml"); private final String fPath; diff --git a/org.eclipse.tracecompass.tmf.analysis.xml.core.tests/src/org/eclipse/tracecompass/tmf/analysis/xml/core/tests/stateprovider/AllTests.java b/org.eclipse.tracecompass.tmf.analysis.xml.core.tests/src/org/eclipse/tracecompass/tmf/analysis/xml/core/tests/stateprovider/AllTests.java index 08f8938c99..d918cc028e 100644 --- a/org.eclipse.tracecompass.tmf.analysis.xml.core.tests/src/org/eclipse/tracecompass/tmf/analysis/xml/core/tests/stateprovider/AllTests.java +++ b/org.eclipse.tracecompass.tmf.analysis.xml.core.tests/src/org/eclipse/tracecompass/tmf/analysis/xml/core/tests/stateprovider/AllTests.java @@ -21,6 +21,7 @@ import org.junit.runners.Suite; */ @RunWith(Suite.class) @Suite.SuiteClasses({ + StateProviderModelTest.class, StateProviderTest.class, StateProviderModuleTest.class }) public class AllTests { diff --git a/org.eclipse.tracecompass.tmf.analysis.xml.core.tests/src/org/eclipse/tracecompass/tmf/analysis/xml/core/tests/stateprovider/StateProviderModelTest.java b/org.eclipse.tracecompass.tmf.analysis.xml.core.tests/src/org/eclipse/tracecompass/tmf/analysis/xml/core/tests/stateprovider/StateProviderModelTest.java new file mode 100644 index 0000000000..85fdb88f51 --- /dev/null +++ b/org.eclipse.tracecompass.tmf.analysis.xml.core.tests/src/org/eclipse/tracecompass/tmf/analysis/xml/core/tests/stateprovider/StateProviderModelTest.java @@ -0,0 +1,153 @@ +/******************************************************************************* + * Copyright (c) 2014 É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 v1.0 which + * accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Geneviève Bastien - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.tracecompass.tmf.analysis.xml.core.tests.stateprovider; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; + +import java.util.List; + +import org.eclipse.core.runtime.Path; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.tracecompass.statesystem.core.ITmfStateSystem; +import org.eclipse.tracecompass.statesystem.core.StateSystemUtils; +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.statesystem.core.statevalue.ITmfStateValue; +import org.eclipse.tracecompass.statesystem.core.statevalue.TmfStateValue; +import org.eclipse.tracecompass.tmf.analysis.xml.core.stateprovider.TmfXmlStrings; +import org.eclipse.tracecompass.tmf.analysis.xml.core.stateprovider.XmlStateSystemModule; +import org.eclipse.tracecompass.tmf.analysis.xml.core.tests.Activator; +import org.eclipse.tracecompass.tmf.analysis.xml.core.tests.common.TmfXmlTestFiles; +import org.eclipse.tracecompass.tmf.core.event.TmfEvent; +import org.eclipse.tracecompass.tmf.core.exceptions.TmfAnalysisException; +import org.eclipse.tracecompass.tmf.core.exceptions.TmfTraceException; +import org.eclipse.tracecompass.tmf.core.trace.ITmfTrace; +import org.eclipse.tracecompass.tmf.tests.stubs.trace.xml.TmfXmlTraceStub; +import org.junit.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; + +/** + * Test the XML model for state providers + * + * @author Geneviève Bastien + */ +public class StateProviderModelTest { + + private static final @NonNull String testTrace1 = "test_traces/testTrace1.xml"; + /* Factor to convert seconds to nanoseconds */ + private static final long TO_NS = 1000000000L; + + private static @NonNull ITmfTrace initializeTrace(String traceFile) { + /* Initialize the trace */ + TmfXmlTraceStub trace = new TmfXmlTraceStub(); + try { + trace.initTrace(null, Activator.getAbsolutePath(new Path(traceFile)).toOSString(), TmfEvent.class); + } catch (TmfTraceException e1) { + fail(e1.getMessage()); + } + return trace; + } + + private static @NonNull XmlStateSystemModule initializeModule(TmfXmlTestFiles xmlAnalysisFile) { + + /* Initialize the state provider module */ + Document doc = xmlAnalysisFile.getXmlDocument(); + assertNotNull(doc); + + /* get State Providers modules */ + NodeList stateproviderNodes = doc.getElementsByTagName(TmfXmlStrings.STATE_PROVIDER); + assertFalse(stateproviderNodes.getLength() == 0); + + Element node = (Element) stateproviderNodes.item(0); + XmlStateSystemModule module = new XmlStateSystemModule(); + String moduleId = node.getAttribute(TmfXmlStrings.ID); + assertNotNull(moduleId); + module.setId(moduleId); + + module.setXmlFile(xmlAnalysisFile.getPath()); + + return module; + } + + private static void verifyStateIntervals(String testId, @NonNull ITmfStateSystem ss, Integer quark, int[] expectedStarts, ITmfStateValue[] expectedValues) throws AttributeNotFoundException, StateSystemDisposedException { + int expectedCount = expectedStarts.length - 1; + List intervals = StateSystemUtils.queryHistoryRange(ss, quark, expectedStarts[0] * TO_NS, expectedStarts[expectedCount] * TO_NS); + assertEquals(testId + ": Interval count", expectedCount, intervals.size()); + for (int i = 0; i < expectedCount; i++) { + ITmfStateInterval interval = intervals.get(i); + assertEquals(testId + ": Start time of interval " + i, expectedStarts[i] * TO_NS, interval.getStartTime()); + long actualEnd = (i == expectedCount - 1) ? (expectedStarts[i + 1] * TO_NS) : (expectedStarts[i + 1] * TO_NS) - 1; + assertEquals(testId + ": End time of interval " + i, actualEnd, interval.getEndTime()); + assertEquals(testId + ": Expected value of interval " + i, expectedValues[i], interval.getStateValue()); + } + } + + /** + * Test an increment of one, for an event name attribute + */ + @Test + public void testEventName() { + ITmfTrace trace = initializeTrace(testTrace1); + XmlStateSystemModule module = initializeModule(TmfXmlTestFiles.ATTRIBUTE_FILE); + try { + + module.setTrace(trace); + + module.schedule(); + module.waitForCompletion(); + + ITmfStateSystem ss = module.getStateSystem(); + assertNotNull(ss); + + List quarks = ss.getQuarks("*"); + assertEquals(2, quarks.size()); + + for (Integer quark : quarks) { + String name = ss.getAttributeName(quark); + switch (name) { + case "test": + { + final int[] expectedStarts = { 1, 5, 7 }; + ITmfStateValue[] expectedValues = { TmfStateValue.newValueInt(1), TmfStateValue.newValueInt(2) }; + verifyStateIntervals("test", ss, quark, expectedStarts, expectedValues); + } + break; + case "test1": + { + final int[] expectedStarts = { 1, 3, 7, 7 }; + ITmfStateValue[] expectedValues = { TmfStateValue.nullValue(), TmfStateValue.newValueInt(1), TmfStateValue.newValueInt(2) }; + verifyStateIntervals("test1", ss, quark, expectedStarts, expectedValues); + } + break; + default: + fail("Wrong attribute name " + name); + break; + } + } + + } catch (TmfAnalysisException | AttributeNotFoundException | StateSystemDisposedException e) { + fail(e.getMessage()); + } finally { + module.dispose(); + trace.dispose(); + } + + } + +} diff --git a/org.eclipse.tracecompass.tmf.analysis.xml.core.tests/test_traces/testTrace1.xml b/org.eclipse.tracecompass.tmf.analysis.xml.core.tests/test_traces/testTrace1.xml new file mode 100644 index 0000000000..6d7bd2cffc --- /dev/null +++ b/org.eclipse.tracecompass.tmf.analysis.xml.core.tests/test_traces/testTrace1.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/org.eclipse.tracecompass.tmf.analysis.xml.core.tests/test_xml_files/test_valid/test_attributes.xml b/org.eclipse.tracecompass.tmf.analysis.xml.core.tests/test_xml_files/test_valid/test_attributes.xml new file mode 100644 index 0000000000..3f01dbf0ef --- /dev/null +++ b/org.eclipse.tracecompass.tmf.analysis.xml.core.tests/test_xml_files/test_valid/test_attributes.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/org.eclipse.tracecompass.tmf.analysis.xml.core/src/org/eclipse/tracecompass/tmf/analysis/xml/core/model/readwrite/TmfXmlReadWriteStateValue.java b/org.eclipse.tracecompass.tmf.analysis.xml.core/src/org/eclipse/tracecompass/tmf/analysis/xml/core/model/readwrite/TmfXmlReadWriteStateValue.java index 4d7994ad49..8bb039f52d 100644 --- a/org.eclipse.tracecompass.tmf.analysis.xml.core/src/org/eclipse/tracecompass/tmf/analysis/xml/core/model/readwrite/TmfXmlReadWriteStateValue.java +++ b/org.eclipse.tracecompass.tmf.analysis.xml.core/src/org/eclipse/tracecompass/tmf/analysis/xml/core/model/readwrite/TmfXmlReadWriteStateValue.java @@ -207,14 +207,16 @@ public class TmfXmlReadWriteStateValue extends TmfXmlStateValue { switch (fValue.getType()) { case LONG: { long incrementLong = fValue.unboxLong(); - long currentValue = ss.queryOngoingState(quark).unboxLong(); + ITmfStateValue currentState = ss.queryOngoingState(quark); + long currentValue = (currentState.isNull() ? 0 : currentState.unboxLong()); ITmfStateValue value = TmfStateValue.newValueLong(incrementLong + currentValue); processValue(quark, timestamp, value); return; } case INTEGER: { int increment = fValue.unboxInt(); - int currentValue = ss.queryOngoingState(quark).unboxInt(); + ITmfStateValue currentState = ss.queryOngoingState(quark); + int currentValue = (currentState.isNull() ? 0 : currentState.unboxInt()); ITmfStateValue value = TmfStateValue.newValueInt(increment + currentValue); processValue(quark, timestamp, value); break; diff --git a/org.eclipse.tracecompass.tmf.core.tests/META-INF/MANIFEST.MF b/org.eclipse.tracecompass.tmf.core.tests/META-INF/MANIFEST.MF index 71926ab7d3..4b03dbc5aa 100644 --- a/org.eclipse.tracecompass.tmf.core.tests/META-INF/MANIFEST.MF +++ b/org.eclipse.tracecompass.tmf.core.tests/META-INF/MANIFEST.MF @@ -16,5 +16,6 @@ Require-Bundle: org.junit;bundle-version="4.0.0", Export-Package: org.eclipse.tracecompass.tmf.core.tests, org.eclipse.tracecompass.tmf.core.tests.perf, org.eclipse.tracecompass.tmf.core.tests.shared, - org.eclipse.tracecompass.tmf.tests.stubs.trace + org.eclipse.tracecompass.tmf.tests.stubs.trace, + org.eclipse.tracecompass.tmf.tests.stubs.trace.xml Import-Package: com.google.common.collect -- 2.34.1