Skip to content

Commit fc8e0d5

Browse files
authored
Merge pull request #454 from michaelwilner/expose-validation
Expose Validator as a publicly accessible interface
2 parents 9b63924 + 082679d commit fc8e0d5

File tree

4 files changed

+57
-36
lines changed

4 files changed

+57
-36
lines changed

session.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ type session struct {
3030
sessionEvent chan internal.Event
3131
messageEvent chan bool
3232
application Application
33-
validator
33+
Validator
3434
stateMachine
3535
stateTimer *internal.EventTimer
3636
peerTimer *internal.EventTimer
@@ -514,8 +514,8 @@ func (s *session) verifySelect(msg *Message, checkTooHigh bool, checkTooLow bool
514514
}
515515
}
516516

517-
if s.validator != nil {
518-
if reject := s.validator.Validate(msg); reject != nil {
517+
if s.Validator != nil {
518+
if reject := s.Validator.Validate(msg); reject != nil {
519519
return reject
520520
}
521521
}

session_factory.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ func (f sessionFactory) newSession(
110110
return
111111
}
112112

113-
s.validator = &fixtValidator{s.transportDataDictionary, s.appDataDictionary, validatorSettings}
113+
s.Validator = NewValidator(validatorSettings, s.appDataDictionary, s.transportDataDictionary)
114114
}
115115
} else if settings.HasSetting(config.DataDictionary) {
116116
var dataDictionaryPath string
@@ -122,7 +122,7 @@ func (f sessionFactory) newSession(
122122
return
123123
}
124124

125-
s.validator = &fixValidator{s.appDataDictionary, validatorSettings}
125+
s.Validator = NewValidator(validatorSettings, s.appDataDictionary, nil)
126126
}
127127

128128
if settings.HasSetting(config.ResetOnLogon) {

validation.go

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,31 +4,48 @@ import (
44
"github.com/quickfixgo/quickfix/datadictionary"
55
)
66

7-
type validator interface {
7+
//Validator validates a FIX message
8+
type Validator interface {
89
Validate(*Message) MessageRejectError
910
}
1011

11-
type validatorSettings struct {
12+
//ValidatorSettings describe validation behavior
13+
type ValidatorSettings struct {
1214
CheckFieldsOutOfOrder bool
1315
RejectInvalidMessage bool
1416
}
1517

1618
//Default configuration for message validation.
1719
//See http://www.quickfixengine.org/quickfix/doc/html/configuration.html.
18-
var defaultValidatorSettings = validatorSettings{
20+
var defaultValidatorSettings = ValidatorSettings{
1921
CheckFieldsOutOfOrder: true,
2022
RejectInvalidMessage: true,
2123
}
2224

2325
type fixValidator struct {
2426
dataDictionary *datadictionary.DataDictionary
25-
settings validatorSettings
27+
settings ValidatorSettings
2628
}
2729

2830
type fixtValidator struct {
2931
transportDataDictionary *datadictionary.DataDictionary
3032
appDataDictionary *datadictionary.DataDictionary
31-
settings validatorSettings
33+
settings ValidatorSettings
34+
}
35+
36+
//NewValidator creates a FIX message validator from the given data dictionaries
37+
func NewValidator(settings ValidatorSettings, appDataDictionary, transportDataDictionary *datadictionary.DataDictionary) Validator {
38+
if transportDataDictionary != nil {
39+
return &fixtValidator{
40+
transportDataDictionary: transportDataDictionary,
41+
appDataDictionary: appDataDictionary,
42+
settings: settings,
43+
}
44+
}
45+
return &fixValidator{
46+
dataDictionary: appDataDictionary,
47+
settings: settings,
48+
}
3249
}
3350

3451
//Validate tests the message against the provided data dictionary.
@@ -61,7 +78,7 @@ func (v *fixtValidator) Validate(msg *Message) MessageRejectError {
6178
return validateFIXT(v.transportDataDictionary, v.appDataDictionary, v.settings, msgType, msg)
6279
}
6380

64-
func validateFIX(d *datadictionary.DataDictionary, settings validatorSettings, msgType string, msg *Message) MessageRejectError {
81+
func validateFIX(d *datadictionary.DataDictionary, settings ValidatorSettings, msgType string, msg *Message) MessageRejectError {
6582
if err := validateMsgType(d, msgType, msg); err != nil {
6683
return err
6784
}
@@ -89,7 +106,7 @@ func validateFIX(d *datadictionary.DataDictionary, settings validatorSettings, m
89106
return nil
90107
}
91108

92-
func validateFIXT(transportDD, appDD *datadictionary.DataDictionary, settings validatorSettings, msgType string, msg *Message) MessageRejectError {
109+
func validateFIXT(transportDD, appDD *datadictionary.DataDictionary, settings ValidatorSettings, msgType string, msg *Message) MessageRejectError {
93110
if err := validateMsgType(appDD, msgType, msg); err != nil {
94111
return err
95112
}

validation_test.go

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111

1212
type validateTest struct {
1313
TestName string
14-
Validator validator
14+
Validator Validator
1515
MessageBytes []byte
1616
ExpectedRejectReason int
1717
ExpectedRefTagID *Tag
@@ -126,7 +126,7 @@ func createFIX43NewOrderSingle() *Message {
126126

127127
func tcInvalidTagNumberHeader() validateTest {
128128
dict, _ := datadictionary.Parse("spec/FIX40.xml")
129-
validator := &fixValidator{dict, defaultValidatorSettings}
129+
validator := NewValidator(defaultValidatorSettings, dict, nil)
130130
invalidHeaderFieldMessage := createFIX40NewOrderSingle()
131131
tag := Tag(9999)
132132
invalidHeaderFieldMessage.Header.SetField(tag, FIXString("hello"))
@@ -142,7 +142,7 @@ func tcInvalidTagNumberHeader() validateTest {
142142
}
143143
func tcInvalidTagNumberBody() validateTest {
144144
dict, _ := datadictionary.Parse("spec/FIX40.xml")
145-
validator := &fixValidator{dict, defaultValidatorSettings}
145+
validator := NewValidator(defaultValidatorSettings, dict, nil)
146146
invalidBodyFieldMessage := createFIX40NewOrderSingle()
147147
tag := Tag(9999)
148148
invalidBodyFieldMessage.Body.SetField(tag, FIXString("hello"))
@@ -159,7 +159,7 @@ func tcInvalidTagNumberBody() validateTest {
159159

160160
func tcInvalidTagNumberTrailer() validateTest {
161161
dict, _ := datadictionary.Parse("spec/FIX40.xml")
162-
validator := &fixValidator{dict, defaultValidatorSettings}
162+
validator := NewValidator(defaultValidatorSettings, dict, nil)
163163
invalidTrailerFieldMessage := createFIX40NewOrderSingle()
164164
tag := Tag(9999)
165165
invalidTrailerFieldMessage.Trailer.SetField(tag, FIXString("hello"))
@@ -176,7 +176,7 @@ func tcInvalidTagNumberTrailer() validateTest {
176176

177177
func tcTagNotDefinedForMessage() validateTest {
178178
dict, _ := datadictionary.Parse("spec/FIX40.xml")
179-
validator := &fixValidator{dict, defaultValidatorSettings}
179+
validator := NewValidator(defaultValidatorSettings, dict, nil)
180180
invalidMsg := createFIX40NewOrderSingle()
181181
tag := Tag(41)
182182
invalidMsg.Body.SetField(tag, FIXString("hello"))
@@ -194,7 +194,7 @@ func tcTagNotDefinedForMessage() validateTest {
194194
func tcTagIsDefinedForMessage() validateTest {
195195
//compare to tcTagIsNotDefinedForMessage
196196
dict, _ := datadictionary.Parse("spec/FIX43.xml")
197-
validator := &fixValidator{dict, defaultValidatorSettings}
197+
validator := NewValidator(defaultValidatorSettings, dict, nil)
198198
validMsg := createFIX43NewOrderSingle()
199199
msgBytes := validMsg.build()
200200

@@ -208,7 +208,7 @@ func tcTagIsDefinedForMessage() validateTest {
208208

209209
func tcFieldNotFoundBody() validateTest {
210210
dict, _ := datadictionary.Parse("spec/FIX40.xml")
211-
validator := &fixValidator{dict, defaultValidatorSettings}
211+
validator := NewValidator(defaultValidatorSettings, dict, nil)
212212
invalidMsg1 := NewMessage()
213213
invalidMsg1.Header.SetField(tagMsgType, FIXString("D")).
214214
SetField(tagBeginString, FIXString("FIX.4.0")).
@@ -242,7 +242,7 @@ func tcFieldNotFoundBody() validateTest {
242242

243243
func tcFieldNotFoundHeader() validateTest {
244244
dict, _ := datadictionary.Parse("spec/FIX40.xml")
245-
validator := &fixValidator{dict, defaultValidatorSettings}
245+
validator := NewValidator(defaultValidatorSettings, dict, nil)
246246

247247
invalidMsg2 := NewMessage()
248248
invalidMsg2.Trailer.SetField(tagCheckSum, FIXString("000"))
@@ -275,7 +275,7 @@ func tcFieldNotFoundHeader() validateTest {
275275

276276
func tcTagSpecifiedWithoutAValue() validateTest {
277277
dict, _ := datadictionary.Parse("spec/FIX40.xml")
278-
validator := &fixValidator{dict, defaultValidatorSettings}
278+
validator := NewValidator(defaultValidatorSettings, dict, nil)
279279
builder := createFIX40NewOrderSingle()
280280

281281
bogusTag := Tag(109)
@@ -293,7 +293,7 @@ func tcTagSpecifiedWithoutAValue() validateTest {
293293

294294
func tcInvalidMsgType() validateTest {
295295
dict, _ := datadictionary.Parse("spec/FIX40.xml")
296-
validator := &fixValidator{dict, defaultValidatorSettings}
296+
validator := NewValidator(defaultValidatorSettings, dict, nil)
297297
builder := createFIX40NewOrderSingle()
298298
builder.Header.SetField(tagMsgType, FIXString("z"))
299299
msgBytes := builder.build()
@@ -308,7 +308,7 @@ func tcInvalidMsgType() validateTest {
308308

309309
func tcValueIsIncorrect() validateTest {
310310
dict, _ := datadictionary.Parse("spec/FIX40.xml")
311-
validator := &fixValidator{dict, defaultValidatorSettings}
311+
validator := NewValidator(defaultValidatorSettings, dict, nil)
312312

313313
tag := Tag(21)
314314
builder := createFIX40NewOrderSingle()
@@ -326,7 +326,7 @@ func tcValueIsIncorrect() validateTest {
326326

327327
func tcIncorrectDataFormatForValue() validateTest {
328328
dict, _ := datadictionary.Parse("spec/FIX40.xml")
329-
validator := &fixValidator{dict, defaultValidatorSettings}
329+
validator := NewValidator(defaultValidatorSettings, dict, nil)
330330
builder := createFIX40NewOrderSingle()
331331
tag := Tag(38)
332332
builder.Body.SetField(tag, FIXString("+200.00"))
@@ -343,7 +343,7 @@ func tcIncorrectDataFormatForValue() validateTest {
343343

344344
func tcTagSpecifiedOutOfRequiredOrderHeader() validateTest {
345345
dict, _ := datadictionary.Parse("spec/FIX40.xml")
346-
validator := &fixValidator{dict, defaultValidatorSettings}
346+
validator := NewValidator(defaultValidatorSettings, dict, nil)
347347

348348
builder := createFIX40NewOrderSingle()
349349
tag := tagOnBehalfOfCompID
@@ -362,7 +362,7 @@ func tcTagSpecifiedOutOfRequiredOrderHeader() validateTest {
362362

363363
func tcTagSpecifiedOutOfRequiredOrderTrailer() validateTest {
364364
dict, _ := datadictionary.Parse("spec/FIX40.xml")
365-
validator := &fixValidator{dict, defaultValidatorSettings}
365+
validator := NewValidator(defaultValidatorSettings, dict, nil)
366366

367367
builder := createFIX40NewOrderSingle()
368368
tag := tagSignature
@@ -382,8 +382,9 @@ func tcTagSpecifiedOutOfRequiredOrderTrailer() validateTest {
382382

383383
func tcInvalidTagCheckDisabled() validateTest {
384384
dict, _ := datadictionary.Parse("spec/FIX40.xml")
385-
validator := &fixValidator{dict, defaultValidatorSettings}
386-
validator.settings.RejectInvalidMessage = false
385+
customValidatorSettings := defaultValidatorSettings
386+
customValidatorSettings.RejectInvalidMessage = false
387+
validator := NewValidator(customValidatorSettings, dict, nil)
387388

388389
builder := createFIX40NewOrderSingle()
389390
tag := Tag(9999)
@@ -400,8 +401,9 @@ func tcInvalidTagCheckDisabled() validateTest {
400401

401402
func tcInvalidTagCheckEnabled() validateTest {
402403
dict, _ := datadictionary.Parse("spec/FIX40.xml")
403-
validator := &fixValidator{dict, defaultValidatorSettings}
404-
validator.settings.RejectInvalidMessage = true
404+
customValidatorSettings := defaultValidatorSettings
405+
customValidatorSettings.RejectInvalidMessage = true
406+
validator := NewValidator(customValidatorSettings, dict, nil)
405407

406408
builder := createFIX40NewOrderSingle()
407409
tag := Tag(9999)
@@ -419,8 +421,9 @@ func tcInvalidTagCheckEnabled() validateTest {
419421

420422
func tcTagSpecifiedOutOfRequiredOrderDisabledHeader() validateTest {
421423
dict, _ := datadictionary.Parse("spec/FIX40.xml")
422-
validator := &fixValidator{dict, defaultValidatorSettings}
423-
validator.settings.CheckFieldsOutOfOrder = false
424+
customValidatorSettings := defaultValidatorSettings
425+
customValidatorSettings.CheckFieldsOutOfOrder = false
426+
validator := NewValidator(customValidatorSettings, dict, nil)
424427

425428
builder := createFIX40NewOrderSingle()
426429
tag := tagOnBehalfOfCompID
@@ -438,8 +441,9 @@ func tcTagSpecifiedOutOfRequiredOrderDisabledHeader() validateTest {
438441

439442
func tcTagSpecifiedOutOfRequiredOrderDisabledTrailer() validateTest {
440443
dict, _ := datadictionary.Parse("spec/FIX40.xml")
441-
validator := &fixValidator{dict, defaultValidatorSettings}
442-
validator.settings.CheckFieldsOutOfOrder = false
444+
customValidatorSettings := defaultValidatorSettings
445+
customValidatorSettings.CheckFieldsOutOfOrder = false
446+
validator := NewValidator(customValidatorSettings, dict, nil)
443447

444448
builder := createFIX40NewOrderSingle()
445449
tag := tagSignature
@@ -457,7 +461,7 @@ func tcTagSpecifiedOutOfRequiredOrderDisabledTrailer() validateTest {
457461

458462
func tcTagAppearsMoreThanOnce() validateTest {
459463
dict, _ := datadictionary.Parse("spec/FIX40.xml")
460-
validator := &fixValidator{dict, defaultValidatorSettings}
464+
validator := NewValidator(defaultValidatorSettings, dict, nil)
461465
tag := Tag(40)
462466

463467
return validateTest{
@@ -471,7 +475,7 @@ func tcTagAppearsMoreThanOnce() validateTest {
471475

472476
func tcFloatValidation() validateTest {
473477
dict, _ := datadictionary.Parse("spec/FIX42.xml")
474-
validator := &fixValidator{dict, defaultValidatorSettings}
478+
validator := NewValidator(defaultValidatorSettings, dict, nil)
475479
tag := Tag(38)
476480
return validateTest{
477481
TestName: "FloatValidation",

0 commit comments

Comments
 (0)