/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.bbg;
import static com.opengamma.bbg.BloombergConstants.BLOOMBERG_DATA_SOURCE_NAME;
import static com.opengamma.bbg.BloombergConstants.DATA_PROVIDER_UNKNOWN;
import static org.testng.AssertJUnit.assertEquals;
import static org.testng.AssertJUnit.assertFalse;
import static org.testng.AssertJUnit.assertNotNull;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.threeten.bp.LocalDate;
import com.opengamma.bbg.historicaltimeseries.BloombergHistoricalTimeSeriesProvider;
import com.opengamma.bbg.test.BloombergTestUtils;
import com.opengamma.core.historicaltimeseries.HistoricalTimeSeries;
import com.opengamma.core.historicaltimeseries.HistoricalTimeSeriesSource;
import com.opengamma.core.id.ExternalSchemes;
import com.opengamma.id.ExternalId;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.timeseries.date.localdate.LocalDateDoubleTimeSeries;
import com.opengamma.util.test.TestGroup;
/**
* Test.
*/
@Test(groups = TestGroup.INTEGRATION)
public class BloombergHistoricalTimeSeriesSourceTest {
private BloombergHistoricalTimeSeriesProvider _provider;
private HistoricalTimeSeriesSource _source;
private ExternalIdBundle _secDes = ExternalIdBundle.of(ExternalSchemes.bloombergTickerSecurityId("IBM US Equity"));
private static final String DEFAULT_DATA_PROVIDER = DATA_PROVIDER_UNKNOWN;
private static final String DEFAULT_DATA_SOURCE = BLOOMBERG_DATA_SOURCE_NAME;
private static final String PX_LAST = "PX_LAST";
@BeforeMethod
public void setUp() throws Exception {
BloombergConnector connector = BloombergTestUtils.getBloombergConnector();
_provider = new BloombergHistoricalTimeSeriesProvider(connector);
_source = new BloombergHistoricalTimeSeriesSource(_provider);
_provider.start();
}
@AfterMethod
public void tearDown() throws Exception {
if (_provider != null) {
_provider.stop();
}
_source = null;
_provider = null;
}
//-------------------------------------------------------------------------
@Test(expectedExceptions=java.lang.IllegalArgumentException.class)
public void getHistoricalWithInvalidDates() throws Exception {
//endDate before startDate
LocalDate startDate = LocalDate.of(2009, 11, 04);
LocalDate endDate = LocalDate.of(2009, 10, 29);
_source.getHistoricalTimeSeries(_secDes, DEFAULT_DATA_SOURCE, DEFAULT_DATA_PROVIDER, PX_LAST, startDate, true, endDate, true);
}
@Test
public void getHistoricalWithSameDate() throws Exception {
LocalDate startDate = LocalDate.of(2009, 11, 04);
LocalDate endDate = LocalDate.of(2009, 11, 04);
HistoricalTimeSeries hts = _source.getHistoricalTimeSeries(_secDes, DEFAULT_DATA_SOURCE, DEFAULT_DATA_PROVIDER, PX_LAST, startDate, true, endDate, true);
assertNotNull(hts);
assertNotNull(hts.getTimeSeries());
assertEquals(1, hts.getTimeSeries().size());
}
@Test
public void getSeriesMap() throws Exception {
LocalDate startDate = LocalDate.of(2009, 10, 04);
LocalDate endDate = LocalDate.of(2009, 11, 29);
final Map<ExternalIdBundle, HistoricalTimeSeries> result = _source.getHistoricalTimeSeries(Collections.singleton(getTestBundle()), "BLOOMBERG", "CMPL", "PX_LAST", startDate, true, endDate, true);
assertNotNull(result);
HistoricalTimeSeries hts = result.get(getTestBundle());
assertNotNull(hts);
assertFalse(hts.getTimeSeries().isEmpty());
}
private ExternalIdBundle getTestBundle() {
return ExternalIdBundle.of(
ExternalId.of("BLOOMBERG_BUID", "EQ0010121400001000"), ExternalId.of("BLOOMBERG_TICKER", "C US Equity"),
ExternalId.of("CUSIP", "172967101"), ExternalId.of("ISIN", "US1729671016"), ExternalId.of("SEDOL1", "2297907"));
}
@Test
public void getHistoricalTimeSeriesWithMaxPoints() throws Exception {
LocalDate endDate = LocalDate.of(2012, 03, 07);
LocalDate startDate = endDate.minusMonths(1);
HistoricalTimeSeries reference = _source.getHistoricalTimeSeries(_secDes, DEFAULT_DATA_SOURCE, DEFAULT_DATA_PROVIDER, PX_LAST, startDate, true, endDate, true);
for (int maxPoints : new int[] {-4, -1}) {
HistoricalTimeSeries hts = _source.getHistoricalTimeSeries(_secDes, DEFAULT_DATA_SOURCE, DEFAULT_DATA_PROVIDER, PX_LAST, startDate, true, endDate, true, maxPoints);
// do we have a time-series?
assertNotNull(hts.getTimeSeries());
// is it the right size?
assertEquals(Math.min(Math.abs(maxPoints), reference.getTimeSeries().size()), hts.getTimeSeries().size());
// does it contain the expected data points?
assertEquals(
(Math.abs(maxPoints) > reference.getTimeSeries().size())
? reference.getTimeSeries()
: (maxPoints >= 0)
? reference.getTimeSeries().head(maxPoints)
: reference.getTimeSeries().tail(-maxPoints),
hts.getTimeSeries());
}
}
@Test
public void getHistoricalTimeSeriesWithZeroMaxPoints() throws Exception {
LocalDate endDate = LocalDate.of(2012, 03, 07);
LocalDate startDate = endDate.minusMonths(1);
HistoricalTimeSeries reference = _source.getHistoricalTimeSeries(_secDes, DEFAULT_DATA_SOURCE, DEFAULT_DATA_PROVIDER, PX_LAST, startDate, true, endDate, true);
HistoricalTimeSeries hts = _source.getHistoricalTimeSeries(_secDes, DEFAULT_DATA_SOURCE, DEFAULT_DATA_PROVIDER, PX_LAST, startDate, true, endDate, true, 0);
// do we have a time-series?
assertNotNull(hts.getTimeSeries());
// is it the right size?
assertEquals(reference.getTimeSeries().size(), hts.getTimeSeries().size());
// does it contain the expected data points?
assertEquals(reference.getTimeSeries(), hts.getTimeSeries());
}
@Test
public void getHistoricalTimeSeriesWithDates() throws Exception {
LocalDate startDate = LocalDate.of(2009, 10, 29);
LocalDate endDate = LocalDate.of(2009, 11, 04);
HistoricalTimeSeries hts = _source.getHistoricalTimeSeries(_secDes, DEFAULT_DATA_SOURCE, DEFAULT_DATA_PROVIDER, PX_LAST, startDate, true, endDate, true);
assertNotNull(hts);
LocalDateDoubleTimeSeries timeSeriesExpected = hts.getTimeSeries();
assertNotNull(timeSeriesExpected);
ExecutorService threadPool = Executors.newFixedThreadPool(4);
List<Future<LocalDateDoubleTimeSeries>> results = new ArrayList<Future<LocalDateDoubleTimeSeries>>();
for (int i = 0; i < 20; i++) {
results.add(threadPool.submit(new BHDPgetHistoricalTimeSeriesWithDates(_secDes, DEFAULT_DATA_SOURCE, DEFAULT_DATA_PROVIDER, PX_LAST, startDate, endDate)));
}
for (Future<LocalDateDoubleTimeSeries> future : results) {
LocalDateDoubleTimeSeries timeSeriesActual = future.get();
assertNotNull(timeSeriesActual);
assertEquals(timeSeriesExpected, timeSeriesActual);
}
}
//-------------------------------------------------------------------------
private class BHDPgetHistoricalTimeSeriesWithDates implements Callable<LocalDateDoubleTimeSeries> {
private ExternalIdBundle _secDes;
private String _dataSource;
private String _provider;
private String _field;
private LocalDate _startDate;
private LocalDate _endDate;
public BHDPgetHistoricalTimeSeriesWithDates(ExternalIdBundle secDes, String dataSource, String dataProvider, String field, LocalDate startDate, LocalDate endDate) {
assertNotNull(secDes);
assertNotNull(startDate);
assertNotNull(endDate);
_secDes = secDes;
_dataSource = dataSource;
_provider = dataProvider;
_field = field;
_startDate = startDate;
_endDate = endDate;
}
@Override
public LocalDateDoubleTimeSeries call() throws Exception {
HistoricalTimeSeries hts = _source.getHistoricalTimeSeries(_secDes, _dataSource, _provider, _field, _startDate, true, _endDate, true);
return hts.getTimeSeries();
}
}
}