Skip to content

Commit

Permalink
all: check record lengths before parsing them
Browse files Browse the repository at this point in the history
  • Loading branch information
adamdecaf committed Jun 27, 2019
1 parent 538b6eb commit b75dd13
Show file tree
Hide file tree
Showing 24 changed files with 190 additions and 9 deletions.
5 changes: 5 additions & 0 deletions CheckDetailAddendumC.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"strconv"
"strings"
"time"
"unicode/utf8"
)

// Errors specific to a CheckDetailAddendumC Record
Expand Down Expand Up @@ -98,6 +99,10 @@ func NewCheckDetailAddendumC() CheckDetailAddendumC {

// Parse takes the input record string and parses the CheckDetailAddendumC values
func (cdAddendumC *CheckDetailAddendumC) Parse(record string) {
if utf8.RuneCountInString(record) < 60 {
return // line too short
}

// Character position 1-2, Always "28"
cdAddendumC.recordType = "28"
// 03-04
Expand Down
5 changes: 5 additions & 0 deletions checkDetail.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"fmt"
"strconv"
"strings"
"unicode/utf8"
)

// Errors specific to a CheckDetail Record
Expand Down Expand Up @@ -162,6 +163,10 @@ func NewCheckDetail() *CheckDetail {

// Parse takes the input record string and parses the CheckDetail values
func (cd *CheckDetail) Parse(record string) {
if utf8.RuneCountInString(record) < 80 {
return // line too short
}

// Character position 1-2, Always "25"
cd.recordType = "25"
// 03-17
Expand Down
5 changes: 5 additions & 0 deletions checkDetailAddendumA.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"strconv"
"strings"
"time"
"unicode/utf8"
)

// Errors specific to a CheckDetailAddendumA Record
Expand Down Expand Up @@ -94,6 +95,10 @@ func NewCheckDetailAddendumA() CheckDetailAddendumA {

// Parse takes the input record string and parses the CheckDetailAddendumA values
func (cdAddendumA *CheckDetailAddendumA) Parse(record string) {
if utf8.RuneCountInString(record) < 77 {
return // line too short
}

// Character position 1-2, Always "26"
cdAddendumA.recordType = "26"
// 03-03
Expand Down
8 changes: 8 additions & 0 deletions checkDetailAddendumA_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,14 @@ func mockCheckDetailAddendumA() CheckDetailAddendumA {
return cdAddendumA
}

func TestCheckDetailAddendumParseErr(t *testing.T) {
var c CheckDetailAddendumA
c.Parse("asdshfaksjs")
if c.RecordNumber != 0 {
t.Errorf("c.RecordNumber=%d", c.RecordNumber)
}
}

// TestMockCheckDetailAddendumA creates a CheckDetailAddendumA
func TestMockCheckDetailAddendumA(t *testing.T) {
cdAddendumA := mockCheckDetailAddendumA()
Expand Down
19 changes: 15 additions & 4 deletions checkDetailAddendumB.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package imagecashletter
import (
"fmt"
"strings"
"unicode/utf8"
)

// Errors specific to a CheckDetailAddendumB Record
Expand Down Expand Up @@ -60,6 +61,10 @@ func NewCheckDetailAddendumB() CheckDetailAddendumB {

// Parse takes the input record string and parses the CheckDetailAddendumB values
func (cdAddendumB *CheckDetailAddendumB) Parse(record string) {
if utf8.RuneCountInString(record) < 22 {
return // line too short
}

// Character position 1-2, Always "27"
cdAddendumB.recordType = "27"
// 03-03
Expand All @@ -68,14 +73,20 @@ func (cdAddendumB *CheckDetailAddendumB) Parse(record string) {
cdAddendumB.MicrofilmArchiveSequenceNumber = cdAddendumB.parseStringField(record[3:18])
// 19-22
cdAddendumB.LengthImageReferenceKey = cdAddendumB.parseStringField(record[18:22])

imageRefLength := cdAddendumB.parseNumField(cdAddendumB.LengthImageReferenceKey)
if utf8.RuneCountInString(record) < 46+imageRefLength {
return // line too short
}

// 23 (22+X)
cdAddendumB.ImageReferenceKey = cdAddendumB.parseStringField(record[22:cdAddendumB.parseNumField(cdAddendumB.LengthImageReferenceKey)])
cdAddendumB.ImageReferenceKey = cdAddendumB.parseStringField(record[22:imageRefLength])
// 23+X - 37+X
cdAddendumB.Description = cdAddendumB.parseStringField(record[22+cdAddendumB.parseNumField(cdAddendumB.LengthImageReferenceKey) : 37+cdAddendumB.parseNumField(cdAddendumB.LengthImageReferenceKey)])
cdAddendumB.Description = cdAddendumB.parseStringField(record[22+imageRefLength : 37+imageRefLength])
// 38+X - 41+X
cdAddendumB.UserField = cdAddendumB.parseStringField(record[37+cdAddendumB.parseNumField(cdAddendumB.LengthImageReferenceKey) : 41+cdAddendumB.parseNumField(cdAddendumB.LengthImageReferenceKey)])
cdAddendumB.UserField = cdAddendumB.parseStringField(record[37+imageRefLength : 41+imageRefLength])
// 42+X - 46+X
cdAddendumB.reserved = cdAddendumB.parseStringField(record[41+cdAddendumB.parseNumField(cdAddendumB.LengthImageReferenceKey) : 46+cdAddendumB.parseNumField(cdAddendumB.LengthImageReferenceKey)])
cdAddendumB.reserved = cdAddendumB.parseStringField(record[41+imageRefLength : 46+imageRefLength])
}

// String writes the CheckDetailAddendumB struct to a string.
Expand Down
15 changes: 15 additions & 0 deletions checkDetailAddendumB_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,21 @@ func mockCheckDetailAddendumB() CheckDetailAddendumB {
return cdAddendumB
}

func TestCheckDetailAddendumBParseErr(t *testing.T) {
var c CheckDetailAddendumB
c.Parse("asdhfakjfsa")
if c.ImageReferenceKeyIndicator != 0 {
t.Errorf("c.ImageReferenceKeyIndicator=%d", c.ImageReferenceKeyIndicator)
}
c.Parse("2711A 00340 CD Addendum B")
if c.ImageReferenceKeyIndicator != 1 {
t.Errorf("c.ImageReferenceKeyIndicator=%d", c.ImageReferenceKeyIndicator)
}
if c.ImageReferenceKey != "" {
t.Errorf("c.ImageReferenceKey=%s", c.ImageReferenceKey)
}
}

// TestMockCheckDetailAddendumB creates a CheckDetailAddendumB
func TestMockCheckDetailAddendumB(t *testing.T) {
cdAddendumB := mockCheckDetailAddendumB()
Expand Down
8 changes: 8 additions & 0 deletions checkDetailAddendumC_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,14 @@ func TestMockCheckDetailAddendumC(t *testing.T) {
}
}

func TestParseCheckDetailAddendumCErr(t *testing.T) {
var c CheckDetailAddendumC
c.Parse("asdsakjahsfa")
if c.RecordNumber != 0 {
t.Errorf("c.RecordNumber=%d", c.RecordNumber)
}
}

// TestParseCheckDetailAddendumC validates parsing a CheckDetailAddendumC
func TestParseCheckDetailAddendumC(t *testing.T) {
var line = "2801121042882201809051 Y10A 0 "
Expand Down
8 changes: 8 additions & 0 deletions checkDetail_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,14 @@ func mockCheckDetail() *CheckDetail {
return cd
}

func TestCheckDetailParseErr(t *testing.T) {
var c CheckDetail
c.Parse("jakjsakjfas")
if c.AuxiliaryOnUs != "" {
t.Errorf("c.AuxiliaryOnUs=%s", c.AuxiliaryOnUs)
}
}

// TestMockCheckDetail creates a CheckDetail
func TestMockCheckDetail(t *testing.T) {
cd := mockCheckDetail()
Expand Down
5 changes: 5 additions & 0 deletions returnDetail.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"strconv"
"strings"
"time"
"unicode/utf8"
)

// Errors specific to a ReturnDetail Record
Expand Down Expand Up @@ -170,6 +171,10 @@ func NewReturnDetail() *ReturnDetail {

// Parse takes the input record string and parses the ReturnDetail values
func (rd *ReturnDetail) Parse(record string) {
if utf8.RuneCountInString(record) < 72 {
return // line too short
}

// Character position 1-2, Always "31"
rd.recordType = "31"
// 03-10
Expand Down
5 changes: 5 additions & 0 deletions returnDetailAddendumA.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"strconv"
"strings"
"time"
"unicode/utf8"
)

// Errors specific to a ReturnDetailAddendumA Record
Expand Down Expand Up @@ -96,6 +97,10 @@ func NewReturnDetailAddendumA() ReturnDetailAddendumA {

// Parse takes the input record string and parses the ReturnDetailAddendumA values
func (rdAddendumA *ReturnDetailAddendumA) Parse(record string) {
if utf8.RuneCountInString(record) < 77 {
return // line too short
}

// Character position 1-2, Always "32"
rdAddendumA.recordType = "32"
// 03-03
Expand Down
8 changes: 8 additions & 0 deletions returnDetailAddendumA_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,14 @@ func mockReturnDetailAddendumA() ReturnDetailAddendumA {
return rdAddendumA
}

func TestReturnDetailAddendumAParseErr(t *testing.T) {
var r ReturnDetailAddendumA
r.Parse("asdlsajhfakjfa")
if r.RecordNumber != 0 {
t.Errorf("r.RecordNumber=%d", r.RecordNumber)
}
}

// TestMockReturnDetailAddendumA creates a ReturnDetailAddendumA
func TestMockReturnDetailAddendumA(t *testing.T) {
rdAddendumA := mockReturnDetailAddendumA()
Expand Down
6 changes: 5 additions & 1 deletion returnDetailAddendumB.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"fmt"
"strings"
"time"
"unicode/utf8"
)

// Errors specific to a ReturnDetailAddendumB Record
Expand Down Expand Up @@ -49,6 +50,10 @@ func NewReturnDetailAddendumB() ReturnDetailAddendumB {

// Parse takes the input record string and parses the ReturnDetailAddendumB values
func (rdAddendumB *ReturnDetailAddendumB) Parse(record string) {
if utf8.RuneCountInString(record) < 80 {
return // line too short
}

// Character position 1-2, Always "33"
rdAddendumB.recordType = "33"
// 03-20
Expand All @@ -61,7 +66,6 @@ func (rdAddendumB *ReturnDetailAddendumB) Parse(record string) {
rdAddendumB.PayorBankBusinessDate = rdAddendumB.parseYYYYMMDDDate(record[50:58])
// 59-80
rdAddendumB.PayorAccountName = rdAddendumB.parseStringField(record[58:80])

}

// String writes the ReturnDetailAddendumB struct to a string.
Expand Down
8 changes: 8 additions & 0 deletions returnDetailAddendumB_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,14 @@ func mockReturnDetailAddendumB() ReturnDetailAddendumB {
return rdAddendumB
}

func TestReturnDetailAddendumBParseErr(t *testing.T) {
var r ReturnDetailAddendumB
r.Parse("Asdjashfakjfa")
if r.PayorBankName != "" {
t.Errorf("r.PayorBankName=%s", r.PayorBankName)
}
}

// TestMockReturnDetailAddendumB creates a ReturnDetailAddendumB
func TestMockReturnDetailAddendumB(t *testing.T) {
rdAddendumB := mockReturnDetailAddendumB()
Expand Down
19 changes: 15 additions & 4 deletions returnDetailAddendumC.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package imagecashletter
import (
"fmt"
"strings"
"unicode/utf8"
)

// Errors specific to a ReturnDetailAddendumC Record
Expand Down Expand Up @@ -61,6 +62,10 @@ func NewReturnDetailAddendumC() ReturnDetailAddendumC {

// Parse takes the input record string and parses the ReturnDetailAddendumC values
func (rdAddendumC *ReturnDetailAddendumC) Parse(record string) {
if utf8.RuneCountInString(record) < 22 {
return // line too short
}

// Character position 1-2, Always "34"
rdAddendumC.recordType = "34"
// 03-03
Expand All @@ -69,14 +74,20 @@ func (rdAddendumC *ReturnDetailAddendumC) Parse(record string) {
rdAddendumC.MicrofilmArchiveSequenceNumber = rdAddendumC.parseStringField(record[3:18])
// 19-22
rdAddendumC.LengthImageReferenceKey = rdAddendumC.parseStringField(record[18:22])

imageRefKeyLength := rdAddendumC.parseNumField(rdAddendumC.LengthImageReferenceKey)
if utf8.RuneCountInString(record) < 46+imageRefKeyLength {
return // line too short
}

// 23 (22+X)
rdAddendumC.ImageReferenceKey = rdAddendumC.parseStringField(record[22:rdAddendumC.parseNumField(rdAddendumC.LengthImageReferenceKey)])
rdAddendumC.ImageReferenceKey = rdAddendumC.parseStringField(record[22:imageRefKeyLength])
// 23+X - 37+X
rdAddendumC.Description = rdAddendumC.parseStringField(record[22+rdAddendumC.parseNumField(rdAddendumC.LengthImageReferenceKey) : 37+rdAddendumC.parseNumField(rdAddendumC.LengthImageReferenceKey)])
rdAddendumC.Description = rdAddendumC.parseStringField(record[22+imageRefKeyLength : 37+imageRefKeyLength])
// 38+X - 41+X
rdAddendumC.UserField = rdAddendumC.parseStringField(record[37+rdAddendumC.parseNumField(rdAddendumC.LengthImageReferenceKey) : 41+rdAddendumC.parseNumField(rdAddendumC.LengthImageReferenceKey)])
rdAddendumC.UserField = rdAddendumC.parseStringField(record[37+imageRefKeyLength : 41+imageRefKeyLength])
// 42+X - 46+X
rdAddendumC.reserved = rdAddendumC.parseStringField(record[41+rdAddendumC.parseNumField(rdAddendumC.LengthImageReferenceKey) : 46+rdAddendumC.parseNumField(rdAddendumC.LengthImageReferenceKey)])
rdAddendumC.reserved = rdAddendumC.parseStringField(record[41+imageRefKeyLength : 46+imageRefKeyLength])

}

Expand Down
15 changes: 15 additions & 0 deletions returnDetailAddendumC_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,21 @@ func mockReturnDetailAddendumC() ReturnDetailAddendumC {
return rdAddendumC
}

func TestReturnDetailAddendumCParseErr(t *testing.T) {
var r ReturnDetailAddendumC
r.Parse("ASdsadasda")
if r.ImageReferenceKeyIndicator != 0 {
t.Errorf("r.ImageReferenceKeyIndicator=%d", r.ImageReferenceKeyIndicator)
}
r.Parse("3411A 00340 RD Addendum C")
if r.ImageReferenceKeyIndicator != 1 {
t.Errorf("r.ImageReferenceKeyIndicator=%d", r.ImageReferenceKeyIndicator)
}
if r.ImageReferenceKey != "" {
t.Errorf("r.ImageReferenceKey=%s", r.ImageReferenceKey)
}
}

// TestMockReturnDetailAddendumCcreates a ReturnDetailAddendumC
func TestMockReturnDetailAddendumC(t *testing.T) {
rdAddendumC := mockReturnDetailAddendumC()
Expand Down
5 changes: 5 additions & 0 deletions returnDetailAddendumD.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (
"strconv"
"strings"
"time"
"unicode/utf8"
)

// Errors specific to a ReturnDetailAddendumD Record
Expand Down Expand Up @@ -98,6 +99,10 @@ func NewReturnDetailAddendumD() ReturnDetailAddendumD {

// Parse takes the input record string and parses the ReturnDetailAddendumD values
func (rdAddendumD *ReturnDetailAddendumD) Parse(record string) {
if utf8.RuneCountInString(record) < 60 {
return // line too short
}

// Character position 1-2, Always "35"
rdAddendumD.recordType = "35"
// 03-04
Expand Down
8 changes: 8 additions & 0 deletions returnDetailAddendumD_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,14 @@ func mockReturnDetailAddendumD() ReturnDetailAddendumD {
return rdAddendumD
}

func TestReturnDetailAddendumDParseErr(t *testing.T) {
var r ReturnDetailAddendumD
r.Parse("ASdasdas")
if r.RecordNumber != 0 {
t.Errorf("r.RecordNumber=%d", r.RecordNumber)
}
}

// TestMockReturnDetailAddendumD creates a ReturnDetailAddendumD
func TestMockReturnDetailAddendumD(t *testing.T) {
rdAddendumD := mockReturnDetailAddendumD()
Expand Down
8 changes: 8 additions & 0 deletions returnDetail_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,14 @@ func mockReturnDetail() *ReturnDetail {
return rd
}

func TestReturnDetailParse(t *testing.T) {
var r ReturnDetail
r.Parse("asshafaksjfas")
if r.PayorBankRoutingNumber != "" {
t.Errorf("r.PayorBankRoutingNumber=%s", r.PayorBankRoutingNumber)
}
}

// TestMockReturnDetail creates a ReturnDetail
func TestMockReturnDetail(t *testing.T) {
rd := mockReturnDetail()
Expand Down
5 changes: 5 additions & 0 deletions routingNumberSummary.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package imagecashletter
import (
"fmt"
"strings"
"unicode/utf8"
)

// RoutingNumberSummary Record
Expand Down Expand Up @@ -40,6 +41,10 @@ func NewRoutingNumberSummary() *RoutingNumberSummary {

// Parse takes the input record string and parses the ImageViewDetail values
func (rns *RoutingNumberSummary) Parse(record string) {
if utf8.RuneCountInString(record) < 55 {
return // line too short
}

// Character position 1-2, Always "85"
rns.recordType = "85"
// 03-11
Expand Down
Loading

0 comments on commit b75dd13

Please sign in to comment.