aefec9b10f
This commit adds an additional return value to Stream.DecodeWithParsedTypes, which returns the set of types that were encountered during decoding. The set will contain all known types that were decoded, as well as unknown odd types that were ignored. The rationale for the return value (rather than an internal member) is so that the stream remains stateless. This return value can be used by callers during decoding to make assertions as to whether specific types were included in the stream. This is need, for example, when parsing onion payloads where certain fields must be included/omitted depending on the hop type. The original Decode method would incur the additional performance hit of needing to track the parsed types, so we can selectively enable this functionality when a decoder requires it by using a helper which conditionally tracks the parsed types.
52 lines
1.3 KiB
Go
52 lines
1.3 KiB
Go
package tlv_test
|
|
|
|
import (
|
|
"bytes"
|
|
"testing"
|
|
|
|
"github.com/lightningnetwork/lnd/tlv"
|
|
)
|
|
|
|
// TestParsedTypes asserts that a Stream will properly return the set of types
|
|
// that it encounters when the type is known-and-decoded or unknown-and-ignored.
|
|
func TestParsedTypes(t *testing.T) {
|
|
const (
|
|
knownType = 1
|
|
unknownType = 3
|
|
)
|
|
|
|
// Construct a stream that will encode two types, one that will be known
|
|
// to the decoder and another that will be unknown.
|
|
encStream := tlv.MustNewStream(
|
|
tlv.MakePrimitiveRecord(knownType, new(uint64)),
|
|
tlv.MakePrimitiveRecord(unknownType, new(uint64)),
|
|
)
|
|
|
|
var b bytes.Buffer
|
|
if err := encStream.Encode(&b); err != nil {
|
|
t.Fatalf("unable to encode stream: %v", err)
|
|
}
|
|
|
|
// Create a stream that will parse only the known type.
|
|
decStream := tlv.MustNewStream(
|
|
tlv.MakePrimitiveRecord(knownType, new(uint64)),
|
|
)
|
|
|
|
parsedTypes, err := decStream.DecodeWithParsedTypes(
|
|
bytes.NewReader(b.Bytes()),
|
|
)
|
|
if err != nil {
|
|
t.Fatalf("unable to decode stream: %v", err)
|
|
}
|
|
|
|
// Assert that both the known and unknown types are included in the set
|
|
// of parsed types.
|
|
if _, ok := parsedTypes[knownType]; !ok {
|
|
t.Fatalf("known type %d should be in parsed types", knownType)
|
|
}
|
|
if _, ok := parsedTypes[unknownType]; !ok {
|
|
t.Fatalf("unknown type %d should be in parsed types",
|
|
unknownType)
|
|
}
|
|
}
|