package com.datascience.scheduler;
import com.datascience.core.base.*;
import com.datascience.datastoring.datamodels.memory.InMemoryData;
import com.datascience.datastoring.datamodels.full.MemoryJobStorage;
import com.datascience.galc.ContinuousIpeirotis;
import com.datascience.galc.ContinuousProject;
import org.junit.Test;
import java.util.concurrent.TimeUnit;
import static org.junit.Assert.assertEquals;
public class SchedulerTest {
private void addAssign(IData<ContValue> data, String worker, String object) {
data.addAssign(
new AssignedLabel<ContValue>(
new Worker(worker),
new LObject<ContValue>(object),
new ContValue(0.)
)
);
}
private ContinuousProject populate(int objectsCount) {
InMemoryData<ContValue> data = new InMemoryData<ContValue>();
data.addObject(new LObject<ContValue>("object0"));
for (int i = 0; i < objectsCount; i++) {
for (int j = 0; j < i; j++) {
addAssign(data, "worker" + j, "object" + i);
}
}
MemoryJobStorage js = new MemoryJobStorage();
ContinuousProject cp = new ContinuousProject(new ContinuousIpeirotis(), js.getContData("testId"), js.getContResults("testId"));
cp.setData(data);
return cp;
}
@Test
public void schedulerTest() {
final int objectsCount = 5;
ContinuousProject cp = populate(objectsCount);
IData<ContValue> data = cp.getData();
Scheduler<ContValue> scheduler = new Scheduler(cp, new DummyPriorityCalculator(data));
scheduler.update();
for (int i = 0; i < objectsCount; i++) {
assertEquals(data.getObject("object0"), scheduler.nextObject());
}
}
@Test
public void schedulerTestOnSmallUpdates() {
final int objectsCount = 5;
MemoryJobStorage js = new MemoryJobStorage();
ContinuousProject cp = new ContinuousProject(new ContinuousIpeirotis(), js.getContData("testId"), js.getContResults("testId"));
InMemoryData<ContValue> data = new InMemoryData<ContValue>();
cp.setData(data);
Scheduler<ContValue> scheduler =
new CachedScheduler<ContValue>(cp, new DummyPriorityCalculator(data), 10, TimeUnit.DAYS);
for (int i = 0; i < objectsCount; i++) {
LObject<ContValue> obj = new LObject<ContValue>("object" + i);
for (int j = 0; j <= i; j++) {
data.addAssign(
new AssignedLabel<ContValue>(
new Worker("worker" + j),
obj,
new ContValue(0.)
)
);
scheduler.update(obj);
}
}
for (int i = 0; i < objectsCount; i++) {
assertEquals(data.getObject("object"+i), scheduler.nextObject());
}
}
@Test
public void cachedSchedulerOrderTest() {
final int objectsCount = 5;
ContinuousProject cp = populate(objectsCount);
IData<ContValue> data = cp.getData();
CachedScheduler<ContValue> scheduler = new CachedScheduler(cp, new DummyPriorityCalculator(data), 10,
TimeUnit.MINUTES);
scheduler.update();
// Check if objects are returned in proper order.
for (int i = 0; i < objectsCount; i++) {
assertEquals(data.getObject("object" + i), scheduler.nextObject());
}
assertEquals(null, scheduler.nextObject());
}
@Test
public void cachedSchedulerExpirationTest() {
final int objectsCount = 5;
ContinuousProject cp = populate(objectsCount);
IData<ContValue> data = cp.getData();
CachedScheduler<ContValue> scheduler = new CachedScheduler(cp, new DummyPriorityCalculator(data), 10,
TimeUnit.MINUTES);
scheduler.update();
// Cache all objects.
for (int i = 0; i < objectsCount; i++) {
scheduler.nextObject();
}
// Simulate cache expiration.
scheduler.update(data.getObject("object0"));
assertEquals(data.getObject("object0"), scheduler.nextObject());
scheduler.update(data.getObject("object3"));
assertEquals(data.getObject("object3"), scheduler.nextObject());
}
@Test
public void cachedSchedulerUpdateTest() {
final int objectsCount = 5;
ContinuousProject cp = populate(objectsCount);
IData<ContValue> data = cp.getData();
CachedScheduler<ContValue> scheduler = new CachedScheduler(cp, new DummyPriorityCalculator(data), 10,
TimeUnit.MINUTES);
scheduler.update();
// Cache all objects.
for (int i = 0; i < objectsCount; i++) {
scheduler.nextObject();
}
// Simulate voting.
for (int i = 0; i < 6; i++) {
addAssign(data, "worker" + i, "object0");
scheduler.update(data.getObject("object0"));
}
addAssign(data, "worker0", "object1");
scheduler.update(data.getObject("object1"));
assertEquals(data.getObject("object1"), scheduler.nextObject());
assertEquals(data.getObject("object0"), scheduler.nextObject());
}
public static class DummyPriorityCalculator<T> extends AssignCountPriorityCalculator<T> {
public DummyPriorityCalculator(IData<T> data) {
this.data = data;
}
}
}