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  }