/**
* Copyright (C) 2011 - 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.assertNotSame;
import static org.testng.Assert.assertSame;
import static org.testng.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Collections;
import java.util.Map;
import java.util.Set;
import net.sf.ehcache.CacheManager;
import org.mockito.Mockito;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.opengamma.engine.ComputationTarget;
import com.opengamma.engine.ComputationTargetSpecification;
import com.opengamma.engine.depgraph.DependencyGraph;
import com.opengamma.engine.depgraph.builder.TestDependencyGraphBuilder;
import com.opengamma.engine.depgraph.builder.TestDependencyGraphBuilder.NodeBuilder;
import com.opengamma.engine.exec.plan.CachingExecutionPlanner.CacheKey;
import com.opengamma.engine.function.EmptyFunctionParameters;
import com.opengamma.engine.function.FunctionParameters;
import com.opengamma.engine.target.ComputationTargetType;
import com.opengamma.engine.test.MockFunction;
import com.opengamma.engine.value.ValueProperties;
import com.opengamma.engine.value.ValuePropertyNames;
import com.opengamma.engine.value.ValueRequirement;
import com.opengamma.engine.value.ValueSpecification;
import com.opengamma.engine.view.impl.ExecutionLogModeSource;
import com.opengamma.id.UniqueId;
import com.opengamma.util.ehcache.EHCacheUtils;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = {TestGroup.UNIT, "ehcache" })
public class CachingExecutionPlannerTest {
private CacheManager _cacheManager;
@BeforeClass
public void setUpClass() {
_cacheManager = EHCacheUtils.createTestCacheManager(getClass());
}
@AfterClass
public void tearDownClass() {
EHCacheUtils.shutdownQuiet(_cacheManager);
}
@BeforeMethod
public void setUp() {
EHCacheUtils.clear(_cacheManager);
}
private TestDependencyGraphBuilder testGraphBuilder(final String config) {
final TestDependencyGraphBuilder gb = new TestDependencyGraphBuilder(config);
for (int i = 0; i < 10; i++) {
final NodeBuilder nb = gb.addNode(new MockFunction("Foo" + i, new ComputationTarget(ComputationTargetType.PRIMITIVE, UniqueId.of("Test", "X"))));
if (i > 0) {
nb.addOutput(Integer.toString(i));
nb.addInput(new ValueSpecification(Integer.toString(i - 1), ComputationTargetSpecification.of(UniqueId.of("Test", "X")), ValueProperties.with(ValuePropertyNames.FUNCTION, "Foo" + (i - 1))
.get()));
} else {
nb.addTerminalOutput("0");
}
}
return gb;
}
public void testCacheKey_same() {
final CacheKey ak = new CacheKey(testGraphBuilder("Default").buildGraph(), 0, Collections.<ValueSpecification>emptySet(), Collections.<ValueSpecification, FunctionParameters>emptyMap());
final CacheKey bk = new CacheKey(testGraphBuilder("Default").buildGraph(), 0, Collections.<ValueSpecification>emptySet(), Collections.<ValueSpecification, FunctionParameters>emptyMap());
assertTrue(ak.equals(bk));
assertTrue(bk.equals(ak));
assertEquals(ak.hashCode(), bk.hashCode());
}
public void testCacheKey_graph1() {
final DependencyGraph a = testGraphBuilder("A").buildGraph();
final DependencyGraph b = testGraphBuilder("B").buildGraph();
assertFalse(a.equals(b));
assertFalse(b.equals(a));
final CacheKey ak = new CacheKey(a, 0, Collections.<ValueSpecification>emptySet(), Collections.<ValueSpecification, FunctionParameters>emptyMap());
final CacheKey bk = new CacheKey(b, 0, Collections.<ValueSpecification>emptySet(), Collections.<ValueSpecification, FunctionParameters>emptyMap());
assertFalse(ak.equals(bk));
assertFalse(bk.equals(ak));
}
public void testCacheKey_initId() {
final DependencyGraph graph = testGraphBuilder("Default").buildGraph();
final CacheKey ak = new CacheKey(graph, 1, Collections.<ValueSpecification>emptySet(), Collections.<ValueSpecification, FunctionParameters>emptyMap());
final CacheKey bk = new CacheKey(graph, 2, Collections.<ValueSpecification>emptySet(), Collections.<ValueSpecification, FunctionParameters>emptyMap());
assertFalse(ak.equals(bk));
assertFalse(bk.equals(ak));
}
public void testCacheKey_graph2() {
final TestDependencyGraphBuilder a = testGraphBuilder("Default");
a.addTerminalOutput(new ValueSpecification("1", ComputationTargetSpecification.of(UniqueId.of("Test", "X")), ValueProperties.with(ValuePropertyNames.FUNCTION, "Foo1").get()),
Collections.singleton(new ValueRequirement("1", ComputationTargetSpecification.of(UniqueId.of("Test", "X")))));
final TestDependencyGraphBuilder b = testGraphBuilder("Default");
b.addTerminalOutput(new ValueSpecification("2", ComputationTargetSpecification.of(UniqueId.of("Test", "X")), ValueProperties.with(ValuePropertyNames.FUNCTION, "Foo2").get()),
Collections.singleton(new ValueRequirement("2", ComputationTargetSpecification.of(UniqueId.of("Test", "X")))));
final CacheKey ak = new CacheKey(a.buildGraph(), 0, Collections.<ValueSpecification>emptySet(), Collections.<ValueSpecification, FunctionParameters>emptyMap());
final CacheKey bk = new CacheKey(b.buildGraph(), 0, Collections.<ValueSpecification>emptySet(), Collections.<ValueSpecification, FunctionParameters>emptyMap());
assertFalse(ak.equals(bk));
assertFalse(bk.equals(ak));
}
public void testCacheKey_shared() {
final TestDependencyGraphBuilder graph = testGraphBuilder("Default");
final ValueSpecification value = graph.addNode("Foo", ComputationTargetSpecification.NULL).addTerminalOutput("Bar");
final CacheKey ak = new CacheKey(graph.buildGraph(), 0, Collections.singleton(value), Collections.<ValueSpecification, FunctionParameters>emptyMap());
final CacheKey bk = new CacheKey(graph.buildGraph(), 0, Collections.<ValueSpecification>emptySet(), Collections.<ValueSpecification, FunctionParameters>emptyMap());
assertFalse(ak.equals(bk));
assertFalse(bk.equals(ak));
}
public void testCacheKey_parameters() {
final TestDependencyGraphBuilder graph = testGraphBuilder("Default");
final ValueSpecification value = graph.addNode("Foo", ComputationTargetSpecification.NULL).addTerminalOutput("Bar");
final CacheKey ak = new CacheKey(graph.buildGraph(), 0, Collections.<ValueSpecification>emptySet(), Collections.<ValueSpecification, FunctionParameters>emptyMap());
final CacheKey bk = new CacheKey(graph.buildGraph(), 0, Collections.<ValueSpecification>emptySet(), Collections.<ValueSpecification, FunctionParameters>singletonMap(value,
EmptyFunctionParameters.INSTANCE));
assertFalse(ak.equals(bk));
assertFalse(bk.equals(ak));
}
public void testCacheKey_serialization() throws Exception {
final CacheKey a = new CacheKey(testGraphBuilder("Default").buildGraph(), 0, Collections.<ValueSpecification>emptySet(), Collections.<ValueSpecification, FunctionParameters>emptyMap());
final ByteArrayOutputStream baos = new ByteArrayOutputStream();
final ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(a);
final ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray()));
final CacheKey b = (CacheKey) ois.readObject();
assertEquals(b, a);
}
private GraphExecutionPlanner createExecutionPlanner() {
return new GraphExecutionPlanner() {
@Override
public GraphExecutionPlan createPlan(DependencyGraph graph, ExecutionLogModeSource logModeSource, long functionInitialisationId, Set<ValueSpecification> sharedValues,
Map<ValueSpecification, FunctionParameters> parameters) {
return new GraphExecutionPlan(graph.getCalculationConfigurationName(), 0L, Collections.<PlannedJob>emptySet(), 0, 0d, 0d, 0d);
}
};
}
public void testCache_match() {
final CachingExecutionPlanner cache = new CachingExecutionPlanner(createExecutionPlanner(), _cacheManager);
try {
final GraphExecutionPlan plan1 = cache.createPlan(testGraphBuilder("Default").buildGraph(), Mockito.mock(ExecutionLogModeSource.class), 0, Collections.<ValueSpecification>emptySet(),
Collections.<ValueSpecification, FunctionParameters>emptyMap());
final GraphExecutionPlan plan2 = cache.createPlan(testGraphBuilder("Default").buildGraph(), Mockito.mock(ExecutionLogModeSource.class), 0, Collections.<ValueSpecification>emptySet(),
Collections.<ValueSpecification, FunctionParameters>emptyMap());
assertSame(plan2, plan1);
assertNotNull(plan1);
assertNotNull(plan2);
} finally {
cache.shutdown();
}
}
public void testCache_mismatch() {
final CachingExecutionPlanner cache = new CachingExecutionPlanner(createExecutionPlanner(), _cacheManager);
try {
final GraphExecutionPlan plan1 = cache.createPlan(testGraphBuilder("Default").buildGraph(), Mockito.mock(ExecutionLogModeSource.class), 0, Collections.<ValueSpecification>emptySet(),
Collections.<ValueSpecification, FunctionParameters>emptyMap());
final TestDependencyGraphBuilder gb = testGraphBuilder("Default");
gb.addTerminalOutput(new ValueSpecification("1", ComputationTargetSpecification.of(UniqueId.of("Test", "X")), ValueProperties.with(ValuePropertyNames.FUNCTION, "Foo1").get()),
Collections.singleton(new ValueRequirement("1", ComputationTargetSpecification.of(UniqueId.of("Test", "X")))));
final GraphExecutionPlan plan2 = cache.createPlan(gb.buildGraph(), Mockito.mock(ExecutionLogModeSource.class), 0, Collections.<ValueSpecification>emptySet(),
Collections.<ValueSpecification, FunctionParameters>emptyMap());
assertNotSame(plan2, plan1);
assertNotNull(plan1);
assertNotNull(plan2);
} finally {
cache.shutdown();
}
}
}