/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.integration.tool.portfolio;
import static org.testng.Assert.assertEquals;
import java.io.File;
import java.math.BigDecimal;
import java.util.List;
import java.util.Set;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.testng.collections.Sets;
import com.google.common.collect.Iterables;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.financial.tool.ToolContext;
import com.opengamma.master.portfolio.ManageablePortfolio;
import com.opengamma.master.portfolio.PortfolioMaster;
import com.opengamma.master.portfolio.PortfolioSearchRequest;
import com.opengamma.master.portfolio.impl.InMemoryPortfolioMaster;
import com.opengamma.master.position.ManageablePosition;
import com.opengamma.master.position.ManageableTrade;
import com.opengamma.master.position.PositionMaster;
import com.opengamma.master.position.PositionSearchRequest;
import com.opengamma.master.position.impl.InMemoryPositionMaster;
import com.opengamma.master.security.ManageableSecurity;
import com.opengamma.master.security.SecurityMaster;
import com.opengamma.master.security.SecuritySearchRequest;
import com.opengamma.master.security.impl.InMemorySecurityMaster;
import com.opengamma.util.test.TestGroup;
/**
* Test the portfolio loader tool behaves as expected. Data should be read from a file and
* inserted into the correct database masters.
*/
@Test(groups = TestGroup.UNIT)
public class XmlPortfolioLoaderToolTest {
private ToolContext _toolContext;
private PortfolioMaster _portfolioMaster;
private PositionMaster _positionMaster;
private SecurityMaster _securityMaster;
@BeforeMethod
public void setUp() throws Exception {
_toolContext = new ToolContext();
_portfolioMaster = new InMemoryPortfolioMaster();
_toolContext.setPortfolioMaster(_portfolioMaster);
_positionMaster = new InMemoryPositionMaster();
_toolContext.setPositionMaster(_positionMaster);
_securityMaster = new InMemorySecurityMaster();
_toolContext.setSecurityMaster(_securityMaster);
}
@AfterMethod
public void tearDown() throws Exception {
_toolContext = null;
_positionMaster = null;
_portfolioMaster = null;
_securityMaster = null;
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testLoadingFileWithWrongRootElementFails() {
String fileLocation = "src/test/resources/xml_portfolios/wrong_root_element.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testLoadingFileWithNoSchemaVersionFails() {
String fileLocation = "src/test/resources/xml_portfolios/empty_portfolio_no_version";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
}
@Test(expectedExceptions = OpenGammaRuntimeException.class)
public void testDuplicateExternalIds() {
String fileLocation = "src/test/resources/xml_portfolios/duplicate_external_ids.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
}
@Test
public void testEmptyPortfolio() {
// We should get a default portfolio and position automatically generated for the trades
String fileLocation = "src/test/resources/xml_portfolios/empty_portfolio.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 1);
assertEquals(_positionMaster.search(new PositionSearchRequest()).getPositions().size(), 0);
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 0);
}
@Test
public void testMissingReference() {
String fileLocation = "src/test/resources/xml_portfolios/missing_trade_reference.xml";
File file = new File(fileLocation);
try {
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true,
true, null).execute();
}
catch (OpenGammaRuntimeException e) {
// Parse failed so no data should have been added to masters
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 0);
assertEquals(_positionMaster.search(new PositionSearchRequest()).getPositions().size(), 0);
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 0);
}
}
@Test
public void testSinglePortfolioSinglePositionNoTrades() {
// to be added
}
@Test
public void testSinglePortfolioMultiplePositionNoTrades() {
// to be added
}
@Test
public void testNoPortfolioMultiplePositionNoTradesCreatesDefaultPortfolio() {
// to be added
}
@Test
public void testNoPortfolioNoPositionMultipleTradesCreatesDefaultPortfolioAndPositions() {
// We should get a default portfolio and position automatically generated for the trades
String fileLocation = "src/test/resources/xml_portfolios/double_fx_option_no_position_no_portfolio.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 1);
assertEquals(_positionMaster.search(new PositionSearchRequest()).getPositions().size(), 2);
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 2);
}
@Test
public void testSinglePortfolioSinglePositionSingleIrs() {
String fileLocation = "src/test/resources/xml_portfolios/single_irs.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 1);
assertEquals(_positionMaster.search(new PositionSearchRequest()).getPositions().size(), 1);
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 1);
}
@Test
public void testSinglePortfolioSinglePositionFra() {
String fileLocation = "src/test/resources/xml_portfolios/single_fra.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 1);
assertEquals(_positionMaster.search(new PositionSearchRequest()).getPositions().size(), 1);
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 1);
}
@Test
public void testSinglePortfolioSinglePositionSingleFxOption() {
String fileLocation = "src/test/resources/xml_portfolios/single_fx_option.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 1);
assertEquals(_positionMaster.search(new PositionSearchRequest()).getPositions().size(), 1);
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 1);
}
@Test
public void testSinglePortfolioNoPositionSingleFxOption() {
// We should get a position automatically generated for the trade
String fileLocation = "src/test/resources/xml_portfolios/single_fx_option_no_position.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 1);
assertEquals(_positionMaster.search(new PositionSearchRequest()).getPositions().size(), 1);
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 1);
}
/*
Removed until ready to fully implement
@Test
public void testSinglePortfolioNoPositionSingleEquityVarianceSwap() {
// We should get a position automatically generated for the trade
String fileLocation = "src/test/resources/xml_portfolios/single_equity_variance_swap_no_position.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, true, false, false, false, true).execute();
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 1);
assertEquals(_positionMaster.search(new PositionSearchRequest()).getPositions().size(), 1);
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 1);
}
*/
@Test
public void testSinglePortfolioNoPositionSingleFxDigitalOption() {
// We should get a position automatically generated for the trade
String fileLocation = "src/test/resources/xml_portfolios/fx_digital_option_no_position.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 1);
assertEquals(_positionMaster.search(new PositionSearchRequest()).getPositions().size(), 1);
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 1);
}
@Test
public void testSinglePortfolioNoPositionSingleFxForward() {
// We should get a position automatically generated for the trade
String fileLocation = "src/test/resources/xml_portfolios/fx_forward_no_position.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 1);
assertEquals(_positionMaster.search(new PositionSearchRequest()).getPositions().size(), 1);
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 1);
}
@Test
public void testSinglePortfolioNoPositionSingleNdfFxForward() {
// We should get a position automatically generated for the trade
String fileLocation = "src/test/resources/xml_portfolios/ndf_fx_forward_no_position.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 1);
assertEquals(_positionMaster.search(new PositionSearchRequest()).getPositions().size(), 1);
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 1);
}
@Test
public void testSinglePortfolioNoPositionSingleOtcEquityIndexOption() {
// We should get a position automatically generated for the trade
String fileLocation = "src/test/resources/xml_portfolios/otc_equity_index_option.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 1);
List<ManageablePosition> positions = _positionMaster.search(new PositionSearchRequest()).getPositions();
assertEquals(positions.size(), 1);
assertEquals(Iterables.getOnlyElement(positions.get(0).getTrades()).getQuantity(), new BigDecimal(250000));
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 1);
}
@Test
public void testSinglePortfolioNoPositionListedEquityIndexOption() {
// We should get a position automatically generated for the trade
String fileLocation = "src/test/resources/xml_portfolios/listed_index_option.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 1);
List<ManageablePosition> positions = _positionMaster.search(new PositionSearchRequest()).getPositions();
assertEquals(positions.size(), 1);
ManageablePosition position = positions.get(0);
List<ManageableTrade> trades = position.getTrades();
assertEquals(trades.size(), 2);
assertEquals(trades.get(0).getQuantity(), BigDecimal.valueOf(25000));
assertEquals(trades.get(1).getQuantity(), BigDecimal.valueOf(-10000));
assertEquals(position.getQuantity(), BigDecimal.valueOf(15000));
assertEquals(position.getAttributes().get("pos-attr1"), "pos-attr1-value");
assertEquals(position.getAttributes().get("pos-attr2"), "pos-attr2-value");
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 1);
}
@Test
public void testSinglePortfolioNoPositionListedEquityIndexFuture() {
// We should get a position automatically generated for the trade
String fileLocation = "src/test/resources/xml_portfolios/listed_index_future.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 1);
List<ManageablePosition> positions = _positionMaster.search(new PositionSearchRequest()).getPositions();
assertEquals(positions.size(), 1);
ManageablePosition position = positions.get(0);
List<ManageableTrade> trades = position.getTrades();
assertEquals(trades.size(), 1);
assertEquals(trades.get(0).getQuantity(), BigDecimal.valueOf(1000));
assertEquals(position.getQuantity(), BigDecimal.valueOf(1000));
List<ManageableSecurity> securities = _securityMaster.search(new SecuritySearchRequest()).getSecurities();
assertEquals(securities.size(), 1);
assertEquals(securities.get(0).getAttributes().get("sec-attr1"), "sec-attr1-value");
assertEquals(securities.get(0).getAttributes().get("sec-attr2"), "sec-attr2-value"); }
@Test
public void testSinglePortfolioNoPositionListedEquityIndexFutureOption() {
// We should get a position automatically generated for the trade
String fileLocation = "src/test/resources/xml_portfolios/listed_index_future_option.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 1);
List<ManageablePosition> positions = _positionMaster.search(new PositionSearchRequest()).getPositions();
assertEquals(positions.size(), 1);
ManageablePosition position = positions.get(0);
List<ManageableTrade> trades = position.getTrades();
assertEquals(trades.size(), 1);
ManageableTrade trade = trades.get(0);
assertEquals(trade.getQuantity(), BigDecimal.valueOf(1000));
assertEquals(trade.getAttributes().get("attr1"), "attr1-value");
assertEquals(trade.getAttributes().get("attr2"), "attr2-value");
assertEquals(position.getQuantity(), BigDecimal.valueOf(1000));
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 1);
}
@Test
public void testSinglePortfolioNoPositionSingleSwaption() {
// We should get a position automatically generated for the trade
String fileLocation = "src/test/resources/xml_portfolios/swaption_no_position.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 1);
assertEquals(_positionMaster.search(new PositionSearchRequest()).getPositions().size(), 1);
// We end up with 2 securities: the swaption itself, and its underlying swap
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 2);
}
@Test
public void testSinglePortfolioNoPositionMultipleFxOption() {
// We should get a position automatically generated for the trades
String fileLocation = "src/test/resources/xml_portfolios/double_fx_option_no_position.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 1);
assertEquals(_positionMaster.search(new PositionSearchRequest()).getPositions().size(), 2);
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 2);
}
@Test
public void testSinglePortfolioSinglePositionMultipleIrs() {
String fileLocation = "src/test/resources/xml_portfolios/triple_irs.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 1);
assertEquals(_positionMaster.search(new PositionSearchRequest()).getPositions().size(), 3);
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 3);
}
@Test
public void testNestedPortfolios() {
String fileLocation = "src/test/resources/xml_portfolios/nested_portfolios.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
List<ManageablePortfolio> portfolios = _portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios();
assertEquals(portfolios.size(), 1);
assertEquals(portfolios.get(0).getRootNode().getChildNodes().size(), 2);
assertEquals(_positionMaster.search(new PositionSearchRequest()).getPositions().size(), 4);
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 4);
}
@Test
public void testDefineSecuritiesAgainstPositions() {
String fileLocation = "src/test/resources/xml_portfolios/position_defined_securities_portfolio.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 1);
assertEquals(_positionMaster.search(new PositionSearchRequest()).getPositions().size(), 2);
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 2);
}
@Test
public void testMultiPortfolioLoad() {
String fileLocation = "src/test/resources/xml_portfolios/multi_portfolio.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 2);
assertEquals(_positionMaster.search(new PositionSearchRequest()).getPositions().size(), 2);
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 2);
}
@Test
public void testMultitypePortfolioLoad() {
String fileLocation = "src/test/resources/xml_portfolios/multitype_portfolio.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 1);
assertEquals(_positionMaster.search(new PositionSearchRequest()).getPositions().size(), 2);
Set<ManageableTrade> tradeSet = extractTrades(_positionMaster);
assertEquals(tradeSet.size(), 2);
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 2);
}
private Set<ManageableTrade> extractTrades(PositionMaster positionMaster) {
Set<ManageableTrade> tradeSet = Sets.newHashSet();
for (ManageablePosition p : positionMaster.search(new PositionSearchRequest()).getPositions()) {
tradeSet.addAll(p.getTrades());
}
return tradeSet;
}
@Test
public void testMultiPortfolioLoadWithBadPortfolio() {
String fileLocation = "src/test/resources/xml_portfolios/double_portfolio_one_bad.xml";
File file = new File(fileLocation);
new PortfolioLoader(_toolContext, "guff", null, file.getAbsolutePath(), true, false, false, false, true, true, null).execute();
// Only one of the portfolios should ,make it in
assertEquals(_portfolioMaster.search(new PortfolioSearchRequest()).getPortfolios().size(), 1);
assertEquals(_positionMaster.search(new PositionSearchRequest()).getPositions().size(), 1);
assertEquals(_securityMaster.search(new SecuritySearchRequest()).getSecurities().size(), 1);
}
}