/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.livedata.server; import static org.testng.Assert.assertEquals; import java.util.Timer; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalScheme; import com.opengamma.livedata.LiveDataSpecification; import com.opengamma.livedata.client.HeartbeatSender; import com.opengamma.livedata.client.Heartbeater; import com.opengamma.livedata.client.ValueDistributor; import com.opengamma.livedata.test.CollectingLiveDataListener; import com.opengamma.transport.DirectInvocationByteArrayMessageSender; import com.opengamma.util.ehcache.EHCacheUtils; import com.opengamma.util.fudgemsg.OpenGammaFudgeContext; import com.opengamma.util.test.TestGroup; import net.sf.ehcache.CacheManager; /** * Test. */ @Test(groups = {TestGroup.UNIT_SLOW}) public class ExpirationManagerTest { private CacheManager _cacheManager; @BeforeClass public void setUpClass() { _cacheManager = EHCacheUtils.createTestCacheManager(getClass()); } @AfterClass public void tearDownClass() { EHCacheUtils.shutdownQuiet(_cacheManager); } //------------------------------------------------------------------------- public void expirationWithHeartbeatSendingClient() throws InterruptedException { ExternalScheme identificationDomain = ExternalScheme.of("BbgId"); MockLiveDataServer dataServer = new MockLiveDataServer(identificationDomain, _cacheManager); dataServer.connect(); ExpirationManager expirationManager = dataServer.getExpirationManager(); // Set expiration timeout artificially low expirationManager.setTimeoutExtension(300); HeartbeatReceiver receiver = new HeartbeatReceiver(expirationManager); DirectInvocationByteArrayMessageSender conduit = new DirectInvocationByteArrayMessageSender(receiver); ValueDistributor valueDistributor = new ValueDistributor(); Timer t = new Timer("HeartbeatConduitTest"); new Heartbeater(valueDistributor, new HeartbeatSender(conduit, OpenGammaFudgeContext.getInstance()), t, 100); // subscribe on the client side - starts sending heartbeats LiveDataSpecification subscription = new LiveDataSpecification( dataServer.getDefaultNormalizationRuleSetId(), ExternalId.of(identificationDomain, "USSw5 Curncy")); CollectingLiveDataListener listener = new CollectingLiveDataListener(); valueDistributor.addListener(subscription, listener); // subscribe on the server side dataServer.subscribe(subscription, false); // Send a couple of heartbeats Thread.sleep(300); // Stop sending heartbeats valueDistributor.removeListener(subscription, listener); // Wait for expiry Thread.sleep(500); expirationManager.housekeep(dataServer); assertEquals(dataServer.getActualSubscriptions().size(), 1); assertEquals(dataServer.getActualUnsubscriptions().size(), 1); assertEquals(dataServer.getActualSubscriptions().get(0), subscription.getIdentifier(identificationDomain)); assertEquals(dataServer.getActualSubscriptions().get(0), subscription.getIdentifier(identificationDomain)); } public void expirationWithClientThatDoesNotSendHeartbeats() throws InterruptedException { ExternalScheme identificationDomain = ExternalScheme.of("BbgId"); MockLiveDataServer dataServer = new MockLiveDataServer(identificationDomain, _cacheManager); dataServer.connect(); ExpirationManager expirationManager = dataServer.getExpirationManager(); // Set expiration timeout artificially low expirationManager.setTimeoutExtension(50); // subscribe on the server side LiveDataSpecification subscription = new LiveDataSpecification( dataServer.getDefaultNormalizationRuleSetId(), ExternalId.of(identificationDomain, "USSw5 Curncy")); dataServer.subscribe("USSw5 Curncy"); assertEquals(dataServer.getActualSubscriptions().size(), 1); assertEquals(dataServer.getActualSubscriptions().get(0), subscription.getIdentifier(identificationDomain)); // Wait for expiry Thread.sleep(200); expirationManager.housekeep(dataServer); assertEquals(dataServer.getActualUnsubscriptions().size(), 1); assertEquals(dataServer.getActualUnsubscriptions().get(0), subscription.getIdentifier(identificationDomain)); } public void heartbeatWhenNoSubscriptionCreatesNewSubscription() throws InterruptedException { ExternalScheme identificationDomain = ExternalScheme.of("BbgId"); MockLiveDataServer dataServer = new MockLiveDataServer(identificationDomain, _cacheManager); dataServer.connect(); ExpirationManager expirationManager = dataServer.getExpirationManager(); // Set expiration timeout artificially low expirationManager.setTimeoutExtension(300); HeartbeatReceiver receiver = new HeartbeatReceiver(expirationManager); DirectInvocationByteArrayMessageSender conduit = new DirectInvocationByteArrayMessageSender(receiver); ValueDistributor valueDistributor = new ValueDistributor(); Timer t = new Timer("HeartbeatConduitTest"); new Heartbeater(valueDistributor, new HeartbeatSender(conduit, OpenGammaFudgeContext.getInstance()), t, 100); // subscribe on the client side - starts sending heartbeats LiveDataSpecification subscription = new LiveDataSpecification( dataServer.getDefaultNormalizationRuleSetId(), ExternalId.of(identificationDomain, "USSw5 Curncy")); CollectingLiveDataListener listener = new CollectingLiveDataListener(); valueDistributor.addListener(subscription, listener); assertEquals(dataServer.getSubscriptions().size(), 0); // subscribe on the server side dataServer.subscribe(subscription, false); // Send a couple of heartbeats Thread.sleep(300); assertEquals(dataServer.getSubscriptions().size(), 1); // Unsubscribe the server dataServer.unsubscribe(subscription.getIdentifier(identificationDomain)); assertEquals(dataServer.getSubscriptions().size(), 0); // Send a couple of heartbeats Thread.sleep(300); expirationManager.housekeep(dataServer); // Now we should be subscribed again due to heartbeating assertEquals(dataServer.getSubscriptions().size(), 1); // Check the recording of what happened: // we subscribed (via client), unsubscribed (at the server) and subscribed again (due to heartbeating) assertEquals(dataServer.getActualSubscriptions().size(), 2); assertEquals(dataServer.getActualUnsubscriptions().size(), 1); assertEquals(dataServer.getActualSubscriptions().get(0), subscription.getIdentifier(identificationDomain)); assertEquals(dataServer.getActualSubscriptions().get(1), subscription.getIdentifier(identificationDomain)); assertEquals(dataServer.getActualUnsubscriptions().get(0), subscription.getIdentifier(identificationDomain)); } }