diff --git a/logon_state.go b/logon_state.go index 88e69bda2..14c473158 100644 --- a/logon_state.go +++ b/logon_state.go @@ -36,6 +36,13 @@ func (s logonState) FixMsgIn(session *session, msg Message) (nextState sessionSt return latentState{} + case targetTooHigh: + if err := session.doTargetTooHigh(err); err != nil { + return handleStateError(session, err) + } + + return resendState{} + default: return handleStateError(session, err) } diff --git a/logon_state_test.go b/logon_state_test.go index 30f56cfde..ef02cc5c0 100644 --- a/logon_state_test.go +++ b/logon_state_test.go @@ -174,3 +174,29 @@ func (s *LogonStateTestSuite) TestFixMsgInLogonRejectLogon() { s.NextTargetMsgSeqNum(3) s.NextSenderMsgSeqNum(3) } + +func (s *LogonStateTestSuite) TestFixMsgInLogonSeqNumTooHigh() { + s.MessageFactory.SetNextSeqNum(6) + logon := s.Logon() + logon.Body.SetField(tagHeartBtInt, FIXInt(32)) + + s.MockApp.On("FromAdmin").Return(nil) + s.MockApp.On("OnLogon") + s.MockApp.On("ToAdmin") + s.fixMsgIn(s.session, logon) + + s.State(resendState{}) + s.NextTargetMsgSeqNum(1) + + //session should send logon, and then queues resend request for send + s.MockApp.AssertNumberOfCalls(s.T(), "ToAdmin", 2) + msgBytesSent, ok := s.Receiver.LastMessage() + s.Require().True(ok) + sentMessage, err := ParseMessage(msgBytesSent) + s.Require().Nil(err) + s.MessageType(enum.MsgType_LOGON, sentMessage) + + s.session.sendQueued() + s.MessageType(enum.MsgType_RESEND_REQUEST, s.MockApp.lastToAdmin) + s.FieldEquals(tagBeginSeqNo, 1, s.MockApp.lastToAdmin.Body) +} diff --git a/session.go b/session.go index a159ff7e3..e3efd6bdb 100644 --- a/session.go +++ b/session.go @@ -368,10 +368,7 @@ func (s *session) handleLogon(msg Message) error { s.application.OnLogon(s.sessionID) if err := s.checkTargetTooHigh(msg); err != nil { - switch TypedError := err.(type) { - case targetTooHigh: - return s.doTargetTooHigh(TypedError) - } + return err } return s.store.IncrNextTargetMsgSeqNum()