/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.security;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertNull;
import static org.testng.AssertJUnit.assertSame;
import java.util.Collection;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.opengamma.DataNotFoundException;
import com.opengamma.core.security.Security;
import com.opengamma.core.security.impl.SimpleSecurity;
import com.opengamma.id.ExternalId;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.id.UniqueId;
import com.opengamma.id.VersionCorrection;
import com.opengamma.util.ehcache.EHCacheUtils;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.UNIT)
public class EHCachingFinancialSecuritySourceTest {
private MockFinancialSecuritySource _underlyingSecuritySource = null;
private EHCachingFinancialSecuritySource _cachingSecuritySource = null;
private ExternalId _secId1 = ExternalId.of("d1", "v1");
private ExternalId _secId2 = ExternalId.of("d1", "v2");
private SimpleSecurity _security1 = new SimpleSecurity("");
private SimpleSecurity _security1_alternate = new SimpleSecurity("alternate");
private SimpleSecurity _security2 = new SimpleSecurity("");
private CacheManager _cacheManager;
@BeforeClass
public void setUpClass() {
_cacheManager = EHCacheUtils.createTestCacheManager(getClass());
}
@AfterClass
public void tearDownClass() {
EHCacheUtils.shutdownQuiet(_cacheManager);
}
@BeforeMethod
public void setUp() throws Exception {
EHCacheUtils.clear(_cacheManager);
_underlyingSecuritySource = new MockFinancialSecuritySource();
_cachingSecuritySource = new EHCachingFinancialSecuritySource(_underlyingSecuritySource, _cacheManager);
_security1.addExternalId(_secId1);
_security1_alternate.addExternalId(_secId1);
_security2.addExternalId(_secId2);
}
@AfterMethod
public void tearDown() throws Exception {
if (_cachingSecuritySource != null) {
_cachingSecuritySource.shutdown();
}
_underlyingSecuritySource = null;
_cachingSecuritySource = null;
}
//-------------------------------------------------------------------------
@Test
public void getSecurity_UniqueId() {
addSecuritiesToMock(_security1, _security2);
UniqueId uid1 = _security1.getUniqueId();
Security underlyingSec = _underlyingSecuritySource.get(uid1);
Security cachedSec = _cachingSecuritySource.get(uid1);
assertNotNull(underlyingSec);
assertNotNull(cachedSec);
assertSame(underlyingSec, cachedSec);
Cache singleSecCache = _cacheManager.getCache(EHCachingFinancialSecuritySource.class.getName() + "-uid-cache");
assertEquals(1, singleSecCache.getSize());
Element element = singleSecCache.getQuiet(uid1);
assertNotNull(element);
for (int i = 1; i < 10; i++) {
cachedSec = _cachingSecuritySource.get(uid1);
assertNotNull(cachedSec);
}
}
@Test(expectedExceptions = DataNotFoundException.class)
public void getSecurity_UniqueId_empty() {
Cache singleSecCache = _cacheManager.getCache(EHCachingFinancialSecuritySource.class.getName() + "-uid-cache");
UniqueId uid = UniqueId.of("Mock", "99");
try {
_cachingSecuritySource.get(uid);
} finally {
assertEquals(0, singleSecCache.getSize());
Element element = singleSecCache.get(uid);
assertNull(element);
}
}
//-------------------------------------------------------------------------
@Test
public void getSecurities_ExternalIdBundle() {
addSecuritiesToMock(_security1, _security2);
ExternalIdBundle secKey = ExternalIdBundle.of(_secId1, _secId2);
Collection<Security> underlyingSecurities = _underlyingSecuritySource.get(secKey);
assertNotNull(underlyingSecurities);
Collection<? extends Security> cachedSecurities = _cachingSecuritySource.get(secKey);
assertNotNull(cachedSecurities);
assertEquals(underlyingSecurities, cachedSecurities);
Cache singleSecCache = _cacheManager.getCache(EHCachingFinancialSecuritySource.class.getName() + "-uid-cache");
assertNotNull(singleSecCache);
assertEquals(2, singleSecCache.getSize());
Element sec1Element = singleSecCache.getQuiet(_security1.getUniqueId());
Element sec2Element = singleSecCache.getQuiet(_security2.getUniqueId());
assertNotNull(sec1Element);
assertNotNull(sec2Element);
for (int i = 1; i < 10; i++) {
_cachingSecuritySource.get(secKey);
assertEquals(0, sec1Element.getHitCount());
assertEquals(0, sec2Element.getHitCount());
}
}
@Test
public void getSecurity_ExternalIdBundle_Changing() {
ExternalIdBundle secKey = ExternalIdBundle.of(_secId1, _secId2);
addSecuritiesToMock(_security1);
Security underlyingSecurity = _cachingSecuritySource.getSingle(secKey, VersionCorrection.LATEST);
assertEquals(_security1, underlyingSecurity);
_underlyingSecuritySource.removeSecurity(_security1);
addSecuritiesToMock(_security1_alternate);
underlyingSecurity = _cachingSecuritySource.getSingle(secKey, VersionCorrection.LATEST);
assertEquals(_security1_alternate, underlyingSecurity);
}
@Test
public void getSecurities_ExternalIdBundle_empty() {
ExternalIdBundle secKey = ExternalIdBundle.of(_secId1);
Cache singleSecCache = _cacheManager.getCache(EHCachingFinancialSecuritySource.class.getName() + "-uid-cache");
Security cachedSec = _cachingSecuritySource.getSingle(secKey);
assertNull(cachedSec);
assertEquals(0, singleSecCache.getSize());
}
//-------------------------------------------------------------------------
@Test
public void getSecurity_ExternalIdBundle() {
addSecuritiesToMock(_security1, _security2);
ExternalIdBundle secKey1 = ExternalIdBundle.of(_secId1);
Security underlyingSec = _underlyingSecuritySource.getSingle(secKey1);
Security cachedSec = _cachingSecuritySource.getSingle(secKey1);
assertNotNull(underlyingSec);
assertNotNull(cachedSec);
assertSame(underlyingSec, cachedSec);
Cache singleSecCache = _cacheManager.getCache(EHCachingFinancialSecuritySource.class.getName() + "-uid-cache");
assertNotNull(singleSecCache);
assertEquals(1, singleSecCache.getSize());
Element sec1Element = singleSecCache.getQuiet(_security1.getUniqueId());
assertNotNull(sec1Element);
for (int i = 1; i < 10; i++) {
_cachingSecuritySource.get(secKey1);
assertEquals(0, sec1Element.getHitCount());
}
}
@Test
public void getSecurity_ExternalIdBundle_empty() {
ExternalIdBundle secKey = ExternalIdBundle.of(_secId1);
Cache singleSecCache = _cacheManager.getCache(EHCachingFinancialSecuritySource.class.getName() + "-uid-cache");
Security cachedSec = _cachingSecuritySource.getSingle(secKey);
assertNull(cachedSec);
assertEquals(0, singleSecCache.getSize());
}
private void addSecuritiesToMock(Security... securities) {
for (Security security : securities) {
_underlyingSecuritySource.addSecurity(security);
}
}
}