blob: 068cd417909b214c0f2a9f24f6e102530240df57 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013, 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
*
* Contributors:
* Matthew Khouzam - Initial API and implementation
******************************************************************************/
package org.eclipse.tracecompass.statesystem.core.tests.backend;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.tracecompass.statesystem.core.backend.IStateHistoryBackend;
import org.eclipse.tracecompass.statesystem.core.backend.StateHistoryBackendFactory;
import org.eclipse.tracecompass.statesystem.core.exceptions.StateSystemDisposedException;
import org.eclipse.tracecompass.statesystem.core.exceptions.StateValueTypeException;
import org.eclipse.tracecompass.statesystem.core.exceptions.TimeRangeException;
import org.eclipse.tracecompass.statesystem.core.interval.ITmfStateInterval;
import org.eclipse.tracecompass.statesystem.core.interval.TmfStateInterval;
import org.eclipse.tracecompass.statesystem.core.statevalue.TmfStateValue;
import org.junit.BeforeClass;
import org.junit.Test;
/**
* Test cases for the in-memory backend
*
* @author Matthew Khouzam
*/
public class InMemoryBackendTest extends StateHistoryBackendTestBase {
private static final String SSID = "test-ss";
private static final int NUMBER_OF_ATTRIBUTES = 10;
private static @Nullable IStateHistoryBackend fixture;
/**
* Test setup. make a state system that is moderately large
*/
@BeforeClass
public static void init() {
IStateHistoryBackend backend = StateHistoryBackendFactory.createInMemoryBackend(SSID, 0);
for (int attribute = 0; attribute < NUMBER_OF_ATTRIBUTES; attribute++) {
for (int timeStart = 0; timeStart < 1000; timeStart++) {
try {
final int stateEndTime = (timeStart * 100) + 90 + attribute;
final int stateStartTime = timeStart * 100 + attribute;
backend.insertPastState(stateStartTime, stateEndTime, attribute, timeStart % 100);
if (timeStart != 999) {
backend.insertPastState(stateEndTime + 1, stateEndTime + 9, attribute, (Object) null);
}
} catch (TimeRangeException e) {
/* Should not happen here */
throw new IllegalStateException();
}
}
}
fixture = backend;
}
private static void testInterval(@Nullable ITmfStateInterval interval, int startTime,
int endTime, int value) {
assertNotNull(interval);
assertEquals(startTime, interval.getStartTime());
assertEquals(endTime, interval.getEndTime());
try {
assertEquals(value, interval.getStateValue().unboxInt());
} catch (StateValueTypeException e) {
fail(e.getMessage());
}
}
@Override
protected IStateHistoryBackend getBackendForBuilding(long startTime) {
return StateHistoryBackendFactory.createInMemoryBackend(SSID, startTime);
}
/**
* Test at start time
*/
@Test
public void testStartTime() {
IStateHistoryBackend backend = fixture;
assertNotNull(backend);
assertEquals(0, backend.getStartTime());
}
/**
* Test at end time
*/
@Test
public void testEndTime() {
IStateHistoryBackend backend = fixture;
assertNotNull(backend);
assertEquals(99999, backend.getEndTime());
}
/**
* Query the state system
*/
@Test
public void testDoQuery() {
List<@Nullable ITmfStateInterval> interval = new ArrayList<>(NUMBER_OF_ATTRIBUTES);
for (int i = 0; i < NUMBER_OF_ATTRIBUTES; i++) {
interval.add(null);
}
IStateHistoryBackend backend = fixture;
assertNotNull(backend);
try {
backend.doQuery(interval, 950);
} catch (TimeRangeException | StateSystemDisposedException e) {
fail(e.getMessage());
}
assertEquals(NUMBER_OF_ATTRIBUTES, interval.size());
testInterval(interval.get(0), 900, 990, 9);
testInterval(interval.get(1), 901, 991, 9);
testInterval(interval.get(2), 902, 992, 9);
testInterval(interval.get(3), 903, 993, 9);
testInterval(interval.get(4), 904, 994, 9);
testInterval(interval.get(5), 905, 995, 9);
testInterval(interval.get(6), 906, 996, 9);
testInterval(interval.get(7), 907, 997, 9);
testInterval(interval.get(8), 908, 998, 9);
testInterval(interval.get(9), 909, 999, 9);
}
/**
* Test single attribute then compare it to a full query
*/
@Test
public void testQueryAttribute() {
try {
IStateHistoryBackend backend = fixture;
assertNotNull(backend);
ITmfStateInterval interval[] = new TmfStateInterval[10];
for (int i = 0; i < 10; i++) {
interval[i] = backend.doSingularQuery(950, i);
}
testInterval(interval[0], 900, 990, 9);
testInterval(interval[1], 901, 991, 9);
testInterval(interval[2], 902, 992, 9);
testInterval(interval[3], 903, 993, 9);
testInterval(interval[4], 904, 994, 9);
testInterval(interval[5], 905, 995, 9);
testInterval(interval[6], 906, 996, 9);
testInterval(interval[7], 907, 997, 9);
testInterval(interval[8], 908, 998, 9);
testInterval(interval[9], 909, 999, 9);
List<@Nullable ITmfStateInterval> intervalQuery = new ArrayList<>(NUMBER_OF_ATTRIBUTES);
for (int i = 0; i < NUMBER_OF_ATTRIBUTES; i++) {
intervalQuery.add(null);
}
backend.doQuery(intervalQuery, 950);
ITmfStateInterval ref[] = intervalQuery.toArray(new ITmfStateInterval[0]);
assertArrayEquals(ref, interval);
} catch (TimeRangeException | StateSystemDisposedException e) {
fail(e.getMessage());
}
}
/**
* Test single attribute that should not exist
*/
@Test
public void testQueryAttributeEmpty() {
try {
IStateHistoryBackend backend = fixture;
assertNotNull(backend);
ITmfStateInterval interval = backend.doSingularQuery(999, 0);
assertEquals(TmfStateValue.nullValue(), interval.getStateValue());
} catch (TimeRangeException | StateSystemDisposedException e) {
fail(e.getMessage());
}
}
/**
* Test first element in ss
*/
@Test
public void testBegin() {
try {
IStateHistoryBackend backend = fixture;
assertNotNull(backend);
ITmfStateInterval interval = backend.doSingularQuery(0, 0);
assertEquals(0, interval.getStartTime());
assertEquals(90, interval.getEndTime());
assertEquals(0, interval.getStateValue().unboxInt());
} catch (TimeRangeException | StateSystemDisposedException e) {
fail(e.getMessage());
}
}
/**
* Test last element in ss
*/
@Test
public void testEnd() {
try {
IStateHistoryBackend backend = fixture;
assertNotNull(backend);
ITmfStateInterval interval = backend.doSingularQuery(99998, 9);
testInterval(interval, 99909, 99999, 99);
} catch (TimeRangeException | StateSystemDisposedException e) {
fail(e.getMessage());
}
}
/**
* Test out of range query
*
* @throws TimeRangeException
* Expected
*/
@Test(expected = TimeRangeException.class)
public void testOutOfRange_1() throws TimeRangeException {
try {
IStateHistoryBackend backend = fixture;
assertNotNull(backend);
ITmfStateInterval interval = backend.doSingularQuery(-1, 0);
assertNull(interval);
} catch (StateSystemDisposedException e) {
fail(e.getMessage());
}
}
/**
* Test out of range query
*
* @throws TimeRangeException
* Expected
*/
@Test(expected = TimeRangeException.class)
public void testOutOfRange_2() throws TimeRangeException {
try {
IStateHistoryBackend backend = fixture;
assertNotNull(backend);
ITmfStateInterval interval = backend.doSingularQuery(100000, 0);
assertNull(interval);
} catch (StateSystemDisposedException e) {
fail(e.getMessage());
}
}
}