package org.deephacks.confit;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import com.google.common.base.Stopwatch;
import com.google.common.collect.Lists;
import com.yammer.metrics.core.Histogram;
import com.yammer.metrics.core.MetricsRegistry;
import org.deephacks.confit.admin.AdminContext;
import org.deephacks.confit.model.Bean;
import org.deephacks.confit.query.ConfigResultSet;
import org.deephacks.confit.spi.BeanManager;
import org.deephacks.confit.spi.Lookup;
import org.deephacks.confit.spi.SchemaManager;
import org.deephacks.confit.test.ConfigTestData.*;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import static org.deephacks.confit.test.ConfigTestData.*;
public abstract class BeanManagerTest {
static {
Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
root.setLevel(Level.ERROR);
}
public ConfigContext config = ConfigContext.lookup();
public AdminContext admin = AdminContext.lookup();
public SchemaManager schemaManager = SchemaManager.lookup();
public static final List<List<Bean>> beans = new ArrayList<>();
private MetricsRegistry registry = new MetricsRegistry();
private int reps;
private int items;
public <T extends BeanManager> void setupTest(T beanManager, int items, int reps) throws Exception {
this.reps = reps;
this.items = items;
Lookup.get().register(BeanManager.class, beanManager);
for (int i = 0; i < items; i++) {
String id = Integer.toString(i);
Grandfather g = getGrandfather(id);
Parent p = getParent(id);
Child c = getChild(id);
g.add(p);
p.add(c);
ArrayList<Bean> unit = new ArrayList<>();
unit.add(schemaManager.convertObject(g));
unit.add(schemaManager.convertObject(p));
unit.add(schemaManager.convertObject(c));
beans.add(unit);
}
config.register(Grandfather.class, Parent.class, Child.class);
cleanUpState();
}
public abstract void cleanUpState();
public void warmUpCreate(int num) {
for (int i = 0; i < num; i++) {
for (int j = 0; j < items; j++) {
admin.create(beans.get(j));
}
cleanUpState();
}
}
public Histogram executeCreate(int reps) {
Histogram responseTime = registry.newHistogram(BeanManagerTest.class, "executeCreate");
for (int i = 0; i < reps; i++) {
for (int j = 0; j < items; j++) {
Stopwatch w = new Stopwatch().start();
admin.create(beans.get(j));
responseTime.update(w.elapsedMillis());
}
if((i + 1) < reps) {
cleanUpState();
}
}
return responseTime;
}
public Histogram executeQuery() {
Histogram responseTime = registry.newHistogram(BeanManagerTest.class, "executeQuery");
for (int i = 0; i < reps; i++) {
Stopwatch w = new Stopwatch().start();
ConfigResultSet<Grandfather> resultSet = config.newQuery(Grandfather.class).retrieve();
List<Grandfather> grandfathers = Lists.newArrayList(resultSet);
responseTime.update(w.elapsedMillis());
}
return responseTime;
}
public Histogram executeAll() {
Histogram responseTime = registry.newHistogram(BeanManagerTest.class, "executeAll");
for (int i = 0; i < reps; i++) {
Stopwatch w = new Stopwatch().start();
List<Grandfather> resultSet = config.list(Grandfather.class);
responseTime.update(w.elapsedMillis());
}
return responseTime;
}
}