Skip to content

Commit e3adf71

Browse files
Fixed broken tests after fixing parsing to validate checksum
1 parent 2497d57 commit e3adf71

File tree

5 files changed

+111
-51
lines changed

5 files changed

+111
-51
lines changed

message.go

Lines changed: 41 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -182,11 +182,17 @@ func ParseMessageWithDataDictionary(
182182
// doParsing executes the message parsing process.
183183
func doParsing(mp *msgParser) (err error) {
184184
mp.msg.Header.rwLock.Lock()
185-
defer mp.msg.Header.rwLock.Unlock()
186185
mp.msg.Body.rwLock.Lock()
187-
defer mp.msg.Body.rwLock.Unlock()
188186
mp.msg.Trailer.rwLock.Lock()
189-
defer mp.msg.Trailer.rwLock.Unlock()
187+
188+
locked := true
189+
defer func() {
190+
if locked {
191+
mp.msg.Header.rwLock.Unlock()
192+
mp.msg.Body.rwLock.Unlock()
193+
mp.msg.Trailer.rwLock.Unlock()
194+
}
195+
}()
190196

191197
// Initialize for parsing.
192198
mp.msg.Header.clearNoLock()
@@ -294,13 +300,44 @@ func doParsing(mp *msgParser) (err error) {
294300
}
295301
}
296302

297-
bodyLength, err := mp.msg.Header.getIntNoLock(tagBodyLength)
303+
var bodyLength int
304+
bodyLength, err = mp.msg.Header.getIntNoLock(tagBodyLength)
298305
if err != nil {
299306
err = parseError{OrigError: err.Error()}
300307
} else if length != bodyLength && !xmlDataMsg {
301308
err = parseError{OrigError: fmt.Sprintf("Incorrect Message Length, expected %d, got %d", bodyLength, length)}
302309
}
303310

311+
mp.msg.Header.rwLock.Unlock()
312+
mp.msg.Body.rwLock.Unlock()
313+
mp.msg.Trailer.rwLock.Unlock()
314+
locked = false
315+
if err != nil {
316+
return err
317+
}
318+
319+
calculatedCheckSum := 0
320+
for i := 0; i <= mp.fieldIndex; i++ {
321+
if mp.msg.fields[i].tag == tagCheckSum {
322+
continue
323+
}
324+
calculatedCheckSum += mp.msg.fields[i].total()
325+
}
326+
327+
calculatedCheckSum = calculatedCheckSum % 256
328+
329+
var expectedCheckSumStr string
330+
expectedCheckSumStr, err = mp.msg.Trailer.GetString(tagCheckSum)
331+
if err != nil {
332+
return parseError{OrigError: "CheckSum tag missing"}
333+
}
334+
335+
if expectedCheckSumStr != formatCheckSum(calculatedCheckSum) {
336+
return parseError{
337+
OrigError: fmt.Sprintf("Expected CheckSum=%s, Received CheckSum=%s", formatCheckSum(calculatedCheckSum), expectedCheckSumStr),
338+
}
339+
}
340+
304341
return
305342
}
306343

message_router_test.go

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -115,25 +115,37 @@ func (suite *MessageRouterTestSuite) SetupTest() {
115115
}
116116

117117
func (suite *MessageRouterTestSuite) TestNoRoute() {
118-
suite.givenTheMessage([]byte("8=FIX.4.39=8735=D49=TW34=356=ISLD52=20160421-14:43:5040=160=20160421-14:43:5054=121=311=id10=235"))
118+
suite.givenTheMessage([]byte("8=FIX.4.39=8735=D49=TW34=356=ISLD52=20160421-14:43:5040=160=20160421-14:43:5054=121=311=id10=236"))
119119

120120
rej := suite.Route(suite.msg, suite.sessionID)
121121
suite.verifyMessageNotRouted()
122122
suite.Equal(NewBusinessMessageRejectError("Unsupported Message Type", 3, nil), rej)
123123
}
124124

