mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-07-01 11:11:15 +02:00
test: Adapt test framework for chains other than "regtest"
Co-Authored-By: Jorge Timón <jtimon@jtimon.cc>
This commit is contained in:
@ -18,10 +18,10 @@ class BlocksdirTest(BitcoinTestFramework):
|
|||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
self.stop_node(0)
|
self.stop_node(0)
|
||||||
assert os.path.isdir(os.path.join(self.nodes[0].datadir, "regtest", "blocks"))
|
assert os.path.isdir(os.path.join(self.nodes[0].datadir, self.chain, "blocks"))
|
||||||
assert not os.path.isdir(os.path.join(self.nodes[0].datadir, "blocks"))
|
assert not os.path.isdir(os.path.join(self.nodes[0].datadir, "blocks"))
|
||||||
shutil.rmtree(self.nodes[0].datadir)
|
shutil.rmtree(self.nodes[0].datadir)
|
||||||
initialize_datadir(self.options.tmpdir, 0)
|
initialize_datadir(self.options.tmpdir, 0, self.chain)
|
||||||
self.log.info("Starting with nonexistent blocksdir ...")
|
self.log.info("Starting with nonexistent blocksdir ...")
|
||||||
blocksdir_path = os.path.join(self.options.tmpdir, 'blocksdir')
|
blocksdir_path = os.path.join(self.options.tmpdir, 'blocksdir')
|
||||||
self.nodes[0].assert_start_raises_init_error(["-blocksdir=" + blocksdir_path], 'Error: Specified blocks directory "{}" does not exist.'.format(blocksdir_path))
|
self.nodes[0].assert_start_raises_init_error(["-blocksdir=" + blocksdir_path], 'Error: Specified blocks directory "{}" does not exist.'.format(blocksdir_path))
|
||||||
@ -30,8 +30,8 @@ class BlocksdirTest(BitcoinTestFramework):
|
|||||||
self.start_node(0, ["-blocksdir=" + blocksdir_path])
|
self.start_node(0, ["-blocksdir=" + blocksdir_path])
|
||||||
self.log.info("mining blocks..")
|
self.log.info("mining blocks..")
|
||||||
self.nodes[0].generatetoaddress(10, self.nodes[0].get_deterministic_priv_key().address)
|
self.nodes[0].generatetoaddress(10, self.nodes[0].get_deterministic_priv_key().address)
|
||||||
assert os.path.isfile(os.path.join(blocksdir_path, "regtest", "blocks", "blk00000.dat"))
|
assert os.path.isfile(os.path.join(blocksdir_path, self.chain, "blocks", "blk00000.dat"))
|
||||||
assert os.path.isdir(os.path.join(self.nodes[0].datadir, "regtest", "blocks", "index"))
|
assert os.path.isdir(os.path.join(self.nodes[0].datadir, self.chain, "blocks", "index"))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
@ -29,7 +29,7 @@ class TestBitcoinCli(BitcoinTestFramework):
|
|||||||
rpc_response = self.nodes[0].getblockchaininfo()
|
rpc_response = self.nodes[0].getblockchaininfo()
|
||||||
assert_equal(cli_response, rpc_response)
|
assert_equal(cli_response, rpc_response)
|
||||||
|
|
||||||
user, password = get_auth_cookie(self.nodes[0].datadir)
|
user, password = get_auth_cookie(self.nodes[0].datadir, self.chain)
|
||||||
|
|
||||||
self.log.info("Test -stdinrpcpass option")
|
self.log.info("Test -stdinrpcpass option")
|
||||||
assert_equal(0, self.nodes[0].cli('-rpcuser=%s' % user, '-stdinrpcpass', input=password).getblockcount())
|
assert_equal(0, self.nodes[0].cli('-rpcuser=%s' % user, '-stdinrpcpass', input=password).getblockcount())
|
||||||
|
@ -55,7 +55,7 @@ class RPCBindTest(BitcoinTestFramework):
|
|||||||
self.nodes[0].rpchost = None
|
self.nodes[0].rpchost = None
|
||||||
self.start_nodes([node_args])
|
self.start_nodes([node_args])
|
||||||
# connect to node through non-loopback interface
|
# connect to node through non-loopback interface
|
||||||
node = get_rpc_proxy(rpc_url(self.nodes[0].datadir, 0, "%s:%d" % (rpchost, rpcport)), 0, coveragedir=self.options.coveragedir)
|
node = get_rpc_proxy(rpc_url(self.nodes[0].datadir, 0, self.chain, "%s:%d" % (rpchost, rpcport)), 0, coveragedir=self.options.coveragedir)
|
||||||
node.getnetworkinfo()
|
node.getnetworkinfo()
|
||||||
self.stop_nodes()
|
self.stop_nodes()
|
||||||
|
|
||||||
|
@ -91,6 +91,7 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
|||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
"""Sets test framework defaults. Do not override this method. Instead, override the set_test_params() method"""
|
"""Sets test framework defaults. Do not override this method. Instead, override the set_test_params() method"""
|
||||||
|
self.chain = 'regtest'
|
||||||
self.setup_clean_chain = False
|
self.setup_clean_chain = False
|
||||||
self.nodes = []
|
self.nodes = []
|
||||||
self.network_thread = None
|
self.network_thread = None
|
||||||
@ -342,6 +343,7 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
|||||||
self.nodes.append(TestNode(
|
self.nodes.append(TestNode(
|
||||||
i,
|
i,
|
||||||
get_datadir_path(self.options.tmpdir, i),
|
get_datadir_path(self.options.tmpdir, i),
|
||||||
|
chain=self.chain,
|
||||||
rpchost=rpchost,
|
rpchost=rpchost,
|
||||||
timewait=self.rpc_timeout,
|
timewait=self.rpc_timeout,
|
||||||
bitcoind=binary[i],
|
bitcoind=binary[i],
|
||||||
@ -477,11 +479,12 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
|||||||
if not os.path.isdir(cache_node_dir):
|
if not os.path.isdir(cache_node_dir):
|
||||||
self.log.debug("Creating cache directory {}".format(cache_node_dir))
|
self.log.debug("Creating cache directory {}".format(cache_node_dir))
|
||||||
|
|
||||||
initialize_datadir(self.options.cachedir, CACHE_NODE_ID)
|
initialize_datadir(self.options.cachedir, CACHE_NODE_ID, self.chain)
|
||||||
self.nodes.append(
|
self.nodes.append(
|
||||||
TestNode(
|
TestNode(
|
||||||
CACHE_NODE_ID,
|
CACHE_NODE_ID,
|
||||||
cache_node_dir,
|
cache_node_dir,
|
||||||
|
chain=self.chain,
|
||||||
extra_conf=["bind=127.0.0.1"],
|
extra_conf=["bind=127.0.0.1"],
|
||||||
extra_args=['-disablewallet'],
|
extra_args=['-disablewallet'],
|
||||||
rpchost=None,
|
rpchost=None,
|
||||||
@ -515,7 +518,7 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
|||||||
self.nodes = []
|
self.nodes = []
|
||||||
|
|
||||||
def cache_path(*paths):
|
def cache_path(*paths):
|
||||||
return os.path.join(cache_node_dir, "regtest", *paths)
|
return os.path.join(cache_node_dir, self.chain, *paths)
|
||||||
|
|
||||||
os.rmdir(cache_path('wallets')) # Remove empty wallets dir
|
os.rmdir(cache_path('wallets')) # Remove empty wallets dir
|
||||||
for entry in os.listdir(cache_path()):
|
for entry in os.listdir(cache_path()):
|
||||||
@ -526,7 +529,7 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
|||||||
self.log.debug("Copy cache directory {} to node {}".format(cache_node_dir, i))
|
self.log.debug("Copy cache directory {} to node {}".format(cache_node_dir, i))
|
||||||
to_dir = get_datadir_path(self.options.tmpdir, i)
|
to_dir = get_datadir_path(self.options.tmpdir, i)
|
||||||
shutil.copytree(cache_node_dir, to_dir)
|
shutil.copytree(cache_node_dir, to_dir)
|
||||||
initialize_datadir(self.options.tmpdir, i) # Overwrite port/rpcport in bitcoin.conf
|
initialize_datadir(self.options.tmpdir, i, self.chain) # Overwrite port/rpcport in bitcoin.conf
|
||||||
|
|
||||||
def _initialize_chain_clean(self):
|
def _initialize_chain_clean(self):
|
||||||
"""Initialize empty blockchain for use by the test.
|
"""Initialize empty blockchain for use by the test.
|
||||||
@ -534,7 +537,7 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
|
|||||||
Create an empty blockchain and num_nodes wallets.
|
Create an empty blockchain and num_nodes wallets.
|
||||||
Useful if a test case wants complete control over initialization."""
|
Useful if a test case wants complete control over initialization."""
|
||||||
for i in range(self.num_nodes):
|
for i in range(self.num_nodes):
|
||||||
initialize_datadir(self.options.tmpdir, i)
|
initialize_datadir(self.options.tmpdir, i, self.chain)
|
||||||
|
|
||||||
def skip_if_no_py3_zmq(self):
|
def skip_if_no_py3_zmq(self):
|
||||||
"""Attempt to import the zmq package and skip the test if the import fails."""
|
"""Attempt to import the zmq package and skip the test if the import fails."""
|
||||||
|
@ -59,7 +59,7 @@ 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, datadir, *, rpchost, timewait, bitcoind, bitcoin_cli, coverage_dir, cwd, extra_conf=None, extra_args=None, use_cli=False, start_perf=False):
|
def __init__(self, i, datadir, *, chain, rpchost, timewait, bitcoind, bitcoin_cli, coverage_dir, cwd, extra_conf=None, extra_args=None, use_cli=False, start_perf=False):
|
||||||
"""
|
"""
|
||||||
Kwargs:
|
Kwargs:
|
||||||
start_perf (bool): If True, begin profiling the node with `perf` as soon as
|
start_perf (bool): If True, begin profiling the node with `perf` as soon as
|
||||||
@ -70,6 +70,7 @@ class TestNode():
|
|||||||
self.datadir = datadir
|
self.datadir = datadir
|
||||||
self.stdout_dir = os.path.join(self.datadir, "stdout")
|
self.stdout_dir = os.path.join(self.datadir, "stdout")
|
||||||
self.stderr_dir = os.path.join(self.datadir, "stderr")
|
self.stderr_dir = os.path.join(self.datadir, "stderr")
|
||||||
|
self.chain = chain
|
||||||
self.rpchost = rpchost
|
self.rpchost = rpchost
|
||||||
self.rpc_timeout = timewait
|
self.rpc_timeout = timewait
|
||||||
self.binary = bitcoind
|
self.binary = bitcoind
|
||||||
@ -197,7 +198,7 @@ class TestNode():
|
|||||||
# Delete any existing cookie file -- if such a file exists (eg due to
|
# Delete any existing cookie file -- if such a file exists (eg due to
|
||||||
# unclean shutdown), it will get overwritten anyway by bitcoind, and
|
# unclean shutdown), it will get overwritten anyway by bitcoind, and
|
||||||
# potentially interfere with our attempt to authenticate
|
# potentially interfere with our attempt to authenticate
|
||||||
delete_cookie_file(self.datadir)
|
delete_cookie_file(self.datadir, self.chain)
|
||||||
|
|
||||||
# add environment variable LIBC_FATAL_STDERR_=1 so that libc errors are written to stderr and not the terminal
|
# add environment variable LIBC_FATAL_STDERR_=1 so that libc errors are written to stderr and not the terminal
|
||||||
subp_env = dict(os.environ, LIBC_FATAL_STDERR_="1")
|
subp_env = dict(os.environ, LIBC_FATAL_STDERR_="1")
|
||||||
@ -219,7 +220,7 @@ class TestNode():
|
|||||||
raise FailedToStartError(self._node_msg(
|
raise FailedToStartError(self._node_msg(
|
||||||
'bitcoind exited with status {} during initialization'.format(self.process.returncode)))
|
'bitcoind exited with status {} during initialization'.format(self.process.returncode)))
|
||||||
try:
|
try:
|
||||||
rpc = get_rpc_proxy(rpc_url(self.datadir, self.index, self.rpchost), self.index, timeout=self.rpc_timeout, coveragedir=self.coverage_dir)
|
rpc = get_rpc_proxy(rpc_url(self.datadir, self.index, self.chain, self.rpchost), self.index, timeout=self.rpc_timeout, coveragedir=self.coverage_dir)
|
||||||
rpc.getblockcount()
|
rpc.getblockcount()
|
||||||
# If the call to getblockcount() succeeds then the RPC connection is up
|
# If the call to getblockcount() succeeds then the RPC connection is up
|
||||||
self.log.debug("RPC successfully started")
|
self.log.debug("RPC successfully started")
|
||||||
@ -306,7 +307,7 @@ class TestNode():
|
|||||||
|
|
||||||
@contextlib.contextmanager
|
@contextlib.contextmanager
|
||||||
def assert_debug_log(self, expected_msgs):
|
def assert_debug_log(self, expected_msgs):
|
||||||
debug_log = os.path.join(self.datadir, 'regtest', 'debug.log')
|
debug_log = os.path.join(self.datadir, self.chain, 'debug.log')
|
||||||
with open(debug_log, encoding='utf-8') as dl:
|
with open(debug_log, encoding='utf-8') as dl:
|
||||||
dl.seek(0, 2)
|
dl.seek(0, 2)
|
||||||
prev_size = dl.tell()
|
prev_size = dl.tell()
|
||||||
|
@ -271,8 +271,8 @@ def p2p_port(n):
|
|||||||
def rpc_port(n):
|
def rpc_port(n):
|
||||||
return PORT_MIN + PORT_RANGE + n + (MAX_NODES * PortSeed.n) % (PORT_RANGE - 1 - MAX_NODES)
|
return PORT_MIN + PORT_RANGE + n + (MAX_NODES * PortSeed.n) % (PORT_RANGE - 1 - MAX_NODES)
|
||||||
|
|
||||||
def rpc_url(datadir, i, rpchost=None):
|
def rpc_url(datadir, i, chain, rpchost):
|
||||||
rpc_u, rpc_p = get_auth_cookie(datadir)
|
rpc_u, rpc_p = get_auth_cookie(datadir, chain)
|
||||||
host = '127.0.0.1'
|
host = '127.0.0.1'
|
||||||
port = rpc_port(i)
|
port = rpc_port(i)
|
||||||
if rpchost:
|
if rpchost:
|
||||||
@ -286,13 +286,13 @@ def rpc_url(datadir, i, rpchost=None):
|
|||||||
# Node functions
|
# Node functions
|
||||||
################
|
################
|
||||||
|
|
||||||
def initialize_datadir(dirname, n):
|
def initialize_datadir(dirname, n, chain):
|
||||||
datadir = get_datadir_path(dirname, 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:
|
||||||
f.write("regtest=1\n")
|
f.write("{}=1\n".format(chain))
|
||||||
f.write("[regtest]\n")
|
f.write("[{}]\n".format(chain))
|
||||||
f.write("port=" + str(p2p_port(n)) + "\n")
|
f.write("port=" + str(p2p_port(n)) + "\n")
|
||||||
f.write("rpcport=" + str(rpc_port(n)) + "\n")
|
f.write("rpcport=" + str(rpc_port(n)) + "\n")
|
||||||
f.write("server=1\n")
|
f.write("server=1\n")
|
||||||
@ -312,7 +312,7 @@ def append_config(datadir, options):
|
|||||||
for option in options:
|
for option in options:
|
||||||
f.write(option + "\n")
|
f.write(option + "\n")
|
||||||
|
|
||||||
def get_auth_cookie(datadir):
|
def get_auth_cookie(datadir, chain):
|
||||||
user = None
|
user = None
|
||||||
password = None
|
password = None
|
||||||
if os.path.isfile(os.path.join(datadir, "bitcoin.conf")):
|
if os.path.isfile(os.path.join(datadir, "bitcoin.conf")):
|
||||||
@ -325,7 +325,7 @@ def get_auth_cookie(datadir):
|
|||||||
assert password is None # Ensure that there is only one rpcpassword line
|
assert password is None # Ensure that there is only one rpcpassword line
|
||||||
password = line.split("=")[1].strip("\n")
|
password = line.split("=")[1].strip("\n")
|
||||||
try:
|
try:
|
||||||
with open(os.path.join(datadir, "regtest", ".cookie"), 'r', encoding="ascii") as f:
|
with open(os.path.join(datadir, chain, ".cookie"), 'r', encoding="ascii") as f:
|
||||||
userpass = f.read()
|
userpass = f.read()
|
||||||
split_userpass = userpass.split(':')
|
split_userpass = userpass.split(':')
|
||||||
user = split_userpass[0]
|
user = split_userpass[0]
|
||||||
@ -337,10 +337,10 @@ def get_auth_cookie(datadir):
|
|||||||
return user, password
|
return user, password
|
||||||
|
|
||||||
# If a cookie file exists in the given datadir, delete it.
|
# If a cookie file exists in the given datadir, delete it.
|
||||||
def delete_cookie_file(datadir):
|
def delete_cookie_file(datadir, chain):
|
||||||
if os.path.isfile(os.path.join(datadir, "regtest", ".cookie")):
|
if os.path.isfile(os.path.join(datadir, chain, ".cookie")):
|
||||||
logger.debug("Deleting leftover cookie file")
|
logger.debug("Deleting leftover cookie file")
|
||||||
os.remove(os.path.join(datadir, "regtest", ".cookie"))
|
os.remove(os.path.join(datadir, chain, ".cookie"))
|
||||||
|
|
||||||
def get_bip9_status(node, key):
|
def get_bip9_status(node, key):
|
||||||
info = node.getblockchaininfo()
|
info = node.getblockchaininfo()
|
||||||
|
Reference in New Issue
Block a user