github.com/decred/dcrlnd@v0.7.6/channeldb/migration/lnwire21/lnwire_test.go (about)

     1  package lnwire
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/binary"
     6  	"encoding/hex"
     7  	"image/color"
     8  	"math"
     9  	"math/rand"
    10  	"net"
    11  	"reflect"
    12  	"testing"
    13  	"testing/quick"
    14  	"time"
    15  
    16  	"github.com/davecgh/go-spew/spew"
    17  
    18  	"github.com/decred/dcrd/chaincfg/chainhash"
    19  	"github.com/decred/dcrd/dcrec/secp256k1/v4"
    20  	"github.com/decred/dcrd/dcrec/secp256k1/v4/ecdsa"
    21  	"github.com/decred/dcrd/dcrutil/v4"
    22  	"github.com/decred/dcrd/wire"
    23  	"github.com/decred/dcrlnd/tor"
    24  )
    25  
    26  func modNScalar(b []byte) *secp256k1.ModNScalar {
    27  	var m secp256k1.ModNScalar
    28  	m.SetByteSlice(b)
    29  	return &m
    30  }
    31  
    32  var (
    33  	shaHash1Bytes, _ = hex.DecodeString("e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855")
    34  	shaHash1, _      = chainhash.NewHash(shaHash1Bytes)
    35  	outpoint1        = wire.NewOutPoint(shaHash1, 0, wire.TxTreeRegular)
    36  	rBytes, _        = hex.DecodeString("63724406601629180062774974542967536251589935445068131219452686511677818569431")
    37  	sBytes, _        = hex.DecodeString("18801056069249825825291287104931333862866033135609736119018462340006816851118")
    38  	testSig          = ecdsa.NewSignature(modNScalar(rBytes), modNScalar(sBytes))
    39  )
    40  
    41  const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    42  
    43  func randAlias(r *rand.Rand) NodeAlias {
    44  	var a NodeAlias
    45  	for i := range a {
    46  		a[i] = letterBytes[r.Intn(len(letterBytes))]
    47  	}
    48  
    49  	return a
    50  }
    51  
    52  func randPubKey() (*secp256k1.PublicKey, error) {
    53  	priv, err := secp256k1.GeneratePrivateKey()
    54  	if err != nil {
    55  		return nil, err
    56  	}
    57  
    58  	return priv.PubKey(), nil
    59  }
    60  
    61  func randRawKey() ([33]byte, error) {
    62  	var n [33]byte
    63  
    64  	priv, err := secp256k1.GeneratePrivateKey()
    65  	if err != nil {
    66  		return n, err
    67  	}
    68  
    69  	copy(n[:], priv.PubKey().SerializeCompressed())
    70  
    71  	return n, nil
    72  }
    73  
    74  func randDeliveryAddress(r *rand.Rand) (DeliveryAddress, error) {
    75  	// Generate size minimum one. Empty scripts should be tested specifically.
    76  	size := r.Intn(deliveryAddressMaxSize) + 1
    77  	da := DeliveryAddress(make([]byte, size))
    78  
    79  	_, err := r.Read(da)
    80  	return da, err
    81  }
    82  
    83  func randRawFeatureVector(r *rand.Rand) *RawFeatureVector {
    84  	featureVec := NewRawFeatureVector()
    85  	for i := 0; i < 10000; i++ {
    86  		if r.Int31n(2) == 0 {
    87  			featureVec.Set(FeatureBit(i))
    88  		}
    89  	}
    90  	return featureVec
    91  }
    92  
    93  func randTCP4Addr(r *rand.Rand) (*net.TCPAddr, error) {
    94  	var ip [4]byte
    95  	if _, err := r.Read(ip[:]); err != nil {
    96  		return nil, err
    97  	}
    98  
    99  	var port [2]byte
   100  	if _, err := r.Read(port[:]); err != nil {
   101  		return nil, err
   102  	}
   103  
   104  	addrIP := net.IP(ip[:])
   105  	addrPort := int(binary.BigEndian.Uint16(port[:]))
   106  
   107  	return &net.TCPAddr{IP: addrIP, Port: addrPort}, nil
   108  }
   109  
   110  func randTCP6Addr(r *rand.Rand) (*net.TCPAddr, error) {
   111  	var ip [16]byte
   112  	if _, err := r.Read(ip[:]); err != nil {
   113  		return nil, err
   114  	}
   115  
   116  	var port [2]byte
   117  	if _, err := r.Read(port[:]); err != nil {
   118  		return nil, err
   119  	}
   120  
   121  	addrIP := net.IP(ip[:])
   122  	addrPort := int(binary.BigEndian.Uint16(port[:]))
   123  
   124  	return &net.TCPAddr{IP: addrIP, Port: addrPort}, nil
   125  }
   126  
   127  func randV2OnionAddr(r *rand.Rand) (*tor.OnionAddr, error) {
   128  	var serviceID [tor.V2DecodedLen]byte
   129  	if _, err := r.Read(serviceID[:]); err != nil {
   130  		return nil, err
   131  	}
   132  
   133  	var port [2]byte
   134  	if _, err := r.Read(port[:]); err != nil {
   135  		return nil, err
   136  	}
   137  
   138  	onionService := tor.Base32Encoding.EncodeToString(serviceID[:])
   139  	onionService += tor.OnionSuffix
   140  	addrPort := int(binary.BigEndian.Uint16(port[:]))
   141  
   142  	return &tor.OnionAddr{OnionService: onionService, Port: addrPort}, nil
   143  }
   144  
   145  func randV3OnionAddr(r *rand.Rand) (*tor.OnionAddr, error) {
   146  	var serviceID [tor.V3DecodedLen]byte
   147  	if _, err := r.Read(serviceID[:]); err != nil {
   148  		return nil, err
   149  	}
   150  
   151  	var port [2]byte
   152  	if _, err := r.Read(port[:]); err != nil {
   153  		return nil, err
   154  	}
   155  
   156  	onionService := tor.Base32Encoding.EncodeToString(serviceID[:])
   157  	onionService += tor.OnionSuffix
   158  	addrPort := int(binary.BigEndian.Uint16(port[:]))
   159  
   160  	return &tor.OnionAddr{OnionService: onionService, Port: addrPort}, nil
   161  }
   162  
   163  func randAddrs(r *rand.Rand) ([]net.Addr, error) {
   164  	tcp4Addr, err := randTCP4Addr(r)
   165  	if err != nil {
   166  		return nil, err
   167  	}
   168  
   169  	tcp6Addr, err := randTCP6Addr(r)
   170  	if err != nil {
   171  		return nil, err
   172  	}
   173  
   174  	v2OnionAddr, err := randV2OnionAddr(r)
   175  	if err != nil {
   176  		return nil, err
   177  	}
   178  
   179  	v3OnionAddr, err := randV3OnionAddr(r)
   180  	if err != nil {
   181  		return nil, err
   182  	}
   183  
   184  	return []net.Addr{tcp4Addr, tcp6Addr, v2OnionAddr, v3OnionAddr}, nil
   185  }
   186  
   187  // TestChanUpdateChanFlags ensures that converting the ChanUpdateChanFlags and
   188  // ChanUpdateMsgFlags bitfields to a string behaves as expected.
   189  func TestChanUpdateChanFlags(t *testing.T) {
   190  	t.Parallel()
   191  
   192  	testCases := []struct {
   193  		flags    uint8
   194  		expected string
   195  	}{
   196  		{
   197  			flags:    0,
   198  			expected: "00000000",
   199  		},
   200  		{
   201  			flags:    1,
   202  			expected: "00000001",
   203  		},
   204  		{
   205  			flags:    3,
   206  			expected: "00000011",
   207  		},
   208  		{
   209  			flags:    255,
   210  			expected: "11111111",
   211  		},
   212  	}
   213  
   214  	for _, test := range testCases {
   215  		chanFlag := ChanUpdateChanFlags(test.flags)
   216  		toStr := chanFlag.String()
   217  		if toStr != test.expected {
   218  			t.Fatalf("expected %v, got %v",
   219  				test.expected, toStr)
   220  		}
   221  
   222  		msgFlag := ChanUpdateMsgFlags(test.flags)
   223  		toStr = msgFlag.String()
   224  		if toStr != test.expected {
   225  			t.Fatalf("expected %v, got %v",
   226  				test.expected, toStr)
   227  		}
   228  	}
   229  }
   230  
   231  func TestMaxOutPointIndex(t *testing.T) {
   232  	t.Parallel()
   233  
   234  	op := wire.OutPoint{
   235  		Index: math.MaxUint32,
   236  	}
   237  
   238  	var b bytes.Buffer
   239  	if err := WriteElement(&b, op); err == nil {
   240  		t.Fatalf("write of outPoint should fail, index exceeds 16-bits")
   241  	}
   242  }
   243  
   244  func TestEmptyMessageUnknownType(t *testing.T) {
   245  	t.Parallel()
   246  
   247  	fakeType := MessageType(math.MaxUint16)
   248  	if _, err := makeEmptyMessage(fakeType); err == nil {
   249  		t.Fatalf("should not be able to make an empty message of an " +
   250  			"unknown type")
   251  	}
   252  }
   253  
   254  // TestLightningWireProtocol uses the testing/quick package to create a series
   255  // of fuzz tests to attempt to break a primary scenario which is implemented as
   256  // property based testing scenario.
   257  //
   258  // Debug help: when the message payload can reach a size larger than the return
   259  // value of MaxPayloadLength, the test can panic without a helpful message.
   260  func TestLightningWireProtocol(t *testing.T) {
   261  	t.Parallel()
   262  
   263  	// mainScenario is the primary test that will programmatically be
   264  	// executed for all registered wire messages. The quick-checker within
   265  	// testing/quick will attempt to find an input to this function, s.t
   266  	// the function returns false, if so then we've found an input that
   267  	// violates our model of the system.
   268  	mainScenario := func(msg Message) bool {
   269  		// Give a new message, we'll serialize the message into a new
   270  		// bytes buffer.
   271  		var b bytes.Buffer
   272  		if _, err := WriteMessage(&b, msg, 0); err != nil {
   273  			t.Fatalf("unable to write msg: %v", err)
   274  			return false
   275  		}
   276  
   277  		// Next, we'll ensure that the serialized payload (subtracting
   278  		// the 2 bytes for the message type) is _below_ the specified
   279  		// max payload size for this message.
   280  		payloadLen := uint32(b.Len()) - 2
   281  		if payloadLen > msg.MaxPayloadLength(0) {
   282  			t.Fatalf("msg payload constraint violated: %v > %v",
   283  				payloadLen, msg.MaxPayloadLength(0))
   284  			return false
   285  		}
   286  
   287  		// Finally, we'll deserialize the message from the written
   288  		// buffer, and finally assert that the messages are equal.
   289  		newMsg, err := ReadMessage(&b, 0)
   290  		if err != nil {
   291  			t.Fatalf("unable to read msg: %v", err)
   292  			return false
   293  		}
   294  		if !reflect.DeepEqual(msg, newMsg) {
   295  			t.Fatalf("messages don't match after re-encoding: %v "+
   296  				"vs %v", spew.Sdump(msg), spew.Sdump(newMsg))
   297  			return false
   298  		}
   299  
   300  		return true
   301  	}
   302  
   303  	// customTypeGen is a map of functions that are able to randomly
   304  	// generate a given type. These functions are needed for types which
   305  	// are too complex for the testing/quick package to automatically
   306  	// generate.
   307  	customTypeGen := map[MessageType]func([]reflect.Value, *rand.Rand){
   308  		MsgInit: func(v []reflect.Value, r *rand.Rand) {
   309  			req := NewInitMessage(
   310  				randRawFeatureVector(r),
   311  				randRawFeatureVector(r),
   312  			)
   313  
   314  			v[0] = reflect.ValueOf(*req)
   315  		},
   316  		MsgOpenChannel: func(v []reflect.Value, r *rand.Rand) {
   317  			req := OpenChannel{
   318  				FundingAmount:    dcrutil.Amount(r.Int63()),
   319  				PushAmount:       MilliAtom(r.Int63()),
   320  				DustLimit:        dcrutil.Amount(r.Int63()),
   321  				MaxValueInFlight: MilliAtom(r.Int63()),
   322  				ChannelReserve:   dcrutil.Amount(r.Int63()),
   323  				HtlcMinimum:      MilliAtom(r.Int31()),
   324  				FeePerKiloByte:   uint32(r.Int63()),
   325  				CsvDelay:         uint16(r.Int31()),
   326  				MaxAcceptedHTLCs: uint16(r.Int31()),
   327  				ChannelFlags:     FundingFlag(uint8(r.Int31())),
   328  			}
   329  
   330  			if _, err := r.Read(req.ChainHash[:]); err != nil {
   331  				t.Fatalf("unable to generate chain hash: %v", err)
   332  				return
   333  			}
   334  
   335  			if _, err := r.Read(req.PendingChannelID[:]); err != nil {
   336  				t.Fatalf("unable to generate pending chan id: %v", err)
   337  				return
   338  			}
   339  
   340  			var err error
   341  			req.FundingKey, err = randPubKey()
   342  			if err != nil {
   343  				t.Fatalf("unable to generate key: %v", err)
   344  				return
   345  			}
   346  			req.RevocationPoint, err = randPubKey()
   347  			if err != nil {
   348  				t.Fatalf("unable to generate key: %v", err)
   349  				return
   350  			}
   351  			req.PaymentPoint, err = randPubKey()
   352  			if err != nil {
   353  				t.Fatalf("unable to generate key: %v", err)
   354  				return
   355  			}
   356  			req.DelayedPaymentPoint, err = randPubKey()
   357  			if err != nil {
   358  				t.Fatalf("unable to generate key: %v", err)
   359  				return
   360  			}
   361  			req.HtlcPoint, err = randPubKey()
   362  			if err != nil {
   363  				t.Fatalf("unable to generate key: %v", err)
   364  				return
   365  			}
   366  			req.FirstCommitmentPoint, err = randPubKey()
   367  			if err != nil {
   368  				t.Fatalf("unable to generate key: %v", err)
   369  				return
   370  			}
   371  
   372  			// 1/2 chance empty upfront shutdown script.
   373  			if r.Intn(2) == 0 {
   374  				req.UpfrontShutdownScript, err = randDeliveryAddress(r)
   375  				if err != nil {
   376  					t.Fatalf("unable to generate delivery address: %v", err)
   377  					return
   378  				}
   379  			} else {
   380  				req.UpfrontShutdownScript = []byte{}
   381  			}
   382  
   383  			v[0] = reflect.ValueOf(req)
   384  		},
   385  		MsgAcceptChannel: func(v []reflect.Value, r *rand.Rand) {
   386  			req := AcceptChannel{
   387  				DustLimit:        dcrutil.Amount(r.Int63()),
   388  				MaxValueInFlight: MilliAtom(r.Int63()),
   389  				ChannelReserve:   dcrutil.Amount(r.Int63()),
   390  				MinAcceptDepth:   uint32(r.Int31()),
   391  				HtlcMinimum:      MilliAtom(r.Int31()),
   392  				CsvDelay:         uint16(r.Int31()),
   393  				MaxAcceptedHTLCs: uint16(r.Int31()),
   394  			}
   395  
   396  			if _, err := r.Read(req.PendingChannelID[:]); err != nil {
   397  				t.Fatalf("unable to generate pending chan id: %v", err)
   398  				return
   399  			}
   400  
   401  			var err error
   402  			req.FundingKey, err = randPubKey()
   403  			if err != nil {
   404  				t.Fatalf("unable to generate key: %v", err)
   405  				return
   406  			}
   407  			req.RevocationPoint, err = randPubKey()
   408  			if err != nil {
   409  				t.Fatalf("unable to generate key: %v", err)
   410  				return
   411  			}
   412  			req.PaymentPoint, err = randPubKey()
   413  			if err != nil {
   414  				t.Fatalf("unable to generate key: %v", err)
   415  				return
   416  			}
   417  			req.DelayedPaymentPoint, err = randPubKey()
   418  			if err != nil {
   419  				t.Fatalf("unable to generate key: %v", err)
   420  				return
   421  			}
   422  			req.HtlcPoint, err = randPubKey()
   423  			if err != nil {
   424  				t.Fatalf("unable to generate key: %v", err)
   425  				return
   426  			}
   427  			req.FirstCommitmentPoint, err = randPubKey()
   428  			if err != nil {
   429  				t.Fatalf("unable to generate key: %v", err)
   430  				return
   431  			}
   432  
   433  			// 1/2 chance empty upfront shutdown script.
   434  			if r.Intn(2) == 0 {
   435  				req.UpfrontShutdownScript, err = randDeliveryAddress(r)
   436  				if err != nil {
   437  					t.Fatalf("unable to generate delivery address: %v", err)
   438  					return
   439  				}
   440  			} else {
   441  				req.UpfrontShutdownScript = []byte{}
   442  			}
   443  
   444  			v[0] = reflect.ValueOf(req)
   445  		},
   446  		MsgFundingCreated: func(v []reflect.Value, r *rand.Rand) {
   447  			req := FundingCreated{}
   448  
   449  			if _, err := r.Read(req.PendingChannelID[:]); err != nil {
   450  				t.Fatalf("unable to generate pending chan id: %v", err)
   451  				return
   452  			}
   453  
   454  			if _, err := r.Read(req.FundingPoint.Hash[:]); err != nil {
   455  				t.Fatalf("unable to generate hash: %v", err)
   456  				return
   457  			}
   458  			req.FundingPoint.Index = uint32(r.Int31()) % math.MaxUint16
   459  
   460  			var err error
   461  			req.CommitSig, err = NewSigFromSignature(testSig)
   462  			if err != nil {
   463  				t.Fatalf("unable to parse sig: %v", err)
   464  				return
   465  			}
   466  
   467  			v[0] = reflect.ValueOf(req)
   468  		},
   469  		MsgFundingSigned: func(v []reflect.Value, r *rand.Rand) {
   470  			var c [32]byte
   471  			_, err := r.Read(c[:])
   472  			if err != nil {
   473  				t.Fatalf("unable to generate chan id: %v", err)
   474  				return
   475  			}
   476  
   477  			req := FundingSigned{
   478  				ChanID: ChannelID(c),
   479  			}
   480  			req.CommitSig, err = NewSigFromSignature(testSig)
   481  			if err != nil {
   482  				t.Fatalf("unable to parse sig: %v", err)
   483  				return
   484  			}
   485  
   486  			v[0] = reflect.ValueOf(req)
   487  		},
   488  		MsgFundingLocked: func(v []reflect.Value, r *rand.Rand) {
   489  
   490  			var c [32]byte
   491  			if _, err := r.Read(c[:]); err != nil {
   492  				t.Fatalf("unable to generate chan id: %v", err)
   493  				return
   494  			}
   495  
   496  			pubKey, err := randPubKey()
   497  			if err != nil {
   498  				t.Fatalf("unable to generate key: %v", err)
   499  				return
   500  			}
   501  
   502  			req := NewFundingLocked(ChannelID(c), pubKey)
   503  
   504  			v[0] = reflect.ValueOf(*req)
   505  		},
   506  		MsgClosingSigned: func(v []reflect.Value, r *rand.Rand) {
   507  			req := ClosingSigned{
   508  				FeeAtoms: dcrutil.Amount(r.Int63()),
   509  			}
   510  			var err error
   511  			req.Signature, err = NewSigFromSignature(testSig)
   512  			if err != nil {
   513  				t.Fatalf("unable to parse sig: %v", err)
   514  				return
   515  			}
   516  
   517  			if _, err := r.Read(req.ChannelID[:]); err != nil {
   518  				t.Fatalf("unable to generate chan id: %v", err)
   519  				return
   520  			}
   521  
   522  			v[0] = reflect.ValueOf(req)
   523  		},
   524  		MsgCommitSig: func(v []reflect.Value, r *rand.Rand) {
   525  			req := NewCommitSig()
   526  			if _, err := r.Read(req.ChanID[:]); err != nil {
   527  				t.Fatalf("unable to generate chan id: %v", err)
   528  				return
   529  			}
   530  
   531  			var err error
   532  			req.CommitSig, err = NewSigFromSignature(testSig)
   533  			if err != nil {
   534  				t.Fatalf("unable to parse sig: %v", err)
   535  				return
   536  			}
   537  
   538  			// Only create the slice if there will be any signatures
   539  			// in it to prevent false positive test failures due to
   540  			// an empty slice versus a nil slice.
   541  			numSigs := uint16(r.Int31n(1020))
   542  			if numSigs > 0 {
   543  				req.HtlcSigs = make([]Sig, numSigs)
   544  			}
   545  			for i := 0; i < int(numSigs); i++ {
   546  				req.HtlcSigs[i], err = NewSigFromSignature(testSig)
   547  				if err != nil {
   548  					t.Fatalf("unable to parse sig: %v", err)
   549  					return
   550  				}
   551  			}
   552  
   553  			v[0] = reflect.ValueOf(*req)
   554  		},
   555  		MsgRevokeAndAck: func(v []reflect.Value, r *rand.Rand) {
   556  			req := NewRevokeAndAck()
   557  			if _, err := r.Read(req.ChanID[:]); err != nil {
   558  				t.Fatalf("unable to generate chan id: %v", err)
   559  				return
   560  			}
   561  			if _, err := r.Read(req.Revocation[:]); err != nil {
   562  				t.Fatalf("unable to generate bytes: %v", err)
   563  				return
   564  			}
   565  			var err error
   566  			req.NextRevocationKey, err = randPubKey()
   567  			if err != nil {
   568  				t.Fatalf("unable to generate key: %v", err)
   569  				return
   570  			}
   571  
   572  			v[0] = reflect.ValueOf(*req)
   573  		},
   574  		MsgChannelAnnouncement: func(v []reflect.Value, r *rand.Rand) {
   575  			var err error
   576  			req := ChannelAnnouncement{
   577  				ShortChannelID: NewShortChanIDFromInt(uint64(r.Int63())),
   578  				Features:       randRawFeatureVector(r),
   579  			}
   580  			req.NodeSig1, err = NewSigFromSignature(testSig)
   581  			if err != nil {
   582  				t.Fatalf("unable to parse sig: %v", err)
   583  				return
   584  			}
   585  			req.NodeSig2, err = NewSigFromSignature(testSig)
   586  			if err != nil {
   587  				t.Fatalf("unable to parse sig: %v", err)
   588  				return
   589  			}
   590  			req.DecredSig1, err = NewSigFromSignature(testSig)
   591  			if err != nil {
   592  				t.Fatalf("unable to parse sig: %v", err)
   593  				return
   594  			}
   595  			req.DecredSig2, err = NewSigFromSignature(testSig)
   596  			if err != nil {
   597  				t.Fatalf("unable to parse sig: %v", err)
   598  				return
   599  			}
   600  
   601  			req.NodeID1, err = randRawKey()
   602  			if err != nil {
   603  				t.Fatalf("unable to generate key: %v", err)
   604  				return
   605  			}
   606  			req.NodeID2, err = randRawKey()
   607  			if err != nil {
   608  				t.Fatalf("unable to generate key: %v", err)
   609  				return
   610  			}
   611  			req.DecredKey1, err = randRawKey()
   612  			if err != nil {
   613  				t.Fatalf("unable to generate key: %v", err)
   614  				return
   615  			}
   616  			req.DecredKey2, err = randRawKey()
   617  			if err != nil {
   618  				t.Fatalf("unable to generate key: %v", err)
   619  				return
   620  			}
   621  			if _, err := r.Read(req.ChainHash[:]); err != nil {
   622  				t.Fatalf("unable to generate chain hash: %v", err)
   623  				return
   624  			}
   625  
   626  			numExtraBytes := r.Int31n(1000)
   627  			if numExtraBytes > 0 {
   628  				req.ExtraOpaqueData = make([]byte, numExtraBytes)
   629  				_, err := r.Read(req.ExtraOpaqueData)
   630  				if err != nil {
   631  					t.Fatalf("unable to generate opaque "+
   632  						"bytes: %v", err)
   633  					return
   634  				}
   635  			}
   636  
   637  			v[0] = reflect.ValueOf(req)
   638  		},
   639  		MsgNodeAnnouncement: func(v []reflect.Value, r *rand.Rand) {
   640  			var err error
   641  			req := NodeAnnouncement{
   642  				Features:  randRawFeatureVector(r),
   643  				Timestamp: uint32(r.Int31()),
   644  				Alias:     randAlias(r),
   645  				RGBColor: color.RGBA{
   646  					R: uint8(r.Int31()),
   647  					G: uint8(r.Int31()),
   648  					B: uint8(r.Int31()),
   649  				},
   650  			}
   651  			req.Signature, err = NewSigFromSignature(testSig)
   652  			if err != nil {
   653  				t.Fatalf("unable to parse sig: %v", err)
   654  				return
   655  			}
   656  
   657  			req.NodeID, err = randRawKey()
   658  			if err != nil {
   659  				t.Fatalf("unable to generate key: %v", err)
   660  				return
   661  			}
   662  
   663  			req.Addresses, err = randAddrs(r)
   664  			if err != nil {
   665  				t.Fatalf("unable to generate addresses: %v", err)
   666  			}
   667  
   668  			numExtraBytes := r.Int31n(1000)
   669  			if numExtraBytes > 0 {
   670  				req.ExtraOpaqueData = make([]byte, numExtraBytes)
   671  				_, err := r.Read(req.ExtraOpaqueData)
   672  				if err != nil {
   673  					t.Fatalf("unable to generate opaque "+
   674  						"bytes: %v", err)
   675  					return
   676  				}
   677  			}
   678  
   679  			v[0] = reflect.ValueOf(req)
   680  		},
   681  		MsgChannelUpdate: func(v []reflect.Value, r *rand.Rand) {
   682  			var err error
   683  
   684  			msgFlags := ChanUpdateMsgFlags(r.Int31())
   685  			maxHtlc := MilliAtom(r.Int63())
   686  
   687  			// We make the max_htlc field zero if it is not flagged
   688  			// as being part of the ChannelUpdate, to pass
   689  			// serialization tests, as it will be ignored if the bit
   690  			// is not set.
   691  			if msgFlags&ChanUpdateOptionMaxHtlc == 0 {
   692  				maxHtlc = 0
   693  			}
   694  
   695  			req := ChannelUpdate{
   696  				ShortChannelID:    NewShortChanIDFromInt(uint64(r.Int63())),
   697  				Timestamp:         uint32(r.Int31()),
   698  				MessageFlags:      msgFlags,
   699  				ChannelFlags:      ChanUpdateChanFlags(r.Int31()),
   700  				TimeLockDelta:     uint16(r.Int31()),
   701  				HtlcMinimumMAtoms: MilliAtom(r.Int63()),
   702  				HtlcMaximumMAtoms: maxHtlc,
   703  				BaseFee:           uint32(r.Int31()),
   704  				FeeRate:           uint32(r.Int31()),
   705  			}
   706  			req.Signature, err = NewSigFromSignature(testSig)
   707  			if err != nil {
   708  				t.Fatalf("unable to parse sig: %v", err)
   709  				return
   710  			}
   711  
   712  			if _, err := r.Read(req.ChainHash[:]); err != nil {
   713  				t.Fatalf("unable to generate chain hash: %v", err)
   714  				return
   715  			}
   716  
   717  			numExtraBytes := r.Int31n(1000)
   718  			if numExtraBytes > 0 {
   719  				req.ExtraOpaqueData = make([]byte, numExtraBytes)
   720  				_, err := r.Read(req.ExtraOpaqueData)
   721  				if err != nil {
   722  					t.Fatalf("unable to generate opaque "+
   723  						"bytes: %v", err)
   724  					return
   725  				}
   726  			}
   727  
   728  			v[0] = reflect.ValueOf(req)
   729  		},
   730  		MsgAnnounceSignatures: func(v []reflect.Value, r *rand.Rand) {
   731  			var err error
   732  			req := AnnounceSignatures{
   733  				ShortChannelID: NewShortChanIDFromInt(uint64(r.Int63())),
   734  			}
   735  
   736  			req.NodeSignature, err = NewSigFromSignature(testSig)
   737  			if err != nil {
   738  				t.Fatalf("unable to parse sig: %v", err)
   739  				return
   740  			}
   741  
   742  			req.DecredSignature, err = NewSigFromSignature(testSig)
   743  			if err != nil {
   744  				t.Fatalf("unable to parse sig: %v", err)
   745  				return
   746  			}
   747  
   748  			if _, err := r.Read(req.ChannelID[:]); err != nil {
   749  				t.Fatalf("unable to generate chan id: %v", err)
   750  				return
   751  			}
   752  
   753  			numExtraBytes := r.Int31n(1000)
   754  			if numExtraBytes > 0 {
   755  				req.ExtraOpaqueData = make([]byte, numExtraBytes)
   756  				_, err := r.Read(req.ExtraOpaqueData)
   757  				if err != nil {
   758  					t.Fatalf("unable to generate opaque "+
   759  						"bytes: %v", err)
   760  					return
   761  				}
   762  			}
   763  
   764  			v[0] = reflect.ValueOf(req)
   765  		},
   766  		MsgChannelReestablish: func(v []reflect.Value, r *rand.Rand) {
   767  			req := ChannelReestablish{
   768  				NextLocalCommitHeight:  uint64(r.Int63()),
   769  				RemoteCommitTailHeight: uint64(r.Int63()),
   770  			}
   771  
   772  			// With a 50/50 probability, we'll include the
   773  			// additional fields so we can test our ability to
   774  			// properly parse, and write out the optional fields.
   775  			if r.Int()%2 == 0 {
   776  				_, err := r.Read(req.LastRemoteCommitSecret[:])
   777  				if err != nil {
   778  					t.Fatalf("unable to read commit secret: %v", err)
   779  					return
   780  				}
   781  
   782  				req.LocalUnrevokedCommitPoint, err = randPubKey()
   783  				if err != nil {
   784  					t.Fatalf("unable to generate key: %v", err)
   785  					return
   786  				}
   787  			}
   788  
   789  			v[0] = reflect.ValueOf(req)
   790  		},
   791  		MsgQueryShortChanIDs: func(v []reflect.Value, r *rand.Rand) {
   792  			req := QueryShortChanIDs{}
   793  
   794  			// With a 50/50 change, we'll either use zlib encoding,
   795  			// or regular encoding.
   796  			if r.Int31()%2 == 0 {
   797  				req.EncodingType = EncodingSortedZlib
   798  			} else {
   799  				req.EncodingType = EncodingSortedPlain
   800  			}
   801  
   802  			if _, err := rand.Read(req.ChainHash[:]); err != nil {
   803  				t.Fatalf("unable to read chain hash: %v", err)
   804  				return
   805  			}
   806  
   807  			numChanIDs := rand.Int31n(5000)
   808  			for i := int32(0); i < numChanIDs; i++ {
   809  				req.ShortChanIDs = append(req.ShortChanIDs,
   810  					NewShortChanIDFromInt(uint64(r.Int63())))
   811  			}
   812  
   813  			v[0] = reflect.ValueOf(req)
   814  		},
   815  		MsgReplyChannelRange: func(v []reflect.Value, r *rand.Rand) {
   816  			req := ReplyChannelRange{
   817  				QueryChannelRange: QueryChannelRange{
   818  					FirstBlockHeight: uint32(r.Int31()),
   819  					NumBlocks:        uint32(r.Int31()),
   820  				},
   821  			}
   822  
   823  			if _, err := rand.Read(req.ChainHash[:]); err != nil {
   824  				t.Fatalf("unable to read chain hash: %v", err)
   825  				return
   826  			}
   827  
   828  			req.Complete = uint8(r.Int31n(2))
   829  
   830  			// With a 50/50 change, we'll either use zlib encoding,
   831  			// or regular encoding.
   832  			if r.Int31()%2 == 0 {
   833  				req.EncodingType = EncodingSortedZlib
   834  			} else {
   835  				req.EncodingType = EncodingSortedPlain
   836  			}
   837  
   838  			numChanIDs := rand.Int31n(5000)
   839  			for i := int32(0); i < numChanIDs; i++ {
   840  				req.ShortChanIDs = append(req.ShortChanIDs,
   841  					NewShortChanIDFromInt(uint64(r.Int63())))
   842  			}
   843  
   844  			v[0] = reflect.ValueOf(req)
   845  		},
   846  	}
   847  
   848  	// With the above types defined, we'll now generate a slice of
   849  	// scenarios to feed into quick.Check. The function scans in input
   850  	// space of the target function under test, so we'll need to create a
   851  	// series of wrapper functions to force it to iterate over the target
   852  	// types, but re-use the mainScenario defined above.
   853  	tests := []struct {
   854  		msgType  MessageType
   855  		scenario interface{}
   856  	}{
   857  		{
   858  			msgType: MsgInit,
   859  			scenario: func(m Init) bool {
   860  				return mainScenario(&m)
   861  			},
   862  		},
   863  		{
   864  			msgType: MsgError,
   865  			scenario: func(m Error) bool {
   866  				return mainScenario(&m)
   867  			},
   868  		},
   869  		{
   870  			msgType: MsgPing,
   871  			scenario: func(m Ping) bool {
   872  				return mainScenario(&m)
   873  			},
   874  		},
   875  		{
   876  			msgType: MsgPong,
   877  			scenario: func(m Pong) bool {
   878  				return mainScenario(&m)
   879  			},
   880  		},
   881  		{
   882  			msgType: MsgOpenChannel,
   883  			scenario: func(m OpenChannel) bool {
   884  				return mainScenario(&m)
   885  			},
   886  		},
   887  		{
   888  			msgType: MsgAcceptChannel,
   889  			scenario: func(m AcceptChannel) bool {
   890  				return mainScenario(&m)
   891  			},
   892  		},
   893  		{
   894  			msgType: MsgFundingCreated,
   895  			scenario: func(m FundingCreated) bool {
   896  				return mainScenario(&m)
   897  			},
   898  		},
   899  		{
   900  			msgType: MsgFundingSigned,
   901  			scenario: func(m FundingSigned) bool {
   902  				return mainScenario(&m)
   903  			},
   904  		},
   905  		{
   906  			msgType: MsgFundingLocked,
   907  			scenario: func(m FundingLocked) bool {
   908  				return mainScenario(&m)
   909  			},
   910  		},
   911  		{
   912  			msgType: MsgShutdown,
   913  			scenario: func(m Shutdown) bool {
   914  				return mainScenario(&m)
   915  			},
   916  		},
   917  		{
   918  			msgType: MsgClosingSigned,
   919  			scenario: func(m ClosingSigned) bool {
   920  				return mainScenario(&m)
   921  			},
   922  		},
   923  		{
   924  			msgType: MsgUpdateAddHTLC,
   925  			scenario: func(m UpdateAddHTLC) bool {
   926  				return mainScenario(&m)
   927  			},
   928  		},
   929  		{
   930  			msgType: MsgUpdateFulfillHTLC,
   931  			scenario: func(m UpdateFulfillHTLC) bool {
   932  				return mainScenario(&m)
   933  			},
   934  		},
   935  		{
   936  			msgType: MsgUpdateFailHTLC,
   937  			scenario: func(m UpdateFailHTLC) bool {
   938  				return mainScenario(&m)
   939  			},
   940  		},
   941  		{
   942  			msgType: MsgCommitSig,
   943  			scenario: func(m CommitSig) bool {
   944  				return mainScenario(&m)
   945  			},
   946  		},
   947  		{
   948  			msgType: MsgRevokeAndAck,
   949  			scenario: func(m RevokeAndAck) bool {
   950  				return mainScenario(&m)
   951  			},
   952  		},
   953  		{
   954  			msgType: MsgUpdateFee,
   955  			scenario: func(m UpdateFee) bool {
   956  				return mainScenario(&m)
   957  			},
   958  		},
   959  		{
   960  
   961  			msgType: MsgUpdateFailMalformedHTLC,
   962  			scenario: func(m UpdateFailMalformedHTLC) bool {
   963  				return mainScenario(&m)
   964  			},
   965  		},
   966  		{
   967  			msgType: MsgChannelReestablish,
   968  			scenario: func(m ChannelReestablish) bool {
   969  				return mainScenario(&m)
   970  			},
   971  		},
   972  		{
   973  			msgType: MsgChannelAnnouncement,
   974  			scenario: func(m ChannelAnnouncement) bool {
   975  				return mainScenario(&m)
   976  			},
   977  		},
   978  		{
   979  			msgType: MsgNodeAnnouncement,
   980  			scenario: func(m NodeAnnouncement) bool {
   981  				return mainScenario(&m)
   982  			},
   983  		},
   984  		{
   985  			msgType: MsgChannelUpdate,
   986  			scenario: func(m ChannelUpdate) bool {
   987  				return mainScenario(&m)
   988  			},
   989  		},
   990  		{
   991  			msgType: MsgAnnounceSignatures,
   992  			scenario: func(m AnnounceSignatures) bool {
   993  				return mainScenario(&m)
   994  			},
   995  		},
   996  		{
   997  			msgType: MsgGossipTimestampRange,
   998  			scenario: func(m GossipTimestampRange) bool {
   999  				return mainScenario(&m)
  1000  			},
  1001  		},
  1002  		{
  1003  			msgType: MsgQueryShortChanIDs,
  1004  			scenario: func(m QueryShortChanIDs) bool {
  1005  				return mainScenario(&m)
  1006  			},
  1007  		},
  1008  		{
  1009  			msgType: MsgReplyShortChanIDsEnd,
  1010  			scenario: func(m ReplyShortChanIDsEnd) bool {
  1011  				return mainScenario(&m)
  1012  			},
  1013  		},
  1014  		{
  1015  			msgType: MsgQueryChannelRange,
  1016  			scenario: func(m QueryChannelRange) bool {
  1017  				return mainScenario(&m)
  1018  			},
  1019  		},
  1020  		{
  1021  			msgType: MsgReplyChannelRange,
  1022  			scenario: func(m ReplyChannelRange) bool {
  1023  				return mainScenario(&m)
  1024  			},
  1025  		},
  1026  	}
  1027  	for _, test := range tests {
  1028  		var config *quick.Config
  1029  
  1030  		// If the type defined is within the custom type gen map above,
  1031  		// then we'll modify the default config to use this Value
  1032  		// function that knows how to generate the proper types.
  1033  		if valueGen, ok := customTypeGen[test.msgType]; ok {
  1034  			config = &quick.Config{
  1035  				Values: valueGen,
  1036  			}
  1037  		}
  1038  
  1039  		t.Logf("Running fuzz tests for msgType=%v", test.msgType)
  1040  		if err := quick.Check(test.scenario, config); err != nil {
  1041  			t.Fatalf("fuzz checks for msg=%v failed: %v",
  1042  				test.msgType, err)
  1043  		}
  1044  	}
  1045  
  1046  }
  1047  
  1048  func init() {
  1049  	rand.Seed(time.Now().Unix())
  1050  }