/**
* 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.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertNull;
import static org.testng.AssertJUnit.assertSame;
import static org.testng.AssertJUnit.assertTrue;
import java.util.Collections;
import net.sf.ehcache.CacheManager;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.opengamma.id.ExternalId;
import com.opengamma.id.ExternalScheme;
import com.opengamma.livedata.LiveDataSpecification;
import com.opengamma.livedata.UserPrincipal;
import com.opengamma.livedata.msg.LiveDataSubscriptionRequest;
import com.opengamma.livedata.msg.LiveDataSubscriptionResponse;
import com.opengamma.livedata.msg.LiveDataSubscriptionResponseMsg;
import com.opengamma.livedata.msg.LiveDataSubscriptionResult;
import com.opengamma.livedata.msg.SubscriptionType;
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.
*/
@Test(groups = {TestGroup.UNIT, "ehcache" })
public class MockLiveDataServerTest {
private ExternalScheme _domain;
private MockLiveDataServer _server;
private CacheManager _cacheManager;
@BeforeClass
public void setUpClass() {
_cacheManager = EHCacheUtils.createTestCacheManager(getClass());
}
@AfterClass
public void tearDownClass() {
EHCacheUtils.shutdownQuiet(_cacheManager);
}
@BeforeMethod
public void setUp() {
_domain = ExternalScheme.of("test");
_server = new MockLiveDataServer(_domain, _cacheManager);
_server.connect();
}
//-------------------------------------------------------------------------
public void persistentSubscription() {
getMethods("persistent", true);
}
public void nonpersistentSubscription() {
getMethods("nonpersistent", false);
}
private LiveDataSpecification getSpec(String uniqueId) {
LiveDataSpecification spec = new LiveDataSpecification(
_server.getDefaultNormalizationRuleSetId(),
ExternalId.of(_server.getUniqueIdDomain(), uniqueId));
return spec;
}
private void getMethods(String uniqueId, boolean persistent) {
LiveDataSpecification spec = getSpec(uniqueId);
LiveDataSubscriptionResponse result = _server.subscribe(uniqueId, persistent);
assertNotNull(result);
assertTrue(result.getSubscriptionResult() == LiveDataSubscriptionResult.SUCCESS);
String distributionSpec = result.getTickDistributionSpecification();
assertNotNull(distributionSpec);
Subscription subscription = _server.getSubscription(uniqueId);
assertNotNull(subscription);
assertEquals(uniqueId, subscription.getSecurityUniqueId());
assertEquals(1, subscription.getDistributors().size());
assertSame(subscription, _server.getSubscription(spec));
assertTrue(_server.isSubscribedTo(subscription));
assertFalse(_server.isSubscribedTo(new Subscription("foo", _server.getMarketDataSenderFactory(), new MapLastKnownValueStoreProvider())));
assertTrue(_server.isSubscribedTo(uniqueId));
assertFalse(_server.isSubscribedTo("foo"));
assertTrue(_server.isSubscribedTo(spec));
assertFalse(_server.isSubscribedTo(getSpec("foo")));
assertEquals(1, _server.getSubscriptions().size());
assertEquals(1, _server.getNumActiveSubscriptions());
assertSame(subscription, _server.getSubscriptions().iterator().next());
assertEquals(1, _server.getActiveSubscriptionIds().size());
assertEquals(uniqueId, _server.getActiveSubscriptionIds().iterator().next());
assertEquals(0, _server.getNumLiveDataUpdatesSentPerSecondOverLastMinute(), 0.0001);
assertEquals(0, _server.getNumMarketDataUpdatesReceived());
MarketDataDistributor distributor = subscription.getDistributors().iterator().next();
assertSame(distributor, subscription.getMarketDataDistributor(spec));
assertSame(distributor, _server.getMarketDataDistributor(spec));
assertTrue(distributor.isPersistent() == persistent);
assertNotNull(distributor.getExpiry());
}
public void subscribeUnsubscribeA() {
_server.subscribe("nonpersistent", false);
_server.subscribe("persistent", true);
assertTrue(_server.unsubscribe("nonpersistent"));
assertTrue(_server.unsubscribe("persistent"));
assertNull(_server.getSubscription("nonpersistent"));
assertNull(_server.getSubscription("persistent"));
assertFalse(_server.isSubscribedTo("nonpersistent"));
assertFalse(_server.isSubscribedTo("persistent"));
}
public void subscribeUnsubscribeB() {
_server.subscribe("nonpersistent", false);
_server.subscribe("persistent", true);
Subscription nonpersistent = _server.getSubscription("nonpersistent");
Subscription persistent = _server.getSubscription("persistent");
assertTrue(_server.unsubscribe(nonpersistent));
assertTrue(_server.unsubscribe(persistent));
}
public void subscribeUnsubscribeC() {
UserPrincipal user = new UserPrincipal("mark", "1.1.1.1");
LiveDataSpecification requestedSpec = new LiveDataSpecification(
StandardRules.getNoNormalization().getId(),
ExternalId.of(_domain, "testsub"));
LiveDataSubscriptionRequest request = new LiveDataSubscriptionRequest(
user,
SubscriptionType.NON_PERSISTENT,
Collections.singleton(requestedSpec));
LiveDataSubscriptionResponseMsg response = _server.subscriptionRequestMade(request);
checkResponse(user, requestedSpec, response);
assertTrue(_server.unsubscribe("testsub"));
response = _server.subscriptionRequestMade(request);
checkResponse(user, requestedSpec, response);
assertTrue(_server.unsubscribe("testsub"));
}
public void subscribeThenStopDistributor() {
_server.subscribe("mysub", false);
_server.subscribe("mysub", false);
_server.subscribe("mysub", true);
assertEquals(1, _server.getNumActiveSubscriptions());
Subscription sub = _server.getSubscription("mysub");
assertEquals(1, sub.getDistributors().size());
LiveDataSpecification spec = getSpec("mysub");
MarketDataDistributor distributor = _server.getMarketDataDistributor(spec);
assertNotNull(distributor);
assertFalse(_server.stopDistributor(distributor));
distributor.setPersistent(false);
assertTrue(_server.stopDistributor(distributor));
assertTrue(sub.getDistributors().isEmpty());
assertFalse(_server.isSubscribedTo("mysub"));
assertNull(_server.getSubscription("mysub"));
assertNull(_server.getSubscription(spec));
assertNull(_server.getMarketDataDistributor(spec));
assertEquals(0, _server.getNumActiveSubscriptions());
assertFalse(_server.stopDistributor(distributor));
}
private void checkResponse(UserPrincipal user, LiveDataSpecification requestedSpec,
LiveDataSubscriptionResponseMsg response) {
assertEquals(user, response.getRequestingUser());
assertEquals(1, response.getResponses().size());
assertEquals(requestedSpec, response.getResponses().get(0).getRequestedSpecification());
assertEquals(requestedSpec, response.getResponses().get(0).getFullyQualifiedSpecification()); // mock server does not modify spec
assertEquals(LiveDataSubscriptionResult.SUCCESS, response.getResponses().get(0).getSubscriptionResult());
assertEquals(null, response.getResponses().get(0).getSnapshot());
assertEquals(requestedSpec.getIdentifiers().toString(), response.getResponses().get(0).getTickDistributionSpecification());
assertEquals(null, response.getResponses().get(0).getUserMessage());
}
public void snapshot() {
UserPrincipal user = new UserPrincipal("mark", "1.1.1.1");
LiveDataSpecification requestedSpec = new LiveDataSpecification(
StandardRules.getNoNormalization().getId(),
ExternalId.of(_domain, "testsub"));
LiveDataSubscriptionRequest request = new LiveDataSubscriptionRequest(
user,
SubscriptionType.SNAPSHOT,
Collections.singleton(requestedSpec));
LiveDataSubscriptionResponseMsg response = _server.subscriptionRequestMade(request);
assertEquals(user, response.getRequestingUser());
assertEquals(1, response.getResponses().size());
assertEquals(requestedSpec, response.getResponses().get(0).getRequestedSpecification());
assertNull(response.getResponses().get(0).getFullyQualifiedSpecification());
assertEquals(LiveDataSubscriptionResult.INTERNAL_ERROR, response.getResponses().get(0).getSubscriptionResult());
assertNull(response.getResponses().get(0).getSnapshot());
assertNull(response.getResponses().get(0).getTickDistributionSpecification());
assertEquals("When snapshot for testsub was run through normalization, the message disappeared. " +
"This indicates there are buggy normalization rules in place, or that buggy (or unexpected) data was " +
"received from the underlying market data API. Check your normalization rules. " +
"Raw, unnormalized msg = FudgeMsg[]",
response.getResponses().get(0).getUserMessage());
assertFalse(_server.unsubscribe("testsub"));
}
}