Skip to content

Commit 7ee9dbc

Browse files
authored
Merge pull request #392 from bobmcn/logon-too-low
Include reason in text field of Logout if seq num too low in Logon.
2 parents 2381ebe + 05048b2 commit 7ee9dbc

File tree

2 files changed

+49
-12
lines changed

2 files changed

+49
-12
lines changed

logon_state.go

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,23 +24,15 @@ func (s logonState) FixMsgIn(session *session, msg *Message) (nextState sessionS
2424
if err := session.handleLogon(msg); err != nil {
2525
switch err := err.(type) {
2626
case RejectLogon:
27-
session.log.OnEvent(err.Text)
28-
logout := session.buildLogout(err.Text)
27+
return shutdownWithReason(session, msg, true, err.Error())
2928

30-
if err := session.dropAndSendInReplyTo(logout, msg); err != nil {
31-
session.logError(err)
32-
}
33-
34-
if err := session.store.IncrNextTargetMsgSeqNum(); err != nil {
35-
session.logError(err)
36-
}
37-
38-
return latentState{}
29+
case targetTooLow:
30+
return shutdownWithReason(session, msg, false, err.Error())
3931

4032
case targetTooHigh:
4133
var tooHighErr error
4234
if nextState, tooHighErr = session.doTargetTooHigh(err); tooHighErr != nil {
43-
return handleStateError(session, tooHighErr)
35+
return shutdownWithReason(session, msg, false, tooHighErr.Error())
4436
}
4537

4638
return
@@ -64,3 +56,20 @@ func (s logonState) Timeout(session *session, e internal.Event) (nextState sessi
6456
func (s logonState) Stop(session *session) (nextState sessionState) {
6557
return latentState{}
6658
}
59+
60+
func shutdownWithReason(session *session, msg *Message, incrNextTargetMsgSeqNum bool, reason string) (nextState sessionState) {
61+
session.log.OnEvent(reason)
62+
logout := session.buildLogout(reason)
63+
64+
if err := session.dropAndSendInReplyTo(logout, msg); err != nil {
65+
session.logError(err)
66+
}
67+
68+
if incrNextTargetMsgSeqNum {
69+
if err := session.store.IncrNextTargetMsgSeqNum(); err != nil {
70+
session.logError(err)
71+
}
72+
}
73+
74+
return latentState{}
75+
}

logon_state_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,3 +302,31 @@ func (s *LogonStateTestSuite) TestFixMsgInLogonSeqNumTooHigh() {
302302
s.State(inSession{})
303303
s.NextTargetMsgSeqNum(7)
304304
}
305+
306+
func (s *LogonStateTestSuite) TestFixMsgInLogonSeqNumTooLow() {
307+
s.IncrNextSenderMsgSeqNum()
308+
s.IncrNextTargetMsgSeqNum()
309+
310+
logon := s.Logon()
311+
logon.Body.SetField(tagHeartBtInt, FIXInt(32))
312+
logon.Header.SetInt(tagMsgSeqNum, 1)
313+
314+
s.MockApp.On("ToAdmin")
315+
s.NextTargetMsgSeqNum(2)
316+
s.fixMsgIn(s.session, logon)
317+
318+
s.State(latentState{})
319+
s.NextTargetMsgSeqNum(2)
320+
321+
s.MockApp.AssertNumberOfCalls(s.T(), "ToAdmin", 1)
322+
msgBytesSent, ok := s.Receiver.LastMessage()
323+
s.Require().True(ok)
324+
sentMessage := NewMessage()
325+
err := ParseMessage(sentMessage, bytes.NewBuffer(msgBytesSent))
326+
s.Require().Nil(err)
327+
s.MessageType(string(msgTypeLogout), sentMessage)
328+
329+
s.session.sendQueued()
330+
s.MessageType(string(msgTypeLogout), s.MockApp.lastToAdmin)
331+
s.FieldEquals(tagText, "MsgSeqNum too low, expecting 2 but received 1", s.MockApp.lastToAdmin.Body)
332+
}

0 commit comments

Comments
 (0)