/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.livedata.server.distribution;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertTrue;
import org.fudgemsg.FudgeContext;
import org.fudgemsg.FudgeMsgEnvelope;
import org.fudgemsg.MutableFudgeMsg;
import org.fudgemsg.mapping.FudgeDeserializer;
import org.springframework.jms.listener.DefaultMessageListenerContainer;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.opengamma.livedata.LiveDataValueUpdateBean;
import com.opengamma.livedata.LiveDataValueUpdateBeanFudgeBuilder;
import com.opengamma.transport.CollectingByteArrayMessageReceiver;
import com.opengamma.transport.jms.JmsByteArrayMessageDispatcher;
import com.opengamma.util.fudgemsg.OpenGammaFudgeContext;
import com.opengamma.util.jms.JmsConnector;
import com.opengamma.util.test.ActiveMQTestUtils;
import com.opengamma.util.test.TestGroup;
/**
*
*/
@Test(groups = TestGroup.INTEGRATION)
// PL 24.6.2010: Putting on ignore as it's failing intermittently on Bamboo and I can't figure out why
public class JmsSenderTest {
private CollectingByteArrayMessageReceiver _collectingReceiver;
private DefaultMessageListenerContainer _container;
private MarketDataDistributor _mdd;
private JmsSenderFactory _factory;
@BeforeClass
public void setUpClass() {
JmsConnector jmsConnector = ActiveMQTestUtils.createTestJmsConnector();
_factory = new JmsSenderFactory(jmsConnector);
_mdd = MarketDataDistributorTest.getTestDistributor(_factory);
_collectingReceiver = new CollectingByteArrayMessageReceiver();
JmsByteArrayMessageDispatcher messageDispatcher = new JmsByteArrayMessageDispatcher(_collectingReceiver);
_container = new DefaultMessageListenerContainer();
_container.setConnectionFactory(jmsConnector.getConnectionFactory());
_container.setMessageListener(messageDispatcher);
_container.setDestinationName(_mdd.getDistributionSpec().getJmsTopic());
_container.setPubSubDomain(true);
_container.afterPropertiesSet();
_container.start();
}
@AfterClass
public void tearDown() {
_container.stop();
_container.destroy();
}
@BeforeMethod
public void setUp() {
_collectingReceiver.clearMessages();
}
//-------------------------------------------------------------------------
private void ensureStarted() {
assertTrue(_container.isActive());
assertTrue(_container.isRunning());
assertEquals(1, _container.getActiveConsumerCount());
}
@Test(timeOut=30000, enabled = false)
public void simpleScenario() throws Exception {
ensureStarted();
FudgeContext fudgeContext = OpenGammaFudgeContext.getInstance();
MutableFudgeMsg msg = fudgeContext.newMessage();
msg.add("name", "ruby");
_mdd.distributeLiveData(msg);
_mdd.distributeLiveData(FudgeContext.EMPTY_MESSAGE); // empty message not sent
// allow data to flow through
while (_collectingReceiver.getMessages().isEmpty()) {
Thread.sleep(100);
}
Thread.sleep(100);
assertEquals(1, _collectingReceiver.getMessages().size());
FudgeDeserializer deserializer = new FudgeDeserializer(fudgeContext);
for (byte[] byteArray : _collectingReceiver.getMessages()) {
FudgeMsgEnvelope msgEnvelope = fudgeContext.deserialize(byteArray);
LiveDataValueUpdateBean update = LiveDataValueUpdateBeanFudgeBuilder.fromFudgeMsg(deserializer, msgEnvelope.getMessage());
assertEquals(msg, update.getFields());
}
}
@Test(timeOut=30000, enabled = false)
public void reconnectionScenario() throws Exception {
ensureStarted();
FudgeContext fudgeContext = OpenGammaFudgeContext.getInstance();
MutableFudgeMsg msg1 = fudgeContext.newMessage();
msg1.add("name", "olivia");
MutableFudgeMsg msg2 = fudgeContext.newMessage();
msg2.add("name", "ruby");
MutableFudgeMsg msg3 = fudgeContext.newMessage();
msg3.add("name", "sophie"); // will overwrite ruby
msg3.add("address", "london");
MutableFudgeMsg msg4 = fudgeContext.newMessage();
msg4.add("name", "chloe");
_mdd.distributeLiveData(msg1);
_factory.transportInterrupted();
_mdd.distributeLiveData(msg2);
_mdd.distributeLiveData(msg3);
_factory.transportResumed();
_mdd.distributeLiveData(msg4);
// allow data to flow through
while (_collectingReceiver.getMessages().size() < 3) {
Thread.sleep(100);
}
Thread.sleep(100);
assertEquals(3, _collectingReceiver.getMessages().size());
LiveDataValueUpdateBean[] updates = new LiveDataValueUpdateBean[3];
FudgeDeserializer deserializer = new FudgeDeserializer(fudgeContext);
for (int i = 0; i < _collectingReceiver.getMessages().size(); i++) {
FudgeMsgEnvelope msgEnvelope = fudgeContext.deserialize(_collectingReceiver.getMessages().get(i));
LiveDataValueUpdateBean update = LiveDataValueUpdateBeanFudgeBuilder.fromFudgeMsg(deserializer, msgEnvelope.getMessage());
updates[i] = update;
}
assertEquals(msg1, updates[0].getFields());
assertEquals(1, updates[0].getSequenceNumber()); // starts from 1 because simpleScenario() already sent 1
assertEquals(msg3, updates[1].getFields());
assertEquals(3, updates[1].getSequenceNumber());
assertEquals(msg4, updates[2].getFields());
assertEquals(4, updates[2].getSequenceNumber());
}
}