Skip to content

Commit af01b95

Browse files
authored
Merge pull request #225 from cbusbey/reject_logon
reject logon support
2 parents 212e459 + f934640 commit af01b95

File tree

5 files changed

+75
-12
lines changed

5 files changed

+75
-12
lines changed

errors.go

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import (
55
"fmt"
66
)
77

8-
//DoNotSend is a convenience error to indicate a DoNotSend in ToApp
9-
var DoNotSend = errors.New("Do Not Send")
8+
//ErrDoNotSend is a convenience error to indicate a DoNotSend in ToApp
9+
var ErrDoNotSend = errors.New("Do Not Send")
1010

1111
//rejectReason enum values.
1212
const (
@@ -37,6 +37,22 @@ type MessageRejectError interface {
3737
IsBusinessReject() bool
3838
}
3939

40+
//RejectLogon indicates the application is rejecting permission to logon. Implements MessageRejectError
41+
type RejectLogon struct {
42+
Text string
43+
}
44+
45+
func (e RejectLogon) Error() string { return e.Text }
46+
47+
//RefTagID implements MessageRejectError
48+
func (RejectLogon) RefTagID() *Tag { return nil }
49+
50+
//RejectReason implements MessageRejectError
51+
func (RejectLogon) RejectReason() int { return 0 }
52+
53+
//IsBusinessReject implements MessageRejectError
54+
func (RejectLogon) IsBusinessReject() bool { return false }
55+
4056
type messageRejectError struct {
4157
rejectReason int
4258
text string

logon_state.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,24 @@ func (s logonState) FixMsgIn(session *session, msg Message) (nextState sessionSt
2121
}
2222

2323
if err := session.handleLogon(msg); err != nil {
24-
return handleStateError(session, err)
24+
switch err := err.(type) {
25+
case RejectLogon:
26+
session.log.OnEvent(err.Text)
27+
msg := session.buildLogout(err.Text)
28+
29+
if err := session.dropAndSend(msg, false); err != nil {
30+
session.logError(err)
31+
}
32+
33+
if err := session.store.IncrNextTargetMsgSeqNum(); err != nil {
34+
session.logError(err)
35+
}
36+
37+
return latentState{}
38+
39+
default:
40+
return handleStateError(session, err)
41+
}
2542
}
2643
return inSession{}
2744
}

logon_state_test.go

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@ func (s *LogonStateTestSuite) TestFixMsgInNotLogon() {
6666
}
6767

6868
func (s *LogonStateTestSuite) TestFixMsgInLogon() {
69-
s.store.IncrNextSenderMsgSeqNum()
69+
s.Require().Nil(s.store.IncrNextSenderMsgSeqNum())
7070
s.MessageFactory.seqNum = 1
71-
s.store.IncrNextTargetMsgSeqNum()
71+
s.Require().Nil(s.store.IncrNextTargetMsgSeqNum())
7272

7373
logon := s.Logon()
7474
logon.Body.SetField(tagHeartBtInt, FIXInt(32))
@@ -93,9 +93,9 @@ func (s *LogonStateTestSuite) TestFixMsgInLogon() {
9393

9494
func (s *LogonStateTestSuite) TestFixMsgInLogonInitiateLogon() {
9595
s.session.InitiateLogon = true
96-
s.store.IncrNextSenderMsgSeqNum()
96+
s.Require().Nil(s.store.IncrNextSenderMsgSeqNum())
9797
s.MessageFactory.seqNum = 1
98-
s.store.IncrNextTargetMsgSeqNum()
98+
s.Require().Nil(s.store.IncrNextTargetMsgSeqNum())
9999

100100
logon := s.Logon()
101101
logon.Body.SetField(tagHeartBtInt, FIXInt(32))
@@ -150,3 +150,27 @@ func (s *LogonStateTestSuite) TestStop() {
150150
s.Stopped()
151151
}
152152
}
153+
154+
func (s *LogonStateTestSuite) TestFixMsgInLogonRejectLogon() {
155+
s.Require().Nil(s.store.IncrNextSenderMsgSeqNum())
156+
s.MessageFactory.seqNum = 1
157+
s.Require().Nil(s.store.IncrNextTargetMsgSeqNum())
158+
159+
logon := s.Logon()
160+
logon.Body.SetField(tagHeartBtInt, FIXInt(32))
161+
162+
s.MockApp.On("FromAdmin").Return(RejectLogon{"reject message"})
163+
s.MockApp.On("ToAdmin")
164+
s.fixMsgIn(s.session, logon)
165+
166+
s.MockApp.AssertExpectations(s.T())
167+
168+
s.State(latentState{})
169+
170+
s.LastToAdminMessageSent()
171+
s.MessageType(enum.MsgType_LOGOUT, s.MockApp.lastToAdmin)
172+
s.FieldEquals(tagText, "reject message", s.MockApp.lastToAdmin.Body)
173+
174+
s.NextTargetMsgSeqNum(3)
175+
s.NextSenderMsgSeqNum(3)
176+
}

session.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ func (s *session) sendLogon(resetStore, setResetSeqNum bool) error {
128128
return nil
129129
}
130130

131-
func (s *session) sendLogout(reason string) error {
131+
func (s *session) buildLogout(reason string) Message {
132132
logout := NewMessage()
133133
logout.Header.SetField(tagMsgType, FIXString("5"))
134134
logout.Header.SetField(tagBeginString, FIXString(s.sessionID.BeginString))
@@ -137,6 +137,12 @@ func (s *session) sendLogout(reason string) error {
137137
if reason != "" {
138138
logout.Body.SetField(tagText, FIXString(reason))
139139
}
140+
141+
return logout
142+
}
143+
144+
func (s *session) sendLogout(reason string) error {
145+
logout := s.buildLogout(reason)
140146
return s.send(logout)
141147
}
142148

session_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -611,8 +611,8 @@ func (suite *SessionSendTestSuite) TestQueueForSendAppMessage() {
611611
}
612612

613613
func (suite *SessionSendTestSuite) TestQueueForSendDoNotSendAppMessage() {
614-
suite.MockApp.On("ToApp").Return(DoNotSend)
615-
suite.Equal(DoNotSend, suite.queueForSend(suite.NewOrderSingle()))
614+
suite.MockApp.On("ToApp").Return(ErrDoNotSend)
615+
suite.Equal(ErrDoNotSend, suite.queueForSend(suite.NewOrderSingle()))
616616

617617
suite.MockApp.AssertExpectations(suite.T())
618618
suite.NoMessagePersisted(1)
@@ -649,8 +649,8 @@ func (suite *SessionSendTestSuite) TestSendAppMessage() {
649649
}
650650

651651
func (suite *SessionSendTestSuite) TestSendAppDoNotSendMessage() {
652-
suite.MockApp.On("ToApp").Return(DoNotSend)
653-
suite.Equal(DoNotSend, suite.send(suite.NewOrderSingle()))
652+
suite.MockApp.On("ToApp").Return(ErrDoNotSend)
653+
suite.Equal(ErrDoNotSend, suite.send(suite.NewOrderSingle()))
654654

655655
suite.MockApp.AssertExpectations(suite.T())
656656
suite.NextSenderMsgSeqNum(1)

0 commit comments

Comments
 (0)