qa: Use node.datadir instead of tmpdir in test framework

This commit is contained in:
MarcoFalke 2018-01-02 08:57:27 -05:00
parent 93634f296e
commit c8330d4216
13 changed files with 74 additions and 71 deletions

View File

@ -241,7 +241,7 @@ class BIP9SoftForksTest(ComparisonTestFramework):
self.test.clear_all_connections() self.test.clear_all_connections()
self.stop_nodes() self.stop_nodes()
self.nodes = [] self.nodes = []
shutil.rmtree(self.options.tmpdir + "/node0") shutil.rmtree(get_datadir_path(self.options.tmpdir, 0))
self.setup_chain() self.setup_chain()
self.setup_network() self.setup_network()
self.test.add_all_connections(self.nodes) self.test.add_all_connections(self.nodes)

View File

@ -7,7 +7,7 @@
import os import os
from test_framework.test_framework import BitcoinTestFramework from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import get_datadir_path
class ConfArgsTest(BitcoinTestFramework): class ConfArgsTest(BitcoinTestFramework):
def set_test_params(self): def set_test_params(self):
@ -19,7 +19,7 @@ class ConfArgsTest(BitcoinTestFramework):
# Remove the -datadir argument so it doesn't override the config file # Remove the -datadir argument so it doesn't override the config file
self.nodes[0].args = [arg for arg in self.nodes[0].args if not arg.startswith("-datadir")] self.nodes[0].args = [arg for arg in self.nodes[0].args if not arg.startswith("-datadir")]
default_data_dir = get_datadir_path(self.options.tmpdir, 0) default_data_dir = self.nodes[0].datadir
new_data_dir = os.path.join(default_data_dir, 'newdatadir') new_data_dir = os.path.join(default_data_dir, 'newdatadir')
new_data_dir_2 = os.path.join(default_data_dir, 'newdatadir2') new_data_dir_2 = os.path.join(default_data_dir, 'newdatadir2')

View File

@ -44,7 +44,7 @@ class PruneTest(BitcoinTestFramework):
def setup_network(self): def setup_network(self):
self.setup_nodes() self.setup_nodes()
self.prunedir = self.options.tmpdir + "/node2/regtest/blocks/" self.prunedir = os.path.join(self.nodes[2].datadir, 'regtest', 'blocks', '')
connect_nodes(self.nodes[0], 1) connect_nodes(self.nodes[0], 1)
connect_nodes(self.nodes[1], 2) connect_nodes(self.nodes[1], 2)

View File

@ -93,8 +93,8 @@ class MempoolPersistTest(BitcoinTestFramework):
self.start_node(0) self.start_node(0)
wait_until(lambda: len(self.nodes[0].getrawmempool()) == 5) wait_until(lambda: len(self.nodes[0].getrawmempool()) == 5)
mempooldat0 = os.path.join(self.options.tmpdir, 'node0', 'regtest', 'mempool.dat') mempooldat0 = os.path.join(self.nodes[0].datadir, 'regtest', 'mempool.dat')
mempooldat1 = os.path.join(self.options.tmpdir, 'node1', 'regtest', 'mempool.dat') mempooldat1 = os.path.join(self.nodes[1].datadir, 'regtest', 'mempool.dat')
self.log.debug("Remove the mempool.dat file. Verify that savemempool to disk via RPC re-creates it") self.log.debug("Remove the mempool.dat file. Verify that savemempool to disk via RPC re-creates it")
os.remove(mempooldat0) os.remove(mempooldat0)
self.nodes[0].savemempool() self.nodes[0].savemempool()

View File

@ -48,7 +48,7 @@ class RPCBindTest(BitcoinTestFramework):
self.nodes[0].rpchost = None self.nodes[0].rpchost = None
self.start_nodes([base_args]) self.start_nodes([base_args])
# connect to node through non-loopback interface # connect to node through non-loopback interface
node = get_rpc_proxy(rpc_url(get_datadir_path(self.options.tmpdir, 0), 0, "%s:%d" % (rpchost, rpcport)), 0, coveragedir=self.options.coveragedir) node = get_rpc_proxy(rpc_url(self.nodes[0].datadir, 0, "%s:%d" % (rpchost, rpcport)), 0, coveragedir=self.options.coveragedir)
node.getnetworkinfo() node.getnetworkinfo()
self.stop_nodes() self.stop_nodes()

