Changeset View
Changeset View
Standalone View
Standalone View
test/functional/wallet_basic.py
Show All 18 Lines | from test_framework.util import ( | ||||
sync_mempools, | sync_mempools, | ||||
wait_until, | wait_until, | ||||
) | ) | ||||
class WalletTest(BitcoinTestFramework): | class WalletTest(BitcoinTestFramework): | ||||
def set_test_params(self): | def set_test_params(self): | ||||
self.num_nodes = 4 | self.num_nodes = 4 | ||||
self.extra_args = [ | |||||
["-acceptnonstdtxn=1"], | |||||
] * self.num_nodes | |||||
self.setup_clean_chain = True | self.setup_clean_chain = True | ||||
def skip_test_if_missing_module(self): | def skip_test_if_missing_module(self): | ||||
self.skip_if_no_wallet() | self.skip_if_no_wallet() | ||||
def setup_network(self): | def setup_network(self): | ||||
self.add_nodes(4) | self.add_nodes(4) | ||||
self.start_node(0) | self.start_node(0, self.extra_args[0]) | ||||
self.start_node(1) | self.start_node(1, self.extra_args[1]) | ||||
self.start_node(2) | self.start_node(2, self.extra_args[2]) | ||||
connect_nodes_bi(self.nodes[0], self.nodes[1]) | connect_nodes_bi(self.nodes[0], self.nodes[1]) | ||||
connect_nodes_bi(self.nodes[1], self.nodes[2]) | connect_nodes_bi(self.nodes[1], self.nodes[2]) | ||||
connect_nodes_bi(self.nodes[0], self.nodes[2]) | connect_nodes_bi(self.nodes[0], self.nodes[2]) | ||||
self.sync_all([self.nodes[0:3]]) | self.sync_all([self.nodes[0:3]]) | ||||
def check_fee_amount(self, curr_balance, | def check_fee_amount(self, curr_balance, | ||||
balance_with_fee, fee_per_byte, tx_size): | 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""" | ||||
▲ Show 20 Lines • Show All 193 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
# Test ResendWalletTransactions: | # Test ResendWalletTransactions: | ||||
# Create a couple of transactions, then start up a fourth | # Create a couple of transactions, then start up a fourth | ||||
# node (nodes[3]) and ask nodes[0] to rebroadcast. | # node (nodes[3]) and ask nodes[0] to rebroadcast. | ||||
# 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[0:2]) | sync_mempools(self.nodes[0:2]) | ||||
self.start_node(3) | self.start_node(3, self.extra_args[3]) | ||||
connect_nodes_bi(self.nodes[0], self.nodes[3]) | connect_nodes_bi(self.nodes[0], self.nodes[3]) | ||||
sync_blocks(self.nodes) | sync_blocks(self.nodes) | ||||
relayed = self.nodes[0].resendwallettransactions() | relayed = self.nodes[0].resendwallettransactions() | ||||
assert_equal(set(relayed), {txid1, txid2}) | assert_equal(set(relayed), {txid1, txid2}) | ||||
sync_mempools(self.nodes) | sync_mempools(self.nodes) | ||||
assert txid1 in self.nodes[3].getrawmempool() | assert txid1 in self.nodes[3].getrawmempool() | ||||
Show All 30 Lines | def run_test(self): | ||||
for uTx in unspentTxs: | for uTx in unspentTxs: | ||||
if uTx['txid'] == zeroValueTxid: | if uTx['txid'] == zeroValueTxid: | ||||
found = True | found = True | ||||
assert_equal(uTx['amount'], Decimal('0')) | assert_equal(uTx['amount'], Decimal('0')) | ||||
assert found | assert found | ||||
# do some -walletbroadcast tests | # do some -walletbroadcast tests | ||||
self.stop_nodes() | self.stop_nodes() | ||||
self.start_node(0, ["-walletbroadcast=0"]) | self.start_node(0, self.extra_args[0] + ["-walletbroadcast=0"]) | ||||
self.start_node(1, ["-walletbroadcast=0"]) | self.start_node(1, self.extra_args[1] + ["-walletbroadcast=0"]) | ||||
self.start_node(2, ["-walletbroadcast=0"]) | self.start_node(2, self.extra_args[2] + ["-walletbroadcast=0"]) | ||||
connect_nodes_bi(self.nodes[0], self.nodes[1]) | connect_nodes_bi(self.nodes[0], self.nodes[1]) | ||||
connect_nodes_bi(self.nodes[1], self.nodes[2]) | connect_nodes_bi(self.nodes[1], self.nodes[2]) | ||||
connect_nodes_bi(self.nodes[0], self.nodes[2]) | connect_nodes_bi(self.nodes[0], self.nodes[2]) | ||||
self.sync_all([self.nodes[0:3]]) | self.sync_all([self.nodes[0:3]]) | ||||
txIdNotBroadcasted = self.nodes[0].sendtoaddress( | txIdNotBroadcasted = self.nodes[0].sendtoaddress( | ||||
self.nodes[2].getnewaddress(), 2) | self.nodes[2].getnewaddress(), 2) | ||||
txObjNotBroadcasted = self.nodes[0].gettransaction(txIdNotBroadcasted) | txObjNotBroadcasted = self.nodes[0].gettransaction(txIdNotBroadcasted) | ||||
Show All 12 Lines | def run_test(self): | ||||
assert_equal(self.nodes[2].getbalance(), node_2_bal) | assert_equal(self.nodes[2].getbalance(), node_2_bal) | ||||
# create another tx | # create another tx | ||||
txIdNotBroadcasted = self.nodes[0].sendtoaddress( | txIdNotBroadcasted = self.nodes[0].sendtoaddress( | ||||
self.nodes[2].getnewaddress(), 2) | self.nodes[2].getnewaddress(), 2) | ||||
# restart the nodes with -walletbroadcast=1 | # restart the nodes with -walletbroadcast=1 | ||||
self.stop_nodes() | self.stop_nodes() | ||||
self.start_node(0) | self.start_node(0, self.extra_args[0]) | ||||
self.start_node(1) | self.start_node(1, self.extra_args[1]) | ||||
self.start_node(2) | self.start_node(2, self.extra_args[2]) | ||||
connect_nodes_bi(self.nodes[0], self.nodes[1]) | connect_nodes_bi(self.nodes[0], self.nodes[1]) | ||||
connect_nodes_bi(self.nodes[1], self.nodes[2]) | connect_nodes_bi(self.nodes[1], self.nodes[2]) | ||||
connect_nodes_bi(self.nodes[0], self.nodes[2]) | connect_nodes_bi(self.nodes[0], self.nodes[2]) | ||||
sync_blocks(self.nodes[0:3]) | sync_blocks(self.nodes[0:3]) | ||||
self.nodes[0].generate(1) | self.nodes[0].generate(1) | ||||
sync_blocks(self.nodes[0:3]) | sync_blocks(self.nodes[0:3]) | ||||
node_2_bal += 2 | node_2_bal += 2 | ||||
▲ Show 20 Lines • Show All 94 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
# disabled until issue is fixed: https://github.com/bitcoin/bitcoin/issues/7463 | # disabled until issue is fixed: https://github.com/bitcoin/bitcoin/issues/7463 | ||||
# '-salvagewallet', | # '-salvagewallet', | ||||
] | ] | ||||
chainlimit = 6 | chainlimit = 6 | ||||
for m in maintenance: | for m in maintenance: | ||||
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.start_node(0, [m, "-limitancestorcount=" + str(chainlimit)]) | self.start_node( | ||||
self.start_node(1, [m, "-limitancestorcount=" + str(chainlimit)]) | 0, self.extra_args[0] + [m, "-limitancestorcount=" + str(chainlimit)]) | ||||
self.start_node(2, [m, "-limitancestorcount=" + str(chainlimit)]) | self.start_node( | ||||
1, self.extra_args[1] + [m, "-limitancestorcount=" + str(chainlimit)]) | |||||
self.start_node( | |||||
2, self.extra_args[2] + [m, "-limitancestorcount=" + str(chainlimit)]) | |||||
if m == '-reindex': | if m == '-reindex': | ||||
# reindex will leave rpc warm up "early"; Wait for it to finish | # reindex will leave rpc warm up "early"; Wait for it to finish | ||||
wait_until(lambda: [block_count] * 3 == | wait_until(lambda: [block_count] * 3 == | ||||
[self.nodes[i].getblockcount() for i in range(3)]) | [self.nodes[i].getblockcount() for i in range(3)]) | ||||
assert_equal(balance_nodes, [ | assert_equal(balance_nodes, [ | ||||
self.nodes[i].getbalance() for i in range(3)]) | self.nodes[i].getbalance() for i in range(3)]) | ||||
# Exercise listsinceblock with the last two blocks | # Exercise listsinceblock with the last two blocks | ||||
▲ Show 20 Lines • Show All 42 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
for tx in self.nodes[0].listtransactions()] | for tx in self.nodes[0].listtransactions()] | ||||
self.nodes[0].abandontransaction(extra_txid) | self.nodes[0].abandontransaction(extra_txid) | ||||
total_txs = len(self.nodes[0].listtransactions("*", 99999)) | total_txs = len(self.nodes[0].listtransactions("*", 99999)) | ||||
# Try with walletrejectlongchains | # Try with walletrejectlongchains | ||||
# Double chain limit but require combining inputs, so we pass | # Double chain limit but require combining inputs, so we pass | ||||
# SelectCoinsMinConf | # SelectCoinsMinConf | ||||
self.stop_node(0) | self.stop_node(0) | ||||
self.start_node(0, extra_args=[ | self.start_node(0, | ||||
"-walletrejectlongchains", "-limitancestorcount=" + str(2 * chainlimit)]) | self.extra_args[0] + ["-walletrejectlongchains", | ||||
"-limitancestorcount=" + str(2 * chainlimit)]) | |||||
# wait for loadmempool | # wait for loadmempool | ||||
timeout = 10 | timeout = 10 | ||||
while (timeout > 0 and len( | while (timeout > 0 and len( | ||||
self.nodes[0].getrawmempool()) < chainlimit * 2): | self.nodes[0].getrawmempool()) < chainlimit * 2): | ||||
time.sleep(0.5) | time.sleep(0.5) | ||||
timeout -= 0.5 | timeout -= 0.5 | ||||
assert_equal(len(self.nodes[0].getrawmempool()), chainlimit * 2) | assert_equal(len(self.nodes[0].getrawmempool()), chainlimit * 2) | ||||
▲ Show 20 Lines • Show All 46 Lines • Show Last 20 Lines |