44555a70ed
This fixes a decoding error when the list of short channel ids within a QueryShortChanIDs message started with a zero sid. BOLT-0007 specifies that lists of short channel ids should be sorted in ascending order. Previously, this was checked within lnwire by comparing two consecutive sids in the list, starting at the empty (zero) sid. This meant that a list that started with a zero sid couldn't be decoded since the first element would _not_ be greater than the last one (namely: also zero). Given that one can only check for ordering starting at the second element, we add a check to ensure the proper behavior. A unit test is also added to ensure no future regressions on this behavior.
122 lines
2.5 KiB
Go
122 lines
2.5 KiB
Go
package lnwire
|
|
|
|
import (
|
|
"bytes"
|
|
"testing"
|
|
)
|
|
|
|
type unsortedSidTest struct {
|
|
name string
|
|
encType ShortChanIDEncoding
|
|
sids []ShortChannelID
|
|
}
|
|
|
|
var (
|
|
unsortedSids = []ShortChannelID{
|
|
NewShortChanIDFromInt(4),
|
|
NewShortChanIDFromInt(3),
|
|
}
|
|
|
|
duplicateSids = []ShortChannelID{
|
|
NewShortChanIDFromInt(3),
|
|
NewShortChanIDFromInt(3),
|
|
}
|
|
|
|
unsortedSidTests = []unsortedSidTest{
|
|
{
|
|
name: "plain unsorted",
|
|
encType: EncodingSortedPlain,
|
|
sids: unsortedSids,
|
|
},
|
|
{
|
|
name: "plain duplicate",
|
|
encType: EncodingSortedPlain,
|
|
sids: duplicateSids,
|
|
},
|
|
{
|
|
name: "zlib unsorted",
|
|
encType: EncodingSortedZlib,
|
|
sids: unsortedSids,
|
|
},
|
|
{
|
|
name: "zlib duplicate",
|
|
encType: EncodingSortedZlib,
|
|
sids: duplicateSids,
|
|
},
|
|
}
|
|
)
|
|
|
|
// TestQueryShortChanIDsUnsorted tests that decoding a QueryShortChanID request
|
|
// that contains duplicate or unsorted ids returns an ErrUnsortedSIDs failure.
|
|
func TestQueryShortChanIDsUnsorted(t *testing.T) {
|
|
|
|
for _, test := range unsortedSidTests {
|
|
test := test
|
|
t.Run(test.name, func(t *testing.T) {
|
|
req := &QueryShortChanIDs{
|
|
EncodingType: test.encType,
|
|
ShortChanIDs: test.sids,
|
|
noSort: true,
|
|
}
|
|
|
|
var b bytes.Buffer
|
|
err := req.Encode(&b, 0)
|
|
if err != nil {
|
|
t.Fatalf("unable to encode req: %v", err)
|
|
}
|
|
|
|
var req2 QueryShortChanIDs
|
|
err = req2.Decode(bytes.NewReader(b.Bytes()), 0)
|
|
if _, ok := err.(ErrUnsortedSIDs); !ok {
|
|
t.Fatalf("expected ErrUnsortedSIDs, got: %T",
|
|
err)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
// TestQueryShortChanIDsZero ensures that decoding of a list of short chan ids
|
|
// still works as expected when the first element of the list is zero.
|
|
func TestQueryShortChanIDsZero(t *testing.T) {
|
|
testCases := []struct {
|
|
name string
|
|
encoding ShortChanIDEncoding
|
|
}{
|
|
{
|
|
name: "plain",
|
|
encoding: EncodingSortedPlain,
|
|
}, {
|
|
name: "zlib",
|
|
encoding: EncodingSortedZlib,
|
|
},
|
|
}
|
|
|
|
testSids := []ShortChannelID{
|
|
NewShortChanIDFromInt(0),
|
|
NewShortChanIDFromInt(10),
|
|
}
|
|
|
|
for _, test := range testCases {
|
|
test := test
|
|
t.Run(test.name, func(t *testing.T) {
|
|
req := &QueryShortChanIDs{
|
|
EncodingType: test.encoding,
|
|
ShortChanIDs: testSids,
|
|
noSort: true,
|
|
}
|
|
|
|
var b bytes.Buffer
|
|
err := req.Encode(&b, 0)
|
|
if err != nil {
|
|
t.Fatalf("unable to encode req: %v", err)
|
|
}
|
|
|
|
var req2 QueryShortChanIDs
|
|
err = req2.Decode(bytes.NewReader(b.Bytes()), 0)
|
|
if err != nil {
|
|
t.Fatalf("unexpected decoding error: %v", err)
|
|
}
|
|
})
|
|
}
|
|
}
|