--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2016 É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
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.statesystem.core.tests.shared.utils;
+
+import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval;
+import org.eclipse.tracecompass.statesystem.core.statevalue.ITmfStateValue;
+
+/**
+ * State interval class to help with unit testing. This class should be used in
+ * unit test to store the expected values of an interval that can then be
+ * compared with an actual interval from the state system. It is not meant to be
+ * inserted in the state system, so the attribute field does not need to be set.
+ *
+ * @author Geneviève Bastien
+ */
+public class StateIntervalStub implements ITmfStateInterval {
+
+ /*
+ * For this kind of interval, the attribute does not matter, so just set a
+ * default value here
+ */
+ private static final int TEST_ATTRIBUTE = 1;
+
+ private final long fStart;
+ private final long fEnd;
+ private final ITmfStateValue fValue;
+
+ /**
+ * Constructor
+ *
+ * @param start
+ * Start time of the interval
+ * @param end
+ * End time of the interval
+ * @param value
+ * Value of the interval
+ */
+ public StateIntervalStub(final int start, final int end, final ITmfStateValue value) {
+ fStart = start;
+ fEnd = end;
+ fValue = value;
+ }
+
+ @Override
+ public long getStartTime() {
+ return fStart;
+ }
+
+ @Override
+ public long getEndTime() {
+ return fEnd;
+ }
+
+ @Override
+ public int getAttribute() {
+ return TEST_ATTRIBUTE;
+ }
+
+ @Override
+ public ITmfStateValue getStateValue() {
+ return fValue;
+ }
+
+ @Override
+ public boolean intersects(long timestamp) {
+ return (fStart >= timestamp && fEnd <= timestamp);
+ }
+
+}
--- /dev/null
+/*******************************************************************************
+ * Copyright (c) 2016 É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
+ *******************************************************************************/
+
+package org.eclipse.tracecompass.statesystem.core.tests.shared.utils;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+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;
+
+/**
+ * Contains utilities to test the content of state systems
+ *
+ * @author Geneviève Bastien
+ */
+public final class StateSystemTestUtils {
+
+ private StateSystemTestUtils() {
+
+ }
+
+ /**
+ * Test that the intervals for a given attribute correspond to what is
+ * expected. If the attribute does not exist or if one of the interval does
+ * not correspond, it will fail the test.
+ *
+ * @param ss
+ * The state system containing the attribute
+ * @param path
+ * The path to the attribute
+ * @param expected
+ * The list of intervals the attribute should have
+ */
+ public static void testIntervalForAttributes(ITmfStateSystem ss, List<ITmfStateInterval> expected, String... path) {
+ try {
+ int quark = ss.getQuarkAbsolute(path);
+ List<ITmfStateInterval> actual = StateSystemUtils.queryHistoryRange(ss, quark, ss.getStartTime(), ss.getCurrentEndTime());
+ /*
+ * This unit test must help debug why a test fail, that is why we do
+ * not test the number of intervals at this point. We make sure each
+ * of the expected interval exists and has the same start and end
+ * times and state value
+ */
+ for (int i = 0; i < expected.size(); i++) {
+ if (i >= actual.size()) {
+ fail(Arrays.deepToString(path) + ": Missing interval " + i);
+ }
+ ITmfStateInterval act = actual.get(i);
+ ITmfStateInterval exp = expected.get(i);
+ if (!compareIntervalContent(exp, act)) {
+ fail(Arrays.deepToString(path) + ":Interval at position " + i + ": expected: " + displayInterval(exp) + " actual: " + displayInterval(act));
+ }
+ }
+ /* Make sure there is no extra interval in the actual */
+ assertEquals(Arrays.deepToString(path) + ":Number of intervals", expected.size(), actual.size());
+ } catch (AttributeNotFoundException e) {
+ fail("Attribute " + Arrays.deepToString(path) + " does not exist");
+ } catch (StateSystemDisposedException e) {
+ fail("State system was disposed");
+ }
+ }
+
+ private static boolean compareIntervalContent(ITmfStateInterval expected, ITmfStateInterval actual) {
+ return (expected.getStartTime() == actual.getStartTime()) &&
+ (expected.getEndTime() == actual.getEndTime()) &&
+ (expected.getStateValue().equals(actual.getStateValue()));
+ }
+
+ private static String displayInterval(ITmfStateInterval interval) {
+ return "[" + interval.getStartTime() + "," + interval.getEndTime() + "]:" + interval.getStateValue();
+ }
+
+ /**
+ * Test that the values in the state system at time t correspond to what is
+ * expected
+ *
+ * @param ss
+ * The state system containing the values
+ * @param t
+ * The time at which to test the values
+ * @param expected
+ * A mapping between the full path of an attribute and its
+ * expected value
+ */
+ public static void testValuesAtTime(ITmfStateSystem ss, long t, Map<String[], ITmfStateValue> expected) {
+ try {
+ List<ITmfStateInterval> intervals = ss.queryFullState(t);
+ for (Entry<String[], ITmfStateValue> entry : expected.entrySet()) {
+ String[] path = entry.getKey();
+ try {
+ int quark = ss.getQuarkAbsolute(entry.getKey());
+ ITmfStateInterval interval = intervals.get(quark);
+ assertEquals(Arrays.deepToString(path) + " at time " + t, entry.getValue(), interval.getStateValue());
+ } catch (AttributeNotFoundException e) {
+ fail("Attribute " + Arrays.deepToString(path) + " does not exist at time " + t);
+ }
+
+ }
+ } catch (StateSystemDisposedException e) {
+ fail("State system was disposed");
+ }
+ }
+
+ /**
+ * Utility method to return an attribute path as an array using varargs
+ *
+ * @param path
+ * The path of the attribute
+ * @return The path as an array of String
+ */
+ public static @NonNull String[] makeAttribute(@NonNull String... path) {
+ return path;
+ }
+
+}