public void TestLastMsgSeqNumProcessed() { // Disabled by default Assert.That(!session.EnableLastMsgSeqNumProcessed); session.EnableLastMsgSeqNumProcessed = true; // Logon Logon(); QuickFix.Message msg = responder.msgLookup[QuickFix.Fields.MsgType.LOGON].Last(); int lastSeqNumProcessed = msg.Header.GetInt(QuickFix.Fields.Tags.LastMsgSeqNumProcessed); Assert.That(lastSeqNumProcessed == 1); // NOS QuickFix.FIX42.NewOrderSingle order = new QuickFix.FIX42.NewOrderSingle( new QuickFix.Fields.ClOrdID("1"), new QuickFix.Fields.HandlInst(QuickFix.Fields.HandlInst.MANUAL_ORDER), new QuickFix.Fields.Symbol("IBM"), new QuickFix.Fields.Side(QuickFix.Fields.Side.BUY), new QuickFix.Fields.TransactTime(), new QuickFix.Fields.OrdType(QuickFix.Fields.OrdType.LIMIT)); order.Header.SetField(new QuickFix.Fields.TargetCompID(sessionID.SenderCompID)); order.Header.SetField(new QuickFix.Fields.SenderCompID(sessionID.TargetCompID)); order.Header.SetField(new QuickFix.Fields.MsgSeqNum(seqNum++)); session.Send(order); msg = responder.msgLookup[QuickFix.Fields.MsgType.NEW_ORDER_D].Last(); lastSeqNumProcessed = msg.Header.GetInt(QuickFix.Fields.Tags.LastMsgSeqNumProcessed); Assert.That(lastSeqNumProcessed == 1); }
public void TestGapFillOnResend() { // Engineer a gap fill at the beginning of a re-send range, in the middle, and at the end Logon(); //seq 1 QuickFix.FIX42.NewOrderSingle order = new QuickFix.FIX42.NewOrderSingle( new QuickFix.Fields.ClOrdID("1"), new QuickFix.Fields.HandlInst(QuickFix.Fields.HandlInst.MANUAL_ORDER), new QuickFix.Fields.Symbol("IBM"), new QuickFix.Fields.Side(QuickFix.Fields.Side.BUY), new QuickFix.Fields.TransactTime(), new QuickFix.Fields.OrdType(QuickFix.Fields.OrdType.LIMIT)); order.Header.SetField(new QuickFix.Fields.TargetCompID(sessionID.TargetCompID)); order.Header.SetField(new QuickFix.Fields.SenderCompID(sessionID.SenderCompID)); int[] gapStarts = new[] { 1, 5, 11 }; // 1st gap from seq num 1 to 2 is just the Logon message int[] gapEnds = new[] { 2, 8, 15 }; int orderCount = 0; for (int msgSeqNum = gapEnds[0]; msgSeqNum < gapStarts[1]; ++msgSeqNum) { order.Header.SetField(new QuickFix.Fields.MsgSeqNum(msgSeqNum)); session.Send(order); ++orderCount; } //seq 4, next is 5 for (int msgSeqNum = gapStarts[1]; msgSeqNum < gapEnds[1]; ++msgSeqNum) { session.GenerateHeartbeat(); } //seq 7, next is 8 for (int msgSeqNum = gapEnds[1]; msgSeqNum < gapStarts[2]; ++msgSeqNum) { order.Header.SetField(new QuickFix.Fields.MsgSeqNum(msgSeqNum)); session.Send(order); ++orderCount; } //seq 10, next is 11 for (int msgSeqNum = gapStarts[2]; msgSeqNum < gapEnds[2]; ++msgSeqNum) { session.GenerateHeartbeat(); } // seq 11 - 14 responder.msgLookup.Clear(); SendResendRequest(1, 100); Assert.AreEqual(responder.GetCount(QuickFix.Fields.MsgType.NEWORDERSINGLE), orderCount); Assert.AreEqual(responder.GetCount(QuickFix.Fields.MsgType.SEQUENCE_RESET), gapStarts.Length); int count = -1; foreach (QuickFix.Message sequenceResestMsg in responder.msgLookup[QuickFix.Fields.MsgType.SEQUENCE_RESET]) { Assert.AreEqual(sequenceResestMsg.GetString(QuickFix.Fields.Tags.GapFillFlag), "Y"); Assert.AreEqual(sequenceResestMsg.Header.GetInt(QuickFix.Fields.Tags.MsgSeqNum), gapStarts[++count]); Assert.AreEqual(sequenceResestMsg.GetInt(QuickFix.Fields.Tags.NewSeqNo), gapEnds[count]); } }