htlcswitch/hop/payload: extend tests to required type failures

This commit is contained in:
Conner Fromknecht 2019-10-30 21:20:49 -07:00
parent e85aaa45f6
commit 937b781276
No known key found for this signature in database
GPG Key ID: E7D737B67FA592C7
2 changed files with 38 additions and 5 deletions

@ -120,10 +120,21 @@ func NewPayloadFromReader(r io.Reader) (*Payload, error) {
if err != nil {
// Promote any required type failures into ErrInvalidPayload.
if e, required := err.(tlv.ErrUnknownRequiredType); required {
// NOTE: FinalHop will be incorrect if the unknown
// required was type 0. Otherwise, the failure must have
// occurred after type 6 and cid should contain an
// accurate value.
// NOTE: Sigh. If the sender included a next hop whose
// value is zero, this would be considered invalid by
// our validation rules below. It's not totally clear
// whether this required failure should take precedence
// over the constraints applied by known types.
// Unfortunately this is an artifact of the layering
// violation in placing the even/odd rule in the parsing
// logic and not at a higher level of validation like
// the other presence/omission checks.
//
// As a result, this may need to be revisted if it is
// decided that the checks below overrule an unknown
// required type failure, in which case an
// IncludedViolation should be returned instead of the
// RequiredViolation.
return nil, ErrInvalidPayload{
Type: tlv.Type(e),
Violation: RequiredViolation,

@ -98,7 +98,7 @@ var decodePayloadTests = []decodePayloadTest{
},
},
{
name: "required type zero",
name: "required type zero final hop",
payload: []byte{0x00, 0x00},
expErr: hop.ErrInvalidPayload{
Type: 0,
@ -106,6 +106,28 @@ var decodePayloadTests = []decodePayloadTest{
FinalHop: true,
},
},
{
name: "required type zero final hop zero sid",
payload: []byte{0x00, 0x00, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
},
expErr: hop.ErrInvalidPayload{
Type: 0,
Violation: hop.RequiredViolation,
FinalHop: true,
},
},
{
name: "required type zero intermediate hop",
payload: []byte{0x00, 0x00, 0x06, 0x08, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
},
expErr: hop.ErrInvalidPayload{
Type: 0,
Violation: hop.RequiredViolation,
FinalHop: false,
},
},
}
// TestDecodeHopPayloadRecordValidation asserts that parsing the payloads in the