package oncue.tests.timedjobs;
import java.util.Arrays;
import java.util.HashSet;
import org.junit.Test;
import akka.testkit.JavaTestKit;
import junit.framework.Assert;
import oncue.backingstore.RedisBackingStore;
import oncue.backingstore.RedisBackingStore.RedisConnection;
import oncue.common.messages.Job;
import oncue.common.messages.WorkResponse;
import oncue.tests.base.DistributedActorSystemTest;
import oncue.tests.load.workers.SimpleLoadTestWorker;
import oncue.timedjobs.TimedJobFactory;
public class DistributedTimedJobTest extends DistributedActorSystemTest {
@Test
public void timedJobsWorkWithDistributedAgents() {
final JavaTestKit agentProbe = new JavaTestKit(agentSystem) {
{
new IgnoreMsg() {
protected boolean ignore(Object message) {
if (message instanceof WorkResponse) {
return false;
}
return true;
}
};
}
};
createScheduler(null);
// Create a throttled agent
createAgent(new HashSet<String>(Arrays.asList(SimpleLoadTestWorker.class.getName())),
agentProbe.getRef());
// The agent should connect to the scheduler and get an empty work
// response
agentProbe.expectMsgClass(WorkResponse.class);
// Initialise timed jobs
TimedJobFactory.createTimedJobs(serviceSystem, serviceSettings.TIMED_JOBS_TIMETABLE);
// Wait until all the jobs have completed
try (RedisConnection redis = new RedisConnection()) {
final int JOB_COUNT = serviceConfig.getInt("oncue.timed-jobs.repeatCount");
new JavaTestKit(serviceSystem) {
{
new AwaitCond(duration("5 minutes"), duration("5 seconds")) {
@Override
protected boolean cond() {
Job finalJob;
try {
finalJob = RedisBackingStore.loadJob(JOB_COUNT, redis);
return finalJob.getProgress() == 1.0;
} catch (RuntimeException e) {
// Job may not exist in Redis yet
return false;
}
}
};
}
};
// Now, check all the jobs completed in Redis
for (int i = 0; i < JOB_COUNT; i++) {
Job job = RedisBackingStore.loadJob(i + 1, redis);
Assert.assertEquals(1.0, job.getProgress());
}
serviceLog.info("All jobs were processed!");
}
}
}