/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.web.analytics;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anySet;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import org.testng.annotations.Test;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.opengamma.engine.ComputationTargetSpecification;
import com.opengamma.engine.target.ComputationTargetType;
import com.opengamma.engine.value.ValueProperties;
import com.opengamma.engine.value.ValuePropertyNames;
import com.opengamma.engine.value.ValueSpecification;
import com.opengamma.engine.view.ExecutionLogMode;
import com.opengamma.engine.view.client.ViewClient;
import com.opengamma.id.UniqueId;
import com.opengamma.util.test.TestGroup;
import com.opengamma.util.tuple.Pair;
import com.opengamma.util.tuple.Pairs;
import com.opengamma.web.analytics.formatting.TypeFormatter;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class LoggingViewportListenerTest {
private final GridCell _cell1 = new GridCell(0, 1, TypeFormatter.Format.CELL);
private final GridCell _cell2 = new GridCell(0, 2, TypeFormatter.Format.CELL);
private final GridCell _cell3 = new GridCell(0, 3, TypeFormatter.Format.CELL);
private final List<GridCell> _cells12 = Lists.newArrayList(_cell1, _cell2);
private final List<GridCell> _cells23 = Lists.newArrayList(_cell2, _cell3);
private final GridStructure _gridStructure = gridStructure(_cell1, _cell2, _cell3);
/**
* creates a viewport with logging enabled and then deletes it
*/
@Test
public void createDeleteWithLogging() {
final ViewClient viewClient = mock(ViewClient.class);
final LoggingViewportListener listener = new LoggingViewportListener(viewClient);
final ViewportDefinition viewportDef = viewportDef(true, _cells12);
listener.viewportCreated(viewportDef, _gridStructure);
verify(viewClient).setMinimumLogMode(ExecutionLogMode.FULL, resultSpecs(_cells12));
listener.viewportDeleted(viewportDef, _gridStructure);
verify(viewClient).setMinimumLogMode(ExecutionLogMode.INDICATORS, resultSpecs(_cells12));
}
/**
* creates a deletes a viewport with no logging enabled
*/
@Test
@SuppressWarnings("unchecked")
public void createDeleteNoLogging() {
final ViewClient viewClient = mock(ViewClient.class);
final LoggingViewportListener listener = new LoggingViewportListener(viewClient);
final ViewportDefinition viewportDef = viewportDef(false, _cells12);
listener.viewportCreated(viewportDef, _gridStructure);
listener.viewportDeleted(viewportDef, _gridStructure);
verify(viewClient, never()).setMinimumLogMode(any(ExecutionLogMode.class), anySet());
}
@Test
public void createUpdateDeleteWithLogging() {
final ViewClient viewClient = mock(ViewClient.class);
final LoggingViewportListener listener = new LoggingViewportListener(viewClient);
final ViewportDefinition viewportDef1 = viewportDef(true, _cells12);
listener.viewportCreated(viewportDef1, _gridStructure);
verify(viewClient).setMinimumLogMode(ExecutionLogMode.FULL, resultSpecs(_cells12));
final ViewportDefinition viewportDef2 = viewportDef(true, _cells23);
listener.viewportUpdated(viewportDef1, viewportDef2, _gridStructure);
verify(viewClient).setMinimumLogMode(ExecutionLogMode.INDICATORS, resultSpecs(_cell1));
verify(viewClient).setMinimumLogMode(ExecutionLogMode.FULL, resultSpecs(_cell3));
listener.viewportDeleted(viewportDef2, _gridStructure);
verify(viewClient).setMinimumLogMode(ExecutionLogMode.INDICATORS, resultSpecs(_cells23));
}
@Test
@SuppressWarnings("unchecked")
public void createUpdateDeleteNoLogging() {
final ViewClient viewClient = mock(ViewClient.class);
final LoggingViewportListener listener = new LoggingViewportListener(viewClient);
final ViewportDefinition viewportDef1 = viewportDef(false, _cells12);
listener.viewportCreated(viewportDef1, _gridStructure);
final ViewportDefinition viewportDef2 = viewportDef(false, _cells23);
listener.viewportUpdated(viewportDef1, viewportDef2, _gridStructure);
listener.viewportDeleted(viewportDef2, _gridStructure);
verify(viewClient, never()).setMinimumLogMode(any(ExecutionLogMode.class), anySet());
}
@Test
public void twoViewportsWithLoggingAndOverlappingCells() {
final ViewClient viewClient = mock(ViewClient.class);
final LoggingViewportListener listener = new LoggingViewportListener(viewClient);
final ViewportDefinition viewportDef1 = viewportDef(true, _cells12);
final ViewportDefinition viewportDef2 = viewportDef(true, _cells23);
listener.viewportCreated(viewportDef1, _gridStructure);
verify(viewClient).setMinimumLogMode(ExecutionLogMode.FULL, resultSpecs(_cell1, _cell2));
listener.viewportCreated(viewportDef2, _gridStructure);
verify(viewClient).setMinimumLogMode(ExecutionLogMode.FULL, resultSpecs(_cell3));
listener.viewportDeleted(viewportDef1, _gridStructure);
verify(viewClient).setMinimumLogMode(ExecutionLogMode.INDICATORS, resultSpecs(_cell1));
listener.viewportDeleted(viewportDef2, _gridStructure);
verify(viewClient).setMinimumLogMode(ExecutionLogMode.INDICATORS, resultSpecs(_cell2, _cell3));
}
//-------------------------------------------------------------------------
private static ViewportDefinition viewportDef(final boolean enableLogging, final List<GridCell> cells) {
return new ArbitraryViewportDefinition(0, cells, enableLogging);
}
private static GridStructure gridStructure(final GridCell... cells) {
return gridStructure(Arrays.asList(cells));
}
private static GridStructure gridStructure(final List<GridCell> cells) {
final GridStructure mock = mock(GridStructure.class);
for (final GridCell cell : cells) {
when(mock.getValueSpecificationForCell(cell.getRow(), cell.getColumn())).thenReturn(target(cell));
}
return mock;
}
private static Pair<String, ValueSpecification> target(final GridCell cell) {
final int row = cell.getRow();
final int col = cell.getColumn();
final ComputationTargetSpecification target = new ComputationTargetSpecification(ComputationTargetType.POSITION,
UniqueId.of("Cell", row + "," + col));
final ValueProperties properties = ValueProperties.with(ValuePropertyNames.FUNCTION, "fnName").get();
return Pairs.of("Default", new ValueSpecification("valueName(" + row + "," + col + ")", target, properties));
}
private Set<Pair<String, ValueSpecification>> resultSpecs(final GridCell... cells) {
return resultSpecs(Arrays.asList(cells));
}
private Set<Pair<String, ValueSpecification>> resultSpecs(final List<GridCell> cells) {
final Set<Pair<String, ValueSpecification>> specs = Sets.newHashSet();
for (final GridCell cell : cells) {
specs.add(target(cell));
}
return specs;
}
}