/*******************************************************************************
* 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.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import fr.inria.soctrace.lib.model.Event;
import fr.inria.soctrace.lib.model.EventParam;
import fr.inria.soctrace.lib.model.utils.SoCTraceException;
import fr.inria.soctrace.lib.query.EventQuery;
import fr.inria.soctrace.lib.query.SelfDefiningElementQuery.ParamType;
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.BaseTraceDBTest;
import fr.inria.soctrace.test.junit.utils.importer.VirtualImporter;
/**
* @author "Generoso Pagano <generoso.pagano@inria.fr>"
*/
public class EventQueryTest extends BaseTraceDBTest {
private EventQuery query;
@Before
public void setUp() throws SoCTraceException {
query = new EventQuery(traceDB);
}
@After
public void tearDown() {
query.clear();
query = null;
}
@Test
public final void testClear() throws SoCTraceException {
query.setElementWhere(new SimpleCondition("ID", ComparisonOperation.EQ, "1"));
// before clear
assertEquals(1, query.getList().size());
assertEquals(1, query.getList().size());
// after clear
query.clear();
assertEquals(VirtualImporter.TOTAL_NUMBER_OF_EVENTS, query.getList().size());
}
@Test
public final void testGetParamType() throws SoCTraceException {
ParamType type = query.getParamType(VirtualImporter.PARAMETER_NAME_PREFIX + 0, 0);
assertEquals(0, type.id);
assertEquals(VirtualImporter.PARAMETER_NAME_PREFIX + 0, type.name);
assertEquals(VirtualImporter.PARAMETER_TYPE, type.type);
}
@Test
public final void testGetTypeId() throws SoCTraceException {
assertEquals(0, query.getTypeId(VirtualImporter.TYPE_NAME_PREFIX+"0"));
assertEquals(-1, query.getTypeId("non existing type"));
}
@Test
public final void testGetElementTableName() {
assertEquals(FramesocTable.EVENT.toString(), query.getElementTableName());
}
@Test
public final void testGetDBObject() {
assertSame(traceDB, query.getDBObject());
}
@Test
public final void testSetTypeWhere() throws SoCTraceException {
query.setTypeWhere(new SimpleCondition("NAME", ComparisonOperation.EQ,
VirtualImporter.TYPE_NAME_PREFIX + "0"));
List<Event> elist = query.getList();
assertEquals(VirtualImporter.NUMBER_OF_PRODUCERS * VirtualImporter.NUMBER_OF_EVENTS,
elist.size());
for (Event e : elist) {
assertEquals(VirtualImporter.TYPE_NAME_PREFIX + "0", e.getType().getName());
}
}
@Test
public final void testSetEventProducerWhere() throws SoCTraceException {
LogicalCondition and = new LogicalCondition(LogicalOperation.AND);
and.addCondition(new SimpleCondition("TYPE", ComparisonOperation.EQ,
VirtualImporter.PRODUCER_TYPE));
and.addCondition(new SimpleCondition("LOCAL_ID", ComparisonOperation.EQ,
VirtualImporter.PRODUCER_LOCAL_ID_PREFIX + "0"));
query.setEventProducerWhere(and);
List<Event> elist = query.getList();
assertEquals(VirtualImporter.NUMBER_OF_CATEGORIES * VirtualImporter.NUMBER_OF_TYPES
* VirtualImporter.NUMBER_OF_EVENTS, elist.size());
for (Event e : elist) {
assertEquals(VirtualImporter.PRODUCER_TYPE, e.getEventProducer().getType());
assertEquals(VirtualImporter.PRODUCER_LOCAL_ID_PREFIX + "0", e.getEventProducer()
.getLocalId());
}
}
@Test
public final void testGetList() throws SoCTraceException {
List<Event> elist = query.getList();
assertEquals(VirtualImporter.TOTAL_NUMBER_OF_EVENTS, elist.size());
}
@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.TYPE_NAME_PREFIX + "0", and);
List<Event> elist = query.getList();
assertEquals(VirtualImporter.NUMBER_OF_PRODUCERS*VirtualImporter.NUMBER_OF_EVENTS, elist.size());
for (Event e : elist) {
assertEquals(VirtualImporter.TYPE_NAME_PREFIX + "0", e.getType().getName());
Map<String, EventParam> 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("CPU", ComparisonOperation.EQ, String.valueOf(VirtualImporter.CPU)));
and.addCondition(new SimpleCondition("TIMESTAMP", ComparisonOperation.GE, String.valueOf(VirtualImporter.MIN_TIMESTAMP)));
query.setElementWhere(and);
List<Event> elist = query.getList();
assertEquals(VirtualImporter.TOTAL_NUMBER_OF_EVENTS, elist.size());
for (Event e : elist) {
assertTrue(e.getTimestamp() >= VirtualImporter.MIN_TIMESTAMP);
assertEquals(VirtualImporter.CPU, e.getCpu());
}
}
@Test
public final void testSetOrderBy() throws SoCTraceException {
query.setOrderBy("TIMESTAMP", OrderBy.DESC);
List<Event> elist = query.getList();
long last = Long.MAX_VALUE;
for (Event e : elist) {
assertTrue(e.getTimestamp() <= last);
last = e.getTimestamp();
}
}
@Test
public final void testSetLoadParameters() throws SoCTraceException {
List<Event> elist = query.getList();
int params = 0;
Map<Integer, Event> emap = new HashMap<Integer, Event>();
for (Event e : elist) {
params += e.getEventParams().size();
emap.put(e.getId(), e);
}
// at least one param to ensure test utility
assertTrue(params > 0);
query.clear();
query.setLoadParameters(false);
List<Event> elistNoPar = query.getList();
for (Event e : elistNoPar) {
assertEquals(0, e.getEventParams().size());
}
query.clear();
query.loadParams(elistNoPar);
int paramsLoaded = 0;
for (Event e : elistNoPar) {
Map<String, EventParam> epm = e.getParamMap();
Map<String, EventParam> epmRef = emap.get(e.getId()).getParamMap();
for (String pname : epmRef.keySet()) {
paramsLoaded++;
assertTrue(epm.containsKey(pname));
assertEquals(epmRef.get(pname), epm.get(pname));
}
}
assertEquals(params, paramsLoaded);
}
@Test
public final void testSetLimit() throws SoCTraceException {
int events = VirtualImporter.TOTAL_NUMBER_OF_EVENTS;
int limits[] = { events / 10, events / 5, events / 2 };
for (int limit : limits) {
query.setLimit(limit);
assertEquals(limit, query.getList().size());
}
query.unsetLimit();
assertEquals(events, query.getList().size());
}
}