@@ -3,9 +3,7 @@ package neutrino
33import (
44 "encoding/binary"
55 "fmt"
6- "io/ioutil"
76 "math/rand"
8- "os"
97 "strings"
108 "testing"
119 "time"
@@ -22,13 +20,14 @@ import (
2220 "github.com/lightninglabs/neutrino/blockntfns"
2321 "github.com/lightninglabs/neutrino/headerfs"
2422 "github.com/lightninglabs/neutrino/query"
23+ "github.com/stretchr/testify/require"
2524)
2625
2726const (
28- // maxHeight is the height we will generate filter headers up to. We use an odd
29- // number of checkpoints to ensure we can test cases where the block manager is
30- // only able to fetch filter headers for one checkpoint interval rather than
31- // two.
27+ // maxHeight is the height we will generate filter headers up to. We use
28+ // an odd number of checkpoints to ensure we can test cases where the
29+ // block manager is only able to fetch filter headers for one checkpoint
30+ // interval rather than two.
3231 maxHeight = 21 * uint32 (wire .CFCheckptInterval )
3332
3433 dbOpenTimeout = time .Second * 10
@@ -52,36 +51,27 @@ func (m *mockDispatcher) Query(requests []*query.Request,
5251}
5352
5453// setupBlockManager initialises a blockManager to be used in tests.
55- func setupBlockManager () (* blockManager , headerfs.BlockHeaderStore ,
56- * headerfs.FilterHeaderStore , func (), error ) {
54+ func setupBlockManager (t * testing. T ) (* blockManager , headerfs.BlockHeaderStore ,
55+ * headerfs.FilterHeaderStore , error ) {
5756
5857 // Set up the block and filter header stores.
59- tempDir , err := ioutil .TempDir ("" , "neutrino" )
60- if err != nil {
61- return nil , nil , nil , nil , fmt .Errorf ("Failed to create " +
62- "temporary directory: %s" , err )
63- }
64-
58+ tempDir := t .TempDir ()
6559 db , err := walletdb .Create (
6660 "bdb" , tempDir + "/weks.db" , true , dbOpenTimeout ,
6761 )
6862 if err != nil {
69- os .RemoveAll (tempDir )
70- return nil , nil , nil , nil , fmt .Errorf ("Error opening DB: %s" ,
71- err )
63+ return nil , nil , nil , fmt .Errorf ("error opening DB: %s" , err )
7264 }
7365
74- cleanUp := func () {
75- db .Close ()
76- os .RemoveAll (tempDir )
77- }
66+ t .Cleanup (func () {
67+ require .NoError (t , db .Close ())
68+ })
7869
7970 hdrStore , err := headerfs .NewBlockHeaderStore (
8071 tempDir , db , & chaincfg .SimNetParams ,
8172 )
8273 if err != nil {
83- cleanUp ()
84- return nil , nil , nil , nil , fmt .Errorf ("Error creating block " +
74+ return nil , nil , nil , fmt .Errorf ("error creating block " +
8575 "header store: %s" , err )
8676 }
8777
@@ -90,8 +80,7 @@ func setupBlockManager() (*blockManager, headerfs.BlockHeaderStore,
9080 nil ,
9181 )
9282 if err != nil {
93- cleanUp ()
94- return nil , nil , nil , nil , fmt .Errorf ("Error creating filter " +
83+ return nil , nil , nil , fmt .Errorf ("error creating filter " +
9584 "header store: %s" , err )
9685 }
9786
@@ -101,14 +90,16 @@ func setupBlockManager() (*blockManager, headerfs.BlockHeaderStore,
10190 BlockHeaders : hdrStore ,
10291 RegFilterHeaders : cfStore ,
10392 QueryDispatcher : & mockDispatcher {},
104- BanPeer : func (string , banman.Reason ) error { return nil },
93+ BanPeer : func (string , banman.Reason ) error {
94+ return nil
95+ },
10596 })
10697 if err != nil {
107- return nil , nil , nil , nil , fmt .Errorf ("unable to create " +
98+ return nil , nil , nil , fmt .Errorf ("unable to create " +
10899 "blockmanager: %v" , err )
109100 }
110101
111- return bm , hdrStore , cfStore , cleanUp , nil
102+ return bm , hdrStore , cfStore , nil
112103}
113104
114105// headers wraps the different headers and filters used throughout the tests.
@@ -315,47 +306,37 @@ func TestBlockManagerInitialInterval(t *testing.T) {
315306 testDesc := fmt .Sprintf ("permute=%v, partial=%v, repeat=%v" ,
316307 test .permute , test .partialInterval , test .repeat )
317308
318- bm , hdrStore , cfStore , cleanUp , err := setupBlockManager ()
309+ bm , hdrStore , cfStore , err := setupBlockManager (t )
319310 if err != nil {
320311 t .Fatalf ("unable to set up ChainService: %v" , err )
321312 }
322- defer cleanUp ()
323313
324314 // Keep track of the filter headers and block headers. Since
325315 // the genesis headers are written automatically when the store
326316 // is created, we query it to add to the slices.
327317 genesisBlockHeader , _ , err := hdrStore .ChainTip ()
328- if err != nil {
329- t .Fatal (err )
330- }
318+ require .NoError (t , err )
331319
332320 genesisFilterHeader , _ , err := cfStore .ChainTip ()
333- if err != nil {
334- t .Fatal (err )
335- }
321+ require .NoError (t , err )
336322
337- headers , err := generateHeaders (genesisBlockHeader ,
338- genesisFilterHeader , nil )
339- if err != nil {
340- t .Fatalf ("unable to generate headers: %v" , err )
341- }
323+ headers , err := generateHeaders (
324+ genesisBlockHeader , genesisFilterHeader , nil ,
325+ )
326+ require .NoError (t , err )
342327
343328 // Write all block headers but the genesis, since it is already
344329 // in the store.
345- if err = hdrStore .WriteHeaders (headers .blockHeaders [1 :]... ); err != nil {
346- t .Fatalf ("Error writing batch of headers: %s" , err )
347- }
330+ err = hdrStore .WriteHeaders (headers .blockHeaders [1 :]... )
331+ require .NoError (t , err )
348332
349333 // We emulate the case where a few filter headers are already
350334 // written to the store by writing 1/3 of the first interval.
351335 if test .partialInterval {
352336 err = cfStore .WriteHeaders (
353337 headers .cfHeaders [1 : wire .CFCheckptInterval / 3 ]... ,
354338 )
355- if err != nil {
356- t .Fatalf ("Error writing batch of headers: %s" ,
357- err )
358- }
339+ require .NoError (t , err )
359340 }
360341
361342 // We set up a custom query batch method for this test, as we
@@ -371,10 +352,7 @@ func TestBlockManagerInitialInterval(t *testing.T) {
371352 }
372353
373354 responses , err := generateResponses (msgs , headers )
374- if err != nil {
375- t .Fatalf ("unable to generate responses: %v" ,
376- err )
377- }
355+ require .NoError (t , err )
378356
379357 // We permute the response order if the test signals
380358 // that.
@@ -459,20 +437,12 @@ func TestBlockManagerInitialInterval(t *testing.T) {
459437
460438 // Finally make sure the filter header tip is what we expect.
461439 tip , tipHeight , err := cfStore .ChainTip ()
462- if err != nil {
463- t .Fatal (err )
464- }
440+ require .NoError (t , err )
465441
466- if tipHeight != maxHeight {
467- t .Fatalf ("expected tip height to be %v, was %v" ,
468- maxHeight , tipHeight )
469- }
442+ require .Equal (t , maxHeight , tipHeight , "tip height" )
470443
471444 lastCheckpoint := headers .checkpoints [len (headers .checkpoints )- 1 ]
472- if * tip != * lastCheckpoint {
473- t .Fatalf ("expected tip to be %v, was %v" ,
474- lastCheckpoint , tip )
475- }
445+ require .Equal (t , * lastCheckpoint , * tip , "tip" )
476446 }
477447}
478448
@@ -547,43 +517,35 @@ func TestBlockManagerInvalidInterval(t *testing.T) {
547517
548518 for _ , test := range testCases {
549519 test := test
550- bm , hdrStore , cfStore , cleanUp , err := setupBlockManager ()
551- if err != nil {
552- t .Fatalf ("unable to set up ChainService: %v" , err )
553- }
554- defer cleanUp ()
520+ bm , hdrStore , cfStore , err := setupBlockManager (t )
521+ require .NoError (t , err )
555522
556523 // Create a mock peer to prevent panics when attempting to ban
557524 // a peer that served an invalid filter header.
558525 mockPeer := NewServerPeer (& ChainService {}, false )
559526 mockPeer .Peer , err = peer .NewOutboundPeer (
560527 NewPeerConfig (mockPeer ), "127.0.0.1:8333" ,
561528 )
562- if err != nil {
563- t .Fatal (err )
564- }
529+ require .NoError (t , err )
565530
566531 // Keep track of the filter headers and block headers. Since
567532 // the genesis headers are written automatically when the store
568533 // is created, we query it to add to the slices.
569534 genesisBlockHeader , _ , err := hdrStore .ChainTip ()
570- if err != nil {
571- t .Fatal (err )
572- }
535+ require .NoError (t , err )
573536
574537 genesisFilterHeader , _ , err := cfStore .ChainTip ()
575- if err != nil {
576- t .Fatal (err )
577- }
538+ require .NoError (t , err )
539+
578540 // To emulate a full node serving us filter headers derived
579541 // from different genesis than what we have, we flip a bit in
580542 // the genesis filter header.
581543 if test .wrongGenesis {
582544 genesisFilterHeader [0 ] ^= 1
583545 }
584546
585- headers , err := generateHeaders (genesisBlockHeader ,
586- genesisFilterHeader ,
547+ headers , err := generateHeaders (
548+ genesisBlockHeader , genesisFilterHeader ,
587549 func (currentCFHeader * chainhash.Hash ) {
588550 // If we are testing that each interval doesn't
589551 // line up properly with the previous, we flip
@@ -592,27 +554,22 @@ func TestBlockManagerInvalidInterval(t *testing.T) {
592554 if test .intervalMisaligned {
593555 currentCFHeader [0 ] ^= 1
594556 }
595- })
596- if err != nil {
597- t .Fatalf ("unable to generate headers: %v" , err )
598- }
557+ },
558+ )
559+ require .NoError (t , err )
599560
600561 // Write all block headers but the genesis, since it is already
601562 // in the store.
602- if err = hdrStore .WriteHeaders (headers .blockHeaders [1 :]... ); err != nil {
603- t .Fatalf ("Error writing batch of headers: %s" , err )
604- }
563+ err = hdrStore .WriteHeaders (headers .blockHeaders [1 :]... )
564+ require .NoError (t , err )
605565
606566 // We emulate the case where a few filter headers are already
607567 // written to the store by writing 1/3 of the first interval.
608568 if test .partialInterval {
609569 err = cfStore .WriteHeaders (
610570 headers .cfHeaders [1 : wire .CFCheckptInterval / 3 ]... ,
611571 )
612- if err != nil {
613- t .Fatalf ("Error writing batch of headers: %s" ,
614- err )
615- }
572+ require .NoError (t , err )
616573 }
617574
618575 bm .cfg .QueryDispatcher .(* mockDispatcher ).query = func (
@@ -624,10 +581,7 @@ func TestBlockManagerInvalidInterval(t *testing.T) {
624581 msgs = append (msgs , q .Req )
625582 }
626583 responses , err := generateResponses (msgs , headers )
627- if err != nil {
628- t .Fatalf ("unable to generate responses: %v" ,
629- err )
630- }
584+ require .NoError (t , err )
631585
632586 // Since we used the generated checkpoints when
633587 // creating the responses, we must flip the
@@ -644,7 +598,7 @@ func TestBlockManagerInvalidInterval(t *testing.T) {
644598 }
645599
646600 // If we are testing for intervals with invalid prev
647- // hashes, we flip a bit to corrup them, regardless of
601+ // hashes, we flip a bit to corrupt them, regardless of
648602 // whether we are testing misaligned intervals.
649603 if test .invalidPrevHash {
650604 for i := range responses {
@@ -760,12 +714,12 @@ func assertBadPeers(expBad map[string]struct{}, badPeers []string) error {
760714 for p := range expBad {
761715 remBad [p ] = struct {}{}
762716 }
763- for _ , peer := range badPeers {
764- _ , ok := remBad [peer ]
717+ for _ , p := range badPeers {
718+ _ , ok := remBad [p ]
765719 if ! ok {
766- return fmt .Errorf ("did not expect %v to be bad" , peer )
720+ return fmt .Errorf ("did not expect %v to be bad" , p )
767721 }
768- delete (remBad , peer )
722+ delete (remBad , p )
769723 }
770724
771725 if len (remBad ) != 0 {
@@ -855,20 +809,25 @@ func TestBlockManagerDetectBadPeers(t *testing.T) {
855809 options ... QueryOption ) {
856810
857811 for p , resp := range answers {
858- pp , err := peer .NewOutboundPeer (& peer.Config {}, p )
812+ pp , err := peer .NewOutboundPeer (
813+ & peer.Config {}, p ,
814+ )
859815 if err != nil {
860816 panic (err )
861817 }
862818
863819 sp := & ServerPeer {
864820 Peer : pp ,
865821 }
866- checkResponse (sp , resp , make (chan struct {}), make (chan struct {}))
822+ checkResponse (
823+ sp , resp , make (chan struct {}),
824+ make (chan struct {}),
825+ )
867826 }
868827 }
869828
870- for _ , peer := range peers {
871- test .filterAnswers (peer , answers )
829+ for _ , p := range peers {
830+ test .filterAnswers (p , answers )
872831 }
873832
874833 // For the CFHeaders, we pretend all peers responded with the same
@@ -884,8 +843,8 @@ func TestBlockManagerDetectBadPeers(t *testing.T) {
884843 }
885844
886845 headers := make (map [string ]* wire.MsgCFHeaders )
887- for _ , peer := range peers {
888- headers [peer ] = msg
846+ for _ , p := range peers {
847+ headers [p ] = msg
889848 }
890849
891850 bm := & blockManager {
@@ -900,12 +859,9 @@ func TestBlockManagerDetectBadPeers(t *testing.T) {
900859 badPeers , err := bm .detectBadPeers (
901860 headers , targetIndex , badIndex , fType ,
902861 )
903- if err != nil {
904- t .Fatalf ("failed to detect bad peers: %v" , err )
905- }
862+ require .NoError (t , err )
906863
907- if err := assertBadPeers (expBad , badPeers ); err != nil {
908- t .Fatal (err )
909- }
864+ err = assertBadPeers (expBad , badPeers )
865+ require .NoError (t , err )
910866 }
911867}
0 commit comments