Changeset View
Changeset View
Standalone View
Standalone View
qa/rpc-tests/test_framework/util.py
Show All 16 Lines | |||||
import json | import json | ||||
import http.client | import http.client | ||||
import random | import random | ||||
import shutil | import shutil | ||||
import subprocess | import subprocess | ||||
import time | import time | ||||
import re | import re | ||||
import errno | import errno | ||||
import logging | |||||
from . import coverage | from . import coverage | ||||
from .authproxy import AuthServiceProxy, JSONRPCException | from .authproxy import AuthServiceProxy, JSONRPCException | ||||
from .outputchecker import OutputChecker | from .outputchecker import OutputChecker | ||||
DEFAULT_BITCOIND = 'bitcoind' | DEFAULT_BITCOIND = 'bitcoind' | ||||
COVERAGE_DIR = None | COVERAGE_DIR = None | ||||
logger = logging.getLogger("TestFramework.utils") | |||||
# The maximum number of nodes a single test can spawn | # The maximum number of nodes a single test can spawn | ||||
MAX_NODES = 8 | MAX_NODES = 8 | ||||
# Don't assign rpc or p2p ports lower than this | # Don't assign rpc or p2p ports lower than this | ||||
PORT_MIN = 11000 | PORT_MIN = 11000 | ||||
# The number of ports to "reserve" for p2p and rpc, each | # The number of ports to "reserve" for p2p and rpc, each | ||||
PORT_RANGE = 5000 | PORT_RANGE = 5000 | ||||
BITCOIND_PROC_WAIT_TIMEOUT = 60 | BITCOIND_PROC_WAIT_TIMEOUT = 60 | ||||
▲ Show 20 Lines • Show All 215 Lines • ▼ Show 20 Lines | def initialize_chain(test_dir, num_nodes, cachedir): | ||||
assert num_nodes <= MAX_NODES | assert num_nodes <= MAX_NODES | ||||
create_cache = False | create_cache = False | ||||
for i in range(MAX_NODES): | for i in range(MAX_NODES): | ||||
if not os.path.isdir(os.path.join(cachedir, 'node' + str(i))): | if not os.path.isdir(os.path.join(cachedir, 'node' + str(i))): | ||||
create_cache = True | create_cache = True | ||||
break | break | ||||
if create_cache: | if create_cache: | ||||
logger.debug("Creating data directories from cached datadir") | |||||
# Find and delete old cache directories if any exist | # Find and delete old cache directories if any exist | ||||
for i in range(MAX_NODES): | for i in range(MAX_NODES): | ||||
if os.path.isdir(os.path.join(cachedir, "node" + str(i))): | if os.path.isdir(os.path.join(cachedir, "node" + str(i))): | ||||
shutil.rmtree(os.path.join(cachedir, "node" + str(i))) | shutil.rmtree(os.path.join(cachedir, "node" + str(i))) | ||||
# Create cache directories, run bitcoinds: | # Create cache directories, run bitcoinds: | ||||
for i in range(MAX_NODES): | for i in range(MAX_NODES): | ||||
datadir = initialize_datadir(cachedir, i) | datadir = initialize_datadir(cachedir, i) | ||||
args = [os.getenv("BITCOIND", "bitcoind"), "-server", | args = [os.getenv("BITCOIND", "bitcoind"), "-server", | ||||
"-keypool=1", "-datadir=" + datadir, "-discover=0"] | "-keypool=1", "-datadir=" + datadir, "-discover=0"] | ||||
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))) | ||||
bitcoind_processes[i] = subprocess.Popen(args) | bitcoind_processes[i] = subprocess.Popen(args) | ||||
if os.getenv("PYTHON_DEBUG", ""): | logger.debug("Creating data directories from cached datadir") | ||||
print( | |||||
"initialize_chain: bitcoind started, waiting for RPC to come up") | |||||
wait_for_bitcoind_start(bitcoind_processes[i], rpc_url(i), i) | wait_for_bitcoind_start(bitcoind_processes[i], rpc_url(i), i) | ||||
if os.getenv("PYTHON_DEBUG", ""): | logger.debug("initialize_chain: RPC successfully started") | ||||
print("initialize_chain: RPC successfully started") | |||||
rpcs = [] | rpcs = [] | ||||
for i in range(MAX_NODES): | for i in range(MAX_NODES): | ||||
try: | try: | ||||
rpcs.append(get_rpc_proxy(rpc_url(i), i)) | rpcs.append(get_rpc_proxy(rpc_url(i), i)) | ||||
except: | except: | ||||
sys.stderr.write("Error connecting to " + url + "\n") | sys.stderr.write("Error connecting to " + url + "\n") | ||||
sys.exit(1) | sys.exit(1) | ||||
▲ Show 20 Lines • Show All 93 Lines • ▼ Show 20 Lines | def start_node(i, dirname, extra_args=None, rpchost=None, timewait=None, binary=None, stderr_checker=None): | ||||
Start a bitcoind and return RPC connection to it. | Start a bitcoind and return RPC connection to it. | ||||
If stderr_checker is provided, it must be an OutputChecker. | If stderr_checker is provided, it must be an OutputChecker. | ||||
Its output_file_obj will be connected to the stderr of the bitcoind process. | Its output_file_obj will be connected to the stderr of the bitcoind process. | ||||
""" | """ | ||||
datadir = os.path.join(dirname, "node" + str(i)) | datadir = os.path.join(dirname, "node" + str(i)) | ||||
if binary is None: | if binary is None: | ||||
binary = locate_bitcoind_binary() | binary = locate_bitcoind_binary() | ||||
args = [binary, "-datadir=" + datadir, "-server", "-keypool=1", | args = [binary, "-datadir=" + datadir, "-server", "-keypool=1", | ||||
"-discover=0", "-rest", "-mocktime=" + str(get_mocktime())] | "-discover=0", "-rest", "-logtimemicros", "-debug", "-mocktime=" + str(get_mocktime())] | ||||
if extra_args is not None: | if extra_args is not None: | ||||
args.extend(extra_args) | args.extend(extra_args) | ||||
if stderr_checker: | if stderr_checker: | ||||
assert(isinstance(stderr_checker, OutputChecker)) | assert(isinstance(stderr_checker, OutputChecker)) | ||||
bitcoind_processes[i] = subprocess.Popen(args, | bitcoind_processes[i] = subprocess.Popen(args, | ||||
universal_newlines=True, | universal_newlines=True, | ||||
stderr=stderr_checker.get_connector()) | stderr=stderr_checker.get_connector()) | ||||
else: | else: | ||||
bitcoind_processes[i] = subprocess.Popen(args) | bitcoind_processes[i] = subprocess.Popen(args) | ||||
if os.getenv("PYTHON_DEBUG", ""): | logger.debug( | ||||
print("start_node: bitcoind started, waiting for RPC to come up") | "initialize_chain: bitcoind started, waiting for RPC to come up") | ||||
url = rpc_url(i, rpchost) | url = rpc_url(i, rpchost) | ||||
wait_for_bitcoind_start(bitcoind_processes[i], url, i) | wait_for_bitcoind_start(bitcoind_processes[i], url, i) | ||||
if os.getenv("PYTHON_DEBUG", ""): | logger.debug("initialize_chain: RPC successfully started") | ||||
print("start_node: RPC successfully started") | |||||
proxy = get_rpc_proxy(url, i, timeout=timewait) | proxy = get_rpc_proxy(url, i, timeout=timewait) | ||||
if COVERAGE_DIR: | if COVERAGE_DIR: | ||||
coverage.write_all_rpc_commands(COVERAGE_DIR, proxy) | coverage.write_all_rpc_commands(COVERAGE_DIR, proxy) | ||||
return proxy | return proxy | ||||
Show All 23 Lines | def start_nodes(num_nodes, dirname, extra_args=None, rpchost=None, timewait=None, binary=None, stderr_checkers=None): | ||||
return rpcs | return rpcs | ||||
def log_filename(dirname, n_node, logname): | def log_filename(dirname, n_node, logname): | ||||
return os.path.join(dirname, "node" + str(n_node), "regtest", logname) | return os.path.join(dirname, "node" + str(n_node), "regtest", logname) | ||||
def stop_node(node, i): | def stop_node(node, i): | ||||
logger.debug("Stopping node %d" % i) | |||||
try: | try: | ||||
node.stop() | node.stop() | ||||
except http.client.CannotSendRequest as e: | except http.client.CannotSendRequest as e: | ||||
print("WARN: Unable to stop node: " + repr(e)) | logger.exception("Unable to stop node") | ||||
return_code = bitcoind_processes[i].wait( | return_code = bitcoind_processes[i].wait( | ||||
timeout=BITCOIND_PROC_WAIT_TIMEOUT) | timeout=BITCOIND_PROC_WAIT_TIMEOUT) | ||||
assert_equal(return_code, 0) | assert_equal(return_code, 0) | ||||
del bitcoind_processes[i] | del bitcoind_processes[i] | ||||
def stop_nodes(nodes): | def stop_nodes(nodes): | ||||
for i, node in enumerate(nodes): | for i, node in enumerate(nodes): | ||||
▲ Show 20 Lines • Show All 418 Lines • Show Last 20 Lines |