[tests] add TestNodeCLI class for calling bitcoin-cli for a node

This commit is contained in:
John Newbery 2017-07-11 13:01:44 -04:00
parent 85aec87b11
commit b23549f6e6
2 changed files with 30 additions and 0 deletions

View File

@ -4,8 +4,10 @@
# file COPYING or http://www.opensource.org/licenses/mit-license.php. # file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""Class for bitcoind node under test""" """Class for bitcoind node under test"""
import decimal
import errno import errno
import http.client import http.client
import json
import logging import logging
import os import os
import subprocess import subprocess
@ -45,6 +47,8 @@ class TestNode():
self.extra_args = extra_args self.extra_args = extra_args
self.args = [self.binary, "-datadir=" + self.datadir, "-server", "-keypool=1", "-discover=0", "-rest", "-logtimemicros", "-debug", "-debugexclude=libevent", "-debugexclude=leveldb", "-mocktime=" + str(mocktime), "-uacomment=testnode%d" % i] self.args = [self.binary, "-datadir=" + self.datadir, "-server", "-keypool=1", "-discover=0", "-rest", "-logtimemicros", "-debug", "-debugexclude=libevent", "-debugexclude=leveldb", "-mocktime=" + str(mocktime), "-uacomment=testnode%d" % i]
self.cli = TestNodeCLI(os.getenv("BITCOINCLI", "bitcoin-cli"), self.datadir)
self.running = False self.running = False
self.process = None self.process = None
self.rpc_connected = False self.rpc_connected = False
@ -132,3 +136,28 @@ class TestNode():
time.sleep(0.1) time.sleep(0.1)
self.rpc = None self.rpc = None
self.rpc_connected = False self.rpc_connected = False
class TestNodeCLI():
"""Interface to bitcoin-cli for an individual node"""
def __init__(self, binary, datadir):
self.binary = binary
self.datadir = datadir
def __getattr__(self, command):
def dispatcher(*args, **kwargs):
return self.send_cli(command, *args, **kwargs)
return dispatcher
def send_cli(self, command, *args, **kwargs):
"""Run bitcoin-cli command. Deserializes returned string as python object."""
pos_args = [str(arg) for arg in args]
named_args = [str(key) + "=" + str(value) for (key, value) in kwargs.items()]
assert not (pos_args and named_args), "Cannot use positional arguments and named arguments in the same bitcoin-cli call"
p_args = [self.binary, "-datadir=" + self.datadir]
if named_args:
p_args += ["-named"]
p_args += [command] + pos_args + named_args
cli_output = subprocess.check_output(p_args, universal_newlines=True)
return json.loads(cli_output, parse_float=decimal.Decimal)

View File

@ -279,6 +279,7 @@ def run_tests(test_list, src_dir, build_dir, exeext, tmpdir, jobs=1, enable_cove
#Set env vars #Set env vars
if "BITCOIND" not in os.environ: if "BITCOIND" not in os.environ:
os.environ["BITCOIND"] = build_dir + '/src/bitcoind' + exeext os.environ["BITCOIND"] = build_dir + '/src/bitcoind' + exeext
os.environ["BITCOINCLI"] = build_dir + '/src/bitcoin-cli' + exeext
tests_dir = src_dir + '/test/functional/' tests_dir = src_dir + '/test/functional/'