github.com/decred/dcrlnd@v0.7.6/feature/deps_test.go (about) 1 package feature 2 3 import ( 4 "reflect" 5 "testing" 6 7 "github.com/decred/dcrlnd/lnwire" 8 ) 9 10 type depTest struct { 11 name string 12 raw *lnwire.RawFeatureVector 13 expErr error 14 } 15 16 var depTests = []depTest{ 17 { 18 name: "empty", 19 raw: lnwire.NewRawFeatureVector(), 20 }, 21 { 22 name: "no deps optional", 23 raw: lnwire.NewRawFeatureVector( 24 lnwire.GossipQueriesOptional, 25 ), 26 }, 27 { 28 name: "no deps required", 29 raw: lnwire.NewRawFeatureVector( 30 lnwire.TLVOnionPayloadRequired, 31 ), 32 }, 33 { 34 name: "one dep optional", 35 raw: lnwire.NewRawFeatureVector( 36 lnwire.TLVOnionPayloadOptional, 37 lnwire.PaymentAddrOptional, 38 ), 39 }, 40 { 41 name: "one dep required", 42 raw: lnwire.NewRawFeatureVector( 43 lnwire.TLVOnionPayloadRequired, 44 lnwire.PaymentAddrRequired, 45 ), 46 }, 47 { 48 name: "one missing optional", 49 raw: lnwire.NewRawFeatureVector( 50 lnwire.PaymentAddrOptional, 51 ), 52 expErr: ErrMissingFeatureDep{lnwire.TLVOnionPayloadOptional}, 53 }, 54 { 55 name: "one missing required", 56 raw: lnwire.NewRawFeatureVector( 57 lnwire.PaymentAddrRequired, 58 ), 59 expErr: ErrMissingFeatureDep{lnwire.TLVOnionPayloadOptional}, 60 }, 61 { 62 name: "two dep optional", 63 raw: lnwire.NewRawFeatureVector( 64 lnwire.TLVOnionPayloadOptional, 65 lnwire.PaymentAddrOptional, 66 lnwire.MPPOptional, 67 ), 68 }, 69 { 70 name: "two dep required", 71 raw: lnwire.NewRawFeatureVector( 72 lnwire.TLVOnionPayloadRequired, 73 lnwire.PaymentAddrRequired, 74 lnwire.MPPRequired, 75 ), 76 }, 77 { 78 name: "two dep last missing optional", 79 raw: lnwire.NewRawFeatureVector( 80 lnwire.PaymentAddrOptional, 81 lnwire.MPPOptional, 82 ), 83 expErr: ErrMissingFeatureDep{lnwire.TLVOnionPayloadOptional}, 84 }, 85 { 86 name: "two dep last missing required", 87 raw: lnwire.NewRawFeatureVector( 88 lnwire.PaymentAddrRequired, 89 lnwire.MPPRequired, 90 ), 91 expErr: ErrMissingFeatureDep{lnwire.TLVOnionPayloadOptional}, 92 }, 93 { 94 name: "two dep first missing optional", 95 raw: lnwire.NewRawFeatureVector( 96 lnwire.TLVOnionPayloadOptional, 97 lnwire.MPPOptional, 98 ), 99 expErr: ErrMissingFeatureDep{lnwire.PaymentAddrOptional}, 100 }, 101 { 102 name: "two dep first missing required", 103 raw: lnwire.NewRawFeatureVector( 104 lnwire.TLVOnionPayloadRequired, 105 lnwire.MPPRequired, 106 ), 107 expErr: ErrMissingFeatureDep{lnwire.PaymentAddrOptional}, 108 }, 109 { 110 name: "forest optional", 111 raw: lnwire.NewRawFeatureVector( 112 lnwire.GossipQueriesOptional, 113 lnwire.TLVOnionPayloadOptional, 114 lnwire.PaymentAddrOptional, 115 lnwire.MPPOptional, 116 ), 117 }, 118 { 119 name: "forest required", 120 raw: lnwire.NewRawFeatureVector( 121 lnwire.GossipQueriesRequired, 122 lnwire.TLVOnionPayloadRequired, 123 lnwire.PaymentAddrRequired, 124 lnwire.MPPRequired, 125 ), 126 }, 127 { 128 name: "broken forest optional", 129 raw: lnwire.NewRawFeatureVector( 130 lnwire.GossipQueriesOptional, 131 lnwire.TLVOnionPayloadOptional, 132 lnwire.MPPOptional, 133 ), 134 expErr: ErrMissingFeatureDep{lnwire.PaymentAddrOptional}, 135 }, 136 { 137 name: "broken forest required", 138 raw: lnwire.NewRawFeatureVector( 139 lnwire.GossipQueriesRequired, 140 lnwire.TLVOnionPayloadRequired, 141 lnwire.MPPRequired, 142 ), 143 expErr: ErrMissingFeatureDep{lnwire.PaymentAddrOptional}, 144 }, 145 } 146 147 // TestValidateDeps tests that ValidateDeps correctly asserts whether or not the 148 // set features constitute a valid feature chain when accounting for transititve 149 // dependencies. 150 func TestValidateDeps(t *testing.T) { 151 for _, test := range depTests { 152 test := test 153 t.Run(test.name, func(t *testing.T) { 154 testValidateDeps(t, test) 155 }) 156 } 157 } 158 159 func testValidateDeps(t *testing.T, test depTest) { 160 fv := lnwire.NewFeatureVector(test.raw, lnwire.Features) 161 err := ValidateDeps(fv) 162 if !reflect.DeepEqual(err, test.expErr) { 163 t.Fatalf("validation mismatch, want: %v, got: %v", 164 test.expErr, err) 165 166 } 167 }