/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.view.impl;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.testng.annotations.Test;
import org.threeten.bp.Instant;
import com.opengamma.core.change.BasicChangeManager;
import com.opengamma.core.change.ChangeManager;
import com.opengamma.core.change.ChangeType;
import com.opengamma.core.config.ConfigSource;
import com.opengamma.core.config.impl.ConfigItem;
import com.opengamma.engine.view.ViewAutoStartManager;
import com.opengamma.engine.view.execution.ExecutionOptions;
import com.opengamma.engine.view.execution.InfiniteViewCycleExecutionSequence;
import com.opengamma.engine.view.execution.ViewExecutionFlags;
import com.opengamma.id.ObjectId;
import com.opengamma.id.UniqueId;
import com.opengamma.id.VersionCorrection;
import com.opengamma.util.test.TestGroup;
@Test(groups = TestGroup.UNIT)
public class ListeningViewAutoStartManagerTest {
@Test(expectedExceptions = IllegalArgumentException.class)
public void testSourceMustBeProvided() {
new ListeningViewAutoStartManager(null);
}
@Test(expectedExceptions = IllegalStateException.class)
public void testCannotGetViewsUntilStarted() {
ViewAutoStartManager manager = new ListeningViewAutoStartManager(createConfigSource(1));
manager.getAutoStartViews();
}
@Test
public void testSingleConfigItemLoadsOnStart() {
ConfigSource configSource = createConfigSource(1);
ViewAutoStartManager manager = new ListeningViewAutoStartManager(configSource);
manager.initialize();
assertThat(manager.getAutoStartViews().size(), is(1));
}
@Test
public void testMultipleConfigItemsGetLoadedOnStart() {
ConfigSource configSource = createConfigSource(10);
ViewAutoStartManager manager = new ListeningViewAutoStartManager(configSource);
manager.initialize();
assertThat(manager.getAutoStartViews().size(), is(10));
}
@Test
public void testDuplicateViewDefinitionsAreIgnored() {
ConfigSource configSource = createConfigSource(createConfigItems("id1", "id1"));
ViewAutoStartManager manager = new ListeningViewAutoStartManager(configSource);
manager.initialize();
checkViewIds(manager.getAutoStartViews(), "id1");
}
@Test
public void testAfterItemsAreRemovedFromDatabaseTheyAreRemovedFromAutoStartList() {
TestConfigSource configSource = createConfigSource(createConfigItems("id1", "id2"));
ViewAutoStartManager manager = new ListeningViewAutoStartManager(configSource);
manager.initialize();
checkViewIds(manager.getAutoStartViews(), "id1", "id2");
configSource.removeItemWithTrigger(createConfigItem("id1"));
checkViewIds(manager.getAutoStartViews(), "id2");
}
@Test
public void testAfterItemsAreAddedToDatabaseTheyAreAddedToAutoStartList() {
TestConfigSource configSource = createConfigSource(createConfigItems("id1", "id2"));
ViewAutoStartManager manager = new ListeningViewAutoStartManager(configSource);
manager.initialize();
checkViewIds(manager.getAutoStartViews(), "id1", "id2");
configSource.addItemWithTrigger(createConfigItem("id3"));
checkViewIds(manager.getAutoStartViews(), "id1", "id2", "id3");
}
@Test
public void testModifiedItemsAreAddedToAutoStartList() {
TestConfigSource configSource = createConfigSource(createConfigItems("id1", "id2"));
ViewAutoStartManager manager = new ListeningViewAutoStartManager(configSource);
manager.initialize();
checkViewIds(manager.getAutoStartViews(), "id1", "id2");
configSource.modifyItemWithTrigger(createConfigItem("id2", "differentId"));
checkViewIds(manager.getAutoStartViews(), "id1", "differentId");
}
private void checkViewIds(Map<String, AutoStartViewDefinition> views, String... ids) {
Set<UniqueId> expected = new HashSet<>();
for (String id : ids) {
expected.add(UniqueId.of("VD", id));
}
Set<UniqueId> checked = new HashSet<>();
assertThat(views.size(), is(ids.length));
for (AutoStartViewDefinition view : views.values()) {
UniqueId uniqueId = view.getViewDefinitionId();
assertThat(expected.contains(uniqueId), is(true));
checked.add(uniqueId);
}
assertThat(checked, is(expected));
}
private TestConfigSource createConfigSource(int qty) {
return createConfigSource(createConfigItems(qty));
}
private TestConfigSource createConfigSource(List<ConfigItem<AutoStartViewDefinition>> configItems) {
return new TestConfigSource(configItems);
}
private List<ConfigItem<AutoStartViewDefinition>> createConfigItems(int qty) {
String[] ids = new String[qty];
for (int i = 0; i < qty; i++) {
ids[i] = "id-" + i;
}
return createConfigItems(ids);
}
private List<ConfigItem<AutoStartViewDefinition>> createConfigItems(String... ids) {
List<ConfigItem<AutoStartViewDefinition>> result = new ArrayList<>();
for (String id : ids) {
result.add(createConfigItem(id));
}
return result;
}
private ConfigItem<AutoStartViewDefinition> createConfigItem(String id) {
return createConfigItem(id, id);
}
private ConfigItem<AutoStartViewDefinition> createConfigItem(String id, String viewId) {
ConfigItem<AutoStartViewDefinition> configItem = ConfigItem.of(createAutoStartViewDefinition(viewId));
configItem.setUniqueId(UniqueId.of("CI", id));
configItem.setName("Item-" + id);
return configItem;
}
private AutoStartViewDefinition createAutoStartViewDefinition(String id) {
return new AutoStartViewDefinition(UniqueId.of("VD", id), ExecutionOptions.of(new InfiniteViewCycleExecutionSequence(),
EnumSet.of(ViewExecutionFlags.RUN_AS_FAST_AS_POSSIBLE)));
}
private static class TestConfigSource implements ConfigSource {
private BasicChangeManager _changeManager = new BasicChangeManager();
private Map<ObjectId, ConfigItem<AutoStartViewDefinition>> views = new HashMap<>();
public TestConfigSource(List<ConfigItem<AutoStartViewDefinition>> configItems) {
for (ConfigItem<AutoStartViewDefinition> item : configItems) {
addItem(item);
}
}
@Override
public ConfigItem<?> get(UniqueId uniqueId) {
return null;
}
@Override
public ConfigItem<?> get(ObjectId objectId, VersionCorrection versionCorrection) {
return views.get(objectId);
}
@Override
public Map<UniqueId, ConfigItem<?>> get(Collection<UniqueId> uniqueIds) {
return null;
}
@Override
public Map<ObjectId, ConfigItem<?>> get(Collection<ObjectId> objectIds, VersionCorrection versionCorrection) {
return null;
}
@Override
@SuppressWarnings("unchecked")
public <R> Collection<ConfigItem<R>> get(Class<R> clazz, String configName, VersionCorrection versionCorrection) {
Collection<ConfigItem<R>> result = new HashSet<>();
if (clazz == AutoStartViewDefinition.class) {
for (ConfigItem<AutoStartViewDefinition> item : views.values()) {
result.add((ConfigItem<R>) item);
}
}
return result;
}
@Override
@SuppressWarnings("unchecked")
public <R> Collection<ConfigItem<R>> getAll(Class<R> clazz, VersionCorrection versionCorrection) {
Collection<ConfigItem<R>> result = new HashSet<>();
if (clazz == AutoStartViewDefinition.class) {
for (ConfigItem<AutoStartViewDefinition> item : views.values()) {
result.add((ConfigItem<R>) item);
}
}
return result;
}
@Override
public <R> R getConfig(Class<R> clazz, UniqueId uniqueId) {
return null;
}
@Override
public <R> R getConfig(Class<R> clazz, ObjectId objectId, VersionCorrection versionCorrection) {
return null;
}
@Override
public <R> R getSingle(Class<R> clazz, String configName, VersionCorrection versionCorrection) {
return null;
}
@Override
public <R> R getLatestByName(Class<R> clazz, String name) {
return null;
}
@Override
public ChangeManager changeManager() {
return _changeManager;
}
private void addItem(ConfigItem<AutoStartViewDefinition> item) {
views.put(item.getObjectId(), item);
}
public void addItemWithTrigger(ConfigItem<AutoStartViewDefinition> item) {
addItem(item);
_changeManager.entityChanged(ChangeType.ADDED, item.getObjectId(), Instant.now(), null, Instant.now());
}
public void removeItemWithTrigger(ConfigItem<AutoStartViewDefinition> item) {
ObjectId objectId = item.getObjectId();
views.remove(objectId);
_changeManager.entityChanged(ChangeType.REMOVED, objectId, Instant.now(), null, Instant.now());
}
public void modifyItemWithTrigger(ConfigItem<AutoStartViewDefinition> item) {
addItem(item);
_changeManager.entityChanged(ChangeType.CHANGED, item.getObjectId(), Instant.now(), null, Instant.now());
}
}
}