/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.master.historicaltimeseries.impl; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNull; import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import net.sf.ehcache.CacheManager; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import org.threeten.bp.LocalDate; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; import com.opengamma.id.ExternalIdBundleWithDates; import com.opengamma.id.ExternalIdWithDates; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolutionResult; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolver; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolverWithBasicChangeManager; import com.opengamma.master.historicaltimeseries.ManageableHistoricalTimeSeriesInfo; import com.opengamma.util.ehcache.EHCacheUtils; import com.opengamma.util.test.TestGroup; /** * Test. */ @Test(groups = {TestGroup.UNIT, "ehcache"}) public class EHCachingHistoricalTimeSeriesResolverTest { private final LocalDate _date1 = LocalDate.now(); private final LocalDate _date2 = _date1.plusDays(1); private final LocalDate _date3 = _date2.plusDays(1); private final ExternalId _id1 = ExternalId.of("Foo", "1"); private final ExternalId _id2 = ExternalId.of("Foo", "2"); private final ExternalId _id3 = ExternalId.of("Bar", "1"); private final ExternalIdBundle _bundleAll = ExternalIdBundle.of(_id1, _id2); private final ExternalIdBundle _bundle1 = _id1.toBundle(); private final ExternalIdBundle _bundle2 = _id2.toBundle(); private final ExternalIdBundle _bundle3 = _id3.toBundle(); private final ExternalIdWithDates _dateId1 = ExternalIdWithDates.of(_id1, null, null); private final ExternalIdWithDates _dateId2 = ExternalIdWithDates.of(_id2, _date2, _date3); private final ExternalIdBundleWithDates _dateBundle = ExternalIdBundleWithDates.of(_dateId1, _dateId2); private final String _source1 = "S1"; private final String _source2 = "S2"; private final String _provider1 = "P1"; private final String _provider2 = "P2"; private final String _field1 = "F1"; private final String _field2 = "F2"; private final String _key1 = "K1"; private final String _key2 = "K2"; private CacheManager _cacheManager; @BeforeClass public void setUpClass() { _cacheManager = EHCacheUtils.createTestCacheManager(EHCachingHistoricalTimeSeriesResolverTest.class); } @AfterClass public void tearDownClass() { EHCacheUtils.shutdownQuiet(_cacheManager); } //------------------------------------------------------------------------- private HistoricalTimeSeriesResolver createUnderlying(final AtomicInteger hits) { return new HistoricalTimeSeriesResolverWithBasicChangeManager() { @Override public HistoricalTimeSeriesResolutionResult resolve(final ExternalIdBundle identifierBundle, final LocalDate identifierValidityDate, final String dataSource, final String dataProvider, final String dataField, final String resolutionKey) { hits.incrementAndGet(); if ((dataSource != null) && !_source1.equals(dataSource)) { return null; } if ((dataProvider != null) && !_provider1.equals(dataProvider)) { return null; } if (!_field1.equals(dataField)) { return null; } if (identifierBundle != null) { if (_key2.equals(resolutionKey)) { return null; } for (ExternalIdWithDates id : _dateBundle.getExternalIds()) { if ((identifierValidityDate == null) || id.isValidOn(identifierValidityDate)) { if (identifierBundle.contains(id.getExternalId())) { final ManageableHistoricalTimeSeriesInfo info = new ManageableHistoricalTimeSeriesInfo(); info.setDataField(_field1); info.setDataProvider(_provider1); info.setDataSource(_source1); info.setExternalIdBundle(_dateBundle); info.setName("Foo"); info.setObservationTime("Close"); return new HistoricalTimeSeriesResolutionResult(info); } } } return null; } else { return new HistoricalTimeSeriesResolutionResult(null); } } }; } private EHCachingHistoricalTimeSeriesResolver createResolver(final boolean optimistic, final AtomicInteger hits) { final EHCachingHistoricalTimeSeriesResolver resolver = new EHCachingHistoricalTimeSeriesResolver(createUnderlying(hits), _cacheManager, getClass().getName()); resolver.setOptimisticFieldResolution(optimistic); return resolver; } private void testResolve_null(final boolean optimistic, final Collection<EHCachingHistoricalTimeSeriesResolver> resolvers) { final AtomicInteger hits = new AtomicInteger(); final EHCachingHistoricalTimeSeriesResolver resolver = createResolver(optimistic, hits); resolvers.add(resolver); for (int i = 0; i < 3; i++) { assertNotNull(resolver.resolve(null, null, null, null, _field1, null)); assertNull(resolver.resolve(null, null, null, null, _field2, null)); assertNotNull(resolver.resolve(null, null, null, _provider1, _field1, null)); assertNull(resolver.resolve(null, null, null, _provider1, _field2, null)); assertNull(resolver.resolve(null, null, null, _provider2, _field1, null)); assertNull(resolver.resolve(null, null, null, _provider2, _field2, null)); assertNotNull(resolver.resolve(null, null, _source1, null, _field1, null)); assertNull(resolver.resolve(null, null, _source1, null, _field2, null)); assertNull(resolver.resolve(null, null, _source2, null, _field1, null)); assertNull(resolver.resolve(null, null, _source2, null, _field2, null)); assertNotNull(resolver.resolve(null, null, _source1, _provider1, _field1, null)); assertNull(resolver.resolve(null, null, _source1, _provider1, _field2, null)); assertNull(resolver.resolve(null, null, _source2, _provider1, _field1, null)); assertNull(resolver.resolve(null, null, _source2, _provider1, _field2, null)); assertNull(resolver.resolve(null, null, _source1, _provider2, _field1, null)); assertNull(resolver.resolve(null, null, _source1, _provider2, _field2, null)); assertNull(resolver.resolve(null, null, _source2, _provider2, _field1, null)); assertNull(resolver.resolve(null, null, _source2, _provider2, _field2, null)); assertEquals(hits.get(), 18); } } public void testResolve_null_opt() { List<EHCachingHistoricalTimeSeriesResolver> resolvers = new LinkedList<EHCachingHistoricalTimeSeriesResolver>(); try { testResolve_null(true, resolvers); } finally { for (EHCachingHistoricalTimeSeriesResolver resolver : resolvers) { resolver.shutdown(); } } } public void testResolve_null_pess() { List<EHCachingHistoricalTimeSeriesResolver> resolvers = new LinkedList<EHCachingHistoricalTimeSeriesResolver>(); try { testResolve_null(false, resolvers); } finally { for (EHCachingHistoricalTimeSeriesResolver resolver : resolvers) { resolver.shutdown(); } } } private void testResolve_dates(final boolean optimistic, final String dataSource, final String dataProvider, final String resolutionKey, final boolean expectTS, final int hitMask, final Collection<EHCachingHistoricalTimeSeriesResolver> resolvers) { final AtomicInteger hits = new AtomicInteger(); final EHCachingHistoricalTimeSeriesResolver resolver = createResolver(optimistic, hits); resolvers.add(resolver); for (int i = 0; i < 3; i++) { assertEquals(resolver.resolve(_bundleAll, _date1, dataSource, dataProvider, _field1, resolutionKey) != null, expectTS); assertEquals(hits.getAndSet(0), (i == 0) ? ((hitMask & 0x1) != 0 ? 1 : ((hitMask & 0x2) != 0 ? 2 : 0)) : 0); assertNull(resolver.resolve(_bundleAll, _date1, dataSource, dataProvider, _field2, resolutionKey)); assertEquals(hits.getAndSet(0), (i == 0) && ((hitMask & 0x4) != 0) ? 1 : 0); assertEquals(resolver.resolve(_bundleAll, _date2, dataSource, dataProvider, _field1, resolutionKey) != null, expectTS); assertEquals(hits.getAndSet(0), (i == 0) && ((hitMask & 0x8) != 0) ? 1 : 0); assertNull(resolver.resolve(_bundleAll, _date2, dataSource, dataProvider, _field2, resolutionKey)); assertEquals(hits.getAndSet(0), (i == 0) && ((hitMask & 0x10) != 0) ? 1 : 0); assertEquals(resolver.resolve(_bundle1, _date1, dataSource, dataProvider, _field1, resolutionKey) != null, expectTS); assertEquals(hits.getAndSet(0), (i == 0) && ((hitMask & 0x20) != 0) ? 1 : 0); assertNull(resolver.resolve(_bundle1, _date1, dataSource, dataProvider, _field2, resolutionKey)); assertEquals(hits.getAndSet(0), (i == 0) && ((hitMask & 0x40) != 0) ? 1 : 0); assertEquals(resolver.resolve(_bundle1, _date2, dataSource, dataProvider, _field1, resolutionKey) != null, expectTS); assertEquals(hits.getAndSet(0), (i == 0) && ((hitMask & 0x80) != 0) ? 1 : 0); assertNull(resolver.resolve(_bundle1, _date2, dataSource, dataProvider, _field2, resolutionKey)); assertEquals(hits.getAndSet(0), (i == 0) && ((hitMask & 0x100) != 0) ? 1 : 0); assertNull(resolver.resolve(_bundle2, _date1, dataSource, dataProvider, _field1, resolutionKey)); assertEquals(hits.getAndSet(0), (i == 0) ? ((hitMask & 0x200) != 0 ? 1 : ((hitMask & 0x400) != 0 ? 2 : 0)) : 0); assertNull(resolver.resolve(_bundle2, _date1, dataSource, dataProvider, _field2, resolutionKey)); assertEquals(hits.getAndSet(0), (i == 0) && ((hitMask & 0x800) != 0) ? 1 : 0); assertEquals(resolver.resolve(_bundle2, _date2, dataSource, dataProvider, _field1, resolutionKey) != null, expectTS); assertEquals(hits.getAndSet(0), (i == 0) && ((hitMask & 0x1000) != 0) ? 1 : 0); assertNull(resolver.resolve(_bundle2, _date2, dataSource, dataProvider, _field2, resolutionKey)); assertEquals(hits.getAndSet(0), (i == 0) && ((hitMask & 0x2000) != 0) ? 1 : 0); assertNull(resolver.resolve(_bundle3, _date1, dataSource, dataProvider, _field1, resolutionKey)); assertEquals(hits.getAndSet(0), (i == 0) && ((hitMask & 0x4000) != 0) ? 1 : 0); assertNull(resolver.resolve(_bundle3, _date1, dataSource, dataProvider, _field2, resolutionKey)); assertEquals(hits.getAndSet(0), (i == 0) && ((hitMask & 0x8000) != 0) ? 1 : 0); assertNull(resolver.resolve(_bundle3, _date2, dataSource, dataProvider, _field1, resolutionKey)); assertEquals(hits.getAndSet(0), (i == 0) && ((hitMask & 0x10000) != 0) ? 1 : 0); assertNull(resolver.resolve(_bundle3, _date2, dataSource, dataProvider, _field2, resolutionKey)); assertEquals(hits.getAndSet(0), (i == 0) && ((hitMask & 0x20000) != 0) ? 1 : 0); } } public void testResolve_dates_opt() { List<EHCachingHistoricalTimeSeriesResolver> resolvers = new LinkedList<EHCachingHistoricalTimeSeriesResolver>(); try { testResolve_dates(true, null, null, null, true, 0x3D215, resolvers); testResolve_dates(true, null, null, _key1, true, 0x3D215, resolvers); testResolve_dates(true, null, null, _key2, false, 0x3C01D, resolvers); testResolve_dates(true, null, _provider1, null, true, 0x3C214, resolvers); testResolve_dates(true, null, _provider1, _key1, true, 0x3C214, resolvers); testResolve_dates(true, null, _provider1, _key2, false, 0x3C01D, resolvers); testResolve_dates(true, null, _provider2, null, false, 0x3C01D, resolvers); testResolve_dates(true, null, _provider2, _key1, false, 0x3C01D, resolvers); testResolve_dates(true, null, _provider2, _key2, false, 0x3C01D, resolvers); testResolve_dates(true, _source1, null, null, true, 0x3C214, resolvers); testResolve_dates(true, _source1, null, _key1, true, 0x3C214, resolvers); testResolve_dates(true, _source1, null, _key2, false, 0x3C01D, resolvers); testResolve_dates(true, _source1, _provider1, null, true, 0x3C214, resolvers); testResolve_dates(true, _source1, _provider1, _key1, true, 0x3C214, resolvers); testResolve_dates(true, _source1, _provider1, _key2, false, 0x3C01D, resolvers); testResolve_dates(true, _source1, _provider2, null, false, 0x3C01D, resolvers); testResolve_dates(true, _source1, _provider2, _key1, false, 0x3C01D, resolvers); testResolve_dates(true, _source1, _provider2, _key2, false, 0x3C01D, resolvers); testResolve_dates(true, _source2, null, null, false, 0x3C01D, resolvers); testResolve_dates(true, _source2, null, _key1, false, 0x3C01D, resolvers); testResolve_dates(true, _source2, null, _key2, false, 0x3C01D, resolvers); testResolve_dates(true, _source2, _provider1, null, false, 0x3C01D, resolvers); testResolve_dates(true, _source2, _provider1, _key1, false, 0x3C01D, resolvers); testResolve_dates(true, _source2, _provider1, _key2, false, 0x3C01D, resolvers); testResolve_dates(true, _source2, _provider2, null, false, 0x3C01D, resolvers); testResolve_dates(true, _source2, _provider2, _key1, false, 0x3C01D, resolvers); testResolve_dates(true, _source2, _provider2, _key2, false, 0x3C01D, resolvers); } finally { for (EHCachingHistoricalTimeSeriesResolver resolver : resolvers) { resolver.shutdown(); } } } public void testResolve_dates_pess() { List<EHCachingHistoricalTimeSeriesResolver> resolvers = new LinkedList<EHCachingHistoricalTimeSeriesResolver>(); try { testResolve_dates(false, null, null, null, true, 0x15206, resolvers); testResolve_dates(false, null, null, _key1, true, 0x15201, resolvers); testResolve_dates(false, null, null, _key2, false, 0x14009, resolvers); testResolve_dates(false, null, _provider1, null, true, 0x14404, resolvers); testResolve_dates(false, null, _provider1, _key1, true, 0x14200, resolvers); testResolve_dates(false, null, _provider1, _key2, false, 0x14009, resolvers); testResolve_dates(false, null, _provider2, null, false, 0x5, resolvers); testResolve_dates(false, null, _provider2, _key1, false, 0, resolvers); testResolve_dates(false, null, _provider2, _key2, false, 0, resolvers); testResolve_dates(false, _source1, null, null, true, 0x14404, resolvers); testResolve_dates(false, _source1, null, _key1, true, 0x14200, resolvers); testResolve_dates(false, _source1, null, _key2, false, 0x14009, resolvers); testResolve_dates(false, _source1, _provider1, null, true, 0x14404, resolvers); testResolve_dates(false, _source1, _provider1, _key1, true, 0x14200, resolvers); testResolve_dates(false, _source1, _provider1, _key2, false, 0x14009, resolvers); testResolve_dates(false, _source1, _provider2, null, false, 0x5, resolvers); testResolve_dates(false, _source1, _provider2, _key1, false, 0, resolvers); testResolve_dates(false, _source1, _provider2, _key2, false, 0, resolvers); testResolve_dates(false, _source2, null, null, false, 0x5, resolvers); testResolve_dates(false, _source2, null, _key1, false, 0, resolvers); testResolve_dates(false, _source2, null, _key2, false, 0, resolvers); testResolve_dates(false, _source2, _provider1, null, false, 0x5, resolvers); testResolve_dates(false, _source2, _provider1, _key1, false, 0, resolvers); testResolve_dates(false, _source2, _provider1, _key2, false, 0, resolvers); testResolve_dates(false, _source2, _provider2, null, false, 0x5, resolvers); testResolve_dates(false, _source2, _provider2, _key1, false, 0, resolvers); testResolve_dates(false, _source2, _provider2, _key2, false, 0, resolvers); } finally { for (EHCachingHistoricalTimeSeriesResolver resolver : resolvers) { resolver.shutdown(); } } } private void testResolve_nodates(final boolean optimistic, final String dataSource, final String dataProvider, final String resolutionKey, final boolean expectTS, final int hitMask, Collection<EHCachingHistoricalTimeSeriesResolver> resolvers) { final AtomicInteger hits = new AtomicInteger(); final EHCachingHistoricalTimeSeriesResolver resolver = createResolver(optimistic, hits); resolvers.add(resolver); for (int i = 0; i < 3; i++) { assertEquals(resolver.resolve(_bundleAll, null, dataSource, dataProvider, _field1, resolutionKey) != null, expectTS); assertEquals(hits.getAndSet(0), (i == 0) ? ((hitMask & 0x1) != 0 ? 1 : ((hitMask & 0x2) != 0 ? 2 : 0)) : 0); assertNull(resolver.resolve(_bundleAll, null, dataSource, dataProvider, _field2, resolutionKey)); assertEquals(hits.getAndSet(0), (i == 0) && ((hitMask & 0x4) != 0) ? 1 : 0); assertEquals(resolver.resolve(_bundle1, null, dataSource, dataProvider, _field1, resolutionKey) != null, expectTS); assertEquals(hits.getAndSet(0), (i == 0) && ((hitMask & 0x8) != 0) ? 1 : 0); assertNull(resolver.resolve(_bundle1, null, dataSource, dataProvider, _field2, resolutionKey)); assertEquals(hits.getAndSet(0), (i == 0) && ((hitMask & 0x10) != 0) ? 1 : 0); assertEquals(resolver.resolve(_bundle2, null, dataSource, dataProvider, _field1, resolutionKey) != null, expectTS); assertEquals(hits.getAndSet(0), (i == 0) ? ((hitMask & 0x20) != 0 ? 1 : ((hitMask & 0x40) != 0 ? 2 : 0)) : 0); assertNull(resolver.resolve(_bundle2, null, dataSource, dataProvider, _field2, resolutionKey)); assertEquals(hits.getAndSet(0), (i == 0) && ((hitMask & 0x80) != 0) ? 1 : 0); } } public void testResolve_nodates_opt() { List<EHCachingHistoricalTimeSeriesResolver> resolvers = new LinkedList<EHCachingHistoricalTimeSeriesResolver>(); try { testResolve_nodates(true, null, null, null, true, 0x5, resolvers); testResolve_nodates(true, null, null, _key1, true, 0x5, resolvers); testResolve_nodates(true, null, null, _key2, false, 0x5, resolvers); testResolve_nodates(true, null, _provider1, null, true, 0x4, resolvers); testResolve_nodates(true, null, _provider1, _key1, true, 0x4, resolvers); testResolve_nodates(true, null, _provider1, _key2, false, 0x5, resolvers); testResolve_nodates(true, null, _provider2, null, false, 0x5, resolvers); testResolve_nodates(true, null, _provider2, _key1, false, 0x5, resolvers); testResolve_nodates(true, null, _provider2, _key2, false, 0x5, resolvers); testResolve_nodates(true, _source1, null, null, true, 0x4, resolvers); testResolve_nodates(true, _source1, null, _key1, true, 0x4, resolvers); testResolve_nodates(true, _source1, null, _key2, false, 0x5, resolvers); testResolve_nodates(true, _source1, _provider1, null, true, 0x4, resolvers); testResolve_nodates(true, _source1, _provider1, _key1, true, 0x4, resolvers); testResolve_nodates(true, _source1, _provider1, _key2, false, 0x5, resolvers); testResolve_nodates(true, _source1, _provider2, null, false, 0x5, resolvers); testResolve_nodates(true, _source1, _provider2, _key1, false, 0x5, resolvers); testResolve_nodates(true, _source1, _provider2, _key2, false, 0x5, resolvers); testResolve_nodates(true, _source2, null, null, false, 0x5, resolvers); testResolve_nodates(true, _source2, null, _key1, false, 0x5, resolvers); testResolve_nodates(true, _source2, null, _key2, false, 0x5, resolvers); testResolve_nodates(true, _source2, _provider1, null, false, 0x5, resolvers); testResolve_nodates(true, _source2, _provider1, _key1, false, 0x5, resolvers); testResolve_nodates(true, _source2, _provider1, _key2, false, 0x5, resolvers); testResolve_nodates(true, _source2, _provider2, null, false, 0x5, resolvers); testResolve_nodates(true, _source2, _provider2, _key1, false, 0x5, resolvers); testResolve_nodates(true, _source2, _provider2, _key2, false, 0x5, resolvers); } finally { for (EHCachingHistoricalTimeSeriesResolver resolver : resolvers) { resolver.shutdown(); } } } public void testResolve_nodates_pess() { List<EHCachingHistoricalTimeSeriesResolver> resolvers = new LinkedList<EHCachingHistoricalTimeSeriesResolver>(); try { testResolve_nodates(false, null, null, null, true, 0x6, resolvers); testResolve_nodates(false, null, null, _key1, true, 0x1, resolvers); testResolve_nodates(false, null, null, _key2, false, 0x1, resolvers); testResolve_nodates(false, null, _provider1, null, true, 0x4, resolvers); testResolve_nodates(false, null, _provider1, _key1, true, 0, resolvers); testResolve_nodates(false, null, _provider1, _key2, false, 0x2, resolvers); testResolve_nodates(false, null, _provider2, null, false, 0x5, resolvers); testResolve_nodates(false, null, _provider2, _key1, false, 0, resolvers); testResolve_nodates(false, null, _provider2, _key2, false, 0, resolvers); testResolve_nodates(false, _source1, null, null, true, 0x4, resolvers); testResolve_nodates(false, _source1, null, _key1, true, 0x0, resolvers); testResolve_nodates(false, _source1, null, _key2, false, 0x2, resolvers); testResolve_nodates(false, _source1, _provider1, null, true, 0x4, resolvers); testResolve_nodates(false, _source1, _provider1, _key1, true, 0x0, resolvers); testResolve_nodates(false, _source1, _provider1, _key2, false, 0x2, resolvers); testResolve_nodates(false, _source1, _provider2, null, false, 0x5, resolvers); testResolve_nodates(false, _source1, _provider2, _key1, false, 0, resolvers); testResolve_nodates(false, _source1, _provider2, _key2, false, 0, resolvers); testResolve_nodates(false, _source2, null, null, false, 0x5, resolvers); testResolve_nodates(false, _source2, null, _key1, false, 0, resolvers); testResolve_nodates(false, _source2, null, _key2, false, 0, resolvers); testResolve_nodates(false, _source2, _provider1, null, false, 0x5, resolvers); testResolve_nodates(false, _source2, _provider1, _key1, false, 0, resolvers); testResolve_nodates(false, _source2, _provider1, _key2, false, 0, resolvers); testResolve_nodates(false, _source2, _provider2, null, false, 0x5, resolvers); testResolve_nodates(false, _source2, _provider2, _key1, false, 0, resolvers); testResolve_nodates(false, _source2, _provider2, _key2, false, 0, resolvers); } finally { for (EHCachingHistoricalTimeSeriesResolver resolver : resolvers) { resolver.shutdown(); } } } }