package org.marketcetera.client.utils; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.Date; import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicInteger; import org.junit.BeforeClass; import org.junit.Test; import org.marketcetera.client.ClientManager; import org.marketcetera.client.MockClient; import org.marketcetera.core.LoggerConfiguration; import org.marketcetera.module.ExpectedFailure; import org.marketcetera.trade.*; import org.marketcetera.trade.utils.OrderHistoryManagerTest; /* $License$ */ /** * Tests {@link AutoOrderHistoryManager}. * * @author <a href="mailto:colin@marketcetera.com">Colin DuPlantis</a> * @version $Id: AutoOrderHistoryManagerTest.java 16154 2012-07-14 16:34:05Z colin $ * @since 2.1.4 */ public class AutoOrderHistoryManagerTest { /** * Run once before all tests. * * @throws Exception if an unexpected error occurs */ @BeforeClass public static void once() throws Exception { LoggerConfiguration.logSetup(); ClientManager.setClientFactory(new MockClient.MockClientFactory()); ClientManager.init(null); client = (MockClient)ClientManager.getInstance(); OrderHistoryManagerTest.once(); } /** * Verifies that the constructor works. * * @throws Exception if an unexpected error occurs */ @Test public void testConstructor() throws Exception { AutoOrderHistoryManager manager = new AutoOrderHistoryManager(null); assertEquals(new Date(0), manager.getReportHistoryOrigin()); manager = new AutoOrderHistoryManager(new Date(Long.MIN_VALUE)); assertEquals(new Date(Long.MIN_VALUE), manager.getReportHistoryOrigin()); manager = new AutoOrderHistoryManager(new Date(Long.MAX_VALUE)); assertEquals(new Date(Long.MAX_VALUE), manager.getReportHistoryOrigin()); manager = new AutoOrderHistoryManager(new Date(0)); assertEquals(new Date(0), manager.getReportHistoryOrigin()); } /** * Verifies that {@link LiveOrderHistoryManager#add(org.marketcetera.trade.ReportBase)} is not allowed. * * @throws Exception if an unexpected error occurs */ @Test public void testAddNotAllowed() throws Exception { final AutoOrderHistoryManager manager = new AutoOrderHistoryManager(null); new ExpectedFailure<UnsupportedOperationException>(org.marketcetera.client.Messages.DONT_ADD_REPORTS.getText()) { @Override protected void run() throws Exception { manager.add(null); } }; new ExpectedFailure<UnsupportedOperationException>(org.marketcetera.client.Messages.DONT_ADD_REPORTS.getText()) { @Override protected void run() throws Exception { manager.add(OrderHistoryManagerTest.generateExecutionReport("order", null, OrderStatus.New)); } }; } /** * Tests {@link AutoOrderHistoryManager#receiveExecutionReport(org.marketcetera.trade.ExecutionReport)}. * * @throws Exception if an unexpected error occurs */ @Test public void testReceiveExecutionReport() throws Exception { final AutoOrderHistoryManager orderManager = new AutoOrderHistoryManager(null); orderManager.start(); ExecutionReport report1 = OrderHistoryManagerTest.generateExecutionReport("order-" + counter.incrementAndGet(), null, OrderStatus.New); final Map<OrderID,ExecutionReport> actualOpenOrders = orderManager.getOpenOrders(); assertTrue(actualOpenOrders.isEmpty()); orderManager.receiveExecutionReport(null); assertTrue(actualOpenOrders.isEmpty()); orderManager.receiveExecutionReport(report1); assertEquals(1, actualOpenOrders.size()); assertEquals(report1, actualOpenOrders.values().iterator().next()); } /** * Tests {@link AutoOrderHistoryManager#receiveCancelReject(org.marketcetera.trade.OrderCancelReject)}. * * @throws Exception if an unexpected error occurs */ @Test public void testReceiveOrderCancelReject() throws Exception { final AutoOrderHistoryManager orderManager = new AutoOrderHistoryManager(null); orderManager.start(); final Map<OrderID,ExecutionReport> actualOpenOrders = orderManager.getOpenOrders(); assertTrue(actualOpenOrders.isEmpty()); orderManager.receiveCancelReject(null); assertTrue(actualOpenOrders.isEmpty()); ExecutionReport report1 = OrderHistoryManagerTest.generateExecutionReport("order-" + counter.incrementAndGet(), null, OrderStatus.PendingNew); ExecutionReport report2 = OrderHistoryManagerTest.generateExecutionReport(report1.getOrderID().getValue(), null, OrderStatus.New); ExecutionReport report3 = OrderHistoryManagerTest.generateExecutionReport("order-" + counter.incrementAndGet(), report2.getOrderID().getValue(), OrderStatus.PendingCancel); OrderCancelReject report4 = OrderHistoryManagerTest.generateOrderCancelReject(report2.getOrderID().getValue(), report3.getOrderID().getValue()); orderManager.receiveExecutionReport(report1); assertEquals(1, actualOpenOrders.size()); assertEquals(report1, actualOpenOrders.values().iterator().next()); orderManager.receiveExecutionReport(report2); assertEquals(1, actualOpenOrders.size()); assertEquals(report2, actualOpenOrders.values().iterator().next()); orderManager.receiveExecutionReport(report3); assertEquals(1, actualOpenOrders.size()); assertEquals(report3, actualOpenOrders.values().iterator().next()); orderManager.receiveCancelReject(report4); assertTrue(actualOpenOrders.isEmpty()); } /** * Tests {@link AutoOrderHistoryManager#start()} and {@link AutoOrderHistoryManager#stop()}. * * @throws Exception if an unexpected error occurs */ @Test public void testStartAndStop() throws Exception { final AutoOrderHistoryManager orderManager = new AutoOrderHistoryManager(null); Set<OrderID> orderIDs = orderManager.getOrderIds(); assertTrue(orderIDs.isEmpty()); ExecutionReport report1 = OrderHistoryManagerTest.generateExecutionReport("order-" + counter.incrementAndGet(), null, OrderStatus.PendingNew); client.sendToListeners(report1); assertTrue(orderIDs.isEmpty()); orderManager.start(); client.sendToListeners(report1); assertEquals(1, orderIDs.size()); assertEquals(report1.getOrderID(), orderIDs.iterator().next()); orderManager.stop(); assertTrue(orderIDs.isEmpty()); ExecutionReport report2 = OrderHistoryManagerTest.generateExecutionReport(report1.getOrderID().getValue(), null, OrderStatus.New); client.sendToListeners(report2); assertTrue(orderIDs.isEmpty()); } /** * test client used to simulate connections to the server */ private static MockClient client; /** * counter used for unique identifiers */ private static final AtomicInteger counter = new AtomicInteger(0); }