package com.ikokoon.serenity.persistence;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.ikokoon.serenity.ATest;
import com.ikokoon.serenity.IConstants;
import com.ikokoon.serenity.model.Class;
import com.ikokoon.serenity.model.Composite;
import com.ikokoon.serenity.model.Line;
import com.ikokoon.serenity.model.Method;
import com.ikokoon.serenity.model.Package;
import com.ikokoon.toolkit.Executer;
import com.ikokoon.toolkit.Toolkit;
public class DataBaseRamTest extends ATest {
private IDataBase dataBase;
@Before
public void open() {
dataBase = IDataBase.DataBaseManager.getDataBase(DataBaseRam.class, IConstants.DATABASE_FILE_RAM, mockInternalDataBase);
}
@After
public void close() {
dataBase.close();
}
@Test
@SuppressWarnings("unchecked")
public void insert() {
final DataBaseRam dataBase = (DataBaseRam) this.dataBase;
final List<Composite<?, ?>> list = getList();
// Check the performance
list.clear();
double inserts = 100000;
double insertsPerSecond = Executer.execute(new Executer.IPerform() {
public void execute() {
long currentTime = System.currentTimeMillis();
Class<?, ?> klass = new Class();
klass.setName("Name : " + currentTime);
klass.setId(currentTime);
dataBase.insert(list, klass);
}
}, "inserts of class", inserts);
assertTrue(insertsPerSecond > 1000);
}
@SuppressWarnings("unchecked")
private LinkedList<Composite<?, ?>> getList() {
DataBaseRam dataBase = (DataBaseRam) this.dataBase;
LinkedList<Composite<?, ?>> list = new LinkedList<Composite<?, ?>>();
Class<?, ?> klass = new Class<Package<?, ?>, Method<?, ?>>();
klass.setName("a");
Long id = Toolkit.hash(klass.getName());
klass.setId(id);
dataBase.insert(list, klass);
klass = new Class<Package, Method>();
klass.setName("c");
id = Toolkit.hash(klass.getName());
klass.setId(id);
dataBase.insert(list, klass);
klass = new Class();
klass.setName("b");
id = Toolkit.hash(klass.getName());
klass.setId(id);
dataBase.insert(list, klass);
return list;
}
@Test
public void search() {
DataBaseRam dataBase = (DataBaseRam) this.dataBase;
LinkedList<Composite<?, ?>> list = getList();
Long id = Toolkit.hash("b");
Object object = dataBase.search(Class.class, list, id);
assertNotNull(object);
}
@Test
@SuppressWarnings("unchecked")
public void persist() {
// T object
Package pakkage = getPackage();
dataBase.persist(pakkage);
pakkage = (Package) dataBase.find(Package.class, pakkage.getId());
assertNotNull(pakkage);
Long classId = ((Class) pakkage.getChildren().get(0)).getId();
Class klass = (Class) dataBase.find(Class.class, classId);
assertNotNull(klass);
}
@Test
@SuppressWarnings("unchecked")
public void findId() {
DataBaseToolkit.clear(dataBase);
Package pakkage = getPackage();
dataBase.persist(pakkage);
// 7873017250689681547, 437917821655607927
Line line = (Line) dataBase.find(Line.class, 7873017250689681547l);
assertNotNull(line);
}
@Test
@SuppressWarnings("unchecked")
public void findParameters() {
Package pakkage = getPackage();
dataBase.persist(pakkage);
List<Object> parameters = new ArrayList<Object>();
parameters.add(packageName);
pakkage = (Package) dataBase.find(Package.class, parameters);
assertNotNull(pakkage);
parameters.clear();
parameters.add(className);
Class klass = (Class) dataBase.find(Class.class, parameters);
assertNotNull(klass);
parameters.clear();
parameters.add(klass.getName());
parameters.add(methodName);
parameters.add(methodDescription);
Method method = (Method) dataBase.find(Method.class, parameters);
assertNotNull(method);
parameters.clear();
parameters.add(klass.getName());
parameters.add(method.getName());
parameters.add(lineNumber);
Line line = (Line) dataBase.find(Line.class, parameters);
assertNotNull(line);
}
@Test
@SuppressWarnings("unchecked")
public void removeId() throws Exception {
// java.lang.Class<T> klass, Long id
Package pakkage = getPackage();
dataBase.persist(pakkage);
Class klass = (Class) pakkage.getChildren().iterator().next();
klass = (Class) dataBase.find(Class.class, klass.getId());
assertNotNull(klass);
dataBase.remove(Class.class, klass.getId());
klass = (Class) dataBase.find(Class.class, klass.getId());
assertNull(klass);
}
@Test
@SuppressWarnings("unchecked")
public void persistPerformance() throws Exception {
// Test the insert performance
double inserts = 10000;
double insertsPerSecond = Executer.execute(new Executer.IPerform() {
public void execute() {
Package pakkage = getPackage();
pakkage.setName(pakkage.getName() + System.currentTimeMillis());
Class klass = (Class) pakkage.getChildren().iterator().next();
klass.setName(klass.getName() + System.currentTimeMillis());
dataBase.persist(pakkage);
}
}, "inserts of package", inserts);
double minimumInsertsPerSecond = 1000d;
assertTrue(insertsPerSecond > minimumInsertsPerSecond);
}
@Test
@SuppressWarnings("unchecked")
public void findPerformance() throws Exception {
long size = 10000;
for (int i = 0; i < size; i++) {
Package pakkage = getPackage();
pakkage.setName(packageName + "." + i);
Class klass = getClass(pakkage);
klass.setName(className + "." + i);
Method method = getMethod(klass);
method.setName(method.getName() + "." + i);
method.setDescription(method.getDescription() + "." + i);
method.setClassName(klass.getName());
Line line = getLine(method);
line.setNumber(i);
line.setClassName(klass.getName());
line.setMethodName(method.getName());
dataBase.persist(pakkage);
}
// Test the select performance
double selects = 10000;
final List<Object> packageParameters = new ArrayList<Object>();
packageParameters.add(packageName + "." + 13);
final List<Object> lineParameters = new ArrayList<Object>();
lineParameters.add(className + "." + 26);
lineParameters.add(methodName + "." + 26);
lineParameters.add(26d);
final Long packageId = Toolkit.hash(packageName + "." + 233);
final Long classId = Toolkit.hash(className + "." + 871);
final Long methodId = Toolkit.hash(className + "." + 441 + methodName + "." + 441 + methodDescription + "." + 441);
final Long lineId = Toolkit.hash(className + "." + 359 + methodName + "." + 359 + "" + 359d);
double selectsPerSecond = Executer.execute(new Executer.IPerform() {
public void execute() {
dataBase.find(Package.class, packageId);
dataBase.find(Class.class, classId);
dataBase.find(Method.class, methodId);
dataBase.find(Line.class, lineId);
dataBase.find(Package.class, packageParameters);
// assertNotNull(object);
dataBase.find(Line.class, lineParameters);
// assertNotNull(object);
dataBase.find(Line.class, lineParameters);
// assertNotNull(object);
}
}, "select different, by id and by parameters, package and line", selects) * 7;
double minimumSelectsPerSecond = 10000;
assertTrue(selectsPerSecond > minimumSelectsPerSecond);
selectsPerSecond = Executer.execute(new Executer.IPerform() {
public void execute() {
dataBase.find(Line.class, lineParameters);
}
}, "select line with parameters", selects);
assertTrue(selectsPerSecond > minimumSelectsPerSecond);
}
}