/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.exec.plan;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.testng.annotations.Test;
import org.threeten.bp.Instant;
import com.opengamma.engine.ComputationTargetSpecification;
import com.opengamma.engine.cache.CacheSelectHint;
import com.opengamma.engine.calcnode.CalculationJob;
import com.opengamma.engine.calcnode.CalculationJobItem;
import com.opengamma.engine.function.EmptyFunctionParameters;
import com.opengamma.engine.value.ValueSpecification;
import com.opengamma.engine.view.ExecutionLogMode;
import com.opengamma.id.UniqueId;
import com.opengamma.id.VersionCorrection;
import com.opengamma.util.test.TestGroup;
/**
* Tests the {@link ExecutingGraph} class.
*/
@Test(groups = TestGroup.UNIT)
public class ExecutingGraphTest {
private CalculationJobItem createItem(final int i) {
return new CalculationJobItem(Integer.toString(i), new EmptyFunctionParameters(), ComputationTargetSpecification.NULL, Collections.<ValueSpecification>emptySet(),
Collections.<ValueSpecification>emptySet(), ExecutionLogMode.INDICATORS);
}
private List<CalculationJobItem> createJobItems(final int i) {
return Arrays.asList(createItem(i));
}
/**
* <pre>
* J9
* / \
* J8 J7
* / / |
* J5 / |
* / \ / |
* J3 J4 | J3, J4, J5 and J8 are tails of J2
* \ / |
* J2 /
* | \ /
* J1 \ /
* J6
* </pre>
*/
private GraphExecutionPlan create9JobPlan() {
final PlannedJob job9 = new PlannedJob(2, createJobItems(9), CacheSelectHint.allShared(), null, null);
final PlannedJob job8 = new PlannedJob(1, createJobItems(8), CacheSelectHint.allShared(), null, new PlannedJob[] {job9 });
final PlannedJob job7 = new PlannedJob(2, createJobItems(7), CacheSelectHint.allShared(), null, new PlannedJob[] {job9 });
final PlannedJob job5 = new PlannedJob(2, createJobItems(5), CacheSelectHint.allShared(), new PlannedJob[] {job8 }, null);
final PlannedJob job3 = new PlannedJob(1, createJobItems(3), CacheSelectHint.allShared(), new PlannedJob[] {job5 }, null);
final PlannedJob job4 = new PlannedJob(1, createJobItems(4), CacheSelectHint.allShared(), new PlannedJob[] {job5 }, new PlannedJob[] {job7 });
final PlannedJob job2 = new PlannedJob(2, createJobItems(2), CacheSelectHint.allShared(), new PlannedJob[] {job3, job4 }, null);
final PlannedJob job1 = new PlannedJob(0, createJobItems(1), CacheSelectHint.allShared(), null, new PlannedJob[] {job2 });
final PlannedJob job6 = new PlannedJob(0, createJobItems(6), CacheSelectHint.allShared(), null, new PlannedJob[] {job2, job7 });
return new GraphExecutionPlan("Default", 0, Arrays.asList(job1, job6), 0, 10d, 10d, 10d);
}
private void assertJob(final CalculationJob job, final int i) {
assertEquals(job.getJobItems().size(), 1);
assertEquals(job.getJobItems().get(0).getFunctionUniqueIdentifier(), Integer.toString(i));
}
public void basicTest() {
final GraphExecutionPlan plan = create9JobPlan();
final ExecutingGraph executing = new ExecutingGraph(plan, UniqueId.of("Cycle", "Test"), Instant.now(), VersionCorrection.LATEST);
final CalculationJob job6 = executing.nextExecutableJob();
assertJob(job6, 6);
final CalculationJob job1 = executing.nextExecutableJob();
assertJob(job1, 1);
assertNull(executing.nextExecutableJob());
executing.jobCompleted(job1.getSpecification());
assertNull(executing.nextExecutableJob());
executing.jobCompleted(job6.getSpecification());
final CalculationJob job2 = executing.nextExecutableJob();
assertJob(job2, 2);
assertNull(executing.nextExecutableJob());
executing.jobCompleted(job6.getSpecification()); // Duplicate notification
assertNull(executing.nextExecutableJob());
assertNotNull(job2.getTail());
assertEquals(job2.getTail().size(), 2);
final Iterator<CalculationJob> itr = job2.getTail().iterator();
final CalculationJob job3 = itr.next();
assertJob(job3, 3);
assertNull(job3.getTail());
final CalculationJob job4 = itr.next();
assertFalse(itr.hasNext());
assertJob(job4, 4);
assertNotNull(job4.getTail());
assertEquals(job4.getTail().size(), 1);
final CalculationJob job5 = job4.getTail().iterator().next();
assertJob(job5, 5);
assertNotNull(job5.getRequiredJobIds());
assertEquals(job5.getRequiredJobIds().length, 2);
assertEquals(job5.getRequiredJobIds()[0], job3.getSpecification().getJobId());
assertEquals(job5.getRequiredJobIds()[1], job4.getSpecification().getJobId());
assertNotNull(job5.getTail());
assertEquals(job5.getTail().size(), 1);
final CalculationJob job8 = job5.getTail().iterator().next();
assertJob(job8, 8);
executing.jobCompleted(job2.getSpecification());
assertNull(executing.nextExecutableJob());
executing.jobCompleted(job3.getSpecification());
assertNull(executing.nextExecutableJob());
executing.jobCompleted(job4.getSpecification());
final CalculationJob job7 = executing.nextExecutableJob();
assertJob(job7, 7);
executing.jobCompleted(job5.getSpecification());
assertNull(executing.nextExecutableJob());
executing.jobCompleted(job8.getSpecification());
assertNull(executing.nextExecutableJob());
executing.jobCompleted(job7.getSpecification());
final CalculationJob job9 = executing.nextExecutableJob();
assertJob(job9, 9);
assertNull(executing.nextExecutableJob());
assertFalse(executing.isFinished());
executing.jobCompleted(job9.getSpecification());
assertNull(executing.nextExecutableJob());
assertTrue(executing.isFinished());
}
}