/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.integration.copier; import static org.mockito.Matchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import static org.testng.Assert.assertEquals; import static org.testng.Assert.fail; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.Collections; import org.testng.annotations.Test; import com.opengamma.core.security.SecuritySource; import com.opengamma.id.UniqueId; import com.opengamma.integration.copier.portfolio.PortfolioCopier; import com.opengamma.integration.copier.portfolio.SimplePortfolioCopier; import com.opengamma.integration.copier.portfolio.reader.MasterPositionReader; import com.opengamma.integration.copier.portfolio.reader.PositionReader; import com.opengamma.integration.copier.portfolio.reader.SingleSheetSimplePositionReader; import com.opengamma.integration.copier.portfolio.writer.MasterPositionWriter; import com.opengamma.integration.copier.portfolio.writer.PositionWriter; import com.opengamma.integration.copier.portfolio.writer.SingleSheetSimplePositionWriter; import com.opengamma.integration.copier.sheet.SheetFormat; import com.opengamma.master.portfolio.ManageablePortfolio; import com.opengamma.master.portfolio.ManageablePortfolioNode; import com.opengamma.master.portfolio.PortfolioDocument; import com.opengamma.master.portfolio.PortfolioMaster; import com.opengamma.master.portfolio.PortfolioSearchRequest; import com.opengamma.master.portfolio.PortfolioSearchResult; import com.opengamma.master.position.PositionMaster; import com.opengamma.master.position.impl.InMemoryPositionMaster; import com.opengamma.master.security.SecurityMaster; import com.opengamma.master.security.impl.InMemorySecurityMaster; import com.opengamma.master.security.impl.MasterSecuritySource; import com.opengamma.util.test.TestGroup; import au.com.bytecode.opencsv.CSVReader; @Test(groups = TestGroup.UNIT) public class PortfolioWithTradesCopierTest { // TODO Improve portfolio copier test coverage: // MasterPositionReader, SingleSheetSimplePositionReader, ZippedPositionReader // MasterPositionWriter, SingleSheetSimplePositionWriter, SingleSheetMultiParserPositionWriter, ZippedPositionWriter // SimplePortfolioCopier, ResolvingPortfolioCopier private static final String PORTFOLIO_NAME = "test"; private static final String PORTFOLIO_FILE = "src/test/java/com/opengamma/integration/copier/TestPortfolioWithTrades.csv"; private static final String SECURITY_TYPE = "StandardVanillaCDS"; @Test public void testCsvToMastersToCsv() throws Exception { PortfolioCopier portfolioCopier = new SimplePortfolioCopier(); PositionMaster positionMaster = new InMemoryPositionMaster(); SecurityMaster securityMaster = new InMemorySecurityMaster(); SecuritySource securitySource = new MasterSecuritySource(securityMaster); // Set up mock portfolio master PortfolioMaster portfolioMaster = mock(PortfolioMaster.class); PortfolioSearchRequest portSearchRequest = new PortfolioSearchRequest(); portSearchRequest.setName(PORTFOLIO_NAME); PortfolioSearchResult portSearchResult = new PortfolioSearchResult(); when(portfolioMaster.search(portSearchRequest)).thenReturn(portSearchResult); ManageablePortfolioNode rootNode = new ManageablePortfolioNode(PORTFOLIO_NAME); rootNode.setUniqueId(UniqueId.of("abc", "123")); ManageablePortfolio portfolio = new ManageablePortfolio(PORTFOLIO_NAME, rootNode); PortfolioDocument portfolioDocument = new PortfolioDocument(); portfolioDocument.setPortfolio(portfolio); when(portfolioMaster.add(any(PortfolioDocument.class))).thenReturn(portfolioDocument); // file to masters PositionReader positionReader = new SingleSheetSimplePositionReader(PORTFOLIO_FILE, SECURITY_TYPE); PositionWriter positionWriter = new MasterPositionWriter(PORTFOLIO_NAME, portfolioMaster, positionMaster, securityMaster, false, false, false); portfolioCopier.copy(positionReader, positionWriter); positionReader.close(); positionWriter.close(); portSearchResult.setDocuments(Collections.singletonList(portfolioDocument)); // Masters to file positionReader = new MasterPositionReader(PORTFOLIO_NAME, portfolioMaster, positionMaster, securitySource); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); positionWriter = new SingleSheetSimplePositionWriter(SheetFormat.CSV, outputStream, SECURITY_TYPE); portfolioCopier.copy(positionReader, positionWriter); positionReader.close(); positionWriter.close(); // Compare source and destination try (CSVReader sourceReader = new CSVReader(new InputStreamReader(new FileInputStream(PORTFOLIO_FILE)))) { try (CSVReader destReader = new CSVReader(new InputStreamReader(new ByteArrayInputStream(outputStream.toByteArray())))) { int j = 1; do { String[] sourceRow; String[] destRow; try { sourceRow = sourceReader.readNext(); destRow = destReader.readNext(); } catch (Throwable e) { fail("Error reading the next rows: " + e); return; } if (sourceRow == null && destRow == null) { break; } assert(sourceRow != null && destRow != null); assertEquals(sourceRow.length, destRow.length, "Row lengths do not match (source has " + sourceRow.length + " columns while destination has " + destRow.length + " columns)"); for (int i = 0; i < sourceRow.length; i++) { assertEquals(sourceRow[i], destRow[i], "Differing contents in line " + j + ", column " + i); } j++; } while (true); } } } }