aboutsummaryrefslogtreecommitdiff
path: root/test/functional
diff options
context:
space:
mode:
Diffstat (limited to 'test/functional')
-rwxr-xr-xtest/functional/rpc_rawtransaction.py30
-rwxr-xr-xtest/functional/test_framework/test_framework.py73
-rwxr-xr-xtest/functional/test_framework/test_node.py18
-rw-r--r--test/functional/test_framework/util.py2
4 files changed, 59 insertions, 64 deletions
diff --git a/test/functional/rpc_rawtransaction.py b/test/functional/rpc_rawtransaction.py
index 6e71817dc3..4338675270 100755
--- a/test/functional/rpc_rawtransaction.py
+++ b/test/functional/rpc_rawtransaction.py
@@ -42,7 +42,11 @@ class RawTransactionsTest(BitcoinTestFramework):
def set_test_params(self):
self.setup_clean_chain = True
self.num_nodes = 3
- self.extra_args = [["-addresstype=legacy", "-txindex"], ["-addresstype=legacy", "-txindex"], ["-addresstype=legacy", "-txindex"]]
+ self.extra_args = [
+ ["-txindex"],
+ ["-txindex"],
+ ["-txindex"],
+ ]
def skip_test_if_missing_module(self):
self.skip_if_no_wallet()
@@ -361,30 +365,30 @@ class RawTransactionsTest(BitcoinTestFramework):
# getrawtransaction tests
# 1. valid parameters - only supply txid
- txHash = rawTx["hash"]
- assert_equal(self.nodes[0].getrawtransaction(txHash), rawTxSigned['hex'])
+ txId = rawTx["txid"]
+ assert_equal(self.nodes[0].getrawtransaction(txId), rawTxSigned['hex'])
# 2. valid parameters - supply txid and 0 for non-verbose
- assert_equal(self.nodes[0].getrawtransaction(txHash, 0), rawTxSigned['hex'])
+ assert_equal(self.nodes[0].getrawtransaction(txId, 0), rawTxSigned['hex'])
# 3. valid parameters - supply txid and False for non-verbose
- assert_equal(self.nodes[0].getrawtransaction(txHash, False), rawTxSigned['hex'])
+ assert_equal(self.nodes[0].getrawtransaction(txId, False), rawTxSigned['hex'])
# 4. valid parameters - supply txid and 1 for verbose.
# We only check the "hex" field of the output so we don't need to update this test every time the output format changes.
- assert_equal(self.nodes[0].getrawtransaction(txHash, 1)["hex"], rawTxSigned['hex'])
+ assert_equal(self.nodes[0].getrawtransaction(txId, 1)["hex"], rawTxSigned['hex'])
# 5. valid parameters - supply txid and True for non-verbose
- assert_equal(self.nodes[0].getrawtransaction(txHash, True)["hex"], rawTxSigned['hex'])
+ assert_equal(self.nodes[0].getrawtransaction(txId, True)["hex"], rawTxSigned['hex'])
# 6. invalid parameters - supply txid and string "Flase"
- assert_raises_rpc_error(-1, "not a boolean", self.nodes[0].getrawtransaction, txHash, "Flase")
+ assert_raises_rpc_error(-1, "not a boolean", self.nodes[0].getrawtransaction, txId, "Flase")
# 7. invalid parameters - supply txid and empty array
- assert_raises_rpc_error(-1, "not a boolean", self.nodes[0].getrawtransaction, txHash, [])
+ assert_raises_rpc_error(-1, "not a boolean", self.nodes[0].getrawtransaction, txId, [])
# 8. invalid parameters - supply txid and empty dict
- assert_raises_rpc_error(-1, "not a boolean", self.nodes[0].getrawtransaction, txHash, {})
+ assert_raises_rpc_error(-1, "not a boolean", self.nodes[0].getrawtransaction, txId, {})
inputs = [ {'txid' : "1d1d4e24ed99057e84c3f80fd8fbec79ed9e1acee37da269356ecea000000000", 'vout' : 1, 'sequence' : 1000}]
outputs = { self.nodes[0].getnewaddress() : 1 }
@@ -438,7 +442,7 @@ class RawTransactionsTest(BitcoinTestFramework):
rawTx = self.nodes[2].createrawtransaction(inputs, outputs)
rawTxSigned = self.nodes[2].signrawtransactionwithwallet(rawTx)
assert_equal(rawTxSigned['complete'], True)
- # 1000 sat fee, ~200 b transaction, fee rate should land around 5 sat/b = 0.00005000 BTC/kB
+ # 1000 sat fee, ~100 b transaction, fee rate should land around 10 sat/b = 0.00010000 BTC/kB
# Thus, testmempoolaccept should reject
testres = self.nodes[2].testmempoolaccept([rawTxSigned['hex']], 0.00001000)[0]
assert_equal(testres['allowed'], False)
@@ -446,9 +450,9 @@ class RawTransactionsTest(BitcoinTestFramework):
# and sendrawtransaction should throw
assert_raises_rpc_error(-26, "absurdly-high-fee", self.nodes[2].sendrawtransaction, rawTxSigned['hex'], 0.00001000)
# And below calls should both succeed
- testres = self.nodes[2].testmempoolaccept(rawtxs=[rawTxSigned['hex']], maxfeerate='0.00007000')[0]
+ testres = self.nodes[2].testmempoolaccept(rawtxs=[rawTxSigned['hex']], maxfeerate='0.00070000')[0]
assert_equal(testres['allowed'], True)
- self.nodes[2].sendrawtransaction(hexstring=rawTxSigned['hex'], maxfeerate='0.00007000')
+ self.nodes[2].sendrawtransaction(hexstring=rawTxSigned['hex'], maxfeerate='0.00070000')
if __name__ == '__main__':
diff --git a/test/functional/test_framework/test_framework.py b/test/functional/test_framework/test_framework.py
index 2187bf5f5f..aa674f9ebe 100755
--- a/test/functional/test_framework/test_framework.py
+++ b/test/functional/test_framework/test_framework.py
@@ -29,7 +29,6 @@ from .util import (
disconnect_nodes,
get_datadir_path,
initialize_datadir,
- p2p_port,
sync_blocks,
sync_mempools,
)
@@ -468,35 +467,23 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
def _initialize_chain(self):
"""Initialize a pre-mined blockchain for use by the test.
- Create a cache of a 199-block-long chain (with wallet) for MAX_NODES
+ Create a cache of a 199-block-long chain
Afterward, create num_nodes copies from the cache."""
+ CACHE_NODE_ID = 0 # Use node 0 to create the cache for all other nodes
+ cache_node_dir = get_datadir_path(self.options.cachedir, CACHE_NODE_ID)
assert self.num_nodes <= MAX_NODES
- create_cache = False
- for i in range(MAX_NODES):
- if not os.path.isdir(get_datadir_path(self.options.cachedir, i)):
- create_cache = True
- break
-
- if create_cache:
- self.log.debug("Creating data directories from cached datadir")
-
- # find and delete old cache directories if any exist
- for i in range(MAX_NODES):
- if os.path.isdir(get_datadir_path(self.options.cachedir, i)):
- shutil.rmtree(get_datadir_path(self.options.cachedir, i))
-
- # Create cache directories, run bitcoinds:
- for i in range(MAX_NODES):
- datadir = initialize_datadir(self.options.cachedir, i)
- args = [self.options.bitcoind, "-datadir=" + datadir, '-disablewallet']
- if i > 0:
- args.append("-connect=127.0.0.1:" + str(p2p_port(0)))
- self.nodes.append(TestNode(
- i,
- get_datadir_path(self.options.cachedir, i),
+
+ if not os.path.isdir(cache_node_dir):
+ self.log.debug("Creating cache directory {}".format(cache_node_dir))
+
+ initialize_datadir(self.options.cachedir, CACHE_NODE_ID)
+ self.nodes.append(
+ TestNode(
+ CACHE_NODE_ID,
+ cache_node_dir,
extra_conf=["bind=127.0.0.1"],
- extra_args=[],
+ extra_args=['-disablewallet'],
rpchost=None,
timewait=self.rpc_timeout,
bitcoind=self.options.bitcoind,
@@ -504,12 +491,10 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
coverage_dir=None,
cwd=self.options.tmpdir,
))
- self.nodes[i].args = args
- self.start_node(i)
+ self.start_node(CACHE_NODE_ID)
# Wait for RPC connections to be ready
- for node in self.nodes:
- node.wait_for_rpc_connection()
+ self.nodes[CACHE_NODE_ID].wait_for_rpc_connection()
# Create a 199-block-long chain; each of the 4 first nodes
# gets 25 mature blocks and 25 immature.
@@ -518,29 +503,29 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
# This is needed so that we are out of IBD when the test starts,
# see the tip age check in IsInitialBlockDownload().
for i in range(8):
- self.nodes[0].generatetoaddress(25 if i != 7 else 24, self.nodes[i % 4].get_deterministic_priv_key().address)
- self.sync_blocks()
+ self.nodes[CACHE_NODE_ID].generatetoaddress(
+ nblocks=25 if i != 7 else 24,
+ address=TestNode.PRIV_KEYS[i % 4].address,
+ )
- for n in self.nodes:
- assert_equal(n.getblockchaininfo()["blocks"], 199)
+ assert_equal(self.nodes[CACHE_NODE_ID].getblockchaininfo()["blocks"], 199)
- # Shut them down, and clean up cache directories:
+ # Shut it down, and clean up cache directories:
self.stop_nodes()
self.nodes = []
- def cache_path(n, *paths):
- return os.path.join(get_datadir_path(self.options.cachedir, n), "regtest", *paths)
+ def cache_path(*paths):
+ return os.path.join(cache_node_dir, "regtest", *paths)
- for i in range(MAX_NODES):
- os.rmdir(cache_path(i, 'wallets')) # Remove empty wallets dir
- for entry in os.listdir(cache_path(i)):
- if entry not in ['chainstate', 'blocks']:
- os.remove(cache_path(i, entry))
+ os.rmdir(cache_path('wallets')) # Remove empty wallets dir
+ for entry in os.listdir(cache_path()):
+ if entry not in ['chainstate', 'blocks']: # Only keep chainstate and blocks folder
+ os.remove(cache_path(entry))
for i in range(self.num_nodes):
- from_dir = get_datadir_path(self.options.cachedir, i)
+ self.log.debug("Copy cache directory {} to node {}".format(cache_node_dir, i))
to_dir = get_datadir_path(self.options.tmpdir, i)
- shutil.copytree(from_dir, to_dir)
+ shutil.copytree(cache_node_dir, to_dir)
initialize_datadir(self.options.tmpdir, i) # Overwrite port/rpcport in bitcoin.conf
def _initialize_chain_clean(self):
diff --git a/test/functional/test_framework/test_node.py b/test/functional/test_framework/test_node.py
index b9d1082ddc..3311377090 100755
--- a/test/functional/test_framework/test_node.py
+++ b/test/functional/test_framework/test_node.py
@@ -23,6 +23,7 @@ import sys
from .authproxy import JSONRPCException
from .util import (
+ MAX_NODES,
append_config,
delete_cookie_file,
get_rpc_proxy,
@@ -110,10 +111,8 @@ class TestNode():
self.p2ps = []
- def get_deterministic_priv_key(self):
- """Return a deterministic priv key in base58, that only depends on the node's index"""
- AddressKeyPair = collections.namedtuple('AddressKeyPair', ['address', 'key'])
- PRIV_KEYS = [
+ AddressKeyPair = collections.namedtuple('AddressKeyPair', ['address', 'key'])
+ PRIV_KEYS = [
# address , privkey
AddressKeyPair('mjTkW3DjgyZck4KbiRusZsqTgaYTxdSz6z', 'cVpF924EspNh8KjYsfhgY96mmxvT6DgdWiTYMtMjuM74hJaU5psW'),
AddressKeyPair('msX6jQXvxiNhx3Q62PKeLPrhrqZQdSimTg', 'cUxsWyKyZ9MAQTaAhUQWJmBbSvHMwSmuv59KgxQV7oZQU3PXN3KE'),
@@ -124,8 +123,15 @@ class TestNode():
AddressKeyPair('myzuPxRwsf3vvGzEuzPfK9Nf2RfwauwYe6', 'cQMpDLJwA8DBe9NcQbdoSb1BhmFxVjWD5gRyrLZCtpuF9Zi3a9RK'),
AddressKeyPair('mumwTaMtbxEPUswmLBBN3vM9oGRtGBrys8', 'cSXmRKXVcoouhNNVpcNKFfxsTsToY5pvB9DVsFksF1ENunTzRKsy'),
AddressKeyPair('mpV7aGShMkJCZgbW7F6iZgrvuPHjZjH9qg', 'cSoXt6tm3pqy43UMabY6eUTmR3eSUYFtB2iNQDGgb3VUnRsQys2k'),
- ]
- return PRIV_KEYS[self.index]
+ AddressKeyPair('mq4fBNdckGtvY2mijd9am7DRsbRB4KjUkf', 'cN55daf1HotwBAgAKWVgDcoppmUNDtQSfb7XLutTLeAgVc3u8hik'),
+ AddressKeyPair('mpFAHDjX7KregM3rVotdXzQmkbwtbQEnZ6', 'cT7qK7g1wkYEMvKowd2ZrX1E5f6JQ7TM246UfqbCiyF7kZhorpX3'),
+ AddressKeyPair('mzRe8QZMfGi58KyWCse2exxEFry2sfF2Y7', 'cPiRWE8KMjTRxH1MWkPerhfoHFn5iHPWVK5aPqjW8NxmdwenFinJ'),
+ ]
+
+ def get_deterministic_priv_key(self):
+ """Return a deterministic priv key in base58, that only depends on the node's index"""
+ assert len(self.PRIV_KEYS) == MAX_NODES
+ return self.PRIV_KEYS[self.index]
def get_mem_rss_kilobytes(self):
"""Get the memory usage (RSS) per `ps`.
diff --git a/test/functional/test_framework/util.py b/test/functional/test_framework/util.py
index 0583b42388..26215083fb 100644
--- a/test/functional/test_framework/util.py
+++ b/test/functional/test_framework/util.py
@@ -228,7 +228,7 @@ def wait_until(predicate, *, attempts=float('inf'), timeout=float('inf'), lock=N
############################################
# The maximum number of nodes a single test can spawn
-MAX_NODES = 8
+MAX_NODES = 12
# Don't assign rpc or p2p ports lower than this
PORT_MIN = 11000
# The number of ports to "reserve" for p2p and rpc, each