View File

@ -5,13 +5,18 @@
"""Test multiple RPC users.""" """Test multiple RPC users."""
from test_framework.test_framework import BitcoinTestFramework from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import str_to_b64str, assert_equal from test_framework.util import (
assert_equal,
get_datadir_path,
str_to_b64str,
)
import os import os
import http.client import http.client
import urllib.parse import urllib.parse
class HTTPBasicsTest (BitcoinTestFramework):
class HTTPBasicsTest(BitcoinTestFramework):
def set_test_params(self): def set_test_params(self):
self.num_nodes = 2 self.num_nodes = 2
@ -22,10 +27,10 @@ class HTTPBasicsTest (BitcoinTestFramework):
rpcauth2 = "rpcauth=rt2:f8607b1a88861fac29dfccf9b52ff9f$ff36a0c23c8c62b4846112e50fa888416e94c17bfd4c42f88fd8f55ec6a3137e" rpcauth2 = "rpcauth=rt2:f8607b1a88861fac29dfccf9b52ff9f$ff36a0c23c8c62b4846112e50fa888416e94c17bfd4c42f88fd8f55ec6a3137e"
rpcuser = "rpcuser=rpcuser💻" rpcuser = "rpcuser=rpcuser💻"
rpcpassword = "rpcpassword=rpcpassword🔑" rpcpassword = "rpcpassword=rpcpassword🔑"
with open(os.path.join(self.options.tmpdir+"/node0", "bitcoin.conf"), 'a', encoding='utf8') as f: with open(os.path.join(get_datadir_path(self.options.tmpdir, 0), "bitcoin.conf"), 'a', encoding='utf8') as f:
f.write(rpcauth+"\n") f.write(rpcauth+"\n")
f.write(rpcauth2+"\n") f.write(rpcauth2+"\n")
with open(os.path.join(self.options.tmpdir+"/node1", "bitcoin.conf"), 'a', encoding='utf8') as f: with open(os.path.join(get_datadir_path(self.options.tmpdir, 1), "bitcoin.conf"), 'a', encoding='utf8') as f:
f.write(rpcuser+"\n") f.write(rpcuser+"\n")
f.write(rpcpassword+"\n") f.write(rpcpassword+"\n")
@ -54,7 +59,7 @@ class HTTPBasicsTest (BitcoinTestFramework):
resp = conn.getresponse() resp = conn.getresponse()
assert_equal(resp.status, 200) assert_equal(resp.status, 200)
conn.close() conn.close()
#Use new authpair to confirm both work #Use new authpair to confirm both work
headers = {"Authorization": "Basic " + str_to_b64str(authpairnew)} headers = {"Authorization": "Basic " + str_to_b64str(authpairnew)}

View File

