/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.depgraph; import static org.testng.AssertJUnit.assertEquals; import static org.testng.AssertJUnit.assertFalse; import static org.testng.AssertJUnit.assertNotNull; import static org.testng.AssertJUnit.assertTrue; import java.util.Collection; import java.util.Collections; import java.util.Set; import org.apache.commons.lang.ObjectUtils; import org.testng.Assert; import org.testng.annotations.Test; import com.google.common.collect.Sets; import com.opengamma.engine.depgraph.impl.DependencyGraphImpl; import com.opengamma.engine.function.MarketDataSourcingFunction; import com.opengamma.engine.test.MockFunction; import com.opengamma.engine.value.ValueRequirement; import com.opengamma.engine.value.ValueSpecification; import com.opengamma.util.test.TestGroup; import com.opengamma.util.test.TestLifecycle; /** * Tests the dependency graph building with trivial constructions. */ @Test(groups = TestGroup.UNIT) public class DepGraphBasicTest extends AbstractDependencyGraphBuilderTest { public void singleOutputSingleFunctionNode() { TestLifecycle.begin(); try { DepGraphTestHelper helper = helper(); MockFunction function = helper.addFunctionProducing1and2(); DependencyGraphBuilder builder = helper.createBuilder(null); builder.addTarget(Sets.newHashSet(helper.getRequirement1())); DependencyGraph graph = builder.getDependencyGraph(); assertNotNull(graph); assertTrue(DependencyGraphImpl.getAllOutputSpecifications(graph).contains(helper.getSpec1())); assertTrue(DependencyGraphImpl.getAllOutputSpecifications(graph).contains(helper.getSpec2())); Collection<DependencyNode> nodes = DependencyGraphImpl.getDependencyNodes(graph); assertNotNull(nodes); assertEquals(1, nodes.size()); DependencyNode node = nodes.iterator().next(); assertEquals(function.getUniqueId(), node.getFunction().getFunctionId()); assertEquals(function.getDefaultParameters(), node.getFunction().getParameters()); assertTrue(node.hasOutputValue(helper.getSpec1())); assertTrue(node.hasOutputValue(helper.getSpec2())); assertEquals(0, node.getInputCount()); assertEquals(helper.getTarget().toSpecification(), node.getTarget()); graph = DependencyGraphImpl.removeUnnecessaryValues(graph); nodes = DependencyGraphImpl.getDependencyNodes(graph); assertNotNull(nodes); assertEquals(1, nodes.size()); node = nodes.iterator().next(); assertEquals(function.getUniqueId(), node.getFunction().getFunctionId()); assertEquals(function.getDefaultParameters(), node.getFunction().getParameters()); assertTrue(node.hasOutputValue(helper.getSpec1())); assertFalse(node.hasOutputValue(helper.getSpec2())); assertEquals(0, node.getInputCount()); } finally { TestLifecycle.end(); } } /** * When you have multiple requirements produced by the same function, should only have a single node using that function. */ public void multipleOutputsSingleFunctionNode() { TestLifecycle.begin(); try { DepGraphTestHelper helper = helper(); MockFunction function = helper.addFunctionProducing1and2(); DependencyGraphBuilder builder = helper.createBuilder(null); builder.addTarget(Sets.newHashSet(helper.getRequirement1())); builder.addTarget(Sets.newHashSet(helper.getRequirement2())); DependencyGraph graph = builder.getDependencyGraph(); assertNotNull(graph); Collection<DependencyNode> nodes = DependencyGraphImpl.getDependencyNodes(graph); assertNotNull(nodes); assertEquals(1, nodes.size()); DependencyNode node = nodes.iterator().next(); assertEquals(function.getUniqueId(), node.getFunction().getFunctionId()); assertEquals(function.getDefaultParameters(), node.getFunction().getParameters()); assertTrue(node.hasOutputValue(helper.getSpec1())); assertTrue(node.hasOutputValue(helper.getSpec2())); assertEquals(0, node.getInputCount()); } finally { TestLifecycle.end(); } } public void unsatisfiableDependency() { TestLifecycle.begin(); try { DepGraphTestHelper helper = helper(); helper.addFunctionProducing1and2(); ValueRequirement anotherReq = new ValueRequirement("Req-3", helper.getTarget().toSpecification()); DependencyGraphBuilder builder = helper.createBuilder(null); expectCompletion(builder, builder.getContext().resolveRequirement(helper.getRequirement1(), null, null)); expectFailure(builder, builder.getContext().resolveRequirement(anotherReq, null, null)); } finally { TestLifecycle.end(); } } public void doubleLevelNoLiveData() { TestLifecycle.begin(); try { DepGraphTestHelper helper = helper(); MockFunction fn1 = helper.addFunctionRequiring2Producing1(); MockFunction fn2 = helper.addFunctionProducing2(); DependencyGraphBuilder builder = helper.createBuilder(null); builder.addTarget(helper.getRequirement1()); DependencyGraph graph = builder.getDependencyGraph(); assertNotNull(graph); graph = DependencyGraphImpl.removeUnnecessaryValues(graph); assertTrue(DependencyGraphImpl.getAllOutputSpecifications(graph).contains(helper.getSpec1())); assertTrue(DependencyGraphImpl.getAllOutputSpecifications(graph).contains(helper.getSpec2())); Collection<DependencyNode> nodes = DependencyGraphImpl.getDependencyNodes(graph); assertNotNull(nodes); assertEquals(2, nodes.size()); for (DependencyNode node : nodes) { if (ObjectUtils.equals(node.getFunction().getFunctionId(), fn1.getUniqueId())) { assertTrue(node.hasOutputValue(helper.getSpec1())); assertFalse(node.hasOutputValue(helper.getSpec2())); assertEquals(1, node.getInputCount()); assertEquals(helper.getSpec2(), node.getInputValue(0)); assertEquals(helper.getTarget().toSpecification(), node.getTarget()); } else if (ObjectUtils.equals(node.getFunction().getFunctionId(), fn2.getUniqueId())) { assertFalse(node.hasOutputValue(helper.getSpec1())); assertTrue(node.hasOutputValue(helper.getSpec2())); assertEquals(0, node.getInputCount()); } else { Assert.fail("Unexpected function definition"); } } } finally { TestLifecycle.end(); } } public void doubleLevelLiveData() { TestLifecycle.begin(); try { DepGraphTestHelper helper = helper(); MockFunction fn1 = helper.addFunctionRequiring2Producing1(); helper.make2AvailableFromLiveData(); DependencyGraphBuilder builder = helper.createBuilder(null); builder.addTarget(helper.getRequirement1()); DependencyGraph graph = builder.getDependencyGraph(); assertNotNull(graph); graph = DependencyGraphImpl.removeUnnecessaryValues(graph); assertTrue(DependencyGraphImpl.getAllOutputSpecifications(graph).contains(helper.getSpec1())); Collection<DependencyNode> nodes = DependencyGraphImpl.getDependencyNodes(graph); assertNotNull(nodes); assertEquals(2, nodes.size()); for (DependencyNode node : nodes) { if (ObjectUtils.equals(node.getFunction().getFunctionId(), fn1.getUniqueId())) { assertTrue(node.hasOutputValue(helper.getSpec1())); assertEquals(1, node.getInputCount()); ValueSpecification inputSpec = node.getInputValue(0); assertEquals(helper.getSpec2().getValueName(), inputSpec.getValueName()); assertEquals(helper.getSpec2().getTargetSpecification(), inputSpec.getTargetSpecification()); assertEquals(helper.getTarget().toSpecification(), node.getTarget()); } else if (MarketDataSourcingFunction.UNIQUE_ID.equals(node.getFunction().getFunctionId())) { assertFalse(node.hasOutputValue(helper.getSpec1())); assertEquals(1, node.getOutputCount()); ValueSpecification outputSpec = node.getOutputValue(0); assertEquals(helper.getSpec2().getValueName(), outputSpec.getValueName()); assertEquals(helper.getSpec2().getTargetSpecification(), outputSpec.getTargetSpecification()); assertEquals(0, node.getInputCount()); } else { Assert.fail("Unexpected function definition"); } } } finally { TestLifecycle.end(); } } public void incrementalBuild() { TestLifecycle.begin(); try { final DepGraphTestHelper helper = helper(); helper.addFunctionRequiring2Producing1(); helper.addFunctionProducing2(); DependencyGraphBuilder builder = helper.createBuilder(null); builder.setDependencyGraph(new DependencyGraphImpl("DEFAULT", Collections.<DependencyNode>emptySet(), 0, Collections.<ValueSpecification, Set<ValueRequirement>>emptyMap())); builder.addTarget(helper.getRequirement2()); final DependencyGraph graph1 = builder.getDependencyGraph(); assertNotNull(graph1); assertEquals(1, graph1.getSize()); builder = helper.createBuilder(null); builder.setDependencyGraph(graph1); builder.addTarget(helper.getRequirement1()); final DependencyGraph graph2 = builder.getDependencyGraph(); assertNotNull(graph2); final Collection<DependencyNode> graph2Nodes = DependencyGraphImpl.getDependencyNodes(graph2); assertEquals(2, graph2Nodes.size()); assertTrue(graph2Nodes.containsAll(DependencyGraphImpl.getDependencyNodes(graph1))); } finally { TestLifecycle.end(); } } }