@@ -12,6 +12,8 @@ import (
1212 "decred.org/dcrwallet/v5/wallet/walletdb"
1313 "github.com/decred/dcrd/chaincfg/chainhash"
1414 "github.com/decred/dcrd/crypto/rand"
15+ "github.com/decred/dcrd/dcrutil/v4"
16+ gcs2 "github.com/decred/dcrd/gcs/v4"
1517)
1618
1719func randomBytes (len int ) []byte {
@@ -79,3 +81,108 @@ func TestSetBirthState(t *testing.T) {
7981 })
8082 }
8183}
84+
85+ func TestMissingCFiltersHeight (t * testing.T ) {
86+ ctx := context .Background ()
87+ db , _ , s , teardown , err := cloneDB (ctx , "mgr_watching_only.kv" )
88+ defer teardown ()
89+ if err != nil {
90+ t .Fatal (err )
91+ }
92+
93+ g := makeBlockGenerator ()
94+ b1H := g .generate (dcrutil .BlockValid )
95+ b2H := g .generate (dcrutil .BlockValid )
96+ b3H := g .generate (dcrutil .BlockValid )
97+ b4H := g .generate (dcrutil .BlockValid )
98+ b5H := g .generate (dcrutil .BlockValid )
99+ headerData := makeHeaderDataSlice (b1H , b2H , b3H , b4H , b5H )
100+ // 3 with filters including genesis then two without and last one with.
101+ filters := emptyFilters (2 )
102+ filters = append (filters , make ([]* gcs2.FilterV2 , 2 )... )
103+ filters = append (filters , emptyFilters (1 )... )
104+
105+ err = walletdb .Update (ctx , db , func (dbtx walletdb.ReadWriteTx ) error {
106+ err = insertMainChainHeaders (s , dbtx , headerData , filters )
107+ if err != nil {
108+ return err
109+ }
110+ return nil
111+ })
112+ if err != nil {
113+ t .Fatal (err )
114+ }
115+
116+ tests := []struct {
117+ name string
118+ missingNo , from int32
119+ wantErr bool
120+ do func ()
121+ }{{
122+ name : "ok from 0" ,
123+ missingNo : 3 ,
124+ }, {
125+ name : "ok from mid" ,
126+ from : 4 ,
127+ missingNo : 4 ,
128+ }, {
129+ name : "ok from 1 after adding" ,
130+ from : 1 ,
131+ do : func () {
132+ if err := walletdb .Update (ctx , db , func (dbtx walletdb.ReadWriteTx ) error {
133+ ns := dbtx .ReadWriteBucket (wtxmgrBucketKey )
134+ b3Hash := b3H .BlockHash ()
135+ err := putRawCFilter (ns , b3Hash [:], nil )
136+ if err != nil {
137+ return err
138+ }
139+ return nil
140+ }); err != nil {
141+ t .Fatal (err )
142+ }
143+ },
144+ missingNo : 4 ,
145+ }, {
146+ name : "error once all filters full" ,
147+ do : func () {
148+ if err := walletdb .Update (ctx , db , func (dbtx walletdb.ReadWriteTx ) error {
149+ ns := dbtx .ReadWriteBucket (wtxmgrBucketKey )
150+ b4Hash := b4H .BlockHash ()
151+ err := putRawCFilter (ns , b4Hash [:], nil )
152+ if err != nil {
153+ return err
154+ }
155+ return nil
156+ }); err != nil {
157+ t .Fatal (err )
158+ }
159+ },
160+ wantErr : true ,
161+ }}
162+
163+ for _ , test := range tests {
164+ t .Run (test .name , func (t * testing.T ) {
165+ var missingNo int32
166+ if test .do != nil {
167+ test .do ()
168+ }
169+ err = walletdb .Update (ctx , db , func (dbtx walletdb.ReadWriteTx ) error {
170+ var err error
171+ missingNo , err = MissingCFiltersHeight (dbtx , test .from )
172+ return err
173+ })
174+ if test .wantErr {
175+ if err == nil {
176+ t .Fatal ("wanted error but got none" )
177+ }
178+ return
179+ }
180+ if err != nil {
181+ t .Fatal (err )
182+ }
183+ if missingNo != test .missingNo {
184+ t .Fatalf ("wanted missing number %v but got %v" , test .missingNo , missingNo )
185+ }
186+ })
187+ }
188+ }
0 commit comments