@ -228,7 +228,7 @@ class BitcoinTestFramework():
assert_equal(len(extra_args), num_nodes) assert_equal(len(extra_args), num_nodes)
assert_equal(len(binary), num_nodes) assert_equal(len(binary), num_nodes)
for i in range(num_nodes): for i in range(num_nodes):
self.nodes.append(TestNode(i, self.options.tmpdir, rpchost=rpchost, timewait=timewait, binary=binary[i], stderr=None, mocktime=self.mocktime, coverage_dir=self.options.coveragedir, extra_conf=extra_confs[i], extra_args=extra_args[i], use_cli=self.options.usecli)) self.nodes.append(TestNode(i, get_datadir_path(self.options.tmpdir, i), rpchost=rpchost, timewait=timewait, binary=binary[i], stderr=None, mocktime=self.mocktime, coverage_dir=self.options.coveragedir, extra_conf=extra_confs[i], extra_args=extra_args[i], use_cli=self.options.usecli))
def start_node(self, i, *args, **kwargs): def start_node(self, i, *args, **kwargs):
"""Start a bitcoind""" """Start a bitcoind"""
@ -400,7 +400,7 @@ class BitcoinTestFramework():
args = [os.getenv("BITCOIND", "bitcoind"), "-datadir=" + datadir] args = [os.getenv("BITCOIND", "bitcoind"), "-datadir=" + datadir]
if i > 0: if i > 0:
args.append("-connect=127.0.0.1:" + str(p2p_port(0))) args.append("-connect=127.0.0.1:" + str(p2p_port(0)))
self.nodes.append(TestNode(i, self.options.cachedir, extra_conf=["bind=127.0.0.1"], extra_args=[],rpchost=None, timewait=None, binary=None, stderr=None, mocktime=self.mocktime, coverage_dir=None)) self.nodes.append(TestNode(i, get_datadir_path(self.options.cachedir, i), extra_conf=["bind=127.0.0.1"], extra_args=[],rpchost=None, timewait=None, binary=None, stderr=None, mocktime=self.mocktime, coverage_dir=None))
self.nodes[i].args = args self.nodes[i].args = args
self.start_node(i) self.start_node(i)

View File

@ -43,9 +43,9 @@ class TestNode():
To make things easier for the test writer, any unrecognised messages will To make things easier for the test writer, any unrecognised messages will
be dispatched to the RPC connection.""" be dispatched to the RPC connection."""
def __init__(self, i, dirname, rpchost, timewait, binary, stderr, mocktime, coverage_dir, extra_conf=None, extra_args=None, use_cli=False): def __init__(self, i, datadir, rpchost, timewait, binary, stderr, mocktime, coverage_dir, extra_conf=None, extra_args=None, use_cli=False):
self.index = i self.index = i
self.datadir = os.path.join(dirname, "node" + str(i)) self.datadir = datadir
self.rpchost = rpchost self.rpchost = rpchost
if timewait: if timewait:
self.rpc_timeout = timewait self.rpc_timeout = timewait
@ -59,7 +59,7 @@ class TestNode():
self.stderr = stderr self.stderr = stderr
self.coverage_dir = coverage_dir self.coverage_dir = coverage_dir
if extra_conf != None: if extra_conf != None:
append_config(dirname, i, extra_conf) append_config(datadir, extra_conf)
# Most callers will just need to add extra args to the standard list below. # Most callers will just need to add extra args to the standard list below.
# For those callers that need more flexibity, they can just set the args property directly. # For those callers that need more flexibity, they can just set the args property directly.
# Note that common args are set in the config file (see initialize_datadir) # Note that common args are set in the config file (see initialize_datadir)

View File

@ -284,7 +284,7 @@ def rpc_url(datadir, i, rpchost=None):
################ ################
def initialize_datadir(dirname, n): def initialize_datadir(dirname, n):
datadir = os.path.join(dirname, "node" + str(n)) datadir = get_datadir_path(dirname, n)
if not os.path.isdir(datadir): if not os.path.isdir(datadir):
os.makedirs(datadir) os.makedirs(datadir)
with open(os.path.join(datadir, "bitcoin.conf"), 'w', encoding='utf8') as f: with open(os.path.join(datadir, "bitcoin.conf"), 'w', encoding='utf8') as f:
@ -300,8 +300,7 @@ def initialize_datadir(dirname, n):
def get_datadir_path(dirname, n): def get_datadir_path(dirname, n):
return os.path.join(dirname, "node" + str(n)) return os.path.join(dirname, "node" + str(n))
def append_config(dirname, n, options): def append_config(datadir, options):
datadir = get_datadir_path(dirname, n)
with open(os.path.join(datadir, "bitcoin.conf"), 'a', encoding='utf8') as f: with open(os.path.join(datadir, "bitcoin.conf"), 'a', encoding='utf8') as f:
for option in options: for option in options:
f.write(option + "\n") f.write(option + "\n")

View File

