You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
167 lines
3.6 KiB
167 lines
3.6 KiB
package feature |
|
|
|
import ( |
|
"reflect" |
|
"testing" |
|
|
|
"github.com/lightningnetwork/lnd/lnwire" |
|
) |
|
|
|
type depTest struct { |
|
name string |
|
raw *lnwire.RawFeatureVector |
|
expErr error |
|
} |
|
|
|
var depTests = []depTest{ |
|
{ |
|
name: "empty", |
|
raw: lnwire.NewRawFeatureVector(), |
|
}, |
|
{ |
|
name: "no deps optional", |
|
raw: lnwire.NewRawFeatureVector( |
|
lnwire.GossipQueriesOptional, |
|
), |
|
}, |
|
{ |
|
name: "no deps required", |
|
raw: lnwire.NewRawFeatureVector( |
|
lnwire.TLVOnionPayloadRequired, |
|
), |
|
}, |
|
{ |
|
name: "one dep optional", |
|
raw: lnwire.NewRawFeatureVector( |
|
lnwire.TLVOnionPayloadOptional, |
|
lnwire.PaymentAddrOptional, |
|
), |
|
}, |
|
{ |
|
name: "one dep required", |
|
raw: lnwire.NewRawFeatureVector( |
|
lnwire.TLVOnionPayloadRequired, |
|
lnwire.PaymentAddrRequired, |
|
), |
|
}, |
|
{ |
|
name: "one missing optional", |
|
raw: lnwire.NewRawFeatureVector( |
|
lnwire.PaymentAddrOptional, |
|
), |
|
expErr: ErrMissingFeatureDep{lnwire.TLVOnionPayloadOptional}, |
|
}, |
|
{ |
|
name: "one missing required", |
|
raw: lnwire.NewRawFeatureVector( |
|
lnwire.PaymentAddrRequired, |
|
), |
|
expErr: ErrMissingFeatureDep{lnwire.TLVOnionPayloadOptional}, |
|
}, |
|
{ |
|
name: "two dep optional", |
|
raw: lnwire.NewRawFeatureVector( |
|
lnwire.TLVOnionPayloadOptional, |
|
lnwire.PaymentAddrOptional, |
|
lnwire.MPPOptional, |
|
), |
|
}, |
|
{ |
|
name: "two dep required", |
|
raw: lnwire.NewRawFeatureVector( |
|
lnwire.TLVOnionPayloadRequired, |
|
lnwire.PaymentAddrRequired, |
|
lnwire.MPPRequired, |
|
), |
|
}, |
|
{ |
|
name: "two dep last missing optional", |
|
raw: lnwire.NewRawFeatureVector( |
|
lnwire.PaymentAddrOptional, |
|
lnwire.MPPOptional, |
|
), |
|
expErr: ErrMissingFeatureDep{lnwire.TLVOnionPayloadOptional}, |
|
}, |
|
{ |
|
name: "two dep last missing required", |
|
raw: lnwire.NewRawFeatureVector( |
|
lnwire.PaymentAddrRequired, |
|
lnwire.MPPRequired, |
|
), |
|
expErr: ErrMissingFeatureDep{lnwire.TLVOnionPayloadOptional}, |
|
}, |
|
{ |
|
name: "two dep first missing optional", |
|
raw: lnwire.NewRawFeatureVector( |
|
lnwire.TLVOnionPayloadOptional, |
|
lnwire.MPPOptional, |
|
), |
|
expErr: ErrMissingFeatureDep{lnwire.PaymentAddrOptional}, |
|
}, |
|
{ |
|
name: "two dep first missing required", |
|
raw: lnwire.NewRawFeatureVector( |
|
lnwire.TLVOnionPayloadRequired, |
|
lnwire.MPPRequired, |
|
), |
|
expErr: ErrMissingFeatureDep{lnwire.PaymentAddrOptional}, |
|
}, |
|
{ |
|
name: "forest optional", |
|
raw: lnwire.NewRawFeatureVector( |
|
lnwire.GossipQueriesOptional, |
|
lnwire.TLVOnionPayloadOptional, |
|
lnwire.PaymentAddrOptional, |
|
lnwire.MPPOptional, |
|
), |
|
}, |
|
{ |
|
name: "forest required", |
|
raw: lnwire.NewRawFeatureVector( |
|
lnwire.GossipQueriesRequired, |
|
lnwire.TLVOnionPayloadRequired, |
|
lnwire.PaymentAddrRequired, |
|
lnwire.MPPRequired, |
|
), |
|
}, |
|
{ |
|
name: "broken forest optional", |
|
raw: lnwire.NewRawFeatureVector( |
|
lnwire.GossipQueriesOptional, |
|
lnwire.TLVOnionPayloadOptional, |
|
lnwire.MPPOptional, |
|
), |
|
expErr: ErrMissingFeatureDep{lnwire.PaymentAddrOptional}, |
|
}, |
|
{ |
|
name: "broken forest required", |
|
raw: lnwire.NewRawFeatureVector( |
|
lnwire.GossipQueriesRequired, |
|
lnwire.TLVOnionPayloadRequired, |
|
lnwire.MPPRequired, |
|
), |
|
expErr: ErrMissingFeatureDep{lnwire.PaymentAddrOptional}, |
|
}, |
|
} |
|
|
|
// TestValidateDeps tests that ValidateDeps correctly asserts whether or not the |
|
// set features constitute a valid feature chain when accounting for transititve |
|
// dependencies. |
|
func TestValidateDeps(t *testing.T) { |
|
for _, test := range depTests { |
|
test := test |
|
t.Run(test.name, func(t *testing.T) { |
|
testValidateDeps(t, test) |
|
}) |
|
} |
|
} |
|
|
|
func testValidateDeps(t *testing.T, test depTest) { |
|
fv := lnwire.NewFeatureVector(test.raw, lnwire.Features) |
|
err := ValidateDeps(fv) |
|
if !reflect.DeepEqual(err, test.expErr) { |
|
t.Fatalf("validation mismatch, want: %v, got: %v", |
|
test.expErr, err) |
|
|
|
} |
|
}
|
|
|