/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.solutions.remote; import com.google.common.base.Objects; import com.google.common.collect.ImmutableMap; import com.opengamma.core.link.ConfigLink; import com.opengamma.core.marketdatasnapshot.MarketDataSnapshotSource; import com.opengamma.core.marketdatasnapshot.impl.ManageableMarketDataSnapshot; import com.opengamma.engine.marketdata.spec.MarketDataSpecification; import com.opengamma.engine.marketdata.spec.UserMarketDataSpecification; import com.opengamma.financial.analytics.curve.exposure.ConfigDBInstrumentExposuresProvider; import com.opengamma.financial.analytics.curve.exposure.ExposureFunctions; import com.opengamma.financial.analytics.curve.exposure.InstrumentExposuresProvider; import com.opengamma.financial.currency.CurrencyMatrix; import com.opengamma.financial.security.irs.InterestRateSwapSecurity; import com.opengamma.id.VersionCorrection; import com.opengamma.integration.server.RemoteServer; import com.opengamma.master.historicaltimeseries.HistoricalTimeSeriesResolver; import com.opengamma.master.historicaltimeseries.impl.RemoteHistoricalTimeSeriesResolver; import com.opengamma.service.ServiceContext; import com.opengamma.service.ThreadLocalServiceContext; import com.opengamma.service.VersionCorrectionProvider; import com.opengamma.sesame.CurrencyPairsFn; import com.opengamma.sesame.CurveDefinitionCurveLabellingFn; import com.opengamma.sesame.CurveDefinitionFn; import com.opengamma.sesame.CurveLabellingFn; import com.opengamma.sesame.CurveSelector; import com.opengamma.sesame.CurveSelectorMulticurveBundleFn; import com.opengamma.sesame.DefaultCurrencyPairsFn; import com.opengamma.sesame.DefaultCurveDefinitionFn; import com.opengamma.sesame.DefaultFXMatrixFn; import com.opengamma.sesame.DefaultFixingsFn; import com.opengamma.sesame.DiscountingMulticurveCombinerFn; import com.opengamma.sesame.Environment; import com.opengamma.sesame.FXMatrixFn; import com.opengamma.sesame.FixingsFn; import com.opengamma.sesame.MarketExposureSelector; import com.opengamma.sesame.cache.FunctionCache; import com.opengamma.sesame.cache.NoOpFunctionCache; import com.opengamma.sesame.config.FunctionModelConfig; import com.opengamma.sesame.engine.CalculationArguments; import com.opengamma.sesame.engine.ComponentMap; import com.opengamma.sesame.engine.FixedInstantVersionCorrectionProvider; import com.opengamma.sesame.engine.FunctionRunner; import com.opengamma.sesame.graph.FunctionModel; import com.opengamma.sesame.irs.DefaultInterestRateSwapConverterFn; import com.opengamma.sesame.irs.DiscountingInterestRateSwapCalculator; import com.opengamma.sesame.irs.DiscountingInterestRateSwapCalculatorFactory; import com.opengamma.sesame.irs.DiscountingInterestRateSwapFn; import com.opengamma.sesame.irs.InterestRateSwapCalculator; import com.opengamma.sesame.irs.InterestRateSwapCalculatorFactory; import com.opengamma.sesame.irs.InterestRateSwapConverterFn; import com.opengamma.sesame.irs.InterestRateSwapFn; import com.opengamma.sesame.marketdata.DefaultHistoricalMarketDataFn; import com.opengamma.sesame.marketdata.DefaultMarketDataFn; import com.opengamma.sesame.marketdata.HistoricalMarketDataFn; import com.opengamma.sesame.marketdata.MarketDataFn; import com.opengamma.sesame.marketdata.SnapshotMarketDataFactory; import com.opengamma.sesame.marketdata.builders.MarketDataBuilder; import com.opengamma.sesame.marketdata.builders.MarketDataBuilders; import com.opengamma.sesame.marketdata.builders.MarketDataEnvironmentFactory; import com.opengamma.solutions.util.SwapViewUtils; import com.opengamma.util.function.Function; import com.opengamma.util.result.Result; import com.opengamma.util.test.TestGroup; import com.opengamma.util.time.DateUtils; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; import org.threeten.bp.Instant; import java.net.URI; import java.util.List; import java.util.Map; import static com.opengamma.sesame.config.ConfigBuilder.argument; import static com.opengamma.sesame.config.ConfigBuilder.arguments; import static com.opengamma.sesame.config.ConfigBuilder.config; import static com.opengamma.sesame.config.ConfigBuilder.function; import static com.opengamma.sesame.config.ConfigBuilder.implementations; import static com.opengamma.util.result.ResultTestUtils.assertSuccess; /** * Integration tests that runs locally with remote components * Input: Vanilla Interest Rate Swaps, Snapshot Market Data * Output: Present Value */ @Test(groups = TestGroup.INTEGRATION, enabled = true) public class RemoteComponentSwapTest { private ConfigLink<ExposureFunctions> _exposureConfig; private ConfigLink<CurrencyMatrix> _currencyMatrixLink; private InterestRateSwapFn _swapFunction; private FunctionRunner _functionRunner; private static String _url; @BeforeClass public void setUp() { _url = Objects.firstNonNull(System.getProperty("server.url"), RemoteTestUtils.LOCALHOST); URI htsResolverUri = URI.create(_url + "components/HistoricalTimeSeriesResolver/shared"); HistoricalTimeSeriesResolver htsResolver = new RemoteHistoricalTimeSeriesResolver(htsResolverUri); Map<Class<?>, Object> comps = ImmutableMap.<Class<?>, Object>of(HistoricalTimeSeriesResolver.class, htsResolver); ComponentMap componentMap = ComponentMap.loadComponents(_url).with(comps); VersionCorrectionProvider vcProvider = new FixedInstantVersionCorrectionProvider(Instant.now()); ServiceContext serviceContext = ServiceContext.of(componentMap.getComponents()).with(VersionCorrectionProvider.class, vcProvider); ThreadLocalServiceContext.init(serviceContext); _exposureConfig = ConfigLink.resolvable(RemoteTestUtils.USD_GBP_FF_EXPOSURE, ExposureFunctions.class); _currencyMatrixLink = ConfigLink.resolvable(RemoteTestUtils.CURRENCY_MATRIX, CurrencyMatrix.class); MarketDataSnapshotSource snapshotSource = componentMap.getComponent(MarketDataSnapshotSource.class); SnapshotMarketDataFactory marketDataFactory = new SnapshotMarketDataFactory(snapshotSource); List<MarketDataBuilder> builders = MarketDataBuilders.standard(componentMap, "BLOOMBERG", _currencyMatrixLink); MarketDataEnvironmentFactory environmentFactory = new MarketDataEnvironmentFactory(marketDataFactory, builders); _functionRunner = new FunctionRunner(environmentFactory); _swapFunction = FunctionModel.build(InterestRateSwapFn.class, createConfig(), componentMap); } private FunctionModelConfig createConfig() { return config( arguments( function( MarketExposureSelector.class, argument("exposureFunctions", _exposureConfig)), function( DefaultHistoricalMarketDataFn.class, argument("currencyMatrix", _currencyMatrixLink)), function( DefaultMarketDataFn.class, argument("currencyMatrix", _currencyMatrixLink))), implementations( InterestRateSwapFn.class, DiscountingInterestRateSwapFn.class, CurveSelector.class, MarketExposureSelector.class, CurrencyPairsFn.class, DefaultCurrencyPairsFn.class, InstrumentExposuresProvider.class, ConfigDBInstrumentExposuresProvider.class, InterestRateSwapCalculatorFactory.class, DiscountingInterestRateSwapCalculatorFactory.class, DiscountingMulticurveCombinerFn.class, CurveSelectorMulticurveBundleFn.class, InterestRateSwapCalculator.class, DiscountingInterestRateSwapCalculator.class, FXMatrixFn.class, DefaultFXMatrixFn.class, CurveDefinitionFn.class, DefaultCurveDefinitionFn.class, InterestRateSwapConverterFn.class, DefaultInterestRateSwapConverterFn.class, CurveLabellingFn.class, CurveDefinitionCurveLabellingFn.class, HistoricalMarketDataFn.class, DefaultHistoricalMarketDataFn.class, FixingsFn.class, DefaultFixingsFn.class, MarketDataFn.class, DefaultMarketDataFn.class, FunctionCache.class, NoOpFunctionCache.class )); } @Test(enabled = true) public void testSwapPV() { final InterestRateSwapSecurity irs = (InterestRateSwapSecurity) SwapViewUtils.VANILLA_INPUTS.get(0); RemoteServer server = RemoteServer.create(_url); MarketDataSnapshotSource snapshotSource = server.getMarketDataSnapshotSource(); ManageableMarketDataSnapshot snapshot = snapshotSource.getSingle(ManageableMarketDataSnapshot.class, RemoteTestUtils.USD_GBP_SNAPSHOT, VersionCorrection.LATEST); MarketDataSpecification marketDataSpec = UserMarketDataSpecification.of(snapshot.getUniqueId()); CalculationArguments calculationArguments = CalculationArguments.builder() .marketDataSpecification(marketDataSpec) .valuationTime(DateUtils.getUTCDate(2014, 1, 22)) .build(); Result result = _functionRunner.runFunction(calculationArguments, new Function<Environment, Result>() { @Override public Result apply(Environment env) { return _swapFunction.calculatePV(env, irs); } }); assertSuccess(result); } }