/*
* Copyright (C) 2012 - present by Yann Le Tallec.
* Please see distribution for license.
*/
package com.assylias.jbloomberg;
import static com.assylias.jbloomberg.RealtimeField.*;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import static org.testng.Assert.*;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
public class BloombergSessionAsyncSusbcriptionTest {
private static final Logger LOG = LoggerFactory.getLogger(BloombergSessionAsyncSusbcriptionTest.class);
private static final int TIMEOUT = 200;
private DefaultBloombergSession session;
//NOTE: the latch could be moved as a member of the class but that creates some side effects (possibly due to testNG)
@BeforeMethod(groups = "requires-bloomberg")
public void beforeMethod() throws Exception {
LOG.trace("beforeMethod");
session = new DefaultBloombergSession();
session.start();
}
@AfterMethod(groups = "requires-bloomberg")
public void afterMethod() {
LOG.trace("afterMethod - entry");
session.stop();
LOG.trace("afterMethod - exit");
}
@Test(groups = "requires-bloomberg")
public void testFeed() throws Exception {
LOG.trace("testFeed");
CountDownLatch latch = new CountDownLatch(1);
DataChangeListener lst = getDataChangeListener(latch, LAST_PRICE, ASK, BID_SIZE);
SubscriptionBuilder builder = new SubscriptionBuilder()
.addSecurity("VGA Index")
.addSecurity("EUR Curncy")
.addField(LAST_PRICE)
.addField(BID_SIZE)
.addField(ASK)
.addListener(lst);
session.subscribe(builder);
assertTrue(latch.await(TIMEOUT, TimeUnit.SECONDS));
}
/**
* in this test, the feed is started first and securities and fields are added afterwards
*/
@Test(groups = "requires-bloomberg")
public void testFeedNewAdditions() throws Exception {
LOG.trace("testFeedNewAdditions");
CountDownLatch latch = new CountDownLatch(1);
DataChangeListener lst = getDataChangeListener(latch, "GBP Curncy");
SubscriptionBuilder builder = new SubscriptionBuilder()
.addSecurity("VGA Index")
.addSecurity("EUR Curncy")
.addField(LAST_PRICE)
.addField(BID_SIZE)
.addField(ASK)
.addListener(lst);
session.subscribe(builder);
assertFalse(latch.await(50, TimeUnit.MILLISECONDS)); //GBP hasn't been registered yet so no event should arrive
builder = new SubscriptionBuilder()
.addSecurity("GBP Curncy")
.addField(ASK)
.addListener(lst);
session.subscribe(builder);
assertTrue(latch.await(TIMEOUT, TimeUnit.SECONDS)); //only works if the GBP has been caught
}
/**
* Wrong ticker is ignored
*/
@Test(groups = "requires-bloomberg")
public void testWrongTicker() throws Exception {
LOG.trace("testWrongTicker");
CountDownLatch latch = new CountDownLatch(1);
DataChangeListener lst = getDataChangeListener(latch);
SubscriptionBuilder builder = new SubscriptionBuilder()
.addSecurity("WHAT TICKER IS THAT")
.addSecurity("EUR Curncy")
.addField(LAST_PRICE)
.addListener(lst);
session.subscribe(builder);
assertTrue(latch.await(TIMEOUT, TimeUnit.SECONDS));
}
private DataChangeListener getDataChangeListener(CountDownLatch latch) {
return (e) -> latch.countDown();
}
private DataChangeListener getDataChangeListener(CountDownLatch latch, String... tickers) {
final Set<String> tickerSet = new HashSet<>(Arrays.asList(tickers));
return (DataChangeEvent e) -> {
if (tickerSet.contains(e.getSource())) {
latch.countDown();
}
};
}
private DataChangeListener getDataChangeListener(CountDownLatch latch, final RealtimeField... fields) {
final Set<RealtimeField> fieldSet = new HashSet<>(Arrays.asList(fields));
return (e) -> {
if (fieldSet.contains(RealtimeField.valueOf(e.getDataName()))) {
latch.countDown();
}
};
}
}