/**
* Copyright (C) 2009 - 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.assertTrue;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import org.testng.Assert;
import com.opengamma.engine.depgraph.impl.DependencyGraphImpl;
import com.opengamma.engine.function.AbstractFunction;
import com.opengamma.engine.target.ComputationTargetType;
import com.opengamma.engine.test.MockFunction;
import com.opengamma.engine.value.ValueRequirement;
/**
* Base class of dependency graph building algorithm tests.
*/
/* package */class AbstractDependencyGraphBuilderTest {
protected DepGraphTestHelper helper() {
return new DepGraphTestHelper();
}
private void blockOnTask(final DependencyGraphBuilder builder, final ResolvedValueProducer task, final String expected) {
final CountDownLatch latch = new CountDownLatch(1);
final AtomicReference<String> result = new AtomicReference<String>();
task.addCallback(builder.getContext(), new ResolvedValueCallback() {
@Override
public void failed(final GraphBuildingContext context, final ValueRequirement value, final ResolutionFailure failure) {
result.set("FAILED");
latch.countDown();
}
@Override
public void resolved(final GraphBuildingContext context, final ValueRequirement valueRequirement, final ResolvedValue resolvedValue, final ResolutionPump pump) {
result.set("COMPLETE");
latch.countDown();
if (pump != null) {
context.close(pump);
}
}
@Override
public void recursionDetected() {
// No-op
}
});
assertTrue(builder.startBackgroundConstructionJob());
try {
latch.await(com.opengamma.util.test.Timeout.standardTimeoutMillis(), TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
Assert.fail("Interrupted", e);
}
assertEquals(expected, result.get());
}
protected void expectFailure(final DependencyGraphBuilder builder, final ResolvedValueProducer task) {
blockOnTask(builder, task, "FAILED");
}
protected void expectCompletion(final DependencyGraphBuilder builder, final ResolvedValueProducer task) {
blockOnTask(builder, task, "COMPLETE");
}
protected Map<MockFunction, DependencyNode> assertGraphContains(final DependencyGraph graph, final MockFunction... functions) {
final Collection<DependencyNode> nodes = DependencyGraphImpl.getDependencyNodes(graph);
final LinkedList<MockFunction> functionList = new LinkedList<MockFunction>(Arrays.asList(functions));
final Map<MockFunction, DependencyNode> result = new HashMap<MockFunction, DependencyNode>();
for (DependencyNode node : nodes) {
MockFunction function = null;
final Iterator<MockFunction> itr = functionList.iterator();
while (itr.hasNext()) {
final MockFunction f = itr.next();
if (node.getFunction().getFunctionId().equals(f.getUniqueId())) {
function = f;
itr.remove();
break;
}
}
if (function == null) {
Assert.fail(node.toString() + " not in expected functions");
}
result.put(function, node);
}
if (!functionList.isEmpty()) {
Assert.fail(functionList.toString() + " not in graph");
}
return result;
}
protected static abstract class TestFunction extends AbstractFunction.NonCompiledInvoker {
@Override
public ComputationTargetType getTargetType() {
return ComputationTargetType.ANYTHING;
}
public int getPriority() {
return 0;
}
};
}