@@ -65,6 +65,12 @@ def assert_is_sqlite(self, wallet_name):
65
65
assert_equal (file_magic , b'SQLite format 3\x00 ' )
66
66
assert_equal (self .master_node .get_wallet_rpc (wallet_name ).getwalletinfo ()["format" ], "sqlite" )
67
67
68
+ def assert_is_bdb (self , wallet_name ):
69
+ with open (self .master_node .wallets_path / wallet_name / self .wallet_data_filename , "rb" ) as f :
70
+ data = f .read (16 )
71
+ _ , _ , magic = struct .unpack ("QII" , data )
72
+ assert_equal (magic , BTREE_MAGIC )
73
+
68
74
def create_legacy_wallet (self , wallet_name , ** kwargs ):
69
75
self .old_node .createwallet (wallet_name = wallet_name , descriptors = False , ** kwargs )
70
76
wallet = self .old_node .get_wallet_rpc (wallet_name )
@@ -916,10 +922,7 @@ def test_failed_migration_cleanup(self):
916
922
assert_equal (original_shasum , new_shasum )
917
923
918
924
# Check the wallet we tried to migrate is still BDB
919
- with open (self .master_node .wallets_path / "failed" / "wallet.dat" , "rb" ) as f :
920
- data = f .read (16 )
921
- _ , _ , magic = struct .unpack ("QII" , data )
922
- assert_equal (magic , BTREE_MAGIC )
925
+ self .assert_is_bdb ("failed" )
923
926
924
927
def test_blank (self ):
925
928
self .log .info ("Test that a blank wallet is migrated" )
@@ -1372,6 +1375,27 @@ def test_solvable_no_privs(self):
1372
1375
assert_equal (addr_info ["solvable" ], True )
1373
1376
assert "hex" in addr_info
1374
1377
1378
+ def test_loading_failure_after_migration (self ):
1379
+ self .log .info ("Test that a failed loading of the wallet at the end of migration restores the backup" )
1380
+ self .stop_node (self .old_node .index )
1381
+ self .old_node .chain = "signet"
1382
+ self .old_node .replace_in_config ([("regtest=" , "signet=" ), ("[regtest]" , "[signet]" )])
1383
+ # Disable network sync and prevent disk space warning on small (tmp)fs
1384
+ self .start_node (self .old_node .index , extra_args = self .old_node .extra_args + ["-maxconnections=0" , "-prune=550" ])
1385
+
1386
+ wallet_name = "failed_load_after_migrate"
1387
+ self .create_legacy_wallet (wallet_name )
1388
+ assert_raises_rpc_error (- 4 , "Wallet loading failed. Wallet files should not be reused across chains." , lambda : self .migrate_and_get_rpc (wallet_name ))
1389
+
1390
+ # Check the wallet we tried to migrate is still BDB
1391
+ self .assert_is_bdb (wallet_name )
1392
+
1393
+ self .stop_node (self .old_node .index )
1394
+ self .old_node .chain = "regtest"
1395
+ self .old_node .replace_in_config ([("signet=" , "regtest=" ), ("[signet]" , "[regtest]" )])
1396
+ self .start_node (self .old_node .index )
1397
+ self .connect_nodes (1 , 0 )
1398
+
1375
1399
def run_test (self ):
1376
1400
self .master_node = self .nodes [0 ]
1377
1401
self .old_node = self .nodes [1 ]
@@ -1404,6 +1428,7 @@ def run_test(self):
1404
1428
self .test_miniscript ()
1405
1429
self .test_taproot ()
1406
1430
self .test_solvable_no_privs ()
1431
+ self .test_loading_failure_after_migration ()
1407
1432
1408
1433
if __name__ == '__main__' :
1409
1434
WalletMigrationTest (__file__ ).main ()
0 commit comments