/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.bbg.referencedata;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertNotNull;
import static org.testng.AssertJUnit.assertTrue;
import java.io.FileReader;
import java.util.Set;
import java.util.TreeSet;
import org.fudgemsg.FudgeField;
import org.fudgemsg.FudgeMsg;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import com.opengamma.bbg.BloombergConnector;
import com.opengamma.bbg.referencedata.impl.BloombergReferenceDataProvider;
import com.opengamma.bbg.test.BloombergTestUtils;
import com.opengamma.bbg.util.BloombergDataUtils;
import com.opengamma.bbg.util.BloombergDomainIdentifierResolver;
import com.opengamma.id.ExternalId;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.INTEGRATION)
public class BloombergReferenceDataProviderTest {
private BloombergReferenceDataProvider _refDataProvider;
@BeforeMethod
public void setUp() throws Exception {
BloombergConnector connector = BloombergTestUtils.getBloombergConnector();
_refDataProvider = new BloombergReferenceDataProvider(connector);
_refDataProvider.start();
}
@AfterMethod
public void terminateReferenceDataProvider() throws Exception {
if (_refDataProvider != null) {
_refDataProvider.stop();
_refDataProvider = null;
}
}
//-------------------------------------------------------------------------
@Test(timeOut=30000)
public void singleSecuritySingleField() {
final String secName = "AAPL US Equity";
ReferenceDataProviderGetRequest request = ReferenceDataProviderGetRequest.createGet(secName, "SECURITY_TYP", false);
ReferenceDataProviderGetResult result = _refDataProvider.getReferenceData(request);
assertNotNull(result);
assertEquals(1, result.getReferenceData().size());
ReferenceData aaplResult = result.getReferenceData(secName);
assertEquals(secName, aaplResult.getIdentifier());
assertTrue(aaplResult.getErrors().isEmpty());
FudgeMsg fieldData = aaplResult.getFieldValues();
assertNotNull(fieldData);
assertEquals(1, fieldData.getNumFields());
assertEquals("Common Stock", fieldData.getString("SECURITY_TYP"));
}
@Test(timeOut=30000)
public void optionExpiryDate() {
final String secName = "AAPL 02/19/11 C320 Equity";
ReferenceDataProviderGetRequest request = ReferenceDataProviderGetRequest.createGet(secName, "OPT_EXPIRE_DT", false);
ReferenceDataProviderGetResult result = _refDataProvider.getReferenceData(request);
assertNotNull(result);
assertEquals(1, result.getReferenceData().size());
ReferenceData aaplResult = result.getReferenceData(secName);
assertEquals(secName, aaplResult.getIdentifier());
assertTrue(aaplResult.getErrors().isEmpty());
FudgeMsg fieldData = aaplResult.getFieldValues();
assertNotNull(fieldData);
assertEquals(1, fieldData.getNumFields());
assertEquals("2011-02-19", fieldData.getString("OPT_EXPIRE_DT"));
}
@Test(timeOut=30000)
public void optionStrikePrice() {
final String secName = "AAPL 02/19/11 C320 Equity";
ReferenceDataProviderGetRequest request = ReferenceDataProviderGetRequest.createGet(secName, "OPT_STRIKE_PX", false);
ReferenceDataProviderGetResult result = _refDataProvider.getReferenceData(request);
assertNotNull(result);
assertEquals(1, result.getReferenceData().size());
ReferenceData aaplResult = result.getReferenceData(secName);
assertEquals(secName, aaplResult.getIdentifier());
assertTrue(aaplResult.getErrors().isEmpty());
FudgeMsg fieldData = aaplResult.getFieldValues();
assertNotNull(fieldData);
assertEquals(1, fieldData.getNumFields());
assertEquals(new Double(320.0), fieldData.getDouble("OPT_STRIKE_PX"));
}
@Test(timeOut=30000)
public void singleSecurityBulkDataField() {
final String secName = "AAPL US Equity";
ReferenceDataProviderGetRequest request = ReferenceDataProviderGetRequest.createGet(secName, "OPT_CHAIN", false);
ReferenceDataProviderGetResult result = _refDataProvider.getReferenceData(request);
assertNotNull(result);
assertEquals(1, result.getReferenceData().size());
ReferenceData aaplResult = result.getReferenceData(secName);
assertEquals(secName, aaplResult.getIdentifier());
assertTrue(aaplResult.getErrors().isEmpty());
FudgeMsg fieldData = aaplResult.getFieldValues();
assertNotNull(fieldData);
assertTrue("Bloomberg only returning these for AAPL Option Chain: " + fieldData, fieldData.getNumFields() > 10);
boolean foundOptionChain = false;
for(FudgeField field : fieldData.getAllByName("OPT_CHAIN")) {
foundOptionChain = true;
assertEquals("OPT_CHAIN", field.getName());
assertTrue(field.getValue() instanceof FudgeMsg);
FudgeMsg chainContainer = (FudgeMsg)field.getValue();
assertEquals(1, chainContainer.getNumFields());
assertNotNull(chainContainer.getString("Security Description"));
}
assertTrue(foundOptionChain);
}
@Test(timeOut=3000000)
public void multipleSecuritySingleField() {
Set<String> securities = new TreeSet<String>();
securities.add("AAPL US Equity");
securities.add("T US Equity");
securities.add("GS US Equity");
securities.add("CSCO US Equity");
ReferenceDataProviderGetRequest request = ReferenceDataProviderGetRequest.createGet(securities, ImmutableSet.of("SECURITY_TYP"), false);
ReferenceDataProviderGetResult result = _refDataProvider.getReferenceData(request);
assertNotNull(result);
assertEquals(securities.size(), result.getReferenceData().size());
for(String secName : securities) {
ReferenceData perSecResult = result.getReferenceData(secName);
assertEquals(secName, perSecResult.getIdentifier());
assertTrue(perSecResult.getErrors().isEmpty());
FudgeMsg fieldData = perSecResult.getFieldValues();
assertNotNull(fieldData);
assertEquals(1, fieldData.getNumFields());
assertEquals("Common Stock", fieldData.getString("SECURITY_TYP"));
}
}
//-------------------------------------------------------------------------
private static final Set<String> VALID_EQUITY_TYPES = new TreeSet<String>();
static {
VALID_EQUITY_TYPES.add("Common Stock");
VALID_EQUITY_TYPES.add("ADR");
VALID_EQUITY_TYPES.add("Closed-End Fund");
VALID_EQUITY_TYPES.add("ETP");
VALID_EQUITY_TYPES.add("REIT");
VALID_EQUITY_TYPES.add("Tracking Stk");
}
@Test(enabled = false, description = "a lot of data to request from bloomberg")
//Bloomberg sends multiple messages per request when you have over 10 securities in the the request
public void multiMessagePerRequest() throws Exception {
String testWatchList = BloombergReferenceDataProviderTest.class.getResource("watchListTest.txt").getPath();
Set<ExternalId> identifiers = BloombergDataUtils.identifierLoader(new FileReader(testWatchList));
Set<String> bloombergKeys = toBloombergKeys(identifiers);
ReferenceDataProviderGetRequest request = ReferenceDataProviderGetRequest.createGet(bloombergKeys, ImmutableSet.of("SECURITY_TYP"), false);
ReferenceDataProviderGetResult result = _refDataProvider.getReferenceData(request);
assertNotNull(result);
assertEquals(bloombergKeys.size(), result.getReferenceData().size());
for (String secName : bloombergKeys) {
ReferenceData perSecResult = result.getReferenceData(secName);
assertEquals(secName, perSecResult.getIdentifier());
assertTrue(perSecResult.getErrors().isEmpty());
FudgeMsg fieldData = perSecResult.getFieldValues();
assertNotNull(fieldData);
assertEquals(1, fieldData.getNumFields());
assertTrue(VALID_EQUITY_TYPES.contains(fieldData.getString("SECURITY_TYP")));
}
}
private Set<String> toBloombergKeys(Set<ExternalId> identifiers) {
Set<String> bloombergKeys = Sets.newHashSet();
for (ExternalId identifier : identifiers) {
bloombergKeys.add(BloombergDomainIdentifierResolver.toBloombergKey(identifier));
}
return bloombergKeys;
}
}