125125
func (suite *MessageRouterTestSuite) TestNoRouteWhitelistedMessageTypes() {
126-
var tests = []string{"0", "A", "1", "2", "3", "4", "5", "j"}
126+
var tests = []struct {
127+
msgType string
128+
checksum string
129+
}{
130+
{"0", "216"},
131+
{"A", "233"},
132+
{"1", "217"},
133+
{"2", "218"},
134+
{"3", "219"},
135+
{"4", "220"},
136+
{"5", "221"},
137+
{"j", "018"},
138+
}
127139

128140
for _, test := range tests {
129141
suite.SetupTest()
130142

131-
msg := fmt.Sprintf("8=FIX.4.39=8735=%v49=TW34=356=ISLD52=20160421-14:43:5040=160=20160421-14:43:5054=121=311=id10=235", test)
143+
msg := fmt.Sprintf("8=FIX.4.39=8735=%s49=TW34=356=ISLD52=20160421-14:43:5040=160=20160421-14:43:5054=121=311=id10=%s", test.msgType, test.checksum)
132144
suite.givenTheMessage([]byte(msg))
133145

134146
rej := suite.Route(suite.msg, suite.sessionID)
135147
suite.verifyMessageNotRouted()
136-
suite.Nil(rej, "Message type '%v' should not be rejected by the MessageRouter", test)
148+
suite.Nil(rej, "Message type '%s' should not be rejected by the MessageRouter", test.msgType)
137149
}
138150
}
139151