@ -90,9 +90,9 @@ class WalletBackupTest(BitcoinTestFramework):
self.stop_node(2) self.stop_node(2)
def erase_three(self): def erase_three(self):
os.remove(self.options.tmpdir + "/node0/regtest/wallets/wallet.dat") os.remove(os.path.join(self.nodes[0].datadir, 'regtest', 'wallets', 'wallet.dat'))
os.remove(self.options.tmpdir + "/node1/regtest/wallets/wallet.dat") os.remove(os.path.join(self.nodes[1].datadir, 'regtest', 'wallets', 'wallet.dat'))
os.remove(self.options.tmpdir + "/node2/regtest/wallets/wallet.dat") os.remove(os.path.join(self.nodes[2].datadir, 'regtest', 'wallets', 'wallet.dat'))
def run_test(self): def run_test(self):
self.log.info("Generating initial blockchain") self.log.info("Generating initial blockchain")
@ -116,13 +116,13 @@ class WalletBackupTest(BitcoinTestFramework):
self.do_one_round() self.do_one_round()
self.log.info("Backing up") self.log.info("Backing up")
tmpdir = self.options.tmpdir
self.nodes[0].backupwallet(tmpdir + "/node0/wallet.bak") self.nodes[0].backupwallet(os.path.join(self.nodes[0].datadir, 'wallet.bak'))
self.nodes[0].dumpwallet(tmpdir + "/node0/wallet.dump") self.nodes[0].dumpwallet(os.path.join(self.nodes[0].datadir, 'wallet.dump'))
self.nodes[1].backupwallet(tmpdir + "/node1/wallet.bak") self.nodes[1].backupwallet(os.path.join(self.nodes[1].datadir, 'wallet.bak'))
self.nodes[1].dumpwallet(tmpdir + "/node1/wallet.dump") self.nodes[1].dumpwallet(os.path.join(self.nodes[1].datadir, 'wallet.dump'))
self.nodes[2].backupwallet(tmpdir + "/node2/wallet.bak") self.nodes[2].backupwallet(os.path.join(self.nodes[2].datadir, 'wallet.bak'))
self.nodes[2].dumpwallet(tmpdir + "/node2/wallet.dump") self.nodes[2].dumpwallet(os.path.join(self.nodes[2].datadir, 'wallet.dump'))
self.log.info("More transactions") self.log.info("More transactions")
for i in range(5): for i in range(5):
@ -150,13 +150,13 @@ class WalletBackupTest(BitcoinTestFramework):
self.erase_three() self.erase_three()
# Start node2 with no chain # Start node2 with no chain
shutil.rmtree(self.options.tmpdir + "/node2/regtest/blocks") shutil.rmtree(os.path.join(self.nodes[2].datadir, 'regtest', 'blocks'))
shutil.rmtree(self.options.tmpdir + "/node2/regtest/chainstate") shutil.rmtree(os.path.join(self.nodes[2].datadir, 'regtest', 'chainstate'))
# Restore wallets from backup # Restore wallets from backup
shutil.copyfile(tmpdir + "/node0/wallet.bak", tmpdir + "/node0/regtest/wallets/wallet.dat") shutil.copyfile(os.path.join(self.nodes[0].datadir, 'wallet.bak'), os.path.join(self.nodes[0].datadir, 'regtest', 'wallets', 'wallet.dat'))
shutil.copyfile(tmpdir + "/node1/wallet.bak", tmpdir + "/node1/regtest/wallets/wallet.dat") shutil.copyfile(os.path.join(self.nodes[1].datadir, 'wallet.bak'), os.path.join(self.nodes[1].datadir, 'regtest', 'wallets', 'wallet.dat'))
shutil.copyfile(tmpdir + "/node2/wallet.bak", tmpdir + "/node2/regtest/wallets/wallet.dat") shutil.copyfile(os.path.join(self.nodes[2].datadir, 'wallet.bak'), os.path.join(self.nodes[2].datadir, 'regtest', 'wallets', 'wallet.dat'))
self.log.info("Re-starting nodes") self.log.info("Re-starting nodes")
self.start_three() self.start_three()
@ -171,8 +171,8 @@ class WalletBackupTest(BitcoinTestFramework):
self.erase_three() self.erase_three()
#start node2 with no chain #start node2 with no chain
shutil.rmtree(self.options.tmpdir + "/node2/regtest/blocks") shutil.rmtree(os.path.join(self.nodes[2].datadir, 'regtest', 'blocks'))
shutil.rmtree(self.options.tmpdir + "/node2/regtest/chainstate") shutil.rmtree(os.path.join(self.nodes[2].datadir, 'regtest', 'chainstate'))
self.start_three() self.start_three()
@ -180,9 +180,9 @@ class WalletBackupTest(BitcoinTestFramework):
assert_equal(self.nodes[1].getbalance(), 0) assert_equal(self.nodes[1].getbalance(), 0)
assert_equal(self.nodes[2].getbalance(), 0) assert_equal(self.nodes[2].getbalance(), 0)
self.nodes[0].importwallet(tmpdir + "/node0/wallet.dump") self.nodes[0].importwallet(os.path.join(self.nodes[0].datadir, 'wallet.dump'))
self.nodes[1].importwallet(tmpdir + "/node1/wallet.dump") self.nodes[1].importwallet(os.path.join(self.nodes[1].datadir, 'wallet.dump'))
self.nodes[2].importwallet(tmpdir + "/node2/wallet.dump") self.nodes[2].importwallet(os.path.join(self.nodes[2].datadir, 'wallet.dump'))
sync_blocks(self.nodes) sync_blocks(self.nodes)
@ -192,10 +192,10 @@ class WalletBackupTest(BitcoinTestFramework):
# Backup to source wallet file must fail # Backup to source wallet file must fail
sourcePaths = [ sourcePaths = [
tmpdir + "/node0/regtest/wallets/wallet.dat", os.path.join(self.nodes[0].datadir, 'regtest', 'wallets', 'wallet.dat'),
tmpdir + "/node0/./regtest/wallets/wallet.dat", os.path.join(self.nodes[0].datadir, 'regtest', '.', 'wallets', 'wallet.dat'),
tmpdir + "/node0/regtest/wallets/", os.path.join(self.nodes[0].datadir, 'regtest', 'wallets', ''),
tmpdir + "/node0/regtest/wallets"] os.path.join(self.nodes[0].datadir, 'regtest', 'wallets')]
for sourcePath in sourcePaths: for sourcePath in sourcePaths:
assert_raises_rpc_error(-4, "backup failed", self.nodes[0].backupwallet, sourcePath) assert_raises_rpc_error(-4, "backup failed", self.nodes[0].backupwallet, sourcePath)

