/*******************************************************************************
* Copyright (c) 2012-2015 INRIA.
* 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:
* Generoso Pagano - initial API and implementation
******************************************************************************/
package fr.inria.soctrace.test.junit.lib.query;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import fr.inria.soctrace.lib.model.Trace;
import fr.inria.soctrace.lib.model.TraceParam;
import fr.inria.soctrace.lib.model.utils.SoCTraceException;
import fr.inria.soctrace.lib.query.SelfDefiningElementQuery.ParamType;
import fr.inria.soctrace.lib.query.TraceQuery;
import fr.inria.soctrace.lib.query.conditions.ConditionsConstants.ComparisonOperation;
import fr.inria.soctrace.lib.query.conditions.ConditionsConstants.LogicalOperation;
import fr.inria.soctrace.lib.query.conditions.ConditionsConstants.OrderBy;
import fr.inria.soctrace.lib.query.conditions.LogicalCondition;
import fr.inria.soctrace.lib.query.conditions.ParamLogicalCondition;
import fr.inria.soctrace.lib.query.conditions.ParamSimpleCondition;
import fr.inria.soctrace.lib.query.conditions.SimpleCondition;
import fr.inria.soctrace.lib.storage.utils.SQLConstants.FramesocTable;
import fr.inria.soctrace.test.junit.utils.BaseSystemDBTest;
import fr.inria.soctrace.test.junit.utils.TestConstants;
import fr.inria.soctrace.test.junit.utils.importer.VirtualImporter;
/**
* @author "Generoso Pagano <generoso.pagano@inria.fr>"
*/
public class TraceQueryTest extends BaseSystemDBTest {
private TraceQuery query;
@Before
public void setUp() throws SoCTraceException {
query = new TraceQuery(sysDB);
}
@After
public void tearDown() {
query.clear();
query = null;
}
@Test
public final void testClear() throws SoCTraceException {
query.setElementWhere(new SimpleCondition("ID", ComparisonOperation.EQ, String.valueOf(VirtualImporter.TRACE_ID)));
// before clear
assertEquals(1, query.getList().size());
assertEquals(1, query.getList().size());
// after clear
query.clear();
assertEquals(2, query.getList().size());
}
@Test
public final void testGetParamType() throws SoCTraceException {
ParamType type = query.getParamType(VirtualImporter.PARAMETER_NAME_PREFIX+0, VirtualImporter.TRACE_TYPE_ID);
assertEquals(VirtualImporter.PARAMETER_NAME_PREFIX+0, type.name);
assertEquals(VirtualImporter.PARAMETER_TYPE, type.type);
type = query.getParamType(VirtualImporter.PARAMETER_NAME_PREFIX+1, VirtualImporter.TRACE_TYPE_ID);
assertEquals(1, type.id);
assertEquals(VirtualImporter.PARAMETER_NAME_PREFIX+1, type.name);
assertEquals(VirtualImporter.PARAMETER_TYPE, type.type);
}
@Test
public final void testGetTypeId() throws SoCTraceException {
assertEquals(VirtualImporter.TRACE_TYPE_ID, query.getTypeId(VirtualImporter.TRACE_TYPE_NAME));
assertEquals(TestConstants.PROCESSED_TRACE_TYPE_ID, query.getTypeId(TestConstants.PROCESSED_TRACE_TYPE_NAME));
assertEquals(-1, query.getTypeId("NOT_FOUND"));
}
@Test
public final void testGetElementTableName() {
assertEquals(FramesocTable.TRACE.toString(), query.getElementTableName());
}
@Test
public final void testGetDBObject() {
assertSame(sysDB, query.getDBObject());
}
@Test
public final void testSetTypeWhere() throws SoCTraceException {
query.setTypeWhere(new SimpleCondition("NAME", ComparisonOperation.EQ, VirtualImporter.TYPE_NAME_PREFIX+VirtualImporter.TRACE_TYPE_ID));
List<Trace> elist = query.getList();
assertEquals(1, elist.size());
for (Trace e: elist) {
assertEquals(VirtualImporter.TYPE_NAME_PREFIX+VirtualImporter.TRACE_TYPE_ID, e.getType().getName());
}
}
@Test
public final void testGetList() throws SoCTraceException {
List<Trace> tlist = query.getList();
assertEquals(TestConstants.NUMBER_OF_TRACES, tlist.size());
}
@Test
public final void testGetTraces() throws SoCTraceException {
Set<Integer> ids = new HashSet<Integer>();
List<Integer> idl = new LinkedList<Integer>();
idl.add(TestConstants.PROCESSED_TRACE_ID);
idl.add(236432); // not present
for (Integer i: idl)
ids.add(i);
List<Trace> tlist = query.getTraces(idl);
assertEquals(1, tlist.size());
for (Trace t: tlist) {
assertTrue(ids.contains(t.getId()));
}
}
@Test
public final void testAddParamCondition() throws SoCTraceException {
ParamLogicalCondition and = new ParamLogicalCondition(LogicalOperation.AND);
for (int i=0; i<VirtualImporter.NUMBER_OF_PARAMETERS; i++) {
and.addCondition(new ParamSimpleCondition(VirtualImporter.PARAMETER_NAME_PREFIX+i, ComparisonOperation.EQ, VirtualImporter.PARAMETER_VALUE));
}
query.addParamCondition(VirtualImporter.TRACE_TYPE_NAME, and);
List<Trace> elist = query.getList();
assertEquals(1, elist.size());
for (Trace e: elist) {
assertEquals(VirtualImporter.TRACE_TYPE_NAME, e.getType().getName());
Map<String, TraceParam> params = e.getParamMap();
for (int i=0; i<VirtualImporter.NUMBER_OF_PARAMETERS; i++) {
assertEquals(VirtualImporter.PARAMETER_VALUE, params.get(VirtualImporter.PARAMETER_NAME_PREFIX+i).getValue());
}
}
}
@Test
public final void testSetElementWhere() throws SoCTraceException {
LogicalCondition and = new LogicalCondition(LogicalOperation.AND);
and.addCondition(new SimpleCondition("BOARD", ComparisonOperation.EQ, VirtualImporter.METADATA));
and.addCondition(new SimpleCondition("OUTPUT_DEVICE", ComparisonOperation.EQ, VirtualImporter.METADATA));
query.setElementWhere(and);
List<Trace> elist = query.getList();
assertEquals(1, elist.size());
for (Trace e: elist) {
assertEquals(VirtualImporter.METADATA, e.getBoard());
assertEquals(VirtualImporter.METADATA, e.getOutputDevice());
}
}
@Test
public final void testMinMaxTimestamp() throws SoCTraceException {
LogicalCondition and = new LogicalCondition(LogicalOperation.AND);
and.addCondition(new SimpleCondition("MIN_TIMESTAMP", ComparisonOperation.EQ, String.valueOf(VirtualImporter.MIN_TIMESTAMP)));
and.addCondition(new SimpleCondition("MAX_TIMESTAMP", ComparisonOperation.EQ, String.valueOf(VirtualImporter.getMaxTimestamp())));
query.setElementWhere(and);
assertEquals(1, query.getList().size());
LogicalCondition and2 = new LogicalCondition(LogicalOperation.AND);
and2.addCondition(new SimpleCondition("MIN_TIMESTAMP", ComparisonOperation.EQ, String.valueOf(VirtualImporter.MIN_TIMESTAMP+34)));
and2.addCondition(new SimpleCondition("MAX_TIMESTAMP", ComparisonOperation.EQ, String.valueOf(VirtualImporter.MIN_TIMESTAMP+33)));
query.setElementWhere(and2);
assertEquals(0, query.getList().size());
}
@Test
public final void testSetOrderBy() throws SoCTraceException {
query.setOrderBy("NUMBER_OF_CPUS", OrderBy.DESC);
List<Trace> tlist = query.getList();
int last = Integer.MAX_VALUE;
for (Trace t: tlist) {
assertTrue(t.getNumberOfCpus()<=last);
last = t.getNumberOfCpus();
}
}
@Test
public final void testSetLimit() throws SoCTraceException {
int limits[] = { TestConstants.NUMBER_OF_TRACES / 10, TestConstants.NUMBER_OF_TRACES / 5,
TestConstants.NUMBER_OF_TRACES / 2 };
for (int limit : limits) {
query.setLimit(limit);
assertEquals(limit, query.getList().size());
}
query.unsetLimit();
assertEquals(TestConstants.NUMBER_OF_TRACES, query.getList().size());
}
}