Changeset View
Changeset View
Standalone View
Standalone View
test/functional/interface_bitcoin_cli.py
#!/usr/bin/env python3 | #!/usr/bin/env python3 | ||||
# Copyright (c) 2017-2019 The Bitcoin Core developers | # Copyright (c) 2017-2019 The Bitcoin Core developers | ||||
# Distributed under the MIT software license, see the accompanying | # Distributed under the MIT software license, see the accompanying | ||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. | # file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
"""Test bitcoin-cli""" | """Test bitcoin-cli""" | ||||
from decimal import Decimal | from decimal import Decimal | ||||
from test_framework.test_framework import BitcoinTestFramework | from test_framework.test_framework import BitcoinTestFramework | ||||
from test_framework.util import ( | from test_framework.util import ( | ||||
assert_equal, | assert_equal, | ||||
assert_raises_process_error, | assert_raises_process_error, | ||||
get_auth_cookie, | get_auth_cookie, | ||||
) | ) | ||||
# The block reward of coinbaseoutput.nValue (50) BTC/block matures after | # The block reward of coinbaseoutput.nValue (50) BTC/block matures after | ||||
# COINBASE_MATURITY (100) blocks. Therefore, after mining 101 blocks we expect | # COINBASE_MATURITY (100) blocks. Therefore, after mining 101 blocks we expect | ||||
# node 0 to have a balance of (BLOCKS - COINBASE_MATURITY) * 50 BTC/block. | # node 0 to have a balance of (BLOCKS - COINBASE_MATURITY) * 50 BTC/block. | ||||
BLOCKS = 101 | BLOCKS = 101 | ||||
BALANCE = (BLOCKS - 100) * 50000000 | BALANCE = (BLOCKS - 100) * 50000000 | ||||
JSON_PARSING_ERROR = 'error: Error parsing JSON:foo' | |||||
BLOCKS_VALUE_OF_ZERO = 'error: the first argument (number of blocks to generate, default: 1) must be an integer value greater than zero' | |||||
TOO_MANY_ARGS = 'error: too many arguments (maximum 2 for nblocks and maxtries)' | |||||
class TestBitcoinCli(BitcoinTestFramework): | class TestBitcoinCli(BitcoinTestFramework): | ||||
def set_test_params(self): | def set_test_params(self): | ||||
self.setup_clean_chain = True | self.setup_clean_chain = True | ||||
self.num_nodes = 1 | self.num_nodes = 1 | ||||
def skip_test_if_missing_module(self): | def skip_test_if_missing_module(self): | ||||
self.skip_if_no_cli() | self.skip_if_no_cli() | ||||
▲ Show 20 Lines • Show All 62 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
wallet_info['keypoolsize']) | wallet_info['keypoolsize']) | ||||
assert_equal( | assert_equal( | ||||
cli_get_info['unlocked_until'], | cli_get_info['unlocked_until'], | ||||
wallet_info['unlocked_until']) | wallet_info['unlocked_until']) | ||||
assert_equal(cli_get_info['paytxfee'], wallet_info['paytxfee']) | assert_equal(cli_get_info['paytxfee'], wallet_info['paytxfee']) | ||||
assert_equal(cli_get_info['relayfee'], network_info['relayfee']) | assert_equal(cli_get_info['relayfee'], network_info['relayfee']) | ||||
assert_equal(self.nodes[0].cli.getwalletinfo(), wallet_info) | assert_equal(self.nodes[0].cli.getwalletinfo(), wallet_info) | ||||
# Setup to test -getinfo and -rpcwallet= with multiple wallets. | # Setup to test -getinfo, -generate, and -rpcwallet= with multiple | ||||
# wallets. | |||||
wallets = ['', 'Encrypted', 'secret'] | wallets = ['', 'Encrypted', 'secret'] | ||||
amounts = [ | amounts = [ | ||||
BALANCE + Decimal('9999995.50'), | BALANCE + Decimal('9999995.50'), | ||||
Decimal(9000000), | Decimal(9000000), | ||||
Decimal(31000000)] | Decimal(31000000)] | ||||
self.nodes[0].createwallet(wallet_name=wallets[1]) | self.nodes[0].createwallet(wallet_name=wallets[1]) | ||||
self.nodes[0].createwallet(wallet_name=wallets[2]) | self.nodes[0].createwallet(wallet_name=wallets[2]) | ||||
w1 = self.nodes[0].get_wallet_rpc(wallets[0]) | w1 = self.nodes[0].get_wallet_rpc(wallets[0]) | ||||
▲ Show 20 Lines • Show All 61 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
self.log.info( | self.log.info( | ||||
"Test -getinfo with -rpcwallet=unloaded wallet returns" | "Test -getinfo with -rpcwallet=unloaded wallet returns" | ||||
" no balances") | " no balances") | ||||
cli_get_info = self.nodes[0].cli( | cli_get_info = self.nodes[0].cli( | ||||
'-getinfo', '-rpcwallet={}'.format(wallets[2])).send_cli() | '-getinfo', '-rpcwallet={}'.format(wallets[2])).send_cli() | ||||
assert 'balance' not in cli_get_info_keys | assert 'balance' not in cli_get_info_keys | ||||
assert 'balances' not in cli_get_info_keys | assert 'balances' not in cli_get_info_keys | ||||
# Test bitcoin-cli -generate. | |||||
n1 = 3 | |||||
n2 = 5 | |||||
w2.walletpassphrase(password, self.rpc_timeout) | |||||
blocks = self.nodes[0].getblockcount() | |||||
self.log.info('Test -generate with no args') | |||||
generate = self.nodes[0].cli('-generate').send_cli() | |||||
assert_equal(set(generate.keys()), {'address', 'blocks'}) | |||||
assert_equal(len(generate["blocks"]), 1) | |||||
assert_equal(self.nodes[0].getblockcount(), blocks + 1) | |||||
self.log.info('Test -generate with bad args') | |||||
assert_raises_process_error( | |||||
1, JSON_PARSING_ERROR, self.nodes[0].cli( | |||||
'-generate', 'foo').echo) | |||||
assert_raises_process_error( | |||||
1, BLOCKS_VALUE_OF_ZERO, self.nodes[0].cli( | |||||
'-generate', 0).echo) | |||||
assert_raises_process_error( | |||||
1, TOO_MANY_ARGS, self.nodes[0].cli( | |||||
'-generate', 1, 2, 3).echo) | |||||
self.log.info('Test -generate with nblocks') | |||||
generate = self.nodes[0].cli('-generate', n1).send_cli() | |||||
assert_equal(set(generate.keys()), {'address', 'blocks'}) | |||||
assert_equal(len(generate["blocks"]), n1) | |||||
assert_equal(self.nodes[0].getblockcount(), blocks + 1 + n1) | |||||
self.log.info('Test -generate with nblocks and maxtries') | |||||
generate = self.nodes[0].cli('-generate', n2, 1000000).send_cli() | |||||
assert_equal(set(generate.keys()), {'address', 'blocks'}) | |||||
assert_equal(len(generate["blocks"]), n2) | |||||
assert_equal(self.nodes[0].getblockcount(), blocks + 1 + n1 + n2) | |||||
else: | else: | ||||
self.log.info( | self.log.info( | ||||
"*** Wallet not compiled; cli getwalletinfo and -getinfo wallet tests skipped") | "*** Wallet not compiled; cli getwalletinfo and -getinfo wallet tests skipped") | ||||
# maintain block parity with the wallet_compiled conditional branch | # maintain block parity with the wallet_compiled conditional branch | ||||
self.nodes[0].generate(1) | self.nodes[0].generate(10) | ||||
self.log.info("Test -version with node stopped") | self.log.info("Test -version with node stopped") | ||||
self.stop_node(0) | self.stop_node(0) | ||||
cli_response = self.nodes[0].cli().send_cli('-version') | cli_response = self.nodes[0].cli().send_cli('-version') | ||||
assert "{} RPC client version".format( | assert "{} RPC client version".format( | ||||
self.config['environment']['PACKAGE_NAME']) in cli_response | self.config['environment']['PACKAGE_NAME']) in cli_response | ||||
self.log.info( | self.log.info( | ||||
"Test -rpcwait option successfully waits for RPC connection") | "Test -rpcwait option successfully waits for RPC connection") | ||||
# Start node without RPC connection. | # Start node without RPC connection. | ||||
self.nodes[0].start() | self.nodes[0].start() | ||||
# ensure cookie file is available to avoid race condition | # ensure cookie file is available to avoid race condition | ||||
self.nodes[0].wait_for_cookie_credentials() | self.nodes[0].wait_for_cookie_credentials() | ||||
blocks = self.nodes[0].cli('-rpcwait').send_cli('getblockcount') | blocks = self.nodes[0].cli('-rpcwait').send_cli('getblockcount') | ||||
self.nodes[0].wait_for_rpc_connection() | self.nodes[0].wait_for_rpc_connection() | ||||
assert_equal(blocks, BLOCKS + 1) | assert_equal(blocks, BLOCKS + 10) | ||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
TestBitcoinCli().main() | TestBitcoinCli().main() |