/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.master.historicaltimeseries.impl; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertNull; import static org.testng.Assert.assertTrue; import static org.testng.Assert.fail; import java.net.URI; import java.util.ArrayList; import java.util.List; import javax.ws.rs.WebApplicationException; import org.fudgemsg.FudgeMsg; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.testng.annotations.Test; import org.threeten.bp.LocalDate; import com.opengamma.core.historicaltimeseries.HistoricalTimeSeries; import com.opengamma.core.historicaltimeseries.HistoricalTimeSeriesAdjuster; import com.opengamma.core.historicaltimeseries.HistoricalTimeSeriesAdjustment; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolutionResult; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolver; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolverWithBasicChangeManager; import com.opengamma.master.historicaltimeseries.ManageableHistoricalTimeSeriesInfo; import com.opengamma.util.fudgemsg.OpenGammaFudgeContext; import com.opengamma.util.rest.UniformInterfaceException404NotFound; import com.opengamma.util.test.TestGroup; import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.UniformInterface; /** * Tests the {@link RemoteHistoricalTimeSeriesResolver} and {@link DataHistoricalTimeSeriesResolverResource} classes. */ @Test(groups = TestGroup.UNIT) public class RemoteHistoricalTimeSeriesResolverTest { private static class MockResolver extends HistoricalTimeSeriesResolverWithBasicChangeManager { private ExternalIdBundle _identifierBundle; private LocalDate _identifierValidityDate; private String _dataSource; private String _dataProvider; private String _dataField; private String _resolutionKey; private HistoricalTimeSeriesResolutionResult _result; @Override public HistoricalTimeSeriesResolutionResult resolve(final ExternalIdBundle identifierBundle, final LocalDate identifierValidityDate, final String dataSource, final String dataProvider, final String dataField, final String resolutionKey) { assertEquals(identifierBundle, _identifierBundle); assertEquals(identifierValidityDate, _identifierValidityDate); assertEquals(dataSource, _dataSource); assertEquals(dataProvider, _dataProvider); assertEquals(dataField, _dataField); assertEquals(resolutionKey, _resolutionKey); return _result; } public void setIdentifierBundle(final ExternalIdBundle identifierBundle) { _identifierBundle = identifierBundle; } public void setIdentifierValidityDate(final LocalDate identifierValidityDate) { _identifierValidityDate = identifierValidityDate; } public void setDataSource(final String dataSource) { _dataSource = dataSource; } public void setDataProvider(final String dataProvider) { _dataProvider = dataProvider; } public void setDataField(final String dataField) { _dataField = dataField; } public void setResolutionKey(final String resolutionKey) { _resolutionKey = resolutionKey; } public void setResult(final HistoricalTimeSeriesResolutionResult result) { _result = result; } } private static class MockAdjuster implements HistoricalTimeSeriesAdjuster { private ExternalIdBundle _identifierBundle; private HistoricalTimeSeriesAdjustment _result; @Override public HistoricalTimeSeries adjust(final ExternalIdBundle securityIdBundle, final HistoricalTimeSeries timeSeries) { throw new UnsupportedOperationException(); } @Override public HistoricalTimeSeriesAdjustment getAdjustment(final ExternalIdBundle identifierBundle) { assertEquals(identifierBundle, _identifierBundle); return _result; } public void setIdentifierBundle(final ExternalIdBundle identifierBundle) { _identifierBundle = identifierBundle; } public void setResult(final HistoricalTimeSeriesAdjustment result) { _result = result; } } private HistoricalTimeSeriesResolver mockConnection(final HistoricalTimeSeriesResolver resolver) { final DataHistoricalTimeSeriesResolverResource server = new DataHistoricalTimeSeriesResolverResource(resolver, OpenGammaFudgeContext.getInstance()); final HistoricalTimeSeriesResolver client = new RemoteHistoricalTimeSeriesResolver(URI.create("http://localhost/")) { @Override protected UniformInterface accessRemote(final URI uri) { assertTrue(uri.getPath().startsWith("/resolve/")); final UniformInterface builder = Mockito.mock(UniformInterface.class); Mockito.when(builder.get(FudgeMsg.class)).thenAnswer(new Answer<FudgeMsg>() { @Override public FudgeMsg answer(final InvocationOnMock invocation) throws Throwable { try { String[] str = uri.getPath().substring(9).split("/"); DataHistoricalTimeSeriesResolverResource.Resolve resolve = server.resolve(); for (int i = 0; i < str.length; i++) { if ("adjustment".equals(str[i])) { final String[] params = uri.getQuery().split("&"); final List<String> ids = new ArrayList<String>(params.length); for (String param : params) { ids.add(param.substring(3)); } return (FudgeMsg) resolve.adjustment(ids).getEntity(); } else if ("dataField".equals(str[i])) { resolve = resolve.dataField(str[++i]); } else if ("dataProvider".equals(str[i])) { resolve = resolve.dataProvider(str[++i]); } else if ("dataSource".equals(str[i])) { resolve = resolve.dataSource(str[++i]); } else if ("id".equals(str[i])) { resolve = resolve.id(str[++i]); } else if ("identifierValidityDate".equals(str[i])) { resolve = resolve.identifierValidityDate(str[++i]); } else if ("resolutionKey".equals(str[i])) { resolve = resolve.resolutionKey(str[++i]); } else { fail(uri + " - " + str[i]); } } return (FudgeMsg) resolve.get().getEntity(); } catch (WebApplicationException e) { assertEquals(e.getResponse().getStatus(), 404); throw new UniformInterfaceException404NotFound(new ClientResponse(404, null, null, null), false); } } }); return builder; } }; return client; } public void testResolve() { final MockResolver mock = new MockResolver(); final HistoricalTimeSeriesResolver client = mockConnection(mock); mock.setIdentifierBundle(ExternalId.of("Test", "Foo").toBundle()); mock.setDataField("PX_LAST"); mock.setResult(new HistoricalTimeSeriesResolutionResult(new ManageableHistoricalTimeSeriesInfo())); assertNotNull(client.resolve(ExternalId.of("Test", "Foo").toBundle(), null, null, null, "PX_LAST", null), null); } public void testResolveWithValidityDate() { final LocalDate now = LocalDate.now(); final MockResolver mock = new MockResolver(); final HistoricalTimeSeriesResolver client = mockConnection(mock); mock.setIdentifierBundle(ExternalId.of("Test", "Foo").toBundle()); mock.setIdentifierValidityDate(now); mock.setDataField("PX_LAST"); mock.setResult(new HistoricalTimeSeriesResolutionResult(new ManageableHistoricalTimeSeriesInfo())); assertNotNull(client.resolve(ExternalId.of("Test", "Foo").toBundle(), now, null, null, "PX_LAST", null), null); } public void testResolveWithDataSourceAndProvider() { final MockResolver mock = new MockResolver(); final HistoricalTimeSeriesResolver client = mockConnection(mock); mock.setIdentifierBundle(ExternalId.of("Test", "Foo").toBundle()); mock.setDataSource("datasource"); mock.setDataProvider("dataprovider"); mock.setDataField("PX_LAST"); mock.setResult(new HistoricalTimeSeriesResolutionResult(new ManageableHistoricalTimeSeriesInfo())); assertNotNull(client.resolve(ExternalId.of("Test", "Foo").toBundle(), null, "datasource", "dataprovider", "PX_LAST", null), null); } public void testResolveWithResolutionKey() { final MockResolver mock = new MockResolver(); final HistoricalTimeSeriesResolver client = mockConnection(mock); mock.setIdentifierBundle(ExternalId.of("Test", "Foo").toBundle()); mock.setDataField("PX_LAST"); mock.setResolutionKey("resolutionkey"); mock.setResult(new HistoricalTimeSeriesResolutionResult(new ManageableHistoricalTimeSeriesInfo())); assertNotNull(client.resolve(ExternalId.of("Test", "Foo").toBundle(), null, null, null, "PX_LAST", "resolutionkey"), null); } public void testGetAdjustment() { final MockResolver resolver = new MockResolver(); final HistoricalTimeSeriesResolver client = mockConnection(resolver); resolver.setIdentifierBundle(ExternalIdBundle.of(ExternalId.of("Test1", "Foo"), ExternalId.of("Test2", "Foo"))); resolver.setDataField("PX_LAST"); final MockAdjuster adjuster = new MockAdjuster(); adjuster.setIdentifierBundle(ExternalIdBundle.of(ExternalId.of("Test1", "Foo"), ExternalId.of("Test2", "Foo"))); adjuster.setResult(new HistoricalTimeSeriesAdjustment.DivideBy(100d)); resolver.setResult(new HistoricalTimeSeriesResolutionResult(new ManageableHistoricalTimeSeriesInfo(), adjuster)); final HistoricalTimeSeriesResolutionResult result = client.resolve(ExternalIdBundle.of(ExternalId.of("Test1", "Foo"), ExternalId.of("Test2", "Foo")), null, null, null, "PX_LAST", null); assertNotNull(result); adjuster.setIdentifierBundle(ExternalIdBundle.of(ExternalId.of("Test1", "Foo"))); adjuster.setResult(HistoricalTimeSeriesAdjustment.NoOp.INSTANCE); HistoricalTimeSeriesAdjustment adjustment = result.getAdjuster().getAdjustment(ExternalIdBundle.of(ExternalId.of("Test1", "Foo"), ExternalId.of("Test2", "Foo"))); assertEquals(adjustment.toString(), "100.0 /"); adjustment = result.getAdjuster().getAdjustment(ExternalIdBundle.of(ExternalId.of("Test1", "Foo"))); assertEquals(adjustment.toString(), ""); } public void testNotFound() { final MockResolver resolver = new MockResolver(); final HistoricalTimeSeriesResolver client = mockConnection(resolver); resolver.setIdentifierBundle(ExternalIdBundle.of(ExternalId.of("Test1", "Foo"), ExternalId.of("Test2", "Foo"))); resolver.setDataField("PX_LAST"); resolver.setResult(null); assertNull(client.resolve(ExternalIdBundle.of(ExternalId.of("Test1", "Foo"), ExternalId.of("Test2", "Foo")), null, null, null, "PX_LAST", null)); } }