@@ -6,6 +6,7 @@ package sync
6
6
import (
7
7
"bytes"
8
8
"context"
9
+ "errors"
9
10
"math/rand"
10
11
"slices"
11
12
"testing"
@@ -23,7 +24,12 @@ import (
23
24
"github.com/ava-labs/avalanchego/x/merkledb"
24
25
)
25
26
26
- var _ p2p.Handler = (* waitingHandler )(nil )
27
+ var (
28
+ _ p2p.Handler = (* waitingHandler )(nil )
29
+
30
+ // Used to simulate a corrupted DB
31
+ errorFoo = errors .New ("mock error" )
32
+ )
27
33
28
34
func Test_Creation (t * testing.T ) {
29
35
require := require .New (t )
@@ -657,6 +663,63 @@ func Test_Sync_UpdateSyncTarget(t *testing.T) {
657
663
require .Equal (1 , m .unprocessedWork .Len ())
658
664
}
659
665
666
+ func Test_Sync_DBError (t * testing.T ) {
667
+ require := require .New (t )
668
+
669
+ now := time .Now ().UnixNano ()
670
+ r := rand .New (rand .NewSource (now )) // #nosec G404
671
+ dbToSync , err := generateTrie (t , r , maxKeyValuesLimit )
672
+ require .NoError (err )
673
+ syncRoot , err := dbToSync .GetMerkleRoot (context .Background ())
674
+ require .NoError (err )
675
+
676
+ db , err := merkledb .New (
677
+ context .Background (),
678
+ memdb .New (),
679
+ newDefaultDBConfig (),
680
+ )
681
+ require .NoError (err )
682
+
683
+ // This client DB will return an error when it tries to commit a range proof.
684
+ badDB := & badMerkleDB {MerkleDB : db }
685
+
686
+ proofClient , err := NewClient (badDB , & ClientConfig {
687
+ BranchFactor : merkledb .BranchFactor16 ,
688
+ })
689
+ require .NoError (err )
690
+
691
+ ctx := context .Background ()
692
+ syncer , err := NewManager (ManagerConfig {
693
+ ProofClient : proofClient ,
694
+ RangeProofClient : p2ptest .NewSelfClient (t , ctx , ids .EmptyNodeID , NewGetRangeProofHandler (dbToSync )),
695
+ ChangeProofClient : p2ptest .NewSelfClient (t , ctx , ids .EmptyNodeID , NewGetChangeProofHandler (dbToSync )),
696
+ TargetRoot : syncRoot ,
697
+ SimultaneousWorkLimit : 5 ,
698
+ Log : logging.NoLog {},
699
+ }, prometheus .NewRegistry ())
700
+ require .NoError (err )
701
+ require .NotNil (syncer )
702
+ require .NoError (syncer .Start (context .Background ()))
703
+ err = syncer .Wait (context .Background ())
704
+ require .ErrorIs (err , errorFoo )
705
+ }
706
+
707
+ var _ DB = (* badMerkleDB )(nil )
708
+
709
+ type badMerkleDB struct {
710
+ merkledb.MerkleDB
711
+ }
712
+
713
+ func (* badMerkleDB ) CommitRangeProof (
714
+ _ context.Context ,
715
+ _ maybe.Maybe [[]byte ],
716
+ _ maybe.Maybe [[]byte ],
717
+ _ * merkledb.RangeProof ,
718
+ ) error {
719
+ // Simulate a bad response by returning an error.
720
+ return errorFoo
721
+ }
722
+
660
723
func generateTrie (t * testing.T , r * rand.Rand , count int ) (merkledb.MerkleDB , error ) {
661
724
return generateTrieWithMinKeyLen (t , r , count , 0 )
662
725
}
0 commit comments