@@ -140,6 +140,25 @@ def restore_wallet_existent_name(self):
140
140
assert_raises_rpc_error (- 36 , error_message , node .restorewallet , wallet_name , backup_file )
141
141
assert wallet_file .exists ()
142
142
143
+ def test_pruned_wallet_backup (self ):
144
+ self .log .info ("Test loading backup on a pruned node when the backup was created close to the prune height of the restoring node" )
145
+ node = self .nodes [3 ]
146
+ self .restart_node (3 , ["-prune=1" , "-fastprune=1" ])
147
+ # Ensure the chain tip is at height 214, because this test assume it is.
148
+ assert_equal (node .getchaintips ()[0 ]["height" ], 214 )
149
+ # We need a few more blocks so we can actually get above an realistic
150
+ # minimal prune height
151
+ self .generate (node , 50 , sync_fun = self .no_op )
152
+ # Backup created at block height 264
153
+ node .backupwallet (node .datadir_path / 'wallet_pruned.bak' )
154
+ # Generate more blocks so we can actually prune the older blocks
155
+ self .generate (node , 300 , sync_fun = self .no_op )
156
+ # This gives us an actual prune height roughly in the range of 220 - 240
157
+ node .pruneblockchain (250 )
158
+ # The backup should be updated with the latest height (locator) for
159
+ # the backup to load successfully this close to the prune height
160
+ node .restorewallet (f'pruned' , node .datadir_path / 'wallet_pruned.bak' )
161
+
143
162
def run_test (self ):
144
163
self .log .info ("Generating initial blockchain" )
145
164
self .generate (self .nodes [0 ], 1 )
@@ -242,6 +261,8 @@ def run_test(self):
242
261
for sourcePath in sourcePaths :
243
262
assert_raises_rpc_error (- 4 , "backup failed" , self .nodes [0 ].backupwallet , sourcePath )
244
263
264
+ self .test_pruned_wallet_backup ()
265
+
245
266
246
267
if __name__ == '__main__' :
247
268
WalletBackupTest (__file__ ).main ()
0 commit comments