org.marketcetera.util.quickfix.AnalyzedMessageTest.java Source code

Java tutorial

Introduction

Here is the source code for org.marketcetera.util.quickfix.AnalyzedMessageTest.java

Source

package org.marketcetera.util.quickfix;

import java.util.Date;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.SystemUtils;
import org.apache.log4j.Level;
import org.junit.Test;
import quickfix.Message;
import quickfix.field.Account;
import quickfix.field.ClOrdID;
import quickfix.field.HandlInst;
import quickfix.field.Issuer;
import quickfix.field.MDEntryPx;
import quickfix.field.MDEntrySize;
import quickfix.field.MDEntryType;
import quickfix.field.MsgSeqNum;
import quickfix.field.NoMDEntries;
import quickfix.field.OrdType;
import quickfix.field.OrderID;
import quickfix.field.QuoteEntryID;
import quickfix.field.QuoteSetID;
import quickfix.field.SenderCompID;
import quickfix.field.SendingTime;
import quickfix.field.Side;
import quickfix.field.Symbol;
import quickfix.field.TargetCompID;
import quickfix.field.TransactTime;
import quickfix.field.UnderlyingIssuer;
import quickfix.fix42.MarketDataSnapshotFullRefresh;
import quickfix.fix42.MassQuote;
import quickfix.fix42.NewOrderSingle;

import static org.junit.Assert.*;

/**
 * @author tlerios@marketcetera.com
 * @since 1.0.0
 * @version $Id$
 */

/* $License$ */

public class AnalyzedMessageTest extends AnalyzerTestBase {
    @Test
    public void empty() throws Exception {
        NewOrderSingle msg = new NewOrderSingle();
        msg.toString();
        AnalyzedMessage msgA = new AnalyzedMessage(TEST_DICTIONARY, msg);
        assertNoEvents();
        assertEquals(3, msgA.getHeader().size());
        assertEquals(0, msgA.getBody().size());
        assertEquals(1, msgA.getTrailer().size());
        assertEquals(TEST_HEADER + "5" + SystemUtils.LINE_SEPARATOR + " MsgType [35R] = NewOrderSingle [D]"
                + TEST_FOOTER + "181", msgA.toString());
    }

    @Test
    public void valid() throws Exception {

        NewOrderSingle msg = new NewOrderSingle();
        // Required header fields.
        msg.getHeader().setField(new SenderCompID("me"));
        msg.getHeader().setField(new TargetCompID("you"));
        msg.getHeader().setField(new MsgSeqNum(1));
        msg.getHeader().setField(new SendingTime(new Date(2)));
        // Required body fields.
        msg.set(new ClOrdID("a"));
        msg.set(new HandlInst(HandlInst.AUTOMATED_EXECUTION_ORDER_PRIVATE));
        msg.set(new TransactTime(new Date(3)));
        msg.set(new OrdType(OrdType.LIMIT));
        msg.set(new Symbol("METC"));
        // A required enumeration.
        msg.set(new Side(Side.BUY));
        // An optional non-enumeration.
        msg.set(new Account("metc"));
        msg.toString();
        AnalyzedMessage msgA = new AnalyzedMessage(TEST_DICTIONARY, msg);
        assertNoEvents();
        assertEquals(7, msgA.getHeader().size());
        assertEquals(7, msgA.getBody().size());
        assertEquals(1, msgA.getTrailer().size());
        assertEquals(SystemUtils.LINE_SEPARATOR + "Header" + SystemUtils.LINE_SEPARATOR
                + " BeginString [8R] = FIX.4.2" + SystemUtils.LINE_SEPARATOR + " BodyLength [9R] = 108"
                + SystemUtils.LINE_SEPARATOR + " MsgSeqNum [34R] = 1" + SystemUtils.LINE_SEPARATOR
                + " MsgType [35R] = NewOrderSingle [D]" + SystemUtils.LINE_SEPARATOR + " SenderCompID [49R] = me"
                + SystemUtils.LINE_SEPARATOR + " SendingTime [52R] = 19700101-00:00:00.002"
                + SystemUtils.LINE_SEPARATOR + " TargetCompID [56R] = you" + SystemUtils.LINE_SEPARATOR + "Body"
                + SystemUtils.LINE_SEPARATOR + " Account [1] = metc" + SystemUtils.LINE_SEPARATOR
                + " ClOrdID [11R] = a" + SystemUtils.LINE_SEPARATOR + " HandlInst [21R] = "
                + "AUTOMATED_EXECUTION_ORDER_PRIVATE_NO_BROKER_INTERVENTION [1]" + SystemUtils.LINE_SEPARATOR
                + " OrdType [40R] = LIMIT [2]" + SystemUtils.LINE_SEPARATOR + " Side [54R] = BUY [1]"
                + SystemUtils.LINE_SEPARATOR + " Symbol [55R] = METC" + SystemUtils.LINE_SEPARATOR
                + " TransactTime [60R] = 19700101-00:00:00.003" + TEST_FOOTER + "076", msgA.toString());
    }