View File

@ -4,13 +4,15 @@
# file COPYING or http://www.opensource.org/licenses/mit-license.php. # file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""Test Hierarchical Deterministic wallet function.""" """Test Hierarchical Deterministic wallet function."""
import os
import shutil
from test_framework.test_framework import BitcoinTestFramework from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import ( from test_framework.util import (
assert_equal, assert_equal,
connect_nodes_bi, connect_nodes_bi,
) )
import shutil
import os
class WalletHDTest(BitcoinTestFramework): class WalletHDTest(BitcoinTestFramework):
def set_test_params(self): def set_test_params(self):
@ -18,9 +20,7 @@ class WalletHDTest(BitcoinTestFramework):
self.num_nodes = 2 self.num_nodes = 2
self.extra_args = [[], ['-keypool=0']] self.extra_args = [[], ['-keypool=0']]
def run_test (self): def run_test(self):
tmpdir = self.options.tmpdir
# Make sure can't switch off usehd after wallet creation # Make sure can't switch off usehd after wallet creation
self.stop_node(1) self.stop_node(1)
self.assert_start_raises_init_error(1, ['-usehd=0'], 'already existing HD wallet') self.assert_start_raises_init_error(1, ['-usehd=0'], 'already existing HD wallet')
@ -41,8 +41,8 @@ class WalletHDTest(BitcoinTestFramework):
self.nodes[1].importprivkey(self.nodes[0].dumpprivkey(non_hd_add)) self.nodes[1].importprivkey(self.nodes[0].dumpprivkey(non_hd_add))
# This should be enough to keep the master key and the non-HD key # This should be enough to keep the master key and the non-HD key
self.nodes[1].backupwallet(tmpdir + "/hd.bak") self.nodes[1].backupwallet(os.path.join(self.nodes[1].datadir, "hd.bak"))
#self.nodes[1].dumpwallet(tmpdir + "/hd.dump") #self.nodes[1].dumpwallet(os.path.join(self.nodes[1].datadir, "hd.dump"))
# Derive some HD addresses and remember the last # Derive some HD addresses and remember the last
# Also send funds to each add # Also send funds to each add
@ -71,9 +71,9 @@ class WalletHDTest(BitcoinTestFramework):
self.stop_node(1) self.stop_node(1)
# we need to delete the complete regtest directory # we need to delete the complete regtest directory
# otherwise node1 would auto-recover all funds in flag the keypool keys as used # otherwise node1 would auto-recover all funds in flag the keypool keys as used
shutil.rmtree(os.path.join(tmpdir, "node1/regtest/blocks")) shutil.rmtree(os.path.join(self.nodes[1].datadir, "regtest", "blocks"))
shutil.rmtree(os.path.join(tmpdir, "node1/regtest/chainstate")) shutil.rmtree(os.path.join(self.nodes[1].datadir, "regtest", "chainstate"))
shutil.copyfile(os.path.join(tmpdir, "hd.bak"), os.path.join(tmpdir, "node1/regtest/wallets/wallet.dat")) shutil.copyfile(os.path.join(self.nodes[1].datadir, "hd.bak"), os.path.join(self.nodes[1].datadir, "regtest", "wallets", "wallet.dat"))
self.start_node(1) self.start_node(1)
# Assert that derivation is deterministic # Assert that derivation is deterministic
@ -94,9 +94,9 @@ class WalletHDTest(BitcoinTestFramework):
# Try a RPC based rescan # Try a RPC based rescan
self.stop_node(1) self.stop_node(1)
shutil.rmtree(os.path.join(tmpdir, "node1/regtest/blocks")) shutil.rmtree(os.path.join(self.nodes[1].datadir, "regtest", "blocks"))
shutil.rmtree(os.path.join(tmpdir, "node1/regtest/chainstate")) shutil.rmtree(os.path.join(self.nodes[1].datadir, "regtest", "chainstate"))
shutil.copyfile(os.path.join(tmpdir, "hd.bak"), os.path.join(tmpdir, "node1/regtest/wallet.dat")) shutil.copyfile(os.path.join(self.nodes[1].datadir, "hd.bak"), os.path.join(self.nodes[1].datadir, "regtest", "wallets", "wallet.dat"))
self.start_node(1, extra_args=self.extra_args[1]) self.start_node(1, extra_args=self.extra_args[1])
connect_nodes_bi(self.nodes, 0, 1) connect_nodes_bi(self.nodes, 0, 1)
self.sync_all() self.sync_all()

View File

@ -10,6 +10,7 @@ Two nodes. Node1 is under test. Node0 is providing transactions and generating b
- Generate 110 keys (enough to drain the keypool). Store key 90 (in the initial keypool) and key 110 (beyond the initial keypool). Send funds to key 90 and key 110. - Generate 110 keys (enough to drain the keypool). Store key 90 (in the initial keypool) and key 110 (beyond the initial keypool). Send funds to key 90 and key 110.
- Stop node1, clear the datadir, move wallet file back into the datadir and restart node1. - Stop node1, clear the datadir, move wallet file back into the datadir and restart node1.
- connect node1 to node0. Verify that they sync and node1 receives its funds.""" - connect node1 to node0. Verify that they sync and node1 receives its funds."""
import os
import shutil import shutil
from test_framework.test_framework import BitcoinTestFramework from test_framework.test_framework import BitcoinTestFramework
@ -19,6 +20,7 @@ from test_framework.util import (
sync_blocks, sync_blocks,
) )
class KeypoolRestoreTest(BitcoinTestFramework): class KeypoolRestoreTest(BitcoinTestFramework):
def set_test_params(self): def set_test_params(self):
self.setup_clean_chain = True self.setup_clean_chain = True
@ -26,26 +28,23 @@ class KeypoolRestoreTest(BitcoinTestFramework):
self.extra_args = [[], ['-keypool=100', '-keypoolmin=20']] self.extra_args = [[], ['-keypool=100', '-keypoolmin=20']]
def run_test(self): def run_test(self):
self.tmpdir = self.options.tmpdir wallet_path = os.path.join(self.nodes[1].datadir, "regtest", "wallets", "wallet.dat")
wallet_backup_path = os.path.join(self.nodes[1].datadir, "wallet.bak")
self.nodes[0].generate(101) self.nodes[0].generate(101)
self.log.info("Make backup of wallet") self.log.info("Make backup of wallet")
self.stop_node(1) self.stop_node(1)
shutil.copyfile(wallet_path, wallet_backup_path)
shutil.copyfile(self.tmpdir + "/node1/regtest/wallets/wallet.dat", self.tmpdir + "/wallet.bak")
self.start_node(1, self.extra_args[1]) self.start_node(1, self.extra_args[1])
connect_nodes_bi(self.nodes, 0, 1) connect_nodes_bi(self.nodes, 0, 1)
self.log.info("Generate keys for wallet") self.log.info("Generate keys for wallet")
for _ in range(90): for _ in range(90):
addr_oldpool = self.nodes[1].getnewaddress() addr_oldpool = self.nodes[1].getnewaddress()
for _ in range(20): for _ in range(20):
addr_extpool = self.nodes[1].getnewaddress() addr_extpool = self.nodes[1].getnewaddress()
self.log.info("Send funds to wallet") self.log.info("Send funds to wallet")
self.nodes[0].sendtoaddress(addr_oldpool, 10) self.nodes[0].sendtoaddress(addr_oldpool, 10)
self.nodes[0].generate(1) self.nodes[0].generate(1)
self.nodes[0].sendtoaddress(addr_extpool, 5) self.nodes[0].sendtoaddress(addr_extpool, 5)
@ -53,22 +52,18 @@ class KeypoolRestoreTest(BitcoinTestFramework):
sync_blocks(self.nodes) sync_blocks(self.nodes)
self.log.info("Restart node with wallet backup") self.log.info("Restart node with wallet backup")
self.stop_node(1) self.stop_node(1)
shutil.copyfile(wallet_backup_path, wallet_path)
shutil.copyfile(self.tmpdir + "/wallet.bak", self.tmpdir + "/node1/regtest/wallets/wallet.dat")
self.log.info("Verify keypool is restored and balance is correct")
self.start_node(1, self.extra_args[1]) self.start_node(1, self.extra_args[1])
connect_nodes_bi(self.nodes, 0, 1) connect_nodes_bi(self.nodes, 0, 1)
self.sync_all() self.sync_all()
self.log.info("Verify keypool is restored and balance is correct")
assert_equal(self.nodes[1].getbalance(), 15) assert_equal(self.nodes[1].getbalance(), 15)
assert_equal(self.nodes[1].listtransactions()[0]['category'], "receive") assert_equal(self.nodes[1].listtransactions()[0]['category'], "receive")
# Check that we have marked all keys up to the used keypool key as used # Check that we have marked all keys up to the used keypool key as used
assert_equal(self.nodes[1].getaddressinfo(self.nodes[1].getnewaddress())['hdkeypath'], "m/0'/0'/110'") assert_equal(self.nodes[1].getaddressinfo(self.nodes[1].getnewaddress())['hdkeypath'], "m/0'/0'/110'")
if __name__ == '__main__': if __name__ == '__main__':
KeypoolRestoreTest().main() KeypoolRestoreTest().main()

View File

@ -10,7 +10,11 @@ import os
import shutil import shutil
from test_framework.test_framework import BitcoinTestFramework from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import assert_equal, assert_raises_rpc_error from test_framework.util import (
assert_equal,
assert_raises_rpc_error,
)
class MultiWalletTest(BitcoinTestFramework): class MultiWalletTest(BitcoinTestFramework):
def set_test_params(self): def set_test_params(self):