/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.view.worker.cache; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNotSame; import static org.testng.Assert.assertNull; import static org.testng.Assert.assertSame; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Collection; import java.util.Collections; import java.util.Map; import net.sf.ehcache.CacheManager; import org.mockito.Mockito; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import org.threeten.bp.Instant; import com.google.common.collect.ImmutableMap; import com.opengamma.core.position.Portfolio; import com.opengamma.core.position.impl.SimplePortfolio; import com.opengamma.engine.ComputationTarget; import com.opengamma.engine.ComputationTargetResolver; 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.target.ComputationTargetReference; import com.opengamma.engine.target.ComputationTargetRequirement; import com.opengamma.engine.target.ComputationTargetType; import com.opengamma.engine.view.ViewCalculationConfiguration; import com.opengamma.engine.view.ViewDefinition; import com.opengamma.engine.view.compilation.CompiledViewCalculationConfiguration; import com.opengamma.engine.view.compilation.CompiledViewCalculationConfigurationImpl; import com.opengamma.engine.view.compilation.CompiledViewDefinitionWithGraphs; import com.opengamma.engine.view.compilation.CompiledViewDefinitionWithGraphsImpl; import com.opengamma.engine.view.worker.cache.EHCacheViewExecutionCache.CompiledViewDefinitionWithGraphsHolder; import com.opengamma.id.ExternalId; import com.opengamma.id.UniqueId; import com.opengamma.id.VersionCorrection; import com.opengamma.util.ehcache.EHCacheUtils; import com.opengamma.util.test.TestGroup; /** * Tests the {@link EHCacheViewExecutionCache} class. */ @Test(groups = TestGroup.UNIT) public class EHCacheViewExecutionCacheTest { private final Instant _now = Instant.now(); private CacheManager _cacheManager; @BeforeClass public void setUpClass() { _cacheManager = EHCacheUtils.createTestCacheManager(EHCacheViewExecutionCache.class); } @AfterClass public void tearDownClass() { EHCacheUtils.shutdownQuiet(_cacheManager); } private Portfolio createPortfolio() { return new SimplePortfolio(UniqueId.of("Portfolio", "0", "V"), "Portfolio"); } private ViewDefinition createViewDefinition() { final ViewDefinition viewDefinition = new ViewDefinition("TestView", UniqueId.of("Portfolio", "0"), "TestUser"); viewDefinition.setUniqueId(UniqueId.of("View", "0", "V")); return viewDefinition; } private DependencyGraph createDependencyGraph() { final TestDependencyGraphBuilder gb = new TestDependencyGraphBuilder("Default"); final NodeBuilder n1 = gb.addNode("Foo", ComputationTargetSpecification.NULL); n1.addTerminalOutput("Foo"); final NodeBuilder n2 = gb.addNode("Bar", ComputationTargetSpecification.NULL); n1.addInput(n2.addOutput("Bar")); final NodeBuilder n3 = gb.addNode("Cow", ComputationTargetSpecification.NULL); n2.addInput(n3.addOutput("Cow")); return gb.buildGraph(); } private CompiledViewDefinitionWithGraphs createCompiledViewDefinitionWithGraphs() { final Portfolio portfolio = createPortfolio(); final ViewDefinition viewDefinition = createViewDefinition(); final ViewCalculationConfiguration calcConfig = new ViewCalculationConfiguration(viewDefinition, "Default"); viewDefinition.addViewCalculationConfiguration(calcConfig); final DependencyGraph graph = createDependencyGraph(); final Collection<DependencyGraph> graphs = Collections.singleton(graph); final Collection<CompiledViewCalculationConfiguration> calcConfigs = Collections.<CompiledViewCalculationConfiguration>singleton(CompiledViewCalculationConfigurationImpl.of(graph)); final Map<ComputationTargetReference, UniqueId> resolutions = ImmutableMap.<ComputationTargetReference, UniqueId>of(new ComputationTargetRequirement(ComputationTargetType.SECURITY, ExternalId.of("Security", "Foo")), UniqueId.of("Sec", "0")); return new CompiledViewDefinitionWithGraphsImpl(VersionCorrection.of(_now, _now), "", viewDefinition, graphs, resolutions, portfolio, 0, calcConfigs, null, null); } private EHCacheViewExecutionCache createCache() { final ComputationTargetResolver targetResolver = Mockito.mock(ComputationTargetResolver.class); Mockito.when(targetResolver.resolve(new ComputationTargetSpecification(ComputationTargetType.PORTFOLIO, UniqueId.of("Portfolio", "0", "V")), VersionCorrection.of(_now, _now))) .thenReturn(new ComputationTarget(ComputationTargetType.PORTFOLIO, createPortfolio())); Mockito.when(targetResolver.resolve(new ComputationTargetSpecification(ComputationTargetType.of(ViewDefinition.class), UniqueId.of("View", "0", "V")), VersionCorrection.LATEST)) .thenReturn(new ComputationTarget(ComputationTargetType.of(ViewDefinition.class), createViewDefinition())); Mockito.when(targetResolver.atVersionCorrection(VersionCorrection.of(_now, _now))).thenReturn(Mockito.mock(ComputationTargetResolver.AtVersionCorrection.class)); return new EHCacheViewExecutionCache(_cacheManager, targetResolver); } public void testCompiledViewDefinitionWithGraphs_serialization() throws Exception { final EHCacheViewExecutionCache cache = createCache(); final CompiledViewDefinitionWithGraphs object = createCompiledViewDefinitionWithGraphs(); final CompiledViewDefinitionWithGraphsHolder holder = cache.new CompiledViewDefinitionWithGraphsHolder(object); assertSame(holder.get(), object); final ByteArrayOutputStream baos = new ByteArrayOutputStream(); final ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(holder); oos.close(); final ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); final ObjectInputStream ois = new ObjectInputStream(bais); final Object newHolder = ois.readObject(); assertEquals(newHolder.getClass(), CompiledViewDefinitionWithGraphsHolder.class); final CompiledViewDefinitionWithGraphs newObject = ((CompiledViewDefinitionWithGraphsHolder) newHolder).get(); assertEquals(newObject.getCompiledCalculationConfigurations(), object.getCompiledCalculationConfigurations()); assertEquals(newObject.getComputationTargets(), object.getComputationTargets()); assertEquals(newObject.getMarketDataRequirements(), object.getMarketDataRequirements()); assertEquals(newObject.getPortfolio(), object.getPortfolio()); assertEquals(newObject.getResolvedIdentifiers(), object.getResolvedIdentifiers()); assertEquals(newObject.getResolverVersionCorrection(), object.getResolverVersionCorrection()); } public void testCompiledViewDefinitionWithGraphs_caching() { final EHCacheViewExecutionCache cache = createCache(); final CompiledViewDefinitionWithGraphs object = createCompiledViewDefinitionWithGraphs(); final ViewExecutionCacheKey key = new ViewExecutionCacheKey(UniqueId.of("Key", "1"), "Foo", "No-op"); // Miss assertNull(cache.getCompiledViewDefinitionWithGraphs(key)); // Store cache.setCompiledViewDefinitionWithGraphs(key, object); // Hit the front cache assertSame(cache.getCompiledViewDefinitionWithGraphs(key), object); // Hit the EH Cache cache.clearFrontCache(); final CompiledViewDefinitionWithGraphs cachedObject = cache.getCompiledViewDefinitionWithGraphs(key); assertNotNull(cachedObject); // Hit the front cache assertSame(cache.getCompiledViewDefinitionWithGraphs(key), cachedObject); // Replacement final CompiledViewDefinitionWithGraphs newObject = createCompiledViewDefinitionWithGraphs(); assertNotSame(newObject, object); assertNotSame(newObject, cachedObject); cache.setCompiledViewDefinitionWithGraphs(key, newObject); assertSame(cache.getCompiledViewDefinitionWithGraphs(key), newObject); } }