package com.opengamma.livedata.server; import static org.testng.AssertJUnit.assertEquals; import java.util.HashSet; import java.util.Queue; import java.util.Set; import java.util.concurrent.LinkedBlockingQueue; import net.sf.ehcache.CacheManager; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import com.google.common.collect.Sets; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalScheme; import com.opengamma.livedata.LiveDataSpecification; import com.opengamma.livedata.normalization.StandardRules; import com.opengamma.livedata.server.distribution.MarketDataDistributor; import com.opengamma.util.ehcache.EHCacheUtils; import com.opengamma.util.test.TestGroup; @Test(groups = {TestGroup.UNIT, "ehcache"}) public class AbstractPersistentSubscriptionManagerTest { //TODO test async logic private final ExternalScheme _scheme = ExternalScheme.of("SomeScheme"); private final String _normalizationRulesetId = StandardRules.getNoNormalization().getId(); private CacheManager _cacheManager; @BeforeClass public void setUpClass() { _cacheManager = EHCacheUtils.createTestCacheManager(getClass()); } @AfterClass public void tearDownClass() { EHCacheUtils.shutdownQuiet(_cacheManager); } //------------------------------------------------------------------------- @Test public void testNormalStartup() throws InterruptedException { MockLiveDataServer server = new MockLiveDataServer(_scheme, _cacheManager); TestPersistentSubscriptionManager subManager = new TestPersistentSubscriptionManager(server); String ticker = "X"; subManager.getPendingReads().add(Sets.newHashSet(getSubscription(ticker))); server.start(); subManager.start(); Thread.sleep(1000); assertEquals(Sets.newHashSet(ticker), server.getActiveSubscriptionIds()); subManager.stop(); server.stop(); } @Test public void testLateRefresh() throws InterruptedException { MockLiveDataServer server = new MockLiveDataServer(_scheme, _cacheManager); TestPersistentSubscriptionManager subManager = new TestPersistentSubscriptionManager(server); String ticker = "X"; subManager.getPendingReads().add(new HashSet<PersistentSubscription>()); subManager.getPendingReads().add(Sets.newHashSet(getSubscription(ticker))); server.start(); subManager.start(); Thread.sleep(1000); assertEquals(new HashSet<String>(), server.getActiveSubscriptionIds()); server.subscribe(ticker); assertEquals(Sets.newHashSet(ticker), server.getActiveSubscriptionIds()); MarketDataDistributor marketDataDistributor = server.getMarketDataDistributor(ticker); assertEquals(false, marketDataDistributor.isPersistent()); subManager.refresh(); Thread.sleep(1000); assertEquals(true, marketDataDistributor.isPersistent()); assertEquals(Sets.newHashSet(ticker), server.getActiveSubscriptionIds()); subManager.stop(); server.stop(); } private PersistentSubscription getSubscription(String ticker) { return new PersistentSubscription(getSpec(ticker)); } private LiveDataSpecification getSpec(String ticker) { return new LiveDataSpecification(_normalizationRulesetId, ExternalId.of(_scheme, ticker)); } class TestPersistentSubscriptionManager extends AbstractPersistentSubscriptionManager { public TestPersistentSubscriptionManager(StandardLiveDataServer server) { super(server); } private final Queue<Set<PersistentSubscription>> _pendingReads = new LinkedBlockingQueue<Set<PersistentSubscription>>(); private final Queue<Set<PersistentSubscription>> _pendingWrites= new LinkedBlockingQueue<Set<PersistentSubscription>>(); @Override protected void readFromStorage() { Set<PersistentSubscription> remove = _pendingReads.remove(); for (PersistentSubscription persistentSubscription : remove) { addPersistentSubscription(persistentSubscription); } } @Override public void saveToStorage(Set<PersistentSubscription> newState) { _pendingWrites.add(newState); } public Queue<Set<PersistentSubscription>> getPendingReads() { return _pendingReads; } public Queue<Set<PersistentSubscription>> getPendingWrites() { return _pendingWrites; } } }