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: AnalyzedMessageTest.java 16154 2012-07-14 16:34:05Z colin $ */ /* $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()); } }