    @Test
    public void group() throws Exception {
        MarketDataSnapshotFullRefresh msg = new MarketDataSnapshotFullRefresh(new Symbol("QF"));
        MarketDataSnapshotFullRefresh.NoMDEntries group = new MarketDataSnapshotFullRefresh.NoMDEntries();
        group.set(new MDEntryType(MDEntryType.BID));
        group.set(new MDEntryPx(2));
        group.set(new MDEntrySize(16));
        group.set(new OrderID("ID1"));
        msg.addGroup(group);
        group = new MarketDataSnapshotFullRefresh.NoMDEntries();
        group.set(new MDEntryType('?'));
        group.set(new MDEntryPx(4));
        group.set(new MDEntrySize(32));
        group.set(new OrderID("ID2"));
        msg.addGroup(group);
        msg.toString();
        AnalyzedMessage msgA = new AnalyzedMessage(TEST_DICTIONARY, msg);
        assertNoEvents();
        assertEquals(3, msgA.getHeader().size());
        assertEquals(2, msgA.getBody().size());
        assertEquals(4, msgA.getBody().get(1).getGroups().get(0).getFields().size());
        assertEquals(4, msgA.getBody().get(1).getGroups().get(1).getFields().size());
        assertEquals(1, msgA.getTrailer().size());
        assertEquals(TEST_HEADER + "69" + SystemUtils.LINE_SEPARATOR
                + " MsgType [35R] = MarketDataSnapshotFullRefresh [W]" + SystemUtils.LINE_SEPARATOR + "Body"
                + SystemUtils.LINE_SEPARATOR + " Symbol [55R] = QF" + SystemUtils.LINE_SEPARATOR
                + " NoMDEntries [268R] = 2" + SystemUtils.LINE_SEPARATOR + "  Group 1" + SystemUtils.LINE_SEPARATOR
                + "   MDEntryType [269R] = BID [0]" + SystemUtils.LINE_SEPARATOR + "   OrderID [37] = ID1"
                + SystemUtils.LINE_SEPARATOR + "   MDEntryPx [270R] = 2" + SystemUtils.LINE_SEPARATOR
                + "   MDEntrySize [271] = 16" + SystemUtils.LINE_SEPARATOR + "  Group 2"
                + SystemUtils.LINE_SEPARATOR + "   MDEntryType [269R] = ? [invalid]" + SystemUtils.LINE_SEPARATOR
                + "   OrderID [37] = ID2" + SystemUtils.LINE_SEPARATOR + "   MDEntryPx [270R] = 4"
                + SystemUtils.LINE_SEPARATOR + "   MDEntrySize [271] = 32" + TEST_FOOTER + "219", msgA.toString());
    }

    @Test
    public void nestedGroup() throws Exception {
        MassQuote msg = new MassQuote();
        MassQuote.NoQuoteSets topGroup = new MassQuote.NoQuoteSets();
        topGroup.set(new QuoteSetID("TID1"));
        topGroup.set(new UnderlyingIssuer("UI1"));
        MassQuote.NoQuoteSets.NoQuoteEntries nestedGroup = new MassQuote.NoQuoteSets.NoQuoteEntries();
        nestedGroup.set(new QuoteEntryID("NID1.1"));
        nestedGroup.set(new Issuer("I1.1"));
        topGroup.addGroup(nestedGroup);
        nestedGroup = new MassQuote.NoQuoteSets.NoQuoteEntries();
        nestedGroup.set(new QuoteEntryID("NID1.2"));
        nestedGroup.set(new Issuer("I1.2"));
        topGroup.addGroup(nestedGroup);
        msg.addGroup(topGroup);
        topGroup = new MassQuote.NoQuoteSets();
        topGroup.set(new QuoteSetID("TID2"));
        topGroup.set(new UnderlyingIssuer("UI2"));
        nestedGroup = new MassQuote.NoQuoteSets.NoQuoteEntries();
        nestedGroup.set(new QuoteEntryID("NID2.1"));
        nestedGroup.set(new Issuer("I2.1"));
        topGroup.addGroup(nestedGroup);
        nestedGroup = new MassQuote.NoQuoteSets.NoQuoteEntries();
        nestedGroup.set(new QuoteEntryID("NID2.2"));
        nestedGroup.set(new Issuer("I2.2"));
        topGroup.addGroup(nestedGroup);
        msg.addGroup(topGroup);
        msg.toString();
        AnalyzedMessage msgA = new AnalyzedMessage(TEST_DICTIONARY, msg);
        assertNoEvents();
        assertEquals(3, msgA.getHeader().size());
        assertEquals(1, msgA.getBody().size());
        assertEquals(3, msgA.getBody().get(0).getGroups().get(0).getFields().size());
        assertEquals(2,
                msgA.getBody().get(0).getGroups().get(0).getFields().get(1).getGroups().get(0).getFields().size());
        assertEquals(2,
                msgA.getBody().get(0).getGroups().get(0).getFields().get(1).getGroups().get(1).getFields().size());
        assertEquals(3, msgA.getBody().get(0).getGroups().get(1).getFields().size());
        assertEquals(2,
                msgA.getBody().get(0).getGroups().get(1).getFields().get(1).getGroups().get(0).getFields().size());
        assertEquals(2,
                msgA.getBody().get(0).getGroups().get(1).getFields().get(1).getGroups().get(1).getFields().size());
        assertEquals(1, msgA.getTrailer().size());
        assertEquals(TEST_HEADER + "137" + SystemUtils.LINE_SEPARATOR + " MsgType [35R] = MassQuote [i]"
                + SystemUtils.LINE_SEPARATOR + "Body" + SystemUtils.LINE_SEPARATOR + " NoQuoteSets [296R] = 2"
                + SystemUtils.LINE_SEPARATOR + "  Group 1" + SystemUtils.LINE_SEPARATOR
                + "   QuoteSetID [302R] = TID1" + SystemUtils.LINE_SEPARATOR + "   NoQuoteEntries [295R] = 2"
                + SystemUtils.LINE_SEPARATOR + "    Group 1" + SystemUtils.LINE_SEPARATOR
                + "     QuoteEntryID [299R] = NID1.1" + SystemUtils.LINE_SEPARATOR + "     Issuer [106] = I1.1"
                + SystemUtils.LINE_SEPARATOR + "    Group 2" + SystemUtils.LINE_SEPARATOR
                + "     QuoteEntryID [299R] = NID1.2" + SystemUtils.LINE_SEPARATOR + "     Issuer [106] = I1.2"
                + SystemUtils.LINE_SEPARATOR + "   UnderlyingIssuer [306] = UI1" + SystemUtils.LINE_SEPARATOR
                + "  Group 2" + SystemUtils.LINE_SEPARATOR + "   QuoteSetID [302R] = TID2"
                + SystemUtils.LINE_SEPARATOR + "   NoQuoteEntries [295R] = 2" + SystemUtils.LINE_SEPARATOR
                + "    Group 1" + SystemUtils.LINE_SEPARATOR + "     QuoteEntryID [299R] = NID2.1"
                + SystemUtils.LINE_SEPARATOR + "     Issuer [106] = I2.1" + SystemUtils.LINE_SEPARATOR
                + "    Group 2" + SystemUtils.LINE_SEPARATOR + "     QuoteEntryID [299R] = NID2.2"
                + SystemUtils.LINE_SEPARATOR + "     Issuer [106] = I2.2" + SystemUtils.LINE_SEPARATOR
                + "   UnderlyingIssuer [306] = UI2" + TEST_FOOTER + "125", msgA.toString());
    }

    @Test
    public void missingType() throws Exception {
        Message msg = new Message();
        msg.toString();
        AnalyzedMessage msgA = new AnalyzedMessage(TEST_DICTIONARY, msg);
        assertSingleEvent(Level.ERROR, TEST_MESSAGE_CATEGORY,
                "Message type is missing from message '9=0" + SOH + "10=167" + SOH + "'", TEST_MESSAGE_CATEGORY);
        assertEquals(0, msgA.getHeader().size());
        assertEquals(0, msgA.getBody().size());
        assertEquals(0, msgA.getTrailer().size());
        assertEquals(StringUtils.EMPTY, msgA.toString());
    }

    @Test
    public void badEnum() throws Exception {
        NewOrderSingle msg = new NewOrderSingle();
        msg.set(new Side('?'));
        msg.toString();
        AnalyzedMessage msgA = new AnalyzedMessage(TEST_DICTIONARY, msg);
        assertNoEvents();
        assertEquals(3, msgA.getHeader().size());
        assertEquals(1, msgA.getBody().size());
        assertEquals(1, msgA.getTrailer().size());
        assertEquals(TEST_HEADER + "10" + SystemUtils.LINE_SEPARATOR + " MsgType [35R] = NewOrderSingle [D]"
                + SystemUtils.LINE_SEPARATOR + "Body" + SystemUtils.LINE_SEPARATOR + " Side [54R] = ? [invalid]"
                + TEST_FOOTER + "199", msgA.toString());
    }

    @Test
    public void missingGroup() throws Exception {
        MarketDataSnapshotFullRefresh msg = new MarketDataSnapshotFullRefresh(new Symbol("QF"));
        msg.set(new NoMDEntries(1));
        msg.toString();
        AnalyzedMessage msgA = new AnalyzedMessage(TEST_DICTIONARY, msg);
        assertSingleEvent(Level.ERROR, TEST_FIELD_CATEGORY, "Group 1 is missing from message scope '8=FIX.4.2" + SOH
                + "9=11" + SOH + "35=W" + SOH + "55=QF" + SOH + "10=052" + SOH + "'", TEST_FIELD_CATEGORY);
        assertEquals(3, msgA.getHeader().size());
        assertEquals(2, msgA.getBody().size());
        assertEquals(1, msgA.getTrailer().size());
        assertEquals(TEST_HEADER + "17" + SystemUtils.LINE_SEPARATOR
                + " MsgType [35R] = MarketDataSnapshotFullRefresh [W]" + SystemUtils.LINE_SEPARATOR + "Body"
                + SystemUtils.LINE_SEPARATOR + " Symbol [55R] = QF" + SystemUtils.LINE_SEPARATOR
                + " NoMDEntries [268R] = 1" + TEST_FOOTER + "052", msgA.toString());
    }
}