@@ -174,7 +186,7 @@ func (suite *MessageRouterTestSuite) TestRouteFIXT50AppWithApplVerID() {
174186
suite.givenTheRoute(ApplVerIDFIX50, "D")
175187
suite.givenTheRoute(ApplVerIDFIX50SP1, "D")
176188

177-
suite.givenTheMessage([]byte("8=FIXT.1.19=8935=D49=TW34=356=ISLD52=20160424-16:48:261128=740=160=20160424-16:48:2611=id21=310=120"))
189+
suite.givenTheMessage([]byte("8=FIXT.1.19=8935=D49=TW34=356=ISLD52=20160424-16:48:261128=740=160=20160424-16:48:2611=id21=310=192"))
178190
rej := suite.Route(suite.msg, suite.sessionID)
179191
suite.verifyMessageRoutedBy(ApplVerIDFIX50, "D")
180192
suite.Nil(rej)
@@ -185,7 +197,7 @@ func (suite *MessageRouterTestSuite) TestRouteFIXTAppWithApplVerID() {
185197
suite.givenTheRoute(ApplVerIDFIX50, "D")
186198
suite.givenTheRoute(ApplVerIDFIX50SP1, "D")
187199

188-
suite.givenTheMessage([]byte("8=FIXT.1.19=8935=D49=TW34=356=ISLD52=20160424-16:48:261128=840=160=20160424-16:48:2611=id21=310=120"))
200+
suite.givenTheMessage([]byte("8=FIXT.1.19=8935=D49=TW34=356=ISLD52=20160424-16:48:261128=840=160=20160424-16:48:2611=id21=310=193"))
189201
rej := suite.Route(suite.msg, suite.sessionID)
190202
suite.verifyMessageRoutedBy(ApplVerIDFIX50SP1, "D")
191203
suite.Nil(rej)

message_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ func (s *MessageSuite) TestParseMessageEmpty() {
6565
}
6666

6767
func (s *MessageSuite) TestParseMessage() {
68-
rawMsg := bytes.NewBufferString("8=FIX.4.29=10435=D34=249=TW52=20140515-19:49:56.65956=ISLD11=10021=140=154=155=TSLA60=00010101-00:00:00.00010=039")
68+
rawMsg := bytes.NewBufferString("8=FIX.4.29=10435=D34=249=TW52=20140515-19:49:56.65956=ISLD11=10021=140=154=155=TSLA60=00010101-00:00:00.00010=051")
6969

7070
err := ParseMessage(s.msg, rawMsg)
7171
s.Nil(err)
@@ -99,7 +99,7 @@ func (s *MessageSuite) TestParseMessageWithDataDictionary() {
9999
5050: nil,
100100
},
101101
}
102-
rawMsg := bytes.NewBufferString("8=FIX.4.29=12635=D34=249=TW52=20140515-19:49:56.65956=ISLD10030=CUST11=10021=140=154=155=TSLA60=00010101-00:00:00.0005050=HELLO10=039")
102+
rawMsg := bytes.NewBufferString("8=FIX.4.29=12635=D34=249=TW52=20140515-19:49:56.65956=ISLD10030=CUST11=10021=140=154=155=TSLA60=00010101-00:00:00.0005050=HELLO10=036")
103103

104104
err := ParseMessageWithDataDictionary(s.msg, rawMsg, dict, dict)
105105
s.Nil(err)
@@ -127,7 +127,7 @@ func (s *MessageSuite) TestBuild() {
127127
}
128128

129129
func (s *MessageSuite) TestReBuild() {
130-
rawMsg := bytes.NewBufferString("8=FIX.4.29=10435=D34=249=TW52=20140515-19:49:56.65956=ISLD11=10021=140=154=155=TSLA60=00010101-00:00:00.00010=039")
130+
rawMsg := bytes.NewBufferString("8=FIX.4.29=10435=D34=249=TW52=20140515-19:49:56.65956=ISLD11=10021=140=154=155=TSLA60=00010101-00:00:00.00010=051")
131131

132132
s.Nil(ParseMessage(s.msg, rawMsg))
133133

@@ -419,7 +419,7 @@ func (s *MessageSuite) TestReBuildWithRepeatingGroupForResend() {
419419
}
420420

421421
func (s *MessageSuite) TestReverseRoute() {
422-
s.Nil(ParseMessage(s.msg, bytes.NewBufferString("8=FIX.4.29=17135=D34=249=TW50=KK52=20060102-15:04:0556=ISLD57=AP144=BB115=JCD116=CS128=MG129=CB142=JV143=RY145=BH11=ID21=338=10040=w54=155=INTC60=20060102-15:04:0510=123")))
422+
s.Nil(ParseMessage(s.msg, bytes.NewBufferString("8=FIX.4.29=17135=D34=249=TW50=KK52=20060102-15:04:0556=ISLD57=AP144=BB115=JCD116=CS128=MG129=CB142=JV143=RY145=BH11=ID21=338=10040=w54=155=INTC60=20060102-15:04:0510=033")))
423423

424424
builder := s.msg.reverseRoute()
425425

@@ -450,15 +450,15 @@ func (s *MessageSuite) TestReverseRoute() {
450450
}
451451

452452
func (s *MessageSuite) TestReverseRouteIgnoreEmpty() {
453-
s.Nil(ParseMessage(s.msg, bytes.NewBufferString("8=FIX.4.09=12835=D34=249=TW52=20060102-15:04:0556=ISLD115=116=CS128=MG129=CB11=ID21=338=10040=w54=155=INTC60=20060102-15:04:0510=123")))
453+
s.Nil(ParseMessage(s.msg, bytes.NewBufferString("8=FIX.4.09=12835=D34=249=TW52=20060102-15:04:0556=ISLD115=116=CS128=MG129=CB11=ID21=338=10040=w54=155=INTC60=20060102-15:04:0510=041")))
454454
builder := s.msg.reverseRoute()
455455

456456
s.False(builder.Header.Has(tagDeliverToCompID), "Should not reverse if empty")
457457
}
458458

459459
func (s *MessageSuite) TestReverseRouteFIX40() {
460460
// The onbehalfof/deliverto location id not supported in fix 4.0.
461-
s.Nil(ParseMessage(s.msg, bytes.NewBufferString("8=FIX.4.09=17135=D34=249=TW50=KK52=20060102-15:04:0556=ISLD57=AP144=BB115=JCD116=CS128=MG129=CB142=JV143=RY145=BH11=ID21=338=10040=w54=155=INTC60=20060102-15:04:0510=123")))
461+
s.Nil(ParseMessage(s.msg, bytes.NewBufferString("8=FIX.4.09=17135=D34=249=TW50=KK52=20060102-15:04:0556=ISLD57=AP144=BB115=JCD116=CS128=MG129=CB142=JV143=RY145=BH11=ID21=338=10040=w54=155=INTC60=20060102-15:04:0510=031")))
462462

463463
builder := s.msg.reverseRoute()
464464

@@ -468,7 +468,7 @@ func (s *MessageSuite) TestReverseRouteFIX40() {
468468
}
469469

470470
func (s *MessageSuite) TestCopyIntoMessage() {
471-
msgString := "8=FIX.4.29=17135=D34=249=TW50=KK52=20060102-15:04:0556=ISLD57=AP144=BB115=JCD116=CS128=MG129=CB142=JV143=RY145=BH11=ID21=338=10040=w54=155=INTC60=20060102-15:04:0510=123"
471+
msgString := "8=FIX.4.29=17135=D34=249=TW50=KK52=20060102-15:04:0556=ISLD57=AP144=BB115=JCD116=CS128=MG129=CB142=JV143=RY145=BH11=ID21=338=10040=w54=155=INTC60=20060102-15:04:0510=033"
472472
msgBuf := bytes.NewBufferString(msgString)
473473
s.Nil(ParseMessage(s.msg, msgBuf))
474474

repeating_group_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ func TestRepeatingGroup_ReadRecursive(t *testing.T) {
230230

231231
func TestRepeatingGroup_ReadComplete(t *testing.T) {
232232

233-
rawMsg := bytes.NewBufferString("8=FIXT.1.19=26835=W34=711849=TEST52=20151027-18:41:52.69856=TST22=9948=TSTX15262=7268=4269=4270=0.07499272=20151027273=18:41:52.698269=7270=0.07501272=20151027273=18:41:52.698269=8270=0.07494272=20151027273=18:41:52.698269=B271=60272=20151027273=18:41:52.69810=163")
233+
rawMsg := bytes.NewBufferString("8=FIXT.1.19=26835=W34=711849=TEST52=20151027-18:41:52.69856=TST22=9948=TSTX15262=7268=4269=4270=0.07499272=20151027273=18:41:52.698269=7270=0.07501272=20151027273=18:41:52.698269=8270=0.07494272=20151027273=18:41:52.698269=B271=60272=20151027273=18:41:52.69810=094")
234234

235235
msg := NewMessage()
236236
err := ParseMessage(msg, rawMsg)

validation_test.go

Lines changed: 44 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ import (
2020
"testing"
2121
"time"
2222

23-
"github.com/stretchr/testify/assert"
24-
2523
"github.com/quickfixgo/quickfix/datadictionary"
2624
)
2725

@@ -32,6 +30,7 @@ type validateTest struct {
3230
ExpectedRejectReason int
3331
ExpectedRefTagID *Tag
3432
DoNotExpectReject bool
33+
ExpectParseError bool
3534
}
3635

3736
func TestValidate(t *testing.T) {
@@ -90,38 +89,49 @@ func TestValidate(t *testing.T) {
9089

9190
msg := NewMessage()
9291
for _, test := range tests {
93-
assert.Nil(t, ParseMessage(msg, bytes.NewBuffer(test.MessageBytes)))
94-
reject := test.Validator.Validate(msg)
92+
t.Run(test.TestName, func(t *testing.T) {
93+
err := ParseMessage(msg, bytes.NewBuffer(test.MessageBytes))
94+
95+
if test.ExpectParseError {
96+
if err == nil {
97+
t.Errorf("%v: Expected ParseMessage to fail, but it succeeded", test.TestName)
98+
}
99+
return
100+
}
95101

96-
switch {
97-
case reject == nil && test.DoNotExpectReject:
98-
continue
102+
if err != nil {
103+
t.Fatalf("ParseMessage failed: %v", err)
104+
}
105+
reject := test.Validator.Validate(msg)
99106

100-
case reject != nil && test.DoNotExpectReject:
101-
t.Errorf("%v: Unexpected reject: %v", test.TestName, reject)
102-
continue
107+
switch {
108+
case reject == nil && test.DoNotExpectReject:
109+
return
103110

104-
case reject == nil:
105-
t.Errorf("%v: Expected reject", test.TestName)
106-
continue
107-
}
111+
case reject != nil && test.DoNotExpectReject:
112+
t.Errorf("%v: Unexpected reject: %v", test.TestName, reject)
113+
return
108114

109-
if reject.RejectReason() != test.ExpectedRejectReason {
110-
t.Errorf("%v: Expected reason %v got %v", test.TestName, test.ExpectedRejectReason, reject.RejectReason())
111-
}
115+
case reject == nil:
116+
t.Errorf("%v: Expected reject", test.TestName)
117+
return
118+
}
112119

113-
switch {
114-
case reject.RefTagID() == nil && test.ExpectedRefTagID == nil:
115-
// OK, expected and actual ref tag not set.
116-
case reject.RefTagID() != nil && test.ExpectedRefTagID == nil:
117-
t.Errorf("%v: Unexpected RefTag '%v'", test.TestName, *reject.RefTagID())
118-
case reject.RefTagID() == nil && test.ExpectedRefTagID != nil:
119-
t.Errorf("%v: Expected RefTag '%v'", test.TestName, *test.ExpectedRefTagID)
120-
case *reject.RefTagID() == *test.ExpectedRefTagID:
121-
// OK, tags equal.
122-
default:
123-
t.Errorf("%v: Expected RefTag '%v' got '%v'", test.TestName, *test.ExpectedRefTagID, *reject.RefTagID())
124-
}
120+
if reject.RejectReason() != test.ExpectedRejectReason {
121+
t.Errorf("%v: Expected reason %v got %v", test.TestName, test.ExpectedRejectReason, reject.RejectReason())
122+
}
123+
124+
switch {
125+
case reject.RefTagID() == nil && test.ExpectedRefTagID == nil:
126+
case reject.RefTagID() != nil && test.ExpectedRefTagID == nil:
127+
t.Errorf("%v: Unexpected RefTag '%v'", test.TestName, *reject.RefTagID())
128+
case reject.RefTagID() == nil && test.ExpectedRefTagID != nil:
129+
t.Errorf("%v: Expected RefTag '%v'", test.TestName, *test.ExpectedRefTagID)
130+
case *reject.RefTagID() == *test.ExpectedRefTagID:
131+
default:
132+
t.Errorf("%v: Expected RefTag '%v' got '%v'", test.TestName, *test.ExpectedRefTagID, *reject.RefTagID())
133+
}
134+
})
125135
}
126136
}
127137

@@ -201,6 +211,7 @@ func tcInvalidTagNumberHeader() validateTest {
201211
invalidHeaderFieldMessage := createFIX40NewOrderSingle()
202212
tag := Tag(9999)
203213
invalidHeaderFieldMessage.Header.SetField(tag, FIXString("hello"))
214+
invalidHeaderFieldMessage.cook()
204215
msgBytes := invalidHeaderFieldMessage.build()
205216

206217
return validateTest{
@@ -1109,7 +1120,7 @@ func tcTagAppearsMoreThanOnce() validateTest {
11091120
return validateTest{
11101121
TestName: "Tag appears more than once",
11111122
Validator: validator,
1112-
MessageBytes: []byte("8=FIX.4.09=10735=D34=249=TW52=20060102-15:04:0556=ISLD11=ID21=140=140=254=138=20055=INTC60=20060102-15:04:0510=234"),
1123+
MessageBytes: []byte("8=FIX.4.09=10735=D34=249=TW52=20060102-15:04:0556=ISLD11=ID21=140=140=254=138=20055=INTC60=20060102-15:04:0510=166"),
11131124
ExpectedRejectReason: rejectReasonTagAppearsMoreThanOnce,
11141125
ExpectedRefTagID: &tag,
11151126
}
@@ -1124,7 +1135,7 @@ func tcTagAppearsMoreThanOnceFixT() validateTest {
11241135
return validateTest{
11251136
TestName: "Tag appears more than once FIXT",
11261137
Validator: validator,
1127-
MessageBytes: []byte("8=FIXT.1.19=10735=D34=249=TW52=20060102-15:04:0556=ISLD11=ID21=140=140=254=138=20055=INTC60=20060102-15:04:0510=234"),
1138+
MessageBytes: []byte("8=FIXT.1.19=10735=D34=249=TW52=20060102-15:04:0556=ISLD11=ID21=140=140=254=138=20055=INTC60=20060102-15:04:0510=248"),
11281139
ExpectedRejectReason: rejectReasonTagAppearsMoreThanOnce,
11291140
ExpectedRefTagID: &tag,
11301141
}
@@ -1151,7 +1162,7 @@ func tcFloatValidationFixT() validateTest {
11511162
return validateTest{
11521163
TestName: "FloatValidation FIXT",
11531164
Validator: validator,
1154-
MessageBytes: []byte("8=FIXT.1.19=10635=D34=249=TW52=20140329-22:38:4556=ISLD11=ID21=140=154=138=+200.0055=INTC60=20140329-22:38:4510=178"),
1165+
MessageBytes: []byte("8=FIXT.1.19=10635=D34=249=TW52=20140329-22:38:4556=ISLD11=ID21=140=154=138=+200.0055=INTC60=20140329-22:38:4510=002"),
11551166
ExpectedRejectReason: rejectReasonIncorrectDataFormatForValue,
11561167
ExpectedRefTagID: &tag,
11571168
}
@@ -1163,7 +1174,7 @@ func tcMultipleRepeatingGroupFields() validateTest {
11631174
return validateTest{
11641175
TestName: "Multiple repeating group fields in a message",
11651176
Validator: validator,
1166-
MessageBytes: []byte("8=FIX.4.39=17635=D34=249=TW52=20140329-22:38:4556=ISLD11=ID453=2448=PARTYID452=3523=SUBID448=PARTYID2452=378=179=ACCOUNT80=121=140=154=138=20055=INTC60=20140329-22:38:4510=178"),
1177+
MessageBytes: []byte("8=FIX.4.39=17635=D34=249=TW52=20140329-22:38:4556=ISLD11=ID453=2448=PARTYID452=3523=SUBID448=PARTYID2452=378=179=ACCOUNT80=121=140=154=138=20055=INTC60=20140329-22:38:4510=012"),
11671178
DoNotExpectReject: true,
11681179
}
11691180
}

0 commit comments

Comments
 (0)