diff options
| author | Jeff Halter <868228+jhalter@users.noreply.github.com> | 2022-06-24 10:41:37 -0700 |
|---|---|---|
| committer | Jeff Halter <868228+jhalter@users.noreply.github.com> | 2022-06-24 10:41:37 -0700 |
| commit | 3178ae580a3fe97d6a1167b4346d209f04e9b7e3 (patch) | |
| tree | da306047792334bbb97e07707d713d3fa582753a /hotline/transaction_test.go | |
| parent | a1ac9a6f60c6881bb9fe97425f6aaa524b910035 (diff) | |
Implement bufio.Scanner for transaction parsing
Diffstat (limited to 'hotline/transaction_test.go')
| -rw-r--r-- | hotline/transaction_test.go | 193 |
1 files changed, 191 insertions, 2 deletions
diff --git a/hotline/transaction_test.go b/hotline/transaction_test.go index 1fade25..04bcde0 100644 --- a/hotline/transaction_test.go +++ b/hotline/transaction_test.go @@ -1,6 +1,7 @@ package hotline import ( + "fmt" "github.com/stretchr/testify/assert" "testing" ) @@ -147,8 +148,8 @@ func TestReadTransaction(t *testing.T) { return b }(), }, - want: sampleTransaction, - want1: func() int { + want: sampleTransaction, + want1: func() int { b, _ := sampleTransaction.MarshalBinary() return len(b) }(), @@ -183,3 +184,191 @@ func TestReadTransaction(t *testing.T) { }) } } + +func Test_transactionScanner(t *testing.T) { + type args struct { + data []byte + in1 bool + } + tests := []struct { + name string + args args + wantAdvance int + wantToken []byte + wantErr assert.ErrorAssertionFunc + }{ + { + name: "when too few bytes are provided to read the transaction size", + args: args{ + data: []byte{}, + in1: false, + }, + wantAdvance: 0, + wantToken: []byte(nil), + wantErr: assert.NoError, + }, + { + name: "when too few bytes are provided to read the full payload", + args: args{ + data: []byte{ + 0, + 1, + 0, 0, + 0, 00, 00, 04, + 00, 00, 00, 00, + 00, 00, 00, 10, + 00, 00, 00, 10, + }, + in1: false, + }, + wantAdvance: 0, + wantToken: []byte(nil), + wantErr: assert.NoError, + }, + { + name: "when a full transaction is provided", + args: args{ + data: []byte{ + 0, + 1, + 0, 0, + 0, 00, 00, 0x04, + 00, 00, 00, 0x00, + 00, 00, 00, 0x10, + 00, 00, 00, 0x10, + 00, 02, + 00, 0x6c, // 108 - fieldTransferSize + 00, 02, + 0x63, 0x3b, + 00, 0x6b, // 107 = fieldRefNum + 00, 0x04, + 00, 0x02, 0x93, 0x47, + }, + in1: false, + }, + wantAdvance: 36, + wantToken: []byte{ + 0, + 1, + 0, 0, + 0, 00, 00, 0x04, + 00, 00, 00, 0x00, + 00, 00, 00, 0x10, + 00, 00, 00, 0x10, + 00, 02, + 00, 0x6c, // 108 - fieldTransferSize + 00, 02, + 0x63, 0x3b, + 00, 0x6b, // 107 = fieldRefNum + 00, 0x04, + 00, 0x02, 0x93, 0x47, + }, + wantErr: assert.NoError, + }, + { + name: "when a full transaction plus extra bytes are provided", + args: args{ + data: []byte{ + 0, + 1, + 0, 0, + 0, 00, 00, 0x04, + 00, 00, 00, 0x00, + 00, 00, 00, 0x10, + 00, 00, 00, 0x10, + 00, 02, + 00, 0x6c, // 108 - fieldTransferSize + 00, 02, + 0x63, 0x3b, + 00, 0x6b, // 107 = fieldRefNum + 00, 0x04, + 00, 0x02, 0x93, 0x47, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + }, + in1: false, + }, + wantAdvance: 36, + wantToken: []byte{ + 0, + 1, + 0, 0, + 0, 00, 00, 0x04, + 00, 00, 00, 0x00, + 00, 00, 00, 0x10, + 00, 00, 00, 0x10, + 00, 02, + 00, 0x6c, // 108 - fieldTransferSize + 00, 02, + 0x63, 0x3b, + 00, 0x6b, // 107 = fieldRefNum + 00, 0x04, + 00, 0x02, 0x93, 0x47, + }, + wantErr: assert.NoError, + }, + { + name: "when two full transactions are provided", + args: args{ + data: []byte{ + 0, + 1, + 0, 0, + 0, 00, 00, 0x04, + 00, 00, 00, 0x00, + 00, 00, 00, 0x10, + 00, 00, 00, 0x10, + 00, 02, + 00, 0x6c, // 108 - fieldTransferSize + 00, 02, + 0x63, 0x3b, + 00, 0x6b, // 107 = fieldRefNum + 00, 0x04, + 00, 0x02, 0x93, 0x47, + 0, + 1, + 0, 0, + 0, 00, 00, 0x04, + 00, 00, 00, 0x00, + 00, 00, 00, 0x10, + 00, 00, 00, 0x10, + 00, 02, + 00, 0x6c, // 108 - fieldTransferSize + 00, 02, + 0x63, 0x3b, + 00, 0x6b, // 107 = fieldRefNum + 00, 0x04, + 00, 0x02, 0x93, 0x47, + }, + in1: false, + }, + wantAdvance: 36, + wantToken: []byte{ + 0, + 1, + 0, 0, + 0, 00, 00, 0x04, + 00, 00, 00, 0x00, + 00, 00, 00, 0x10, + 00, 00, 00, 0x10, + 00, 02, + 00, 0x6c, // 108 - fieldTransferSize + 00, 02, + 0x63, 0x3b, + 00, 0x6b, // 107 = fieldRefNum + 00, 0x04, + 00, 0x02, 0x93, 0x47, + }, + wantErr: assert.NoError, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotAdvance, gotToken, err := transactionScanner(tt.args.data, tt.args.in1) + if !tt.wantErr(t, err, fmt.Sprintf("transactionScanner(%v, %v)", tt.args.data, tt.args.in1)) { + return + } + assert.Equalf(t, tt.wantAdvance, gotAdvance, "transactionScanner(%v, %v)", tt.args.data, tt.args.in1) + assert.Equalf(t, tt.wantToken, gotToken, "transactionScanner(%v, %v)", tt.args.data, tt.args.in1) + }) + } +} |