Merge #11121: TestNode tidyups
7148b74dc
[tests] Functional tests must explicitly set num_nodes (John Newbery)5448a1471
[tests] don't override __init__() in individual tests (John Newbery)6cf094a02
[tests] Avoid passing around member variables in test_framework (John Newbery)36b626867
[tests] TestNode: separate add_node from start_node (John Newbery)be2a2ab6a
[tests] fix - use rpc_timeout as rpc timeout (John Newbery) Pull request description: Some additional tidyups after the introduction of TestNode: - commit 1 makes TestNode use the correct rpc timeout. This should have been included in #11077 - commit 2 separates `add_node()` from `start_node()` as originally discussed here: https://github.com/bitcoin/bitcoin/pull/10556#discussion_r121161453 with @kallewoof . The test writer no longer needs to assign to `self.nodes` when starting/stopping nodes. - commit 3 adds a `set_test_params()` method, so individual tests don't need to override `__init__()` and call `super().__init__()` Tree-SHA512: 0adb030623b96675b5c29e2890ce99ccd837ed05f721d0c91b35378c5ac01b6658174aac12f1f77402e1d38b61f39b3c43b4df85c96952565dde1cda05b0db84
This commit is contained in:
commit
28f788e47e
83 changed files with 383 additions and 531 deletions
|
@ -24,8 +24,8 @@ don't have test cases for.
|
||||||
- Use a module-level docstring to describe what the test is testing, and how it
|
- Use a module-level docstring to describe what the test is testing, and how it
|
||||||
is testing it.
|
is testing it.
|
||||||
- When subclassing the BitcoinTestFramwork, place overrides for the
|
- When subclassing the BitcoinTestFramwork, place overrides for the
|
||||||
`__init__()`, and `setup_xxxx()` methods at the top of the subclass, then
|
`set_test_params()`, `add_options()` and `setup_xxxx()` methods at the top of
|
||||||
locally-defined helper methods, then the `run_test()` method.
|
the subclass, then locally-defined helper methods, then the `run_test()` method.
|
||||||
|
|
||||||
#### General test-writing advice
|
#### General test-writing advice
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ don't have test cases for.
|
||||||
- Avoid stop-starting the nodes multiple times during the test if possible. A
|
- Avoid stop-starting the nodes multiple times during the test if possible. A
|
||||||
stop-start takes several seconds, so doing it several times blows up the
|
stop-start takes several seconds, so doing it several times blows up the
|
||||||
runtime of the test.
|
runtime of the test.
|
||||||
- Set the `self.setup_clean_chain` variable in `__init__()` to control whether
|
- Set the `self.setup_clean_chain` variable in `set_test_params()` to control whether
|
||||||
or not to use the cached data directories. The cached data directories
|
or not to use the cached data directories. The cached data directories
|
||||||
contain a 200-block pre-mined blockchain and wallets for four nodes. Each node
|
contain a 200-block pre-mined blockchain and wallets for four nodes. Each node
|
||||||
has 25 mature blocks (25x50=1250 BTC) in its wallet.
|
has 25 mature blocks (25x50=1250 BTC) in its wallet.
|
||||||
|
|
|
@ -14,10 +14,8 @@ from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import *
|
from test_framework.util import *
|
||||||
|
|
||||||
class AbandonConflictTest(BitcoinTestFramework):
|
class AbandonConflictTest(BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
self.setup_clean_chain = False
|
|
||||||
self.extra_args = [["-minrelaytxfee=0.00001"], []]
|
self.extra_args = [["-minrelaytxfee=0.00001"], []]
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
|
@ -74,7 +72,7 @@ class AbandonConflictTest(BitcoinTestFramework):
|
||||||
# Restart the node with a higher min relay fee so the parent tx is no longer in mempool
|
# Restart the node with a higher min relay fee so the parent tx is no longer in mempool
|
||||||
# TODO: redo with eviction
|
# TODO: redo with eviction
|
||||||
self.stop_node(0)
|
self.stop_node(0)
|
||||||
self.nodes[0] = self.start_node(0, self.options.tmpdir, ["-minrelaytxfee=0.0001"])
|
self.start_node(0, extra_args=["-minrelaytxfee=0.0001"])
|
||||||
|
|
||||||
# Verify txs no longer in either node's mempool
|
# Verify txs no longer in either node's mempool
|
||||||
assert_equal(len(self.nodes[0].getrawmempool()), 0)
|
assert_equal(len(self.nodes[0].getrawmempool()), 0)
|
||||||
|
@ -101,7 +99,7 @@ class AbandonConflictTest(BitcoinTestFramework):
|
||||||
|
|
||||||
# Verify that even with a low min relay fee, the tx is not reaccepted from wallet on startup once abandoned
|
# Verify that even with a low min relay fee, the tx is not reaccepted from wallet on startup once abandoned
|
||||||
self.stop_node(0)
|
self.stop_node(0)
|
||||||
self.nodes[0] = self.start_node(0, self.options.tmpdir, ["-minrelaytxfee=0.00001"])
|
self.start_node(0, extra_args=["-minrelaytxfee=0.00001"])
|
||||||
assert_equal(len(self.nodes[0].getrawmempool()), 0)
|
assert_equal(len(self.nodes[0].getrawmempool()), 0)
|
||||||
assert_equal(self.nodes[0].getbalance(), balance)
|
assert_equal(self.nodes[0].getbalance(), balance)
|
||||||
|
|
||||||
|
@ -121,7 +119,7 @@ class AbandonConflictTest(BitcoinTestFramework):
|
||||||
|
|
||||||
# Remove using high relay fee again
|
# Remove using high relay fee again
|
||||||
self.stop_node(0)
|
self.stop_node(0)
|
||||||
self.nodes[0] = self.start_node(0, self.options.tmpdir, ["-minrelaytxfee=0.0001"])
|
self.start_node(0, extra_args=["-minrelaytxfee=0.0001"])
|
||||||
assert_equal(len(self.nodes[0].getrawmempool()), 0)
|
assert_equal(len(self.nodes[0].getrawmempool()), 0)
|
||||||
newbalance = self.nodes[0].getbalance()
|
newbalance = self.nodes[0].getbalance()
|
||||||
assert_equal(newbalance, balance - Decimal("24.9996"))
|
assert_equal(newbalance, balance - Decimal("24.9996"))
|
||||||
|
|
|
@ -54,16 +54,16 @@ class BaseNode(NodeConnCB):
|
||||||
self.send_message(headers_message)
|
self.send_message(headers_message)
|
||||||
|
|
||||||
class AssumeValidTest(BitcoinTestFramework):
|
class AssumeValidTest(BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 3
|
self.num_nodes = 3
|
||||||
|
|
||||||
def setup_network(self):
|
def setup_network(self):
|
||||||
|
self.add_nodes(3)
|
||||||
# Start node0. We don't start the other nodes yet since
|
# Start node0. We don't start the other nodes yet since
|
||||||
# we need to pre-mine a block with an invalid transaction
|
# we need to pre-mine a block with an invalid transaction
|
||||||
# signature so we can pass in the block hash as assumevalid.
|
# signature so we can pass in the block hash as assumevalid.
|
||||||
self.nodes = [self.start_node(0, self.options.tmpdir)]
|
self.start_node(0)
|
||||||
|
|
||||||
def send_blocks_until_disconnected(self, node):
|
def send_blocks_until_disconnected(self, node):
|
||||||
"""Keep sending blocks to the node until we're disconnected."""
|
"""Keep sending blocks to the node until we're disconnected."""
|
||||||
|
@ -162,15 +162,13 @@ class AssumeValidTest(BitcoinTestFramework):
|
||||||
height += 1
|
height += 1
|
||||||
|
|
||||||
# Start node1 and node2 with assumevalid so they accept a block with a bad signature.
|
# Start node1 and node2 with assumevalid so they accept a block with a bad signature.
|
||||||
self.nodes.append(self.start_node(1, self.options.tmpdir,
|
self.start_node(1, extra_args=["-assumevalid=" + hex(block102.sha256)])
|
||||||
["-assumevalid=" + hex(block102.sha256)]))
|
|
||||||
node1 = BaseNode() # connects to node1
|
node1 = BaseNode() # connects to node1
|
||||||
connections.append(NodeConn('127.0.0.1', p2p_port(1), self.nodes[1], node1))
|
connections.append(NodeConn('127.0.0.1', p2p_port(1), self.nodes[1], node1))
|
||||||
node1.add_connection(connections[1])
|
node1.add_connection(connections[1])
|
||||||
node1.wait_for_verack()
|
node1.wait_for_verack()
|
||||||
|
|
||||||
self.nodes.append(self.start_node(2, self.options.tmpdir,
|
self.start_node(2, extra_args=["-assumevalid=" + hex(block102.sha256)])
|
||||||
["-assumevalid=" + hex(block102.sha256)]))
|
|
||||||
node2 = BaseNode() # connects to node2
|
node2 = BaseNode() # connects to node2
|
||||||
connections.append(NodeConn('127.0.0.1', p2p_port(2), self.nodes[2], node2))
|
connections.append(NodeConn('127.0.0.1', p2p_port(2), self.nodes[2], node2))
|
||||||
node2.add_connection(connections[2])
|
node2.add_connection(connections[2])
|
||||||
|
|
|
@ -60,9 +60,7 @@ def create_transaction(node, coinbase, to_address, amount):
|
||||||
return tx
|
return tx
|
||||||
|
|
||||||
class BIP65Test(BitcoinTestFramework):
|
class BIP65Test(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
self.extra_args = [['-promiscuousmempoolflags=1', '-whitelist=127.0.0.1']]
|
self.extra_args = [['-promiscuousmempoolflags=1', '-whitelist=127.0.0.1']]
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
|
|
|
@ -92,9 +92,9 @@ def all_rlt_txs(txarray):
|
||||||
return txs
|
return txs
|
||||||
|
|
||||||
class BIP68_112_113Test(ComparisonTestFramework):
|
class BIP68_112_113Test(ComparisonTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
|
self.setup_clean_chain = True
|
||||||
self.extra_args = [['-whitelist=127.0.0.1', '-blockversion=4']]
|
self.extra_args = [['-whitelist=127.0.0.1', '-blockversion=4']]
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
|
|
|
@ -17,10 +17,8 @@ SEQUENCE_LOCKTIME_MASK = 0x0000ffff
|
||||||
NOT_FINAL_ERROR = "64: non-BIP68-final"
|
NOT_FINAL_ERROR = "64: non-BIP68-final"
|
||||||
|
|
||||||
class BIP68Test(BitcoinTestFramework):
|
class BIP68Test(BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
self.setup_clean_chain = False
|
|
||||||
self.extra_args = [[], ["-acceptnonstdtxn=0"]]
|
self.extra_args = [[], ["-acceptnonstdtxn=0"]]
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
|
|
|
@ -28,11 +28,10 @@ from test_framework.comptool import TestInstance, TestManager
|
||||||
from test_framework.script import CScript, OP_1NEGATE, OP_CHECKSEQUENCEVERIFY, OP_DROP
|
from test_framework.script import CScript, OP_1NEGATE, OP_CHECKSEQUENCEVERIFY, OP_DROP
|
||||||
|
|
||||||
class BIP9SoftForksTest(ComparisonTestFramework):
|
class BIP9SoftForksTest(ComparisonTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
self.extra_args = [['-whitelist=127.0.0.1']]
|
self.extra_args = [['-whitelist=127.0.0.1']]
|
||||||
|
self.setup_clean_chain = True
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
self.test = TestManager(self, self.options.tmpdir)
|
self.test = TestManager(self, self.options.tmpdir)
|
||||||
|
@ -241,6 +240,7 @@ class BIP9SoftForksTest(ComparisonTestFramework):
|
||||||
# Restart all
|
# Restart all
|
||||||
self.test.clear_all_connections()
|
self.test.clear_all_connections()
|
||||||
self.stop_nodes()
|
self.stop_nodes()
|
||||||
|
self.nodes = []
|
||||||
shutil.rmtree(self.options.tmpdir + "/node0")
|
shutil.rmtree(self.options.tmpdir + "/node0")
|
||||||
self.setup_chain()
|
self.setup_chain()
|
||||||
self.setup_network()
|
self.setup_network()
|
||||||
|
|
|
@ -48,9 +48,7 @@ def create_transaction(node, coinbase, to_address, amount):
|
||||||
return tx
|
return tx
|
||||||
|
|
||||||
class BIP66Test(BitcoinTestFramework):
|
class BIP66Test(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
self.extra_args = [['-promiscuousmempoolflags=1', '-whitelist=127.0.0.1']]
|
self.extra_args = [['-promiscuousmempoolflags=1', '-whitelist=127.0.0.1']]
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
|
|
|
@ -30,12 +30,8 @@ from test_framework.util import (
|
||||||
assert_is_hash_string,
|
assert_is_hash_string,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class BlockchainTest(BitcoinTestFramework):
|
class BlockchainTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = False
|
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
self.extra_args = [['-stopatheight=207']]
|
self.extra_args = [['-stopatheight=207']]
|
||||||
|
|
||||||
|
@ -146,7 +142,7 @@ class BlockchainTest(BitcoinTestFramework):
|
||||||
pass # The node already shut down before response
|
pass # The node already shut down before response
|
||||||
self.log.debug('Node should stop at this height...')
|
self.log.debug('Node should stop at this height...')
|
||||||
self.nodes[0].process.wait(timeout=BITCOIND_PROC_WAIT_TIMEOUT)
|
self.nodes[0].process.wait(timeout=BITCOIND_PROC_WAIT_TIMEOUT)
|
||||||
self.nodes[0] = self.start_node(0, self.options.tmpdir)
|
self.start_node(0)
|
||||||
assert_equal(self.nodes[0].getblockcount(), 207)
|
assert_equal(self.nodes[0].getblockcount(), 207)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -30,25 +30,21 @@ WALLET_PASSPHRASE_TIMEOUT = 3600
|
||||||
|
|
||||||
|
|
||||||
class BumpFeeTest(BitcoinTestFramework):
|
class BumpFeeTest(BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
|
self.extra_args = [["-prematurewitness", "-walletprematurewitness", "-walletrbf={}".format(i)]
|
||||||
def setup_network(self, split=False):
|
|
||||||
extra_args = [["-prematurewitness", "-walletprematurewitness", "-walletrbf={}".format(i)]
|
|
||||||
for i in range(self.num_nodes)]
|
for i in range(self.num_nodes)]
|
||||||
self.nodes = self.start_nodes(self.num_nodes, self.options.tmpdir, extra_args)
|
|
||||||
|
|
||||||
|
def run_test(self):
|
||||||
# Encrypt wallet for test_locked_wallet_fails test
|
# Encrypt wallet for test_locked_wallet_fails test
|
||||||
self.nodes[1].node_encrypt_wallet(WALLET_PASSPHRASE)
|
self.nodes[1].node_encrypt_wallet(WALLET_PASSPHRASE)
|
||||||
self.nodes[1] = self.start_node(1, self.options.tmpdir, extra_args[1])
|
self.start_node(1)
|
||||||
self.nodes[1].walletpassphrase(WALLET_PASSPHRASE, WALLET_PASSPHRASE_TIMEOUT)
|
self.nodes[1].walletpassphrase(WALLET_PASSPHRASE, WALLET_PASSPHRASE_TIMEOUT)
|
||||||
|
|
||||||
connect_nodes_bi(self.nodes, 0, 1)
|
connect_nodes_bi(self.nodes, 0, 1)
|
||||||
self.sync_all()
|
self.sync_all()
|
||||||
|
|
||||||
def run_test(self):
|
|
||||||
peer_node, rbf_node = self.nodes
|
peer_node, rbf_node = self.nodes
|
||||||
rbf_node_address = rbf_node.getnewaddress()
|
rbf_node_address = rbf_node.getnewaddress()
|
||||||
|
|
||||||
|
|
|
@ -12,13 +12,10 @@ tests are being run in parallel.
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
|
|
||||||
class CreateCache(BitcoinTestFramework):
|
class CreateCache(BitcoinTestFramework):
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
|
|
||||||
# Test network and test nodes are not required:
|
# Test network and test nodes are not required:
|
||||||
|
|
||||||
|
def set_test_params(self):
|
||||||
self.num_nodes = 0
|
self.num_nodes = 0
|
||||||
self.nodes = []
|
|
||||||
|
|
||||||
def setup_network(self):
|
def setup_network(self):
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -43,8 +43,7 @@ except AttributeError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class ChainstateWriteCrashTest(BitcoinTestFramework):
|
class ChainstateWriteCrashTest(BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 4
|
self.num_nodes = 4
|
||||||
self.setup_clean_chain = False
|
self.setup_clean_chain = False
|
||||||
|
|
||||||
|
@ -65,7 +64,8 @@ class ChainstateWriteCrashTest(BitcoinTestFramework):
|
||||||
|
|
||||||
def setup_network(self):
|
def setup_network(self):
|
||||||
# Need a bit of extra time for the nodes to start up for this test
|
# Need a bit of extra time for the nodes to start up for this test
|
||||||
self.nodes = self.start_nodes(self.num_nodes, self.options.tmpdir, self.extra_args, timewait=90)
|
self.add_nodes(self.num_nodes, timewait=90)
|
||||||
|
self.start_nodes()
|
||||||
# Leave them unconnected, we'll use submitblock directly in this test
|
# Leave them unconnected, we'll use submitblock directly in this test
|
||||||
|
|
||||||
def restart_node(self, node_index, expected_tip):
|
def restart_node(self, node_index, expected_tip):
|
||||||
|
@ -78,7 +78,7 @@ class ChainstateWriteCrashTest(BitcoinTestFramework):
|
||||||
while time.time() - time_start < 120:
|
while time.time() - time_start < 120:
|
||||||
try:
|
try:
|
||||||
# Any of these RPC calls could throw due to node crash
|
# Any of these RPC calls could throw due to node crash
|
||||||
self.nodes[node_index] = self.start_node(node_index, self.options.tmpdir, self.extra_args[node_index], timewait=90)
|
self.start_node(node_index)
|
||||||
self.nodes[node_index].waitforblock(expected_tip)
|
self.nodes[node_index].waitforblock(expected_tip)
|
||||||
utxo_hash = self.nodes[node_index].gettxoutsetinfo()['hash_serialized_2']
|
utxo_hash = self.nodes[node_index].gettxoutsetinfo()['hash_serialized_2']
|
||||||
return utxo_hash
|
return utxo_hash
|
||||||
|
|
|
@ -10,9 +10,7 @@ from test_framework.mininode import *
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
|
|
||||||
class DecodeScriptTest(BitcoinTestFramework):
|
class DecodeScriptTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
|
|
||||||
|
|
|
@ -11,11 +11,8 @@
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import *
|
from test_framework.util import *
|
||||||
|
|
||||||
|
|
||||||
class DisableWalletTest (BitcoinTestFramework):
|
class DisableWalletTest (BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
self.extra_args = [["-disablewallet"]]
|
self.extra_args = [["-disablewallet"]]
|
||||||
|
|
|
@ -14,11 +14,8 @@ from test_framework.util import (
|
||||||
)
|
)
|
||||||
|
|
||||||
class DisconnectBanTest(BitcoinTestFramework):
|
class DisconnectBanTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
self.setup_clean_chain = False
|
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
self.log.info("Test setban and listbanned RPCs")
|
self.log.info("Test setban and listbanned RPCs")
|
||||||
|
@ -68,8 +65,8 @@ class DisconnectBanTest(BitcoinTestFramework):
|
||||||
assert_equal(len(self.nodes[1].listbanned()), 3)
|
assert_equal(len(self.nodes[1].listbanned()), 3)
|
||||||
|
|
||||||
self.stop_node(1)
|
self.stop_node(1)
|
||||||
|
self.start_node(1)
|
||||||
|
|
||||||
self.nodes[1] = self.start_node(1, self.options.tmpdir)
|
|
||||||
listAfterShutdown = self.nodes[1].listbanned()
|
listAfterShutdown = self.nodes[1].listbanned()
|
||||||
assert_equal("127.0.0.0/24", listAfterShutdown[0]['address'])
|
assert_equal("127.0.0.0/24", listAfterShutdown[0]['address'])
|
||||||
assert_equal("127.0.0.0/32", listAfterShutdown[1]['address'])
|
assert_equal("127.0.0.0/32", listAfterShutdown[1]['address'])
|
||||||
|
|
|
@ -73,15 +73,13 @@ def custom_function():
|
||||||
class ExampleTest(BitcoinTestFramework):
|
class ExampleTest(BitcoinTestFramework):
|
||||||
# Each functional test is a subclass of the BitcoinTestFramework class.
|
# Each functional test is a subclass of the BitcoinTestFramework class.
|
||||||
|
|
||||||
# Override the __init__(), add_options(), setup_chain(), setup_network()
|
# Override the set_test_params(), add_options(), setup_chain(), setup_network()
|
||||||
# and setup_nodes() methods to customize the test setup as required.
|
# and setup_nodes() methods to customize the test setup as required.
|
||||||
|
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
"""Initialize the test
|
"""Override test parameters for your individual test.
|
||||||
|
|
||||||
Call super().__init__() first, and then override any test parameters
|
This method must be overridden and num_nodes must be exlicitly set."""
|
||||||
for your individual test."""
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 3
|
self.num_nodes = 3
|
||||||
# Use self.extra_args to change command-line arguments for the nodes
|
# Use self.extra_args to change command-line arguments for the nodes
|
||||||
|
|
|
@ -7,28 +7,18 @@ import os
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import *
|
|
||||||
|
|
||||||
class ForkNotifyTest(BitcoinTestFramework):
|
class ForkNotifyTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
self.setup_clean_chain = False
|
|
||||||
|
|
||||||
def setup_network(self):
|
def setup_network(self):
|
||||||
self.nodes = []
|
|
||||||
self.alert_filename = os.path.join(self.options.tmpdir, "alert.txt")
|
self.alert_filename = os.path.join(self.options.tmpdir, "alert.txt")
|
||||||
with open(self.alert_filename, 'w', encoding='utf8'):
|
with open(self.alert_filename, 'w', encoding='utf8'):
|
||||||
pass # Just open then close to create zero-length file
|
pass # Just open then close to create zero-length file
|
||||||
self.nodes.append(self.start_node(0, self.options.tmpdir,
|
self.extra_args = [["-blockversion=2", "-alertnotify=echo %s >> \"" + self.alert_filename + "\""],
|
||||||
["-blockversion=2", "-alertnotify=echo %s >> \"" + self.alert_filename + "\""]))
|
["-blockversion=211"]]
|
||||||
# Node1 mines block.version=211 blocks
|
super().setup_network()
|
||||||
self.nodes.append(self.start_node(1, self.options.tmpdir,
|
|
||||||
["-blockversion=211"]))
|
|
||||||
connect_nodes(self.nodes[1], 0)
|
|
||||||
|
|
||||||
self.sync_all()
|
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
# Mine 51 up-version blocks
|
# Mine 51 up-version blocks
|
||||||
|
|
|
@ -14,13 +14,10 @@ def get_unspent(listunspent, amount):
|
||||||
return utx
|
return utx
|
||||||
raise AssertionError('Could not find unspent with amount={}'.format(amount))
|
raise AssertionError('Could not find unspent with amount={}'.format(amount))
|
||||||
|
|
||||||
|
|
||||||
class RawTransactionsTest(BitcoinTestFramework):
|
class RawTransactionsTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
|
||||||
self.num_nodes = 4
|
self.num_nodes = 4
|
||||||
|
self.setup_clean_chain = True
|
||||||
|
|
||||||
def setup_network(self, split=False):
|
def setup_network(self, split=False):
|
||||||
self.setup_nodes()
|
self.setup_nodes()
|
||||||
|
@ -448,11 +445,11 @@ class RawTransactionsTest(BitcoinTestFramework):
|
||||||
############################################################
|
############################################################
|
||||||
# locked wallet test
|
# locked wallet test
|
||||||
self.stop_node(0)
|
self.stop_node(0)
|
||||||
|
self.nodes[1].node_encrypt_wallet("test")
|
||||||
self.stop_node(2)
|
self.stop_node(2)
|
||||||
self.stop_node(3)
|
self.stop_node(3)
|
||||||
self.nodes[1].node_encrypt_wallet("test")
|
|
||||||
|
|
||||||
self.nodes = self.start_nodes(self.num_nodes, self.options.tmpdir)
|
self.start_nodes()
|
||||||
# This test is not meant to test fee estimation and we'd like
|
# This test is not meant to test fee estimation and we'd like
|
||||||
# to be sure all txs are sent at a consistent desired feerate
|
# to be sure all txs are sent at a consistent desired feerate
|
||||||
for node in self.nodes:
|
for node in self.nodes:
|
||||||
|
|
|
@ -23,10 +23,8 @@ class LongpollThread(threading.Thread):
|
||||||
self.node.getblocktemplate({'longpollid':self.longpollid})
|
self.node.getblocktemplate({'longpollid':self.longpollid})
|
||||||
|
|
||||||
class GetBlockTemplateLPTest(BitcoinTestFramework):
|
class GetBlockTemplateLPTest(BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
self.num_nodes = 2
|
||||||
self.num_nodes = 4
|
|
||||||
self.setup_clean_chain = False
|
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
self.log.info("Warning: this test will take about 70 seconds in the best case. Be patient.")
|
self.log.info("Warning: this test will take about 70 seconds in the best case. Be patient.")
|
||||||
|
|
|
@ -14,13 +14,10 @@ from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import assert_equal
|
from test_framework.util import assert_equal
|
||||||
|
|
||||||
class GetChainTipsTest (BitcoinTestFramework):
|
class GetChainTipsTest (BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 4
|
self.num_nodes = 4
|
||||||
self.setup_clean_chain = False
|
|
||||||
|
|
||||||
def run_test (self):
|
def run_test (self):
|
||||||
|
|
||||||
tips = self.nodes[0].getchaintips ()
|
tips = self.nodes[0].getchaintips ()
|
||||||
assert_equal (len (tips), 1)
|
assert_equal (len (tips), 1)
|
||||||
assert_equal (tips[0]['branchlen'], 0)
|
assert_equal (tips[0]['branchlen'], 0)
|
||||||
|
|
|
@ -11,10 +11,8 @@ import http.client
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
|
|
||||||
class HTTPBasicsTest (BitcoinTestFramework):
|
class HTTPBasicsTest (BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 3
|
self.num_nodes = 3
|
||||||
self.setup_clean_chain = False
|
|
||||||
|
|
||||||
def setup_network(self):
|
def setup_network(self):
|
||||||
self.setup_nodes()
|
self.setup_nodes()
|
||||||
|
|
|
@ -111,8 +111,7 @@ TIMESTAMP_WINDOW = 2 * 60 * 60
|
||||||
|
|
||||||
|
|
||||||
class ImportRescanTest(BitcoinTestFramework):
|
class ImportRescanTest(BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 2 + len(IMPORT_NODES)
|
self.num_nodes = 2 + len(IMPORT_NODES)
|
||||||
|
|
||||||
def setup_network(self):
|
def setup_network(self):
|
||||||
|
@ -121,7 +120,8 @@ class ImportRescanTest(BitcoinTestFramework):
|
||||||
if import_node.prune:
|
if import_node.prune:
|
||||||
extra_args[i] += ["-prune=1"]
|
extra_args[i] += ["-prune=1"]
|
||||||
|
|
||||||
self.nodes = self.start_nodes(self.num_nodes, self.options.tmpdir, extra_args)
|
self.add_nodes(self.num_nodes, extra_args)
|
||||||
|
self.start_nodes()
|
||||||
for i in range(1, self.num_nodes):
|
for i in range(1, self.num_nodes):
|
||||||
connect_nodes(self.nodes[i], 0)
|
connect_nodes(self.nodes[i], 0)
|
||||||
|
|
||||||
|
|
|
@ -7,8 +7,7 @@ from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import *
|
from test_framework.util import *
|
||||||
|
|
||||||
class ImportMultiTest (BitcoinTestFramework):
|
class ImportMultiTest (BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
|
|
||||||
|
@ -416,7 +415,7 @@ class ImportMultiTest (BitcoinTestFramework):
|
||||||
|
|
||||||
# restart nodes to check for proper serialization/deserialization of watch only address
|
# restart nodes to check for proper serialization/deserialization of watch only address
|
||||||
self.stop_nodes()
|
self.stop_nodes()
|
||||||
self.nodes = self.start_nodes(2, self.options.tmpdir)
|
self.start_nodes()
|
||||||
address_assert = self.nodes[1].validateaddress(watchonly_address)
|
address_assert = self.nodes[1].validateaddress(watchonly_address)
|
||||||
assert_equal(address_assert['iswatchonly'], True)
|
assert_equal(address_assert['iswatchonly'], True)
|
||||||
assert_equal(address_assert['ismine'], False)
|
assert_equal(address_assert['ismine'], False)
|
||||||
|
|
|
@ -6,11 +6,8 @@
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import *
|
from test_framework.util import *
|
||||||
|
|
||||||
|
|
||||||
class ImportPrunedFundsTest(BitcoinTestFramework):
|
class ImportPrunedFundsTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
|
|
||||||
|
|
|
@ -8,9 +8,7 @@ from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import *
|
from test_framework.util import *
|
||||||
|
|
||||||
class InvalidateTest(BitcoinTestFramework):
|
class InvalidateTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 3
|
self.num_nodes = 3
|
||||||
|
|
||||||
|
|
|
@ -23,9 +23,9 @@ class InvalidBlockRequestTest(ComparisonTestFramework):
|
||||||
|
|
||||||
''' Can either run this test as 1 node with expected answers, or two and compare them.
|
''' Can either run this test as 1 node with expected answers, or two and compare them.
|
||||||
Change the "outcome" variable from each TestInstance object to only do the comparison. '''
|
Change the "outcome" variable from each TestInstance object to only do the comparison. '''
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
|
self.setup_clean_chain = True
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
test = TestManager(self, self.options.tmpdir)
|
test = TestManager(self, self.options.tmpdir)
|
||||||
|
|
|
@ -19,9 +19,9 @@ class InvalidTxRequestTest(ComparisonTestFramework):
|
||||||
|
|
||||||
''' Can either run this test as 1 node with expected answers, or two and compare them.
|
''' Can either run this test as 1 node with expected answers, or two and compare them.
|
||||||
Change the "outcome" variable from each TestInstance object to only do the comparison. '''
|
Change the "outcome" variable from each TestInstance object to only do the comparison. '''
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
|
self.setup_clean_chain = True
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
test = TestManager(self, self.options.tmpdir)
|
test = TestManager(self, self.options.tmpdir)
|
||||||
|
|
|
@ -20,8 +20,7 @@ from test_framework.util import (
|
||||||
)
|
)
|
||||||
|
|
||||||
class KeypoolRestoreTest(BitcoinTestFramework):
|
class KeypoolRestoreTest(BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
self.extra_args = [['-usehd=0'], ['-usehd=1', '-keypool=100', '-keypoolmin=20']]
|
self.extra_args = [['-usehd=0'], ['-usehd=1', '-keypool=100', '-keypoolmin=20']]
|
||||||
|
@ -35,7 +34,7 @@ class KeypoolRestoreTest(BitcoinTestFramework):
|
||||||
self.stop_node(1)
|
self.stop_node(1)
|
||||||
|
|
||||||
shutil.copyfile(self.tmpdir + "/node1/regtest/wallet.dat", self.tmpdir + "/wallet.bak")
|
shutil.copyfile(self.tmpdir + "/node1/regtest/wallet.dat", self.tmpdir + "/wallet.bak")
|
||||||
self.nodes[1] = self.start_node(1, self.tmpdir, 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")
|
||||||
|
@ -61,7 +60,7 @@ class KeypoolRestoreTest(BitcoinTestFramework):
|
||||||
|
|
||||||
self.log.info("Verify keypool is restored and balance is correct")
|
self.log.info("Verify keypool is restored and balance is correct")
|
||||||
|
|
||||||
self.nodes[1] = self.start_node(1, self.tmpdir, 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()
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,8 @@ from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import *
|
from test_framework.util import *
|
||||||
|
|
||||||
class KeyPoolTest(BitcoinTestFramework):
|
class KeyPoolTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
|
self.num_nodes = 1
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
nodes = self.nodes
|
nodes = self.nodes
|
||||||
|
@ -19,7 +21,7 @@ class KeyPoolTest(BitcoinTestFramework):
|
||||||
# Encrypt wallet and wait to terminate
|
# Encrypt wallet and wait to terminate
|
||||||
nodes[0].node_encrypt_wallet('test')
|
nodes[0].node_encrypt_wallet('test')
|
||||||
# Restart node 0
|
# Restart node 0
|
||||||
nodes[0] = self.start_node(0, self.options.tmpdir)
|
self.start_node(0)
|
||||||
# Keep creating keys
|
# Keep creating keys
|
||||||
addr = nodes[0].getnewaddress()
|
addr = nodes[0].getnewaddress()
|
||||||
addr_data = nodes[0].validateaddress(addr)
|
addr_data = nodes[0].validateaddress(addr)
|
||||||
|
@ -78,10 +80,5 @@ class KeyPoolTest(BitcoinTestFramework):
|
||||||
assert_equal(wi['keypoolsize_hd_internal'], 100)
|
assert_equal(wi['keypoolsize_hd_internal'], 100)
|
||||||
assert_equal(wi['keypoolsize'], 100)
|
assert_equal(wi['keypoolsize'], 100)
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = False
|
|
||||||
self.num_nodes = 1
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
KeyPoolTest().main()
|
KeyPoolTest().main()
|
||||||
|
|
|
@ -8,11 +8,9 @@ from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import assert_equal
|
from test_framework.util import assert_equal
|
||||||
|
|
||||||
class ListSinceBlockTest (BitcoinTestFramework):
|
class ListSinceBlockTest (BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
|
||||||
self.num_nodes = 4
|
self.num_nodes = 4
|
||||||
|
self.setup_clean_chain = True
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
self.nodes[2].generate(101)
|
self.nodes[2].generate(101)
|
||||||
|
|
|
@ -16,15 +16,9 @@ def txFromHex(hexstring):
|
||||||
return tx
|
return tx
|
||||||
|
|
||||||
class ListTransactionsTest(BitcoinTestFramework):
|
class ListTransactionsTest(BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
self.num_nodes = 2
|
||||||
self.num_nodes = 4
|
|
||||||
self.setup_clean_chain = False
|
|
||||||
|
|
||||||
def setup_nodes(self):
|
|
||||||
#This test requires mocktime
|
|
||||||
self.enable_mocktime()
|
self.enable_mocktime()
|
||||||
self.nodes = self.start_nodes(self.num_nodes, self.options.tmpdir)
|
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
# Simple send, 0 to 1:
|
# Simple send, 0 to 1:
|
||||||
|
|
|
@ -31,8 +31,7 @@ class TestNode(NodeConnCB):
|
||||||
|
|
||||||
class MaxUploadTest(BitcoinTestFramework):
|
class MaxUploadTest(BitcoinTestFramework):
|
||||||
|
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
self.extra_args = [["-maxuploadtarget=800", "-blockmaxsize=999000"]]
|
self.extra_args = [["-maxuploadtarget=800", "-blockmaxsize=999000"]]
|
||||||
|
@ -147,7 +146,7 @@ class MaxUploadTest(BitcoinTestFramework):
|
||||||
#stop and start node 0 with 1MB maxuploadtarget, whitelist 127.0.0.1
|
#stop and start node 0 with 1MB maxuploadtarget, whitelist 127.0.0.1
|
||||||
self.log.info("Restarting nodes with -whitelist=127.0.0.1")
|
self.log.info("Restarting nodes with -whitelist=127.0.0.1")
|
||||||
self.stop_node(0)
|
self.stop_node(0)
|
||||||
self.nodes[0] = self.start_node(0, self.options.tmpdir, ["-whitelist=127.0.0.1", "-maxuploadtarget=1", "-blockmaxsize=999000"])
|
self.start_node(0, ["-whitelist=127.0.0.1", "-maxuploadtarget=1", "-blockmaxsize=999000"])
|
||||||
|
|
||||||
#recreate/reconnect a test node
|
#recreate/reconnect a test node
|
||||||
test_nodes = [TestNode()]
|
test_nodes = [TestNode()]
|
||||||
|
|
|
@ -8,9 +8,7 @@ from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import *
|
from test_framework.util import *
|
||||||
|
|
||||||
class MempoolLimitTest(BitcoinTestFramework):
|
class MempoolLimitTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
self.extra_args = [["-maxmempool=5", "-spendzeroconfchange=0"]]
|
self.extra_args = [["-maxmempool=5", "-spendzeroconfchange=0"]]
|
||||||
|
|
|
@ -12,10 +12,8 @@ MAX_ANCESTORS = 25
|
||||||
MAX_DESCENDANTS = 25
|
MAX_DESCENDANTS = 25
|
||||||
|
|
||||||
class MempoolPackagesTest(BitcoinTestFramework):
|
class MempoolPackagesTest(BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
self.setup_clean_chain = False
|
|
||||||
self.extra_args = [["-maxorphantx=1000"], ["-maxorphantx=1000", "-limitancestorcount=5"]]
|
self.extra_args = [["-maxorphantx=1000"], ["-maxorphantx=1000", "-limitancestorcount=5"]]
|
||||||
|
|
||||||
# Build a transaction that spends parent_txid:vout
|
# Build a transaction that spends parent_txid:vout
|
||||||
|
|
|
@ -36,12 +36,8 @@ from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import *
|
from test_framework.util import *
|
||||||
|
|
||||||
class MempoolPersistTest(BitcoinTestFramework):
|
class MempoolPersistTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
# We need 3 nodes for this test. Node1 does not have a persistent mempool.
|
|
||||||
self.num_nodes = 3
|
self.num_nodes = 3
|
||||||
self.setup_clean_chain = False
|
|
||||||
self.extra_args = [[], ["-persistmempool=0"], []]
|
self.extra_args = [[], ["-persistmempool=0"], []]
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
|
@ -63,9 +59,8 @@ class MempoolPersistTest(BitcoinTestFramework):
|
||||||
|
|
||||||
self.log.debug("Stop-start node0 and node1. Verify that node0 has the transactions in its mempool and node1 does not.")
|
self.log.debug("Stop-start node0 and node1. Verify that node0 has the transactions in its mempool and node1 does not.")
|
||||||
self.stop_nodes()
|
self.stop_nodes()
|
||||||
self.nodes = []
|
self.start_node(0)
|
||||||
self.nodes.append(self.start_node(0, self.options.tmpdir))
|
self.start_node(1)
|
||||||
self.nodes.append(self.start_node(1, self.options.tmpdir))
|
|
||||||
# Give bitcoind a second to reload the mempool
|
# Give bitcoind a second to reload the mempool
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
wait_until(lambda: len(self.nodes[0].getrawmempool()) == 5)
|
wait_until(lambda: len(self.nodes[0].getrawmempool()) == 5)
|
||||||
|
@ -73,16 +68,14 @@ class MempoolPersistTest(BitcoinTestFramework):
|
||||||
|
|
||||||
self.log.debug("Stop-start node0 with -persistmempool=0. Verify that it doesn't load its mempool.dat file.")
|
self.log.debug("Stop-start node0 with -persistmempool=0. Verify that it doesn't load its mempool.dat file.")
|
||||||
self.stop_nodes()
|
self.stop_nodes()
|
||||||
self.nodes = []
|
self.start_node(0, extra_args=["-persistmempool=0"])
|
||||||
self.nodes.append(self.start_node(0, self.options.tmpdir, ["-persistmempool=0"]))
|
|
||||||
# Give bitcoind a second to reload the mempool
|
# Give bitcoind a second to reload the mempool
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
assert_equal(len(self.nodes[0].getrawmempool()), 0)
|
assert_equal(len(self.nodes[0].getrawmempool()), 0)
|
||||||
|
|
||||||
self.log.debug("Stop-start node0. Verify that it has the transactions in its mempool.")
|
self.log.debug("Stop-start node0. Verify that it has the transactions in its mempool.")
|
||||||
self.stop_nodes()
|
self.stop_nodes()
|
||||||
self.nodes = []
|
self.start_node(0)
|
||||||
self.nodes.append(self.start_node(0, self.options.tmpdir))
|
|
||||||
wait_until(lambda: len(self.nodes[0].getrawmempool()) == 5)
|
wait_until(lambda: len(self.nodes[0].getrawmempool()) == 5)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
|
@ -13,10 +13,8 @@ from test_framework.util import *
|
||||||
|
|
||||||
# Create one-input, one-output, no-fee transaction:
|
# Create one-input, one-output, no-fee transaction:
|
||||||
class MempoolCoinbaseTest(BitcoinTestFramework):
|
class MempoolCoinbaseTest(BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
self.setup_clean_chain = False
|
|
||||||
self.extra_args = [["-checkmempool"]] * 2
|
self.extra_args = [["-checkmempool"]] * 2
|
||||||
|
|
||||||
alert_filename = None # Set by setup_network
|
alert_filename = None # Set by setup_network
|
||||||
|
|
|
@ -9,12 +9,8 @@ from test_framework.util import *
|
||||||
|
|
||||||
# Create one-input, one-output, no-fee transaction:
|
# Create one-input, one-output, no-fee transaction:
|
||||||
class MempoolCoinbaseTest(BitcoinTestFramework):
|
class MempoolCoinbaseTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
self.setup_clean_chain = False
|
|
||||||
# Just need one node for this test
|
|
||||||
self.extra_args = [["-checkmempool"]]
|
self.extra_args = [["-checkmempool"]]
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
|
|
|
@ -17,11 +17,8 @@ from test_framework.util import *
|
||||||
|
|
||||||
# Create one-input, one-output, no-fee transaction:
|
# Create one-input, one-output, no-fee transaction:
|
||||||
class MempoolSpendCoinbaseTest(BitcoinTestFramework):
|
class MempoolSpendCoinbaseTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
self.setup_clean_chain = False
|
|
||||||
self.extra_args = [["-checkmempool"]]
|
self.extra_args = [["-checkmempool"]]
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
|
|
|
@ -8,11 +8,9 @@ from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import *
|
from test_framework.util import *
|
||||||
|
|
||||||
class MerkleBlockTest(BitcoinTestFramework):
|
class MerkleBlockTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
|
||||||
self.num_nodes = 4
|
self.num_nodes = 4
|
||||||
|
self.setup_clean_chain = True
|
||||||
# Nodes 0/1 are "wallet" nodes, Nodes 2/3 are used for testing
|
# Nodes 0/1 are "wallet" nodes, Nodes 2/3 are used for testing
|
||||||
self.extra_args = [[], [], [], ["-txindex"]]
|
self.extra_args = [[], [], [], ["-txindex"]]
|
||||||
|
|
||||||
|
|
|
@ -27,9 +27,7 @@ def assert_template(node, block, expect, rehash=True):
|
||||||
assert_equal(rsp, expect)
|
assert_equal(rsp, expect)
|
||||||
|
|
||||||
class MiningTest(BitcoinTestFramework):
|
class MiningTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
self.setup_clean_chain = False
|
self.setup_clean_chain = False
|
||||||
|
|
||||||
|
|
|
@ -12,10 +12,7 @@ import http.client
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
|
|
||||||
class HTTPBasicsTest (BitcoinTestFramework):
|
class HTTPBasicsTest (BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = False
|
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
|
|
||||||
def setup_chain(self):
|
def setup_chain(self):
|
||||||
|
|
|
@ -12,9 +12,7 @@ from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import assert_equal, assert_raises_jsonrpc
|
from test_framework.util import assert_equal, assert_raises_jsonrpc
|
||||||
|
|
||||||
class MultiWalletTest(BitcoinTestFramework):
|
class MultiWalletTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
self.extra_args = [['-wallet=w1', '-wallet=w2', '-wallet=w3']]
|
self.extra_args = [['-wallet=w1', '-wallet=w2', '-wallet=w3']]
|
||||||
|
@ -23,17 +21,17 @@ class MultiWalletTest(BitcoinTestFramework):
|
||||||
self.stop_node(0)
|
self.stop_node(0)
|
||||||
|
|
||||||
# should not initialize if there are duplicate wallets
|
# should not initialize if there are duplicate wallets
|
||||||
self.assert_start_raises_init_error(0, self.options.tmpdir, ['-wallet=w1', '-wallet=w1'], 'Error loading wallet w1. Duplicate -wallet filename specified.')
|
self.assert_start_raises_init_error(0, ['-wallet=w1', '-wallet=w1'], 'Error loading wallet w1. Duplicate -wallet filename specified.')
|
||||||
|
|
||||||
# should not initialize if wallet file is a directory
|
# should not initialize if wallet file is a directory
|
||||||
os.mkdir(os.path.join(self.options.tmpdir, 'node0', 'regtest', 'w11'))
|
os.mkdir(os.path.join(self.options.tmpdir, 'node0', 'regtest', 'w11'))
|
||||||
self.assert_start_raises_init_error(0, self.options.tmpdir, ['-wallet=w11'], 'Error loading wallet w11. -wallet filename must be a regular file.')
|
self.assert_start_raises_init_error(0, ['-wallet=w11'], 'Error loading wallet w11. -wallet filename must be a regular file.')
|
||||||
|
|
||||||
# should not initialize if wallet file is a symlink
|
# should not initialize if wallet file is a symlink
|
||||||
os.symlink(os.path.join(self.options.tmpdir, 'node0', 'regtest', 'w1'), os.path.join(self.options.tmpdir, 'node0', 'regtest', 'w12'))
|
os.symlink(os.path.join(self.options.tmpdir, 'node0', 'regtest', 'w1'), os.path.join(self.options.tmpdir, 'node0', 'regtest', 'w12'))
|
||||||
self.assert_start_raises_init_error(0, self.options.tmpdir, ['-wallet=w12'], 'Error loading wallet w12. -wallet filename must be a regular file.')
|
self.assert_start_raises_init_error(0, ['-wallet=w12'], 'Error loading wallet w12. -wallet filename must be a regular file.')
|
||||||
|
|
||||||
self.nodes[0] = self.start_node(0, self.options.tmpdir, self.extra_args[0])
|
self.start_node(0, self.extra_args[0])
|
||||||
|
|
||||||
w1 = self.nodes[0].get_wallet_rpc("w1")
|
w1 = self.nodes[0].get_wallet_rpc("w1")
|
||||||
w2 = self.nodes[0].get_wallet_rpc("w2")
|
w2 = self.nodes[0].get_wallet_rpc("w2")
|
||||||
|
|
|
@ -17,10 +17,8 @@ from test_framework.util import (
|
||||||
p2p_port,
|
p2p_port,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class NetTest(BitcoinTestFramework):
|
class NetTest(BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
|
|
||||||
|
|
|
@ -37,8 +37,7 @@ def trueDummy(tx):
|
||||||
|
|
||||||
class NULLDUMMYTest(BitcoinTestFramework):
|
class NULLDUMMYTest(BitcoinTestFramework):
|
||||||
|
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.extra_args = [['-whitelist=127.0.0.1', '-walletprematurewitness']]
|
self.extra_args = [['-whitelist=127.0.0.1', '-walletprematurewitness']]
|
||||||
|
|
|
@ -60,8 +60,7 @@ class AcceptBlockTest(BitcoinTestFramework):
|
||||||
default=os.getenv("BITCOIND", "bitcoind"),
|
default=os.getenv("BITCOIND", "bitcoind"),
|
||||||
help="bitcoind binary to test")
|
help="bitcoind binary to test")
|
||||||
|
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
self.extra_args = [[], ["-whitelist=127.0.0.1"]]
|
self.extra_args = [[], ["-whitelist=127.0.0.1"]]
|
||||||
|
|
|
@ -89,8 +89,7 @@ class TestNode(NodeConnCB):
|
||||||
wait_until(lambda: not self.connected, timeout=timeout, lock=mininode_lock)
|
wait_until(lambda: not self.connected, timeout=timeout, lock=mininode_lock)
|
||||||
|
|
||||||
class CompactBlocksTest(BitcoinTestFramework):
|
class CompactBlocksTest(BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
# Node0 = pre-segwit, node1 = segwit-aware
|
# Node0 = pre-segwit, node1 = segwit-aware
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
|
|
|
@ -37,11 +37,8 @@ class TestNode(NodeConnCB):
|
||||||
self.txinvs = []
|
self.txinvs = []
|
||||||
|
|
||||||
class FeeFilterTest(BitcoinTestFramework):
|
class FeeFilterTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
self.setup_clean_chain = False
|
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
node1 = self.nodes[1]
|
node1 = self.nodes[1]
|
||||||
|
|
|
@ -49,12 +49,11 @@ class CBrokenBlock(CBlock):
|
||||||
return r
|
return r
|
||||||
|
|
||||||
class FullBlockTest(ComparisonTestFramework):
|
class FullBlockTest(ComparisonTestFramework):
|
||||||
|
|
||||||
# Can either run this test as 1 node with expected answers, or two and compare them.
|
# Can either run this test as 1 node with expected answers, or two and compare them.
|
||||||
# Change the "outcome" variable from each TestInstance object to only do the comparison.
|
# Change the "outcome" variable from each TestInstance object to only do the comparison.
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
|
self.setup_clean_chain = True
|
||||||
self.block_heights = {}
|
self.block_heights = {}
|
||||||
self.coinbase_key = CECKey()
|
self.coinbase_key = CECKey()
|
||||||
self.coinbase_key.set_secretbytes(b"horsebattery")
|
self.coinbase_key.set_secretbytes(b"horsebattery")
|
||||||
|
|
|
@ -92,8 +92,7 @@ class CNodeNoVerackIdle(CLazyNode):
|
||||||
conn.send_message(msg_getaddr())
|
conn.send_message(msg_getaddr())
|
||||||
|
|
||||||
class P2PLeakTest(BitcoinTestFramework):
|
class P2PLeakTest(BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
self.extra_args = [['-banscore='+str(banscore)]]
|
self.extra_args = [['-banscore='+str(banscore)]]
|
||||||
|
|
||||||
|
|
|
@ -13,9 +13,7 @@ from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import *
|
from test_framework.util import *
|
||||||
|
|
||||||
class P2PMempoolTests(BitcoinTestFramework):
|
class P2PMempoolTests(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
self.extra_args = [["-peerbloomfilters=0"]]
|
self.extra_args = [["-peerbloomfilters=0"]]
|
||||||
|
|
|
@ -32,8 +32,8 @@ def get_virtual_size(witness_block):
|
||||||
return vsize
|
return vsize
|
||||||
|
|
||||||
class TestNode(NodeConnCB):
|
class TestNode(NodeConnCB):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
self.num_nodes = 3
|
||||||
self.getdataset = set()
|
self.getdataset = set()
|
||||||
|
|
||||||
def on_getdata(self, conn, message):
|
def on_getdata(self, conn, message):
|
||||||
|
@ -108,9 +108,7 @@ def sign_P2PK_witness_input(script, txTo, inIdx, hashtype, value, key):
|
||||||
|
|
||||||
|
|
||||||
class SegWitTest(BitcoinTestFramework):
|
class SegWitTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 3
|
self.num_nodes = 3
|
||||||
self.extra_args = [["-whitelist=127.0.0.1"], ["-whitelist=127.0.0.1", "-acceptnonstdtxn=0"], ["-whitelist=127.0.0.1", "-vbparams=segwit:0:0"]]
|
self.extra_args = [["-whitelist=127.0.0.1"], ["-whitelist=127.0.0.1", "-acceptnonstdtxn=0"], ["-whitelist=127.0.0.1", "-vbparams=segwit:0:0"]]
|
||||||
|
@ -1495,7 +1493,7 @@ class SegWitTest(BitcoinTestFramework):
|
||||||
|
|
||||||
# Restart with the new binary
|
# Restart with the new binary
|
||||||
self.stop_node(node_id)
|
self.stop_node(node_id)
|
||||||
self.nodes[node_id] = self.start_node(node_id, self.options.tmpdir)
|
self.start_node(node_id, extra_args=[])
|
||||||
connect_nodes(self.nodes[0], node_id)
|
connect_nodes(self.nodes[0], node_id)
|
||||||
|
|
||||||
sync_blocks(self.nodes)
|
sync_blocks(self.nodes)
|
||||||
|
|
|
@ -33,8 +33,7 @@ class TestNode(NodeConnCB):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class TimeoutsTest(BitcoinTestFramework):
|
class TimeoutsTest(BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
|
|
||||||
|
|
|
@ -28,8 +28,7 @@ class TestNode(NodeConnCB):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
class VersionBitsWarningTest(BitcoinTestFramework):
|
class VersionBitsWarningTest(BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
|
|
||||||
|
@ -112,7 +111,7 @@ class VersionBitsWarningTest(BitcoinTestFramework):
|
||||||
# Empty out the alert file
|
# Empty out the alert file
|
||||||
with open(self.alert_filename, 'w', encoding='utf8') as _:
|
with open(self.alert_filename, 'w', encoding='utf8') as _:
|
||||||
pass
|
pass
|
||||||
self.nodes = self.start_nodes(self.num_nodes, self.options.tmpdir, self.extra_args)
|
self.start_nodes()
|
||||||
|
|
||||||
# Connecting one block should be enough to generate an error.
|
# Connecting one block should be enough to generate an error.
|
||||||
self.nodes[0].generate(1)
|
self.nodes[0].generate(1)
|
||||||
|
@ -123,7 +122,7 @@ class VersionBitsWarningTest(BitcoinTestFramework):
|
||||||
self.test_versionbits_in_alert_file()
|
self.test_versionbits_in_alert_file()
|
||||||
|
|
||||||
# Test framework expects the node to still be running...
|
# Test framework expects the node to still be running...
|
||||||
self.nodes = self.start_nodes(self.num_nodes, self.options.tmpdir, self.extra_args)
|
self.start_nodes()
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
VersionBitsWarningTest().main()
|
VersionBitsWarningTest().main()
|
||||||
|
|
|
@ -35,8 +35,7 @@ def node_sync_via_rpc(nodes):
|
||||||
unidirectional_node_sync_via_rpc(node_src, node_dest)
|
unidirectional_node_sync_via_rpc(node_src, node_dest)
|
||||||
|
|
||||||
class PreciousTest(BitcoinTestFramework):
|
class PreciousTest(BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 3
|
self.num_nodes = 3
|
||||||
|
|
||||||
|
|
|
@ -9,9 +9,7 @@ from test_framework.util import *
|
||||||
from test_framework.mininode import COIN, MAX_BLOCK_BASE_SIZE
|
from test_framework.mininode import COIN, MAX_BLOCK_BASE_SIZE
|
||||||
|
|
||||||
class PrioritiseTransactionTest(BitcoinTestFramework):
|
class PrioritiseTransactionTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
self.extra_args = [["-printpriority=1"], ["-printpriority=1"]]
|
self.extra_args = [["-printpriority=1"], ["-printpriority=1"]]
|
||||||
|
|
|
@ -41,12 +41,9 @@ from test_framework.netutil import test_ipv6_local
|
||||||
|
|
||||||
RANGE_BEGIN = PORT_MIN + 2 * PORT_RANGE # Start after p2p and rpc ports
|
RANGE_BEGIN = PORT_MIN + 2 * PORT_RANGE # Start after p2p and rpc ports
|
||||||
|
|
||||||
|
|
||||||
class ProxyTest(BitcoinTestFramework):
|
class ProxyTest(BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 4
|
self.num_nodes = 4
|
||||||
self.setup_clean_chain = False
|
|
||||||
|
|
||||||
def setup_nodes(self):
|
def setup_nodes(self):
|
||||||
self.have_ipv6 = test_ipv6_local()
|
self.have_ipv6 = test_ipv6_local()
|
||||||
|
@ -89,7 +86,8 @@ class ProxyTest(BitcoinTestFramework):
|
||||||
]
|
]
|
||||||
if self.have_ipv6:
|
if self.have_ipv6:
|
||||||
args[3] = ['-listen', '-proxy=[%s]:%i' % (self.conf3.addr),'-proxyrandomize=0', '-noonion']
|
args[3] = ['-listen', '-proxy=[%s]:%i' % (self.conf3.addr),'-proxyrandomize=0', '-noonion']
|
||||||
self.nodes = self.start_nodes(self.num_nodes, self.options.tmpdir, extra_args=args)
|
self.add_nodes(self.num_nodes, extra_args=args)
|
||||||
|
self.start_nodes()
|
||||||
|
|
||||||
def node_test(self, node, proxies, auth, test_onion=True):
|
def node_test(self, node, proxies, auth, test_onion=True):
|
||||||
rv = []
|
rv = []
|
||||||
|
|
|
@ -26,9 +26,7 @@ def calc_usage(blockdir):
|
||||||
return sum(os.path.getsize(blockdir+f) for f in os.listdir(blockdir) if os.path.isfile(blockdir+f)) / (1024. * 1024.)
|
return sum(os.path.getsize(blockdir+f) for f in os.listdir(blockdir) if os.path.isfile(blockdir+f)) / (1024. * 1024.)
|
||||||
|
|
||||||
class PruneTest(BitcoinTestFramework):
|
class PruneTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 6
|
self.num_nodes = 6
|
||||||
|
|
||||||
|
@ -56,6 +54,10 @@ class PruneTest(BitcoinTestFramework):
|
||||||
connect_nodes(self.nodes[0], 4)
|
connect_nodes(self.nodes[0], 4)
|
||||||
sync_blocks(self.nodes[0:5])
|
sync_blocks(self.nodes[0:5])
|
||||||
|
|
||||||
|
def setup_nodes(self):
|
||||||
|
self.add_nodes(self.num_nodes, self.extra_args, timewait=900)
|
||||||
|
self.start_nodes()
|
||||||
|
|
||||||
def create_big_chain(self):
|
def create_big_chain(self):
|
||||||
# Start by creating some coinbases we can spend later
|
# Start by creating some coinbases we can spend later
|
||||||
self.nodes[1].generate(200)
|
self.nodes[1].generate(200)
|
||||||
|
@ -98,7 +100,7 @@ class PruneTest(BitcoinTestFramework):
|
||||||
# Node 2 stays connected, so it hears about the stale blocks and then reorg's when node0 reconnects
|
# Node 2 stays connected, so it hears about the stale blocks and then reorg's when node0 reconnects
|
||||||
# Stopping node 0 also clears its mempool, so it doesn't have node1's transactions to accidentally mine
|
# Stopping node 0 also clears its mempool, so it doesn't have node1's transactions to accidentally mine
|
||||||
self.stop_node(0)
|
self.stop_node(0)
|
||||||
self.nodes[0]=self.start_node(0, self.options.tmpdir, self.full_node_default_args, timewait=900)
|
self.start_node(0, extra_args=self.full_node_default_args)
|
||||||
# Mine 24 blocks in node 1
|
# Mine 24 blocks in node 1
|
||||||
for i in range(24):
|
for i in range(24):
|
||||||
if j == 0:
|
if j == 0:
|
||||||
|
@ -126,7 +128,7 @@ class PruneTest(BitcoinTestFramework):
|
||||||
# Reboot node 1 to clear its mempool (hopefully make the invalidate faster)
|
# Reboot node 1 to clear its mempool (hopefully make the invalidate faster)
|
||||||
# Lower the block max size so we don't keep mining all our big mempool transactions (from disconnected blocks)
|
# Lower the block max size so we don't keep mining all our big mempool transactions (from disconnected blocks)
|
||||||
self.stop_node(1)
|
self.stop_node(1)
|
||||||
self.nodes[1] = self.start_node(1, self.options.tmpdir, ["-maxreceivebuffer=20000","-blockmaxsize=5000", "-checkblocks=5", "-disablesafemode"], timewait=900)
|
self.start_node(1, extra_args=["-maxreceivebuffer=20000","-blockmaxsize=5000", "-checkblocks=5", "-disablesafemode"])
|
||||||
|
|
||||||
height = self.nodes[1].getblockcount()
|
height = self.nodes[1].getblockcount()
|
||||||
self.log.info("Current block height: %d" % height)
|
self.log.info("Current block height: %d" % height)
|
||||||
|
@ -149,7 +151,7 @@ class PruneTest(BitcoinTestFramework):
|
||||||
|
|
||||||
# Reboot node1 to clear those giant tx's from mempool
|
# Reboot node1 to clear those giant tx's from mempool
|
||||||
self.stop_node(1)
|
self.stop_node(1)
|
||||||
self.nodes[1] = self.start_node(1, self.options.tmpdir, ["-maxreceivebuffer=20000","-blockmaxsize=5000", "-checkblocks=5", "-disablesafemode"], timewait=900)
|
self.start_node(1, extra_args=["-maxreceivebuffer=20000","-blockmaxsize=5000", "-checkblocks=5", "-disablesafemode"])
|
||||||
|
|
||||||
self.log.info("Generating new longer chain of 300 more blocks")
|
self.log.info("Generating new longer chain of 300 more blocks")
|
||||||
self.nodes[1].generate(300)
|
self.nodes[1].generate(300)
|
||||||
|
@ -227,13 +229,15 @@ class PruneTest(BitcoinTestFramework):
|
||||||
|
|
||||||
def manual_test(self, node_number, use_timestamp):
|
def manual_test(self, node_number, use_timestamp):
|
||||||
# at this point, node has 995 blocks and has not yet run in prune mode
|
# at this point, node has 995 blocks and has not yet run in prune mode
|
||||||
node = self.nodes[node_number] = self.start_node(node_number, self.options.tmpdir, timewait=900)
|
self.start_node(node_number)
|
||||||
|
node = self.nodes[node_number]
|
||||||
assert_equal(node.getblockcount(), 995)
|
assert_equal(node.getblockcount(), 995)
|
||||||
assert_raises_jsonrpc(-1, "not in prune mode", node.pruneblockchain, 500)
|
assert_raises_jsonrpc(-1, "not in prune mode", node.pruneblockchain, 500)
|
||||||
self.stop_node(node_number)
|
|
||||||
|
|
||||||
# now re-start in manual pruning mode
|
# now re-start in manual pruning mode
|
||||||
node = self.nodes[node_number] = self.start_node(node_number, self.options.tmpdir, ["-prune=1"], timewait=900)
|
self.stop_node(node_number)
|
||||||
|
self.start_node(node_number, extra_args=["-prune=1"])
|
||||||
|
node = self.nodes[node_number]
|
||||||
assert_equal(node.getblockcount(), 995)
|
assert_equal(node.getblockcount(), 995)
|
||||||
|
|
||||||
def height(index):
|
def height(index):
|
||||||
|
@ -307,7 +311,7 @@ class PruneTest(BitcoinTestFramework):
|
||||||
|
|
||||||
# stop node, start back up with auto-prune at 550MB, make sure still runs
|
# stop node, start back up with auto-prune at 550MB, make sure still runs
|
||||||
self.stop_node(node_number)
|
self.stop_node(node_number)
|
||||||
self.nodes[node_number] = self.start_node(node_number, self.options.tmpdir, ["-prune=550"], timewait=900)
|
self.start_node(node_number, extra_args=["-prune=550"])
|
||||||
|
|
||||||
self.log.info("Success")
|
self.log.info("Success")
|
||||||
|
|
||||||
|
@ -315,7 +319,7 @@ class PruneTest(BitcoinTestFramework):
|
||||||
# check that the pruning node's wallet is still in good shape
|
# check that the pruning node's wallet is still in good shape
|
||||||
self.log.info("Stop and start pruning node to trigger wallet rescan")
|
self.log.info("Stop and start pruning node to trigger wallet rescan")
|
||||||
self.stop_node(2)
|
self.stop_node(2)
|
||||||
self.nodes[2] = self.start_node(2, self.options.tmpdir, ["-prune=550"])
|
self.start_node(2, extra_args=["-prune=550"])
|
||||||
self.log.info("Success")
|
self.log.info("Success")
|
||||||
|
|
||||||
# check that wallet loads successfully when restarting a pruned node after IBD.
|
# check that wallet loads successfully when restarting a pruned node after IBD.
|
||||||
|
@ -325,7 +329,7 @@ class PruneTest(BitcoinTestFramework):
|
||||||
nds = [self.nodes[0], self.nodes[5]]
|
nds = [self.nodes[0], self.nodes[5]]
|
||||||
sync_blocks(nds, wait=5, timeout=300)
|
sync_blocks(nds, wait=5, timeout=300)
|
||||||
self.stop_node(5) #stop and start to trigger rescan
|
self.stop_node(5) #stop and start to trigger rescan
|
||||||
self.nodes[5] = self.start_node(5, self.options.tmpdir, ["-prune=550"])
|
self.start_node(5, extra_args=["-prune=550"])
|
||||||
self.log.info("Success")
|
self.log.info("Success")
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
|
|
|
@ -17,9 +17,7 @@ from test_framework.util import *
|
||||||
|
|
||||||
# Create one-input, one-output, no-fee transaction:
|
# Create one-input, one-output, no-fee transaction:
|
||||||
class RawTransactionsTest(BitcoinTestFramework):
|
class RawTransactionsTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 3
|
self.num_nodes = 3
|
||||||
|
|
||||||
|
|
|
@ -23,16 +23,9 @@ def get_sub_array_from_array(object_array, to_match):
|
||||||
return []
|
return []
|
||||||
|
|
||||||
class ReceivedByTest(BitcoinTestFramework):
|
class ReceivedByTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
self.num_nodes = 2
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 4
|
|
||||||
self.setup_clean_chain = False
|
|
||||||
|
|
||||||
def setup_nodes(self):
|
|
||||||
#This test requires mocktime
|
|
||||||
self.enable_mocktime()
|
self.enable_mocktime()
|
||||||
self.nodes = self.start_nodes(self.num_nodes, self.options.tmpdir)
|
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
'''
|
'''
|
||||||
|
|
|
@ -15,8 +15,7 @@ import time
|
||||||
|
|
||||||
class ReindexTest(BitcoinTestFramework):
|
class ReindexTest(BitcoinTestFramework):
|
||||||
|
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
|
|
||||||
|
@ -25,7 +24,7 @@ class ReindexTest(BitcoinTestFramework):
|
||||||
blockcount = self.nodes[0].getblockcount()
|
blockcount = self.nodes[0].getblockcount()
|
||||||
self.stop_nodes()
|
self.stop_nodes()
|
||||||
extra_args = [["-reindex-chainstate" if justchainstate else "-reindex", "-checkblockindex=1"]]
|
extra_args = [["-reindex-chainstate" if justchainstate else "-reindex", "-checkblockindex=1"]]
|
||||||
self.nodes = self.start_nodes(self.num_nodes, self.options.tmpdir, extra_args)
|
self.start_nodes(extra_args)
|
||||||
while self.nodes[0].getblockcount() < blockcount:
|
while self.nodes[0].getblockcount() < blockcount:
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
assert_equal(self.nodes[0].getblockcount(), blockcount)
|
assert_equal(self.nodes[0].getblockcount(), blockcount)
|
||||||
|
|
|
@ -61,10 +61,8 @@ def make_utxo(node, amount, confirmed=True, scriptPubKey=CScript([1])):
|
||||||
|
|
||||||
class ReplaceByFeeTest(BitcoinTestFramework):
|
class ReplaceByFeeTest(BitcoinTestFramework):
|
||||||
|
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
self.setup_clean_chain = False
|
|
||||||
self.extra_args= [["-maxorphantx=1000",
|
self.extra_args= [["-maxorphantx=1000",
|
||||||
"-whitelist=127.0.0.1",
|
"-whitelist=127.0.0.1",
|
||||||
"-limitancestorcount=50",
|
"-limitancestorcount=50",
|
||||||
|
|
|
@ -8,11 +8,9 @@ from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import assert_equal, assert_raises_jsonrpc
|
from test_framework.util import assert_equal, assert_raises_jsonrpc
|
||||||
|
|
||||||
class ResendWalletTransactionsTest(BitcoinTestFramework):
|
class ResendWalletTransactionsTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.extra_args = [['--walletbroadcast=false']]
|
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
|
self.extra_args = [['--walletbroadcast=false']]
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
# Should raise RPC_WALLET_ERROR (-4) if walletbroadcast is disabled.
|
# Should raise RPC_WALLET_ERROR (-4) if walletbroadcast is disabled.
|
||||||
|
@ -20,7 +18,7 @@ class ResendWalletTransactionsTest(BitcoinTestFramework):
|
||||||
|
|
||||||
# Should return an empty array if there aren't unconfirmed wallet transactions.
|
# Should return an empty array if there aren't unconfirmed wallet transactions.
|
||||||
self.stop_node(0)
|
self.stop_node(0)
|
||||||
self.nodes[0] = self.start_node(0, self.options.tmpdir)
|
self.start_node(0, extra_args=[])
|
||||||
assert_equal(self.nodes[0].resendwallettransactions(), [])
|
assert_equal(self.nodes[0].resendwallettransactions(), [])
|
||||||
|
|
||||||
# Should return an array with the unconfirmed wallet transaction.
|
# Should return an array with the unconfirmed wallet transaction.
|
||||||
|
|
|
@ -43,8 +43,7 @@ def http_post_call(host, port, path, requestdata = '', response_object = 0):
|
||||||
class RESTTest (BitcoinTestFramework):
|
class RESTTest (BitcoinTestFramework):
|
||||||
FORMAT_SEPARATOR = "."
|
FORMAT_SEPARATOR = "."
|
||||||
|
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 3
|
self.num_nodes = 3
|
||||||
|
|
||||||
|
|
|
@ -11,19 +11,13 @@ from test_framework.test_framework import BitcoinTestFramework, SkipTest
|
||||||
from test_framework.util import *
|
from test_framework.util import *
|
||||||
from test_framework.netutil import *
|
from test_framework.netutil import *
|
||||||
|
|
||||||
|
|
||||||
class RPCBindTest(BitcoinTestFramework):
|
class RPCBindTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
|
|
||||||
def setup_network(self):
|
def setup_network(self):
|
||||||
pass
|
self.add_nodes(self.num_nodes, None)
|
||||||
|
|
||||||
def setup_nodes(self):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def run_bind_test(self, allow_ips, connect_to, addresses, expected):
|
def run_bind_test(self, allow_ips, connect_to, addresses, expected):
|
||||||
'''
|
'''
|
||||||
|
@ -31,12 +25,14 @@ class RPCBindTest(BitcoinTestFramework):
|
||||||
then try to connect, and check if the set of bound addresses
|
then try to connect, and check if the set of bound addresses
|
||||||
matches the expected set.
|
matches the expected set.
|
||||||
'''
|
'''
|
||||||
|
self.log.info("Bind test for %s" % str(addresses))
|
||||||
expected = [(addr_to_hex(addr), port) for (addr, port) in expected]
|
expected = [(addr_to_hex(addr), port) for (addr, port) in expected]
|
||||||
base_args = ['-disablewallet', '-nolisten']
|
base_args = ['-disablewallet', '-nolisten']
|
||||||
if allow_ips:
|
if allow_ips:
|
||||||
base_args += ['-rpcallowip=' + x for x in allow_ips]
|
base_args += ['-rpcallowip=' + x for x in allow_ips]
|
||||||
binds = ['-rpcbind='+addr for addr in addresses]
|
binds = ['-rpcbind='+addr for addr in addresses]
|
||||||
self.nodes = self.start_nodes(self.num_nodes, self.options.tmpdir, [base_args + binds], connect_to)
|
self.nodes[0].rpchost = connect_to
|
||||||
|
self.start_node(0, base_args + binds)
|
||||||
pid = self.nodes[0].process.pid
|
pid = self.nodes[0].process.pid
|
||||||
assert_equal(set(get_bind_addrs(pid)), set(expected))
|
assert_equal(set(get_bind_addrs(pid)), set(expected))
|
||||||
self.stop_nodes()
|
self.stop_nodes()
|
||||||
|
@ -46,8 +42,10 @@ class RPCBindTest(BitcoinTestFramework):
|
||||||
Start a node with rpcallow IP, and request getnetworkinfo
|
Start a node with rpcallow IP, and request getnetworkinfo
|
||||||
at a non-localhost IP.
|
at a non-localhost IP.
|
||||||
'''
|
'''
|
||||||
|
self.log.info("Allow IP test for %s:%d" % (rpchost, rpcport))
|
||||||
base_args = ['-disablewallet', '-nolisten'] + ['-rpcallowip='+x for x in allow_ips]
|
base_args = ['-disablewallet', '-nolisten'] + ['-rpcallowip='+x for x in allow_ips]
|
||||||
self.nodes = self.start_nodes(self.num_nodes, self.options.tmpdir, [base_args])
|
self.nodes[0].rpchost = None
|
||||||
|
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(get_datadir_path(self.options.tmpdir, 0), 0, "%s:%d" % (rpchost, rpcport)), 0, coveragedir=self.options.coveragedir)
|
||||||
node.getnetworkinfo()
|
node.getnetworkinfo()
|
||||||
|
|
|
@ -10,15 +10,8 @@ from test_framework.util import (
|
||||||
assert_raises_jsonrpc,
|
assert_raises_jsonrpc,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class NamedArgumentTest(BitcoinTestFramework):
|
class NamedArgumentTest(BitcoinTestFramework):
|
||||||
"""
|
def set_test_params(self):
|
||||||
Test named arguments on RPC calls.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = False
|
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
|
|
|
@ -74,9 +74,7 @@ def find_unspent(node, min_value):
|
||||||
return utxo
|
return utxo
|
||||||
|
|
||||||
class SegWitTest(BitcoinTestFramework):
|
class SegWitTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 3
|
self.num_nodes = 3
|
||||||
self.extra_args = [["-walletprematurewitness", "-rpcserialversion=0"],
|
self.extra_args = [["-walletprematurewitness", "-rpcserialversion=0"],
|
||||||
|
|
|
@ -174,8 +174,7 @@ class TestNode(NodeConnCB):
|
||||||
self.send_message(getblocks_message)
|
self.send_message(getblocks_message)
|
||||||
|
|
||||||
class SendHeadersTest(BitcoinTestFramework):
|
class SendHeadersTest(BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
|
|
||||||
|
|
|
@ -7,9 +7,7 @@
|
||||||
from test_framework.test_framework import BitcoinTestFramework
|
from test_framework.test_framework import BitcoinTestFramework
|
||||||
|
|
||||||
class SignMessagesTest(BitcoinTestFramework):
|
class SignMessagesTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
|
|
||||||
|
|
|
@ -9,8 +9,7 @@ from test_framework.util import *
|
||||||
|
|
||||||
|
|
||||||
class SignRawTransactionsTest(BitcoinTestFramework):
|
class SignRawTransactionsTest(BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
|
|
||||||
|
|
|
@ -141,11 +141,8 @@ def check_estimates(node, fees_seen, max_invalid, print_estimates = True):
|
||||||
|
|
||||||
|
|
||||||
class EstimateFeeTest(BitcoinTestFramework):
|
class EstimateFeeTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 3
|
self.num_nodes = 3
|
||||||
self.setup_clean_chain = False
|
|
||||||
|
|
||||||
def setup_network(self):
|
def setup_network(self):
|
||||||
"""
|
"""
|
||||||
|
@ -153,57 +150,16 @@ class EstimateFeeTest(BitcoinTestFramework):
|
||||||
But first we need to use one node to create a lot of outputs
|
But first we need to use one node to create a lot of outputs
|
||||||
which we will use to generate our transactions.
|
which we will use to generate our transactions.
|
||||||
"""
|
"""
|
||||||
self.nodes = []
|
self.add_nodes(3, extra_args=[["-maxorphantx=1000", "-whitelist=127.0.0.1"],
|
||||||
|
["-blockmaxsize=17000", "-maxorphantx=1000"],
|
||||||
|
["-blockmaxsize=8000", "-maxorphantx=1000"]])
|
||||||
# Use node0 to mine blocks for input splitting
|
# Use node0 to mine blocks for input splitting
|
||||||
self.nodes.append(self.start_node(0, self.options.tmpdir, ["-maxorphantx=1000",
|
|
||||||
"-whitelist=127.0.0.1"]))
|
|
||||||
|
|
||||||
self.log.info("This test is time consuming, please be patient")
|
|
||||||
self.log.info("Splitting inputs so we can generate tx's")
|
|
||||||
self.txouts = []
|
|
||||||
self.txouts2 = []
|
|
||||||
# Split a coinbase into two transaction puzzle outputs
|
|
||||||
split_inputs(self.nodes[0], self.nodes[0].listunspent(0), self.txouts, True)
|
|
||||||
|
|
||||||
# Mine
|
|
||||||
while (len(self.nodes[0].getrawmempool()) > 0):
|
|
||||||
self.nodes[0].generate(1)
|
|
||||||
|
|
||||||
# Repeatedly split those 2 outputs, doubling twice for each rep
|
|
||||||
# Use txouts to monitor the available utxo, since these won't be tracked in wallet
|
|
||||||
reps = 0
|
|
||||||
while (reps < 5):
|
|
||||||
#Double txouts to txouts2
|
|
||||||
while (len(self.txouts)>0):
|
|
||||||
split_inputs(self.nodes[0], self.txouts, self.txouts2)
|
|
||||||
while (len(self.nodes[0].getrawmempool()) > 0):
|
|
||||||
self.nodes[0].generate(1)
|
|
||||||
#Double txouts2 to txouts
|
|
||||||
while (len(self.txouts2)>0):
|
|
||||||
split_inputs(self.nodes[0], self.txouts2, self.txouts)
|
|
||||||
while (len(self.nodes[0].getrawmempool()) > 0):
|
|
||||||
self.nodes[0].generate(1)
|
|
||||||
reps += 1
|
|
||||||
self.log.info("Finished splitting")
|
|
||||||
|
|
||||||
# Now we can connect the other nodes, didn't want to connect them earlier
|
|
||||||
# so the estimates would not be affected by the splitting transactions
|
|
||||||
# Node1 mines small blocks but that are bigger than the expected transaction rate.
|
# Node1 mines small blocks but that are bigger than the expected transaction rate.
|
||||||
# NOTE: the CreateNewBlock code starts counting block size at 1,000 bytes,
|
# NOTE: the CreateNewBlock code starts counting block size at 1,000 bytes,
|
||||||
# (17k is room enough for 110 or so transactions)
|
# (17k is room enough for 110 or so transactions)
|
||||||
self.nodes.append(self.start_node(1, self.options.tmpdir,
|
|
||||||
["-blockmaxsize=17000", "-maxorphantx=1000"]))
|
|
||||||
connect_nodes(self.nodes[1], 0)
|
|
||||||
|
|
||||||
# Node2 is a stingy miner, that
|
# Node2 is a stingy miner, that
|
||||||
# produces too small blocks (room for only 55 or so transactions)
|
# produces too small blocks (room for only 55 or so transactions)
|
||||||
node2args = ["-blockmaxsize=8000", "-maxorphantx=1000"]
|
|
||||||
|
|
||||||
self.nodes.append(self.start_node(2, self.options.tmpdir, node2args))
|
|
||||||
connect_nodes(self.nodes[0], 2)
|
|
||||||
connect_nodes(self.nodes[2], 1)
|
|
||||||
|
|
||||||
self.sync_all()
|
|
||||||
|
|
||||||
def transact_and_mine(self, numblocks, mining_node):
|
def transact_and_mine(self, numblocks, mining_node):
|
||||||
min_fee = Decimal("0.00001")
|
min_fee = Decimal("0.00001")
|
||||||
|
@ -232,9 +188,51 @@ class EstimateFeeTest(BitcoinTestFramework):
|
||||||
self.memutxo = newmem
|
self.memutxo = newmem
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
|
self.log.info("This test is time consuming, please be patient")
|
||||||
|
self.log.info("Splitting inputs so we can generate tx's")
|
||||||
|
|
||||||
# Make log handler available to helper functions
|
# Make log handler available to helper functions
|
||||||
global log
|
global log
|
||||||
log = self.log
|
log = self.log
|
||||||
|
|
||||||
|
# Start node0
|
||||||
|
self.start_node(0)
|
||||||
|
self.txouts = []
|
||||||
|
self.txouts2 = []
|
||||||
|
# Split a coinbase into two transaction puzzle outputs
|
||||||
|
split_inputs(self.nodes[0], self.nodes[0].listunspent(0), self.txouts, True)
|
||||||
|
|
||||||
|
# Mine
|
||||||
|
while (len(self.nodes[0].getrawmempool()) > 0):
|
||||||
|
self.nodes[0].generate(1)
|
||||||
|
|
||||||
|
# Repeatedly split those 2 outputs, doubling twice for each rep
|
||||||
|
# Use txouts to monitor the available utxo, since these won't be tracked in wallet
|
||||||
|
reps = 0
|
||||||
|
while (reps < 5):
|
||||||
|
#Double txouts to txouts2
|
||||||
|
while (len(self.txouts)>0):
|
||||||
|
split_inputs(self.nodes[0], self.txouts, self.txouts2)
|
||||||
|
while (len(self.nodes[0].getrawmempool()) > 0):
|
||||||
|
self.nodes[0].generate(1)
|
||||||
|
#Double txouts2 to txouts
|
||||||
|
while (len(self.txouts2)>0):
|
||||||
|
split_inputs(self.nodes[0], self.txouts2, self.txouts)
|
||||||
|
while (len(self.nodes[0].getrawmempool()) > 0):
|
||||||
|
self.nodes[0].generate(1)
|
||||||
|
reps += 1
|
||||||
|
self.log.info("Finished splitting")
|
||||||
|
|
||||||
|
# Now we can connect the other nodes, didn't want to connect them earlier
|
||||||
|
# so the estimates would not be affected by the splitting transactions
|
||||||
|
self.start_node(1)
|
||||||
|
self.start_node(2)
|
||||||
|
connect_nodes(self.nodes[1], 0)
|
||||||
|
connect_nodes(self.nodes[0], 2)
|
||||||
|
connect_nodes(self.nodes[2], 1)
|
||||||
|
|
||||||
|
self.sync_all()
|
||||||
|
|
||||||
self.fees_per_kb = []
|
self.fees_per_kb = []
|
||||||
self.memutxo = []
|
self.memutxo = []
|
||||||
self.confutxo = self.txouts # Start with the set of confirmed txouts after splitting
|
self.confutxo = self.txouts # Start with the set of confirmed txouts after splitting
|
||||||
|
|
|
@ -48,57 +48,30 @@ BITCOIND_PROC_WAIT_TIMEOUT = 60
|
||||||
class BitcoinTestFramework(object):
|
class BitcoinTestFramework(object):
|
||||||
"""Base class for a bitcoin test script.
|
"""Base class for a bitcoin test script.
|
||||||
|
|
||||||
Individual bitcoin test scripts should subclass this class and override the following methods:
|
Individual bitcoin test scripts should subclass this class and override the set_test_params() and run_test() methods.
|
||||||
|
|
||||||
|
Individual tests can also override the following methods to customize the test setup:
|
||||||
|
|
||||||
- __init__()
|
|
||||||
- add_options()
|
- add_options()
|
||||||
- setup_chain()
|
- setup_chain()
|
||||||
- setup_network()
|
- setup_network()
|
||||||
- run_test()
|
- setup_nodes()
|
||||||
|
|
||||||
The main() method should not be overridden.
|
The __init__() and main() methods should not be overridden.
|
||||||
|
|
||||||
This class also contains various public and private helper methods."""
|
This class also contains various public and private helper methods."""
|
||||||
|
|
||||||
# Methods to override in subclass test scripts.
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.num_nodes = 4
|
"""Sets test framework defaults. Do not override this method. Instead, override the set_test_params() method"""
|
||||||
self.setup_clean_chain = False
|
self.setup_clean_chain = False
|
||||||
self.nodes = []
|
self.nodes = []
|
||||||
self.mocktime = 0
|
self.mocktime = 0
|
||||||
|
self.set_test_params()
|
||||||
|
|
||||||
def add_options(self, parser):
|
assert hasattr(self, "num_nodes"), "Test must set self.num_nodes in set_test_params()"
|
||||||
pass
|
|
||||||
|
|
||||||
def setup_chain(self):
|
|
||||||
self.log.info("Initializing test directory " + self.options.tmpdir)
|
|
||||||
if self.setup_clean_chain:
|
|
||||||
self._initialize_chain_clean(self.options.tmpdir, self.num_nodes)
|
|
||||||
else:
|
|
||||||
self._initialize_chain(self.options.tmpdir, self.num_nodes, self.options.cachedir)
|
|
||||||
|
|
||||||
def setup_network(self):
|
|
||||||
self.setup_nodes()
|
|
||||||
|
|
||||||
# Connect the nodes as a "chain". This allows us
|
|
||||||
# to split the network between nodes 1 and 2 to get
|
|
||||||
# two halves that can work on competing chains.
|
|
||||||
for i in range(self.num_nodes - 1):
|
|
||||||
connect_nodes_bi(self.nodes, i, i + 1)
|
|
||||||
self.sync_all()
|
|
||||||
|
|
||||||
def setup_nodes(self):
|
|
||||||
extra_args = None
|
|
||||||
if hasattr(self, "extra_args"):
|
|
||||||
extra_args = self.extra_args
|
|
||||||
self.nodes = self.start_nodes(self.num_nodes, self.options.tmpdir, extra_args)
|
|
||||||
|
|
||||||
def run_test(self):
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
# Main function. This should not be overridden by the subclass test scripts.
|
|
||||||
|
|
||||||
def main(self):
|
def main(self):
|
||||||
|
"""Main function. This should not be overridden by the subclass test scripts."""
|
||||||
|
|
||||||
parser = optparse.OptionParser(usage="%prog [options]")
|
parser = optparse.OptionParser(usage="%prog [options]")
|
||||||
parser.add_option("--nocleanup", dest="nocleanup", default=False, action="store_true",
|
parser.add_option("--nocleanup", dest="nocleanup", default=False, action="store_true",
|
||||||
|
@ -202,26 +175,50 @@ class BitcoinTestFramework(object):
|
||||||
logging.shutdown()
|
logging.shutdown()
|
||||||
sys.exit(TEST_EXIT_FAILED)
|
sys.exit(TEST_EXIT_FAILED)
|
||||||
|
|
||||||
|
# Methods to override in subclass test scripts.
|
||||||
|
def set_test_params(self):
|
||||||
|
"""Tests must this method to change default values for number of nodes, topology, etc"""
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
def add_options(self, parser):
|
||||||
|
"""Override this method to add command-line options to the test"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
def setup_chain(self):
|
||||||
|
"""Override this method to customize blockchain setup"""
|
||||||
|
self.log.info("Initializing test directory " + self.options.tmpdir)
|
||||||
|
if self.setup_clean_chain:
|
||||||
|
self._initialize_chain_clean()
|
||||||
|
else:
|
||||||
|
self._initialize_chain()
|
||||||
|
|
||||||
|
def setup_network(self):
|
||||||
|
"""Override this method to customize test network topology"""
|
||||||
|
self.setup_nodes()
|
||||||
|
|
||||||
|
# Connect the nodes as a "chain". This allows us
|
||||||
|
# to split the network between nodes 1 and 2 to get
|
||||||
|
# two halves that can work on competing chains.
|
||||||
|
for i in range(self.num_nodes - 1):
|
||||||
|
connect_nodes_bi(self.nodes, i, i + 1)
|
||||||
|
self.sync_all()
|
||||||
|
|
||||||
|
def setup_nodes(self):
|
||||||
|
"""Override this method to customize test node setup"""
|
||||||
|
extra_args = None
|
||||||
|
if hasattr(self, "extra_args"):
|
||||||
|
extra_args = self.extra_args
|
||||||
|
self.add_nodes(self.num_nodes, extra_args)
|
||||||
|
self.start_nodes()
|
||||||
|
|
||||||
|
def run_test(self):
|
||||||
|
"""Tests must override this method to define test logic"""
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
# Public helper methods. These can be accessed by the subclass test scripts.
|
# Public helper methods. These can be accessed by the subclass test scripts.
|
||||||
|
|
||||||
def start_node(self, i, dirname, extra_args=None, rpchost=None, timewait=None, binary=None, stderr=None):
|
def add_nodes(self, num_nodes, extra_args=None, rpchost=None, timewait=None, binary=None):
|
||||||
"""Start a bitcoind and return RPC connection to it"""
|
"""Instantiate TestNode objects"""
|
||||||
|
|
||||||
if extra_args is None:
|
|
||||||
extra_args = []
|
|
||||||
if binary is None:
|
|
||||||
binary = os.getenv("BITCOIND", "bitcoind")
|
|
||||||
node = TestNode(i, dirname, extra_args, rpchost, timewait, binary, stderr, self.mocktime, coverage_dir=self.options.coveragedir)
|
|
||||||
node.start()
|
|
||||||
node.wait_for_rpc_connection()
|
|
||||||
|
|
||||||
if self.options.coveragedir is not None:
|
|
||||||
coverage.write_all_rpc_commands(self.options.coveragedir, node.rpc)
|
|
||||||
|
|
||||||
return node
|
|
||||||
|
|
||||||
def start_nodes(self, num_nodes, dirname, extra_args=None, rpchost=None, timewait=None, binary=None):
|
|
||||||
"""Start multiple bitcoinds, return RPC connections to them"""
|
|
||||||
|
|
||||||
if extra_args is None:
|
if extra_args is None:
|
||||||
extra_args = [[]] * num_nodes
|
extra_args = [[]] * num_nodes
|
||||||
|
@ -229,12 +226,30 @@ class BitcoinTestFramework(object):
|
||||||
binary = [None] * num_nodes
|
binary = [None] * num_nodes
|
||||||
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)
|
||||||
nodes = []
|
|
||||||
try:
|
|
||||||
for i in range(num_nodes):
|
for i in range(num_nodes):
|
||||||
nodes.append(TestNode(i, dirname, extra_args[i], rpchost, timewait=timewait, binary=binary[i], stderr=None, mocktime=self.mocktime, coverage_dir=self.options.coveragedir))
|
self.nodes.append(TestNode(i, self.options.tmpdir, extra_args[i], rpchost, timewait=timewait, binary=binary[i], stderr=None, mocktime=self.mocktime, coverage_dir=self.options.coveragedir))
|
||||||
nodes[i].start()
|
|
||||||
for node in nodes:
|
def start_node(self, i, extra_args=None, stderr=None):
|
||||||
|
"""Start a bitcoind"""
|
||||||
|
|
||||||
|
node = self.nodes[i]
|
||||||
|
|
||||||
|
node.start(extra_args, stderr)
|
||||||
|
node.wait_for_rpc_connection()
|
||||||
|
|
||||||
|
if self.options.coveragedir is not None:
|
||||||
|
coverage.write_all_rpc_commands(self.options.coveragedir, node.rpc)
|
||||||
|
|
||||||
|
def start_nodes(self, extra_args=None):
|
||||||
|
"""Start multiple bitcoinds"""
|
||||||
|
|
||||||
|
if extra_args is None:
|
||||||
|
extra_args = [None] * self.num_nodes
|
||||||
|
assert_equal(len(extra_args), self.num_nodes)
|
||||||
|
try:
|
||||||
|
for i, node in enumerate(self.nodes):
|
||||||
|
node.start(extra_args[i])
|
||||||
|
for node in self.nodes:
|
||||||
node.wait_for_rpc_connection()
|
node.wait_for_rpc_connection()
|
||||||
except:
|
except:
|
||||||
# If one node failed to start, stop the others
|
# If one node failed to start, stop the others
|
||||||
|
@ -242,11 +257,9 @@ class BitcoinTestFramework(object):
|
||||||
raise
|
raise
|
||||||
|
|
||||||
if self.options.coveragedir is not None:
|
if self.options.coveragedir is not None:
|
||||||
for node in nodes:
|
for node in self.nodes:
|
||||||
coverage.write_all_rpc_commands(self.options.coveragedir, node.rpc)
|
coverage.write_all_rpc_commands(self.options.coveragedir, node.rpc)
|
||||||
|
|
||||||
return nodes
|
|
||||||
|
|
||||||
def stop_node(self, i):
|
def stop_node(self, i):
|
||||||
"""Stop a bitcoind test node"""
|
"""Stop a bitcoind test node"""
|
||||||
self.nodes[i].stop_node()
|
self.nodes[i].stop_node()
|
||||||
|
@ -264,10 +277,10 @@ class BitcoinTestFramework(object):
|
||||||
while not node.is_node_stopped():
|
while not node.is_node_stopped():
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
|
|
||||||
def assert_start_raises_init_error(self, i, dirname, extra_args=None, expected_msg=None):
|
def assert_start_raises_init_error(self, i, extra_args=None, expected_msg=None):
|
||||||
with tempfile.SpooledTemporaryFile(max_size=2**16) as log_stderr:
|
with tempfile.SpooledTemporaryFile(max_size=2**16) as log_stderr:
|
||||||
try:
|
try:
|
||||||
self.start_node(i, dirname, extra_args, stderr=log_stderr)
|
self.start_node(i, extra_args, stderr=log_stderr)
|
||||||
self.stop_node(i)
|
self.stop_node(i)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
assert 'bitcoind exited' in str(e) # node must have shutdown
|
assert 'bitcoind exited' in str(e) # node must have shutdown
|
||||||
|
@ -356,16 +369,16 @@ class BitcoinTestFramework(object):
|
||||||
rpc_handler.setLevel(logging.DEBUG)
|
rpc_handler.setLevel(logging.DEBUG)
|
||||||
rpc_logger.addHandler(rpc_handler)
|
rpc_logger.addHandler(rpc_handler)
|
||||||
|
|
||||||
def _initialize_chain(self, test_dir, num_nodes, cachedir):
|
def _initialize_chain(self):
|
||||||
"""Initialize a pre-mined blockchain for use by the test.
|
"""Initialize a pre-mined blockchain for use by the test.
|
||||||
|
|
||||||
Create a cache of a 200-block-long chain (with wallet) for MAX_NODES
|
Create a cache of a 200-block-long chain (with wallet) for MAX_NODES
|
||||||
Afterward, create num_nodes copies from the cache."""
|
Afterward, create num_nodes copies from the cache."""
|
||||||
|
|
||||||
assert num_nodes <= MAX_NODES
|
assert self.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(self.options.cachedir, 'node' + str(i))):
|
||||||
create_cache = True
|
create_cache = True
|
||||||
break
|
break
|
||||||
|
|
||||||
|
@ -374,18 +387,18 @@ class BitcoinTestFramework(object):
|
||||||
|
|
||||||
# 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(self.options.cachedir, "node" + str(i))):
|
||||||
shutil.rmtree(os.path.join(cachedir, "node" + str(i)))
|
shutil.rmtree(os.path.join(self.options.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(self.options.cachedir, i)
|
||||||
args = [os.getenv("BITCOIND", "bitcoind"), "-server", "-keypool=1", "-datadir=" + datadir, "-discover=0"]
|
args = [os.getenv("BITCOIND", "bitcoind"), "-server", "-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)))
|
||||||
self.nodes.append(TestNode(i, cachedir, extra_args=[], rpchost=None, timewait=None, binary=None, stderr=None, mocktime=self.mocktime, coverage_dir=None))
|
self.nodes.append(TestNode(i, self.options.cachedir, 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.nodes[i].start()
|
self.start_node(i)
|
||||||
|
|
||||||
# Wait for RPC connections to be ready
|
# Wait for RPC connections to be ready
|
||||||
for node in self.nodes:
|
for node in self.nodes:
|
||||||
|
@ -414,24 +427,24 @@ class BitcoinTestFramework(object):
|
||||||
self.nodes = []
|
self.nodes = []
|
||||||
self.disable_mocktime()
|
self.disable_mocktime()
|
||||||
for i in range(MAX_NODES):
|
for i in range(MAX_NODES):
|
||||||
os.remove(log_filename(cachedir, i, "debug.log"))
|
os.remove(log_filename(self.options.cachedir, i, "debug.log"))
|
||||||
os.remove(log_filename(cachedir, i, "db.log"))
|
os.remove(log_filename(self.options.cachedir, i, "db.log"))
|
||||||
os.remove(log_filename(cachedir, i, "peers.dat"))
|
os.remove(log_filename(self.options.cachedir, i, "peers.dat"))
|
||||||
os.remove(log_filename(cachedir, i, "fee_estimates.dat"))
|
os.remove(log_filename(self.options.cachedir, i, "fee_estimates.dat"))
|
||||||
|
|
||||||
for i in range(num_nodes):
|
for i in range(self.num_nodes):
|
||||||
from_dir = os.path.join(cachedir, "node" + str(i))
|
from_dir = os.path.join(self.options.cachedir, "node" + str(i))
|
||||||
to_dir = os.path.join(test_dir, "node" + str(i))
|
to_dir = os.path.join(self.options.tmpdir, "node" + str(i))
|
||||||
shutil.copytree(from_dir, to_dir)
|
shutil.copytree(from_dir, to_dir)
|
||||||
initialize_datadir(test_dir, i) # Overwrite port/rpcport in bitcoin.conf
|
initialize_datadir(self.options.tmpdir, i) # Overwrite port/rpcport in bitcoin.conf
|
||||||
|
|
||||||
def _initialize_chain_clean(self, test_dir, num_nodes):
|
def _initialize_chain_clean(self):
|
||||||
"""Initialize empty blockchain for use by the test.
|
"""Initialize empty blockchain for use by the test.
|
||||||
|
|
||||||
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(num_nodes):
|
for i in range(self.num_nodes):
|
||||||
initialize_datadir(test_dir, i)
|
initialize_datadir(self.options.tmpdir, i)
|
||||||
|
|
||||||
class ComparisonTestFramework(BitcoinTestFramework):
|
class ComparisonTestFramework(BitcoinTestFramework):
|
||||||
"""Test framework for doing p2p comparison testing
|
"""Test framework for doing p2p comparison testing
|
||||||
|
@ -441,8 +454,7 @@ class ComparisonTestFramework(BitcoinTestFramework):
|
||||||
- 2 binaries: 1 test binary, 1 ref binary
|
- 2 binaries: 1 test binary, 1 ref binary
|
||||||
- n>2 binaries: 1 test binary, n-1 ref binaries"""
|
- n>2 binaries: 1 test binary, n-1 ref binaries"""
|
||||||
|
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
|
|
||||||
|
@ -458,10 +470,10 @@ class ComparisonTestFramework(BitcoinTestFramework):
|
||||||
extra_args = [['-whitelist=127.0.0.1']] * self.num_nodes
|
extra_args = [['-whitelist=127.0.0.1']] * self.num_nodes
|
||||||
if hasattr(self, "extra_args"):
|
if hasattr(self, "extra_args"):
|
||||||
extra_args = self.extra_args
|
extra_args = self.extra_args
|
||||||
self.nodes = self.start_nodes(
|
self.add_nodes(self.num_nodes, extra_args,
|
||||||
self.num_nodes, self.options.tmpdir, extra_args,
|
|
||||||
binary=[self.options.testbinary] +
|
binary=[self.options.testbinary] +
|
||||||
[self.options.refbinary] * (self.num_nodes - 1))
|
[self.options.refbinary] * (self.num_nodes - 1))
|
||||||
|
self.start_nodes()
|
||||||
|
|
||||||
class SkipTest(Exception):
|
class SkipTest(Exception):
|
||||||
"""This exception is raised to skip a test"""
|
"""This exception is raised to skip a test"""
|
||||||
|
|
|
@ -65,9 +65,13 @@ class TestNode():
|
||||||
assert self.rpc_connected and self.rpc is not None, "Error: no RPC connection"
|
assert self.rpc_connected and self.rpc is not None, "Error: no RPC connection"
|
||||||
return self.rpc.__getattr__(*args, **kwargs)
|
return self.rpc.__getattr__(*args, **kwargs)
|
||||||
|
|
||||||
def start(self):
|
def start(self, extra_args=None, stderr=None):
|
||||||
"""Start the node."""
|
"""Start the node."""
|
||||||
self.process = subprocess.Popen(self.args + self.extra_args, stderr=self.stderr)
|
if extra_args is None:
|
||||||
|
extra_args = self.extra_args
|
||||||
|
if stderr is None:
|
||||||
|
stderr = self.stderr
|
||||||
|
self.process = subprocess.Popen(self.args + extra_args, stderr=stderr)
|
||||||
self.running = True
|
self.running = True
|
||||||
self.log.debug("bitcoind started, waiting for RPC to come up")
|
self.log.debug("bitcoind started, waiting for RPC to come up")
|
||||||
|
|
||||||
|
@ -78,7 +82,7 @@ class TestNode():
|
||||||
for _ in range(poll_per_s * self.rpc_timeout):
|
for _ in range(poll_per_s * self.rpc_timeout):
|
||||||
assert self.process.poll() is None, "bitcoind exited with status %i during initialization" % self.process.returncode
|
assert self.process.poll() is None, "bitcoind exited with status %i during initialization" % self.process.returncode
|
||||||
try:
|
try:
|
||||||
self.rpc = get_rpc_proxy(rpc_url(self.datadir, self.index, self.rpchost), self.index, coveragedir=self.coverage_dir)
|
self.rpc = get_rpc_proxy(rpc_url(self.datadir, self.index, self.rpchost), self.index, timeout=self.rpc_timeout, coveragedir=self.coverage_dir)
|
||||||
self.rpc.getblockcount()
|
self.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.rpc_connected = True
|
self.rpc_connected = True
|
||||||
|
|
|
@ -8,11 +8,8 @@ from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import *
|
from test_framework.util import *
|
||||||
|
|
||||||
class TxnMallTest(BitcoinTestFramework):
|
class TxnMallTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 4
|
self.num_nodes = 4
|
||||||
self.setup_clean_chain = False
|
|
||||||
|
|
||||||
def add_options(self, parser):
|
def add_options(self, parser):
|
||||||
parser.add_option("--mineblock", dest="mine_block", default=False, action="store_true",
|
parser.add_option("--mineblock", dest="mine_block", default=False, action="store_true",
|
||||||
|
|
|
@ -8,11 +8,8 @@ from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import *
|
from test_framework.util import *
|
||||||
|
|
||||||
class TxnMallTest(BitcoinTestFramework):
|
class TxnMallTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 4
|
self.num_nodes = 4
|
||||||
self.setup_clean_chain = False
|
|
||||||
|
|
||||||
def add_options(self, parser):
|
def add_options(self, parser):
|
||||||
parser.add_option("--mineblock", dest="mine_block", default=False, action="store_true",
|
parser.add_option("--mineblock", dest="mine_block", default=False, action="store_true",
|
||||||
|
|
|
@ -13,9 +13,7 @@ from test_framework.test_framework import BitcoinTestFramework
|
||||||
|
|
||||||
|
|
||||||
class UptimeTest(BitcoinTestFramework):
|
class UptimeTest(BitcoinTestFramework):
|
||||||
def __init__(self):
|
def set_test_params(self):
|
||||||
super().__init__()
|
|
||||||
|
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
|
|
||||||
|
|
|
@ -17,9 +17,7 @@ from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import assert_equal
|
from test_framework.util import assert_equal
|
||||||
|
|
||||||
class WalletAccountsTest(BitcoinTestFramework):
|
class WalletAccountsTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
self.extra_args = [[]]
|
self.extra_args = [[]]
|
||||||
|
|
|
@ -56,10 +56,7 @@ def read_dump(file_name, addrs, hd_master_addr_old):
|
||||||
|
|
||||||
|
|
||||||
class WalletDumpTest(BitcoinTestFramework):
|
class WalletDumpTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = False
|
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
self.extra_args = [["-keypool=90"]]
|
self.extra_args = [["-keypool=90"]]
|
||||||
|
|
||||||
|
@ -68,7 +65,8 @@ class WalletDumpTest(BitcoinTestFramework):
|
||||||
# longer than the default 30 seconds due to an expensive
|
# longer than the default 30 seconds due to an expensive
|
||||||
# CWallet::TopUpKeyPool call, and the encryptwallet RPC made later in
|
# CWallet::TopUpKeyPool call, and the encryptwallet RPC made later in
|
||||||
# the test often takes even longer.
|
# the test often takes even longer.
|
||||||
self.nodes = self.start_nodes(self.num_nodes, self.options.tmpdir, self.extra_args, timewait=60)
|
self.add_nodes(self.num_nodes, self.extra_args, timewait=60)
|
||||||
|
self.start_nodes()
|
||||||
|
|
||||||
def run_test (self):
|
def run_test (self):
|
||||||
tmpdir = self.options.tmpdir
|
tmpdir = self.options.tmpdir
|
||||||
|
@ -95,7 +93,7 @@ class WalletDumpTest(BitcoinTestFramework):
|
||||||
|
|
||||||
#encrypt wallet, restart, unlock and dump
|
#encrypt wallet, restart, unlock and dump
|
||||||
self.nodes[0].node_encrypt_wallet('test')
|
self.nodes[0].node_encrypt_wallet('test')
|
||||||
self.nodes[0] = self.start_node(0, self.options.tmpdir, self.extra_args[0])
|
self.start_node(0)
|
||||||
self.nodes[0].walletpassphrase('test', 10)
|
self.nodes[0].walletpassphrase('test', 10)
|
||||||
# Should be a no-op:
|
# Should be a no-op:
|
||||||
self.nodes[0].keypoolrefill()
|
self.nodes[0].keypoolrefill()
|
||||||
|
|
|
@ -13,9 +13,7 @@ from test_framework.util import (
|
||||||
)
|
)
|
||||||
|
|
||||||
class WalletEncryptionTest(BitcoinTestFramework):
|
class WalletEncryptionTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 1
|
self.num_nodes = 1
|
||||||
|
|
||||||
|
@ -31,7 +29,7 @@ class WalletEncryptionTest(BitcoinTestFramework):
|
||||||
|
|
||||||
# Encrypt the wallet
|
# Encrypt the wallet
|
||||||
self.nodes[0].node_encrypt_wallet(passphrase)
|
self.nodes[0].node_encrypt_wallet(passphrase)
|
||||||
self.nodes[0] = self.start_node(0, self.options.tmpdir)
|
self.start_node(0)
|
||||||
|
|
||||||
# Test that the wallet is encrypted
|
# Test that the wallet is encrypted
|
||||||
assert_raises_jsonrpc(-13, "Please enter the wallet passphrase with walletpassphrase first", self.nodes[0].dumpprivkey, address)
|
assert_raises_jsonrpc(-13, "Please enter the wallet passphrase with walletpassphrase first", self.nodes[0].dumpprivkey, address)
|
||||||
|
|
|
@ -11,11 +11,8 @@ from test_framework.util import (
|
||||||
)
|
)
|
||||||
import shutil
|
import shutil
|
||||||
|
|
||||||
|
|
||||||
class WalletHDTest(BitcoinTestFramework):
|
class WalletHDTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
self.extra_args = [['-usehd=0'], ['-usehd=1', '-keypool=0']]
|
self.extra_args = [['-usehd=0'], ['-usehd=1', '-keypool=0']]
|
||||||
|
@ -25,8 +22,8 @@ class WalletHDTest(BitcoinTestFramework):
|
||||||
|
|
||||||
# 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, self.options.tmpdir, ['-usehd=0'], 'already existing HD wallet')
|
self.assert_start_raises_init_error(1, ['-usehd=0'], 'already existing HD wallet')
|
||||||
self.nodes[1] = self.start_node(1, self.options.tmpdir, self.extra_args[1])
|
self.start_node(1)
|
||||||
connect_nodes_bi(self.nodes, 0, 1)
|
connect_nodes_bi(self.nodes, 0, 1)
|
||||||
|
|
||||||
# Make sure we use hd, keep masterkeyid
|
# Make sure we use hd, keep masterkeyid
|
||||||
|
@ -76,7 +73,7 @@ class WalletHDTest(BitcoinTestFramework):
|
||||||
shutil.rmtree(tmpdir + "/node1/regtest/blocks")
|
shutil.rmtree(tmpdir + "/node1/regtest/blocks")
|
||||||
shutil.rmtree(tmpdir + "/node1/regtest/chainstate")
|
shutil.rmtree(tmpdir + "/node1/regtest/chainstate")
|
||||||
shutil.copyfile(tmpdir + "/hd.bak", tmpdir + "/node1/regtest/wallet.dat")
|
shutil.copyfile(tmpdir + "/hd.bak", tmpdir + "/node1/regtest/wallet.dat")
|
||||||
self.nodes[1] = self.start_node(1, self.options.tmpdir, self.extra_args[1])
|
self.start_node(1)
|
||||||
|
|
||||||
# Assert that derivation is deterministic
|
# Assert that derivation is deterministic
|
||||||
hd_add_2 = None
|
hd_add_2 = None
|
||||||
|
@ -91,7 +88,7 @@ class WalletHDTest(BitcoinTestFramework):
|
||||||
|
|
||||||
# Needs rescan
|
# Needs rescan
|
||||||
self.stop_node(1)
|
self.stop_node(1)
|
||||||
self.nodes[1] = self.start_node(1, self.options.tmpdir, self.extra_args[1] + ['-rescan'])
|
self.start_node(1, extra_args=self.extra_args[1] + ['-rescan'])
|
||||||
assert_equal(self.nodes[1].getbalance(), num_hd_adds + 1)
|
assert_equal(self.nodes[1].getbalance(), num_hd_adds + 1)
|
||||||
|
|
||||||
# send a tx and make sure its using the internal chain for the changeoutput
|
# send a tx and make sure its using the internal chain for the changeoutput
|
||||||
|
|
|
@ -7,6 +7,20 @@ from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import *
|
from test_framework.util import *
|
||||||
|
|
||||||
class WalletTest(BitcoinTestFramework):
|
class WalletTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
|
self.num_nodes = 4
|
||||||
|
self.setup_clean_chain = True
|
||||||
|
self.extra_args = [['-usehd={:d}'.format(i%2==0)] for i in range(4)]
|
||||||
|
|
||||||
|
def setup_network(self):
|
||||||
|
self.add_nodes(4, self.extra_args)
|
||||||
|
self.start_node(0)
|
||||||
|
self.start_node(1)
|
||||||
|
self.start_node(2)
|
||||||
|
connect_nodes_bi(self.nodes,0,1)
|
||||||
|
connect_nodes_bi(self.nodes,1,2)
|
||||||
|
connect_nodes_bi(self.nodes,0,2)
|
||||||
|
self.sync_all([self.nodes[0:3]])
|
||||||
|
|
||||||
def check_fee_amount(self, curr_balance, balance_with_fee, fee_per_byte, tx_size):
|
def check_fee_amount(self, curr_balance, balance_with_fee, fee_per_byte, tx_size):
|
||||||
"""Return curr_balance after asserting the fee was in range"""
|
"""Return curr_balance after asserting the fee was in range"""
|
||||||
|
@ -14,21 +28,7 @@ class WalletTest(BitcoinTestFramework):
|
||||||
assert_fee_amount(fee, tx_size, fee_per_byte * 1000)
|
assert_fee_amount(fee, tx_size, fee_per_byte * 1000)
|
||||||
return curr_balance
|
return curr_balance
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
|
||||||
self.num_nodes = 4
|
|
||||||
self.extra_args = [['-usehd={:d}'.format(i%2==0)] for i in range(4)]
|
|
||||||
|
|
||||||
def setup_network(self):
|
|
||||||
self.nodes = self.start_nodes(3, self.options.tmpdir, self.extra_args[:3])
|
|
||||||
connect_nodes_bi(self.nodes,0,1)
|
|
||||||
connect_nodes_bi(self.nodes,1,2)
|
|
||||||
connect_nodes_bi(self.nodes,0,2)
|
|
||||||
self.sync_all()
|
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
|
|
||||||
# Check that there's no UTXO on none of the nodes
|
# Check that there's no UTXO on none of the nodes
|
||||||
assert_equal(len(self.nodes[0].listunspent()), 0)
|
assert_equal(len(self.nodes[0].listunspent()), 0)
|
||||||
assert_equal(len(self.nodes[1].listunspent()), 0)
|
assert_equal(len(self.nodes[1].listunspent()), 0)
|
||||||
|
@ -42,9 +42,9 @@ class WalletTest(BitcoinTestFramework):
|
||||||
assert_equal(walletinfo['immature_balance'], 50)
|
assert_equal(walletinfo['immature_balance'], 50)
|
||||||
assert_equal(walletinfo['balance'], 0)
|
assert_equal(walletinfo['balance'], 0)
|
||||||
|
|
||||||
self.sync_all()
|
self.sync_all([self.nodes[0:3]])
|
||||||
self.nodes[1].generate(101)
|
self.nodes[1].generate(101)
|
||||||
self.sync_all()
|
self.sync_all([self.nodes[0:3]])
|
||||||
|
|
||||||
assert_equal(self.nodes[0].getbalance(), 50)
|
assert_equal(self.nodes[0].getbalance(), 50)
|
||||||
assert_equal(self.nodes[1].getbalance(), 50)
|
assert_equal(self.nodes[1].getbalance(), 50)
|
||||||
|
@ -96,7 +96,7 @@ class WalletTest(BitcoinTestFramework):
|
||||||
|
|
||||||
# Have node0 mine a block, thus it will collect its own fee.
|
# Have node0 mine a block, thus it will collect its own fee.
|
||||||
self.nodes[0].generate(1)
|
self.nodes[0].generate(1)
|
||||||
self.sync_all()
|
self.sync_all([self.nodes[0:3]])
|
||||||
|
|
||||||
# Exercise locking of unspent outputs
|
# Exercise locking of unspent outputs
|
||||||
unspent_0 = self.nodes[2].listunspent()[0]
|
unspent_0 = self.nodes[2].listunspent()[0]
|
||||||
|
@ -109,7 +109,7 @@ class WalletTest(BitcoinTestFramework):
|
||||||
|
|
||||||
# Have node1 generate 100 blocks (so node0 can recover the fee)
|
# Have node1 generate 100 blocks (so node0 can recover the fee)
|
||||||
self.nodes[1].generate(100)
|
self.nodes[1].generate(100)
|
||||||
self.sync_all()
|
self.sync_all([self.nodes[0:3]])
|
||||||
|
|
||||||
# node0 should end up with 100 btc in block rewards plus fees, but
|
# node0 should end up with 100 btc in block rewards plus fees, but
|
||||||
# minus the 21 plus fees sent to node2
|
# minus the 21 plus fees sent to node2
|
||||||
|
@ -138,7 +138,7 @@ class WalletTest(BitcoinTestFramework):
|
||||||
|
|
||||||
# Have node1 mine a block to confirm transactions:
|
# Have node1 mine a block to confirm transactions:
|
||||||
self.nodes[1].generate(1)
|
self.nodes[1].generate(1)
|
||||||
self.sync_all()
|
self.sync_all([self.nodes[0:3]])
|
||||||
|
|
||||||
assert_equal(self.nodes[0].getbalance(), 0)
|
assert_equal(self.nodes[0].getbalance(), 0)
|
||||||
assert_equal(self.nodes[2].getbalance(), 94)
|
assert_equal(self.nodes[2].getbalance(), 94)
|
||||||
|
@ -150,14 +150,14 @@ class WalletTest(BitcoinTestFramework):
|
||||||
self.nodes[2].settxfee(fee_per_byte * 1000)
|
self.nodes[2].settxfee(fee_per_byte * 1000)
|
||||||
txid = self.nodes[2].sendtoaddress(address, 10, "", "", False)
|
txid = self.nodes[2].sendtoaddress(address, 10, "", "", False)
|
||||||
self.nodes[2].generate(1)
|
self.nodes[2].generate(1)
|
||||||
self.sync_all()
|
self.sync_all([self.nodes[0:3]])
|
||||||
node_2_bal = self.check_fee_amount(self.nodes[2].getbalance(), Decimal('84'), fee_per_byte, count_bytes(self.nodes[2].getrawtransaction(txid)))
|
node_2_bal = self.check_fee_amount(self.nodes[2].getbalance(), Decimal('84'), fee_per_byte, count_bytes(self.nodes[2].getrawtransaction(txid)))
|
||||||
assert_equal(self.nodes[0].getbalance(), Decimal('10'))
|
assert_equal(self.nodes[0].getbalance(), Decimal('10'))
|
||||||
|
|
||||||
# Send 10 BTC with subtract fee from amount
|
# Send 10 BTC with subtract fee from amount
|
||||||
txid = self.nodes[2].sendtoaddress(address, 10, "", "", True)
|
txid = self.nodes[2].sendtoaddress(address, 10, "", "", True)
|
||||||
self.nodes[2].generate(1)
|
self.nodes[2].generate(1)
|
||||||
self.sync_all()
|
self.sync_all([self.nodes[0:3]])
|
||||||
node_2_bal -= Decimal('10')
|
node_2_bal -= Decimal('10')
|
||||||
assert_equal(self.nodes[2].getbalance(), node_2_bal)
|
assert_equal(self.nodes[2].getbalance(), node_2_bal)
|
||||||
node_0_bal = self.check_fee_amount(self.nodes[0].getbalance(), Decimal('20'), fee_per_byte, count_bytes(self.nodes[2].getrawtransaction(txid)))
|
node_0_bal = self.check_fee_amount(self.nodes[0].getbalance(), Decimal('20'), fee_per_byte, count_bytes(self.nodes[2].getrawtransaction(txid)))
|
||||||
|
@ -165,7 +165,7 @@ class WalletTest(BitcoinTestFramework):
|
||||||
# Sendmany 10 BTC
|
# Sendmany 10 BTC
|
||||||
txid = self.nodes[2].sendmany('from1', {address: 10}, 0, "", [])
|
txid = self.nodes[2].sendmany('from1', {address: 10}, 0, "", [])
|
||||||
self.nodes[2].generate(1)
|
self.nodes[2].generate(1)
|
||||||
self.sync_all()
|
self.sync_all([self.nodes[0:3]])
|
||||||
node_0_bal += Decimal('10')
|
node_0_bal += Decimal('10')
|
||||||
node_2_bal = self.check_fee_amount(self.nodes[2].getbalance(), node_2_bal - Decimal('10'), fee_per_byte, count_bytes(self.nodes[2].getrawtransaction(txid)))
|
node_2_bal = self.check_fee_amount(self.nodes[2].getbalance(), node_2_bal - Decimal('10'), fee_per_byte, count_bytes(self.nodes[2].getrawtransaction(txid)))
|
||||||
assert_equal(self.nodes[0].getbalance(), node_0_bal)
|
assert_equal(self.nodes[0].getbalance(), node_0_bal)
|
||||||
|
@ -173,7 +173,7 @@ class WalletTest(BitcoinTestFramework):
|
||||||
# Sendmany 10 BTC with subtract fee from amount
|
# Sendmany 10 BTC with subtract fee from amount
|
||||||
txid = self.nodes[2].sendmany('from1', {address: 10}, 0, "", [address])
|
txid = self.nodes[2].sendmany('from1', {address: 10}, 0, "", [address])
|
||||||
self.nodes[2].generate(1)
|
self.nodes[2].generate(1)
|
||||||
self.sync_all()
|
self.sync_all([self.nodes[0:3]])
|
||||||
node_2_bal -= Decimal('10')
|
node_2_bal -= Decimal('10')
|
||||||
assert_equal(self.nodes[2].getbalance(), node_2_bal)
|
assert_equal(self.nodes[2].getbalance(), node_2_bal)
|
||||||
node_0_bal = self.check_fee_amount(self.nodes[0].getbalance(), node_0_bal + Decimal('10'), fee_per_byte, count_bytes(self.nodes[2].getrawtransaction(txid)))
|
node_0_bal = self.check_fee_amount(self.nodes[0].getbalance(), node_0_bal + Decimal('10'), fee_per_byte, count_bytes(self.nodes[2].getrawtransaction(txid)))
|
||||||
|
@ -184,9 +184,9 @@ class WalletTest(BitcoinTestFramework):
|
||||||
# EXPECT: nodes[3] should have those transactions in its mempool.
|
# EXPECT: nodes[3] should have those transactions in its mempool.
|
||||||
txid1 = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 1)
|
txid1 = self.nodes[0].sendtoaddress(self.nodes[1].getnewaddress(), 1)
|
||||||
txid2 = self.nodes[1].sendtoaddress(self.nodes[0].getnewaddress(), 1)
|
txid2 = self.nodes[1].sendtoaddress(self.nodes[0].getnewaddress(), 1)
|
||||||
sync_mempools(self.nodes)
|
sync_mempools(self.nodes[0:2])
|
||||||
|
|
||||||
self.nodes.append(self.start_node(3, self.options.tmpdir, self.extra_args[3]))
|
self.start_node(3)
|
||||||
connect_nodes_bi(self.nodes, 0, 3)
|
connect_nodes_bi(self.nodes, 0, 3)
|
||||||
sync_blocks(self.nodes)
|
sync_blocks(self.nodes)
|
||||||
|
|
||||||
|
@ -230,22 +230,24 @@ class WalletTest(BitcoinTestFramework):
|
||||||
|
|
||||||
#do some -walletbroadcast tests
|
#do some -walletbroadcast tests
|
||||||
self.stop_nodes()
|
self.stop_nodes()
|
||||||
self.nodes = self.start_nodes(3, self.options.tmpdir, [["-walletbroadcast=0"],["-walletbroadcast=0"],["-walletbroadcast=0"]])
|
self.start_node(0, ["-walletbroadcast=0"])
|
||||||
|
self.start_node(1, ["-walletbroadcast=0"])
|
||||||
|
self.start_node(2, ["-walletbroadcast=0"])
|
||||||
connect_nodes_bi(self.nodes,0,1)
|
connect_nodes_bi(self.nodes,0,1)
|
||||||
connect_nodes_bi(self.nodes,1,2)
|
connect_nodes_bi(self.nodes,1,2)
|
||||||
connect_nodes_bi(self.nodes,0,2)
|
connect_nodes_bi(self.nodes,0,2)
|
||||||
self.sync_all()
|
self.sync_all([self.nodes[0:3]])
|
||||||
|
|
||||||
txIdNotBroadcasted = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 2)
|
txIdNotBroadcasted = self.nodes[0].sendtoaddress(self.nodes[2].getnewaddress(), 2)
|
||||||
txObjNotBroadcasted = self.nodes[0].gettransaction(txIdNotBroadcasted)
|
txObjNotBroadcasted = self.nodes[0].gettransaction(txIdNotBroadcasted)
|
||||||
self.nodes[1].generate(1) #mine a block, tx should not be in there
|
self.nodes[1].generate(1) #mine a block, tx should not be in there
|
||||||
self.sync_all()
|
self.sync_all([self.nodes[0:3]])
|
||||||
assert_equal(self.nodes[2].getbalance(), node_2_bal) #should not be changed because tx was not broadcasted
|
assert_equal(self.nodes[2].getbalance(), node_2_bal) #should not be changed because tx was not broadcasted
|
||||||
|
|
||||||
#now broadcast from another node, mine a block, sync, and check the balance
|
#now broadcast from another node, mine a block, sync, and check the balance
|
||||||
self.nodes[1].sendrawtransaction(txObjNotBroadcasted['hex'])
|
self.nodes[1].sendrawtransaction(txObjNotBroadcasted['hex'])
|
||||||
self.nodes[1].generate(1)
|
self.nodes[1].generate(1)
|
||||||
self.sync_all()
|
self.sync_all([self.nodes[0:3]])
|
||||||
node_2_bal += 2
|
node_2_bal += 2
|
||||||
txObjNotBroadcasted = self.nodes[0].gettransaction(txIdNotBroadcasted)
|
txObjNotBroadcasted = self.nodes[0].gettransaction(txIdNotBroadcasted)
|
||||||
assert_equal(self.nodes[2].getbalance(), node_2_bal)
|
assert_equal(self.nodes[2].getbalance(), node_2_bal)
|
||||||
|
@ -255,14 +257,16 @@ class WalletTest(BitcoinTestFramework):
|
||||||
|
|
||||||
#restart the nodes with -walletbroadcast=1
|
#restart the nodes with -walletbroadcast=1
|
||||||
self.stop_nodes()
|
self.stop_nodes()
|
||||||
self.nodes = self.start_nodes(3, self.options.tmpdir)
|
self.start_node(0)
|
||||||
|
self.start_node(1)
|
||||||
|
self.start_node(2)
|
||||||
connect_nodes_bi(self.nodes,0,1)
|
connect_nodes_bi(self.nodes,0,1)
|
||||||
connect_nodes_bi(self.nodes,1,2)
|
connect_nodes_bi(self.nodes,1,2)
|
||||||
connect_nodes_bi(self.nodes,0,2)
|
connect_nodes_bi(self.nodes,0,2)
|
||||||
sync_blocks(self.nodes)
|
sync_blocks(self.nodes[0:3])
|
||||||
|
|
||||||
self.nodes[0].generate(1)
|
self.nodes[0].generate(1)
|
||||||
sync_blocks(self.nodes)
|
sync_blocks(self.nodes[0:3])
|
||||||
node_2_bal += 2
|
node_2_bal += 2
|
||||||
|
|
||||||
#tx should be added to balance because after restarting the nodes tx should be broadcastet
|
#tx should be added to balance because after restarting the nodes tx should be broadcastet
|
||||||
|
@ -293,7 +297,7 @@ class WalletTest(BitcoinTestFramework):
|
||||||
address_to_import = self.nodes[2].getnewaddress()
|
address_to_import = self.nodes[2].getnewaddress()
|
||||||
txid = self.nodes[0].sendtoaddress(address_to_import, 1)
|
txid = self.nodes[0].sendtoaddress(address_to_import, 1)
|
||||||
self.nodes[0].generate(1)
|
self.nodes[0].generate(1)
|
||||||
self.sync_all()
|
self.sync_all([self.nodes[0:3]])
|
||||||
|
|
||||||
# 2. Import address from node2 to node1
|
# 2. Import address from node2 to node1
|
||||||
self.nodes[1].importaddress(address_to_import)
|
self.nodes[1].importaddress(address_to_import)
|
||||||
|
@ -319,15 +323,15 @@ class WalletTest(BitcoinTestFramework):
|
||||||
cbAddr = self.nodes[1].getnewaddress()
|
cbAddr = self.nodes[1].getnewaddress()
|
||||||
blkHash = self.nodes[0].generatetoaddress(1, cbAddr)[0]
|
blkHash = self.nodes[0].generatetoaddress(1, cbAddr)[0]
|
||||||
cbTxId = self.nodes[0].getblock(blkHash)['tx'][0]
|
cbTxId = self.nodes[0].getblock(blkHash)['tx'][0]
|
||||||
self.sync_all()
|
self.sync_all([self.nodes[0:3]])
|
||||||
|
|
||||||
# Check that the txid and balance is found by node1
|
# Check that the txid and balance is found by node1
|
||||||
self.nodes[1].gettransaction(cbTxId)
|
self.nodes[1].gettransaction(cbTxId)
|
||||||
|
|
||||||
# check if wallet or blockchain maintenance changes the balance
|
# check if wallet or blockchain maintenance changes the balance
|
||||||
self.sync_all()
|
self.sync_all([self.nodes[0:3]])
|
||||||
blocks = self.nodes[0].generate(2)
|
blocks = self.nodes[0].generate(2)
|
||||||
self.sync_all()
|
self.sync_all([self.nodes[0:3]])
|
||||||
balance_nodes = [self.nodes[i].getbalance() for i in range(3)]
|
balance_nodes = [self.nodes[i].getbalance() for i in range(3)]
|
||||||
block_count = self.nodes[0].getblockcount()
|
block_count = self.nodes[0].getblockcount()
|
||||||
|
|
||||||
|
@ -358,7 +362,9 @@ class WalletTest(BitcoinTestFramework):
|
||||||
self.log.info("check " + m)
|
self.log.info("check " + m)
|
||||||
self.stop_nodes()
|
self.stop_nodes()
|
||||||
# set lower ancestor limit for later
|
# set lower ancestor limit for later
|
||||||
self.nodes = self.start_nodes(3, self.options.tmpdir, [[m, "-limitancestorcount="+str(chainlimit)]] * 3)
|
self.start_node(0, [m, "-limitancestorcount="+str(chainlimit)])
|
||||||
|
self.start_node(1, [m, "-limitancestorcount="+str(chainlimit)])
|
||||||
|
self.start_node(2, [m, "-limitancestorcount="+str(chainlimit)])
|
||||||
while m == '-reindex' and [block_count] * 3 != [self.nodes[i].getblockcount() for i in range(3)]:
|
while m == '-reindex' and [block_count] * 3 != [self.nodes[i].getblockcount() for i in range(3)]:
|
||||||
# reindex will leave rpc warm up "early"; Wait for it to finish
|
# reindex will leave rpc warm up "early"; Wait for it to finish
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
|
@ -406,7 +412,7 @@ class WalletTest(BitcoinTestFramework):
|
||||||
# Try with walletrejectlongchains
|
# Try with walletrejectlongchains
|
||||||
# Double chain limit but require combining inputs, so we pass SelectCoinsMinConf
|
# Double chain limit but require combining inputs, so we pass SelectCoinsMinConf
|
||||||
self.stop_node(0)
|
self.stop_node(0)
|
||||||
self.nodes[0] = self.start_node(0, self.options.tmpdir, ["-walletrejectlongchains", "-limitancestorcount="+str(2*chainlimit)])
|
self.start_node(0, extra_args=["-walletrejectlongchains", "-limitancestorcount="+str(2*chainlimit)])
|
||||||
|
|
||||||
# wait for loadmempool
|
# wait for loadmempool
|
||||||
timeout = 10
|
timeout = 10
|
||||||
|
|
|
@ -37,11 +37,9 @@ from test_framework.test_framework import BitcoinTestFramework
|
||||||
from test_framework.util import *
|
from test_framework.util import *
|
||||||
|
|
||||||
class WalletBackupTest(BitcoinTestFramework):
|
class WalletBackupTest(BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
|
||||||
self.num_nodes = 4
|
self.num_nodes = 4
|
||||||
|
self.setup_clean_chain = True
|
||||||
# nodes 1, 2,3 are spenders, let's give them a keypool=100
|
# nodes 1, 2,3 are spenders, let's give them a keypool=100
|
||||||
self.extra_args = [["-keypool=100"], ["-keypool=100"], ["-keypool=100"], []]
|
self.extra_args = [["-keypool=100"], ["-keypool=100"], ["-keypool=100"], []]
|
||||||
|
|
||||||
|
@ -78,9 +76,9 @@ class WalletBackupTest(BitcoinTestFramework):
|
||||||
|
|
||||||
# As above, this mirrors the original bash test.
|
# As above, this mirrors the original bash test.
|
||||||
def start_three(self):
|
def start_three(self):
|
||||||
self.nodes[0] = self.start_node(0, self.options.tmpdir)
|
self.start_node(0)
|
||||||
self.nodes[1] = self.start_node(1, self.options.tmpdir)
|
self.start_node(1)
|
||||||
self.nodes[2] = self.start_node(2, self.options.tmpdir)
|
self.start_node(2)
|
||||||
connect_nodes(self.nodes[0], 3)
|
connect_nodes(self.nodes[0], 3)
|
||||||
connect_nodes(self.nodes[1], 3)
|
connect_nodes(self.nodes[1], 3)
|
||||||
connect_nodes(self.nodes[2], 3)
|
connect_nodes(self.nodes[2], 3)
|
||||||
|
|
|
@ -20,9 +20,7 @@ from test_framework.util import (assert_equal,
|
||||||
)
|
)
|
||||||
|
|
||||||
class ZapWalletTXesTest (BitcoinTestFramework):
|
class ZapWalletTXesTest (BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.setup_clean_chain = True
|
self.setup_clean_chain = True
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
|
|
||||||
|
@ -48,7 +46,7 @@ class ZapWalletTXesTest (BitcoinTestFramework):
|
||||||
|
|
||||||
# Stop-start node0. Both confirmed and unconfirmed transactions remain in the wallet.
|
# Stop-start node0. Both confirmed and unconfirmed transactions remain in the wallet.
|
||||||
self.stop_node(0)
|
self.stop_node(0)
|
||||||
self.nodes[0] = self.start_node(0, self.options.tmpdir)
|
self.start_node(0)
|
||||||
|
|
||||||
assert_equal(self.nodes[0].gettransaction(txid1)['txid'], txid1)
|
assert_equal(self.nodes[0].gettransaction(txid1)['txid'], txid1)
|
||||||
assert_equal(self.nodes[0].gettransaction(txid2)['txid'], txid2)
|
assert_equal(self.nodes[0].gettransaction(txid2)['txid'], txid2)
|
||||||
|
@ -56,7 +54,7 @@ class ZapWalletTXesTest (BitcoinTestFramework):
|
||||||
# Stop node0 and restart with zapwallettxes and persistmempool. The unconfirmed
|
# Stop node0 and restart with zapwallettxes and persistmempool. The unconfirmed
|
||||||
# transaction is zapped from the wallet, but is re-added when the mempool is reloaded.
|
# transaction is zapped from the wallet, but is re-added when the mempool is reloaded.
|
||||||
self.stop_node(0)
|
self.stop_node(0)
|
||||||
self.nodes[0] = self.start_node(0, self.options.tmpdir, ["-persistmempool=1", "-zapwallettxes=2"])
|
self.start_node(0, ["-persistmempool=1", "-zapwallettxes=2"])
|
||||||
|
|
||||||
assert_equal(self.nodes[0].gettransaction(txid1)['txid'], txid1)
|
assert_equal(self.nodes[0].gettransaction(txid1)['txid'], txid1)
|
||||||
assert_equal(self.nodes[0].gettransaction(txid2)['txid'], txid2)
|
assert_equal(self.nodes[0].gettransaction(txid2)['txid'], txid2)
|
||||||
|
@ -64,7 +62,7 @@ class ZapWalletTXesTest (BitcoinTestFramework):
|
||||||
# Stop node0 and restart with zapwallettxes, but not persistmempool.
|
# Stop node0 and restart with zapwallettxes, but not persistmempool.
|
||||||
# The unconfirmed transaction is zapped and is no longer in the wallet.
|
# The unconfirmed transaction is zapped and is no longer in the wallet.
|
||||||
self.stop_node(0)
|
self.stop_node(0)
|
||||||
self.nodes[0] = self.start_node(0, self.options.tmpdir, ["-zapwallettxes=2"])
|
self.start_node(0, ["-zapwallettxes=2"])
|
||||||
|
|
||||||
# tx1 is still be available because it was confirmed
|
# tx1 is still be available because it was confirmed
|
||||||
assert_equal(self.nodes[0].gettransaction(txid1)['txid'], txid1)
|
assert_equal(self.nodes[0].gettransaction(txid1)['txid'], txid1)
|
||||||
|
|
|
@ -13,9 +13,7 @@ from test_framework.util import (assert_equal,
|
||||||
)
|
)
|
||||||
|
|
||||||
class ZMQTest (BitcoinTestFramework):
|
class ZMQTest (BitcoinTestFramework):
|
||||||
|
def set_test_params(self):
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.num_nodes = 2
|
self.num_nodes = 2
|
||||||
|
|
||||||
def setup_nodes(self):
|
def setup_nodes(self):
|
||||||
|
@ -41,8 +39,9 @@ class ZMQTest (BitcoinTestFramework):
|
||||||
self.zmqSubSocket.setsockopt(zmq.SUBSCRIBE, b"hashtx")
|
self.zmqSubSocket.setsockopt(zmq.SUBSCRIBE, b"hashtx")
|
||||||
ip_address = "tcp://127.0.0.1:28332"
|
ip_address = "tcp://127.0.0.1:28332"
|
||||||
self.zmqSubSocket.connect(ip_address)
|
self.zmqSubSocket.connect(ip_address)
|
||||||
extra_args = [['-zmqpubhashtx=%s' % ip_address, '-zmqpubhashblock=%s' % ip_address], []]
|
self.extra_args = [['-zmqpubhashtx=%s' % ip_address, '-zmqpubhashblock=%s' % ip_address], []]
|
||||||
self.nodes = self.start_nodes(self.num_nodes, self.options.tmpdir, extra_args)
|
self.add_nodes(self.num_nodes, self.extra_args)
|
||||||
|
self.start_nodes()
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
try:
|
try:
|
||||||
|
|
Loading…
Reference in a new issue