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 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 | ||||
▲ Show 20 Lines • Show All 74 Lines • ▼ Show 20 Lines | def run_test(self): | ||||
cli_get_info['keypoolsize'], | cli_get_info['keypoolsize'], | ||||
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. | |||||
wallets = ['', 'Encrypted', 'secret'] | |||||
amounts = [Decimal('59.99999550'), Decimal(9), Decimal(31)] | |||||
self.nodes[0].createwallet(wallet_name=wallets[1]) | |||||
self.nodes[0].createwallet(wallet_name=wallets[2]) | |||||
w1 = self.nodes[0].get_wallet_rpc(wallets[0]) | |||||
w2 = self.nodes[0].get_wallet_rpc(wallets[1]) | |||||
w3 = self.nodes[0].get_wallet_rpc(wallets[2]) | |||||
w1.walletpassphrase(password, self.rpc_timeout) | |||||
w1.sendtoaddress(w2.getnewaddress(), amounts[1]) | |||||
w1.sendtoaddress(w3.getnewaddress(), amounts[2]) | |||||
# Mine a block to confirm; adds a block reward (50 BTC) to the | |||||
# default wallet. | |||||
self.nodes[0].generate(1) | |||||
self.log.info( | |||||
"Test -getinfo with multiple wallets loaded returns no balance") | |||||
assert_equal(set(self.nodes[0].listwallets()), set(wallets)) | |||||
assert 'balance' not in self.nodes[0].cli( | |||||
'-getinfo').send_cli().keys() | |||||
self.log.info( | |||||
"Test -getinfo with multiple wallets and -rpcwallet returns specified wallet balance") | |||||
for i in range(len(wallets)): | |||||
cli_get_info = self.nodes[0].cli( | |||||
'-getinfo').send_cli('-rpcwallet={}'.format(wallets[i])) | |||||
assert_equal(cli_get_info['balance'], amounts[i]) | |||||
self.log.info( | |||||
"Test -getinfo with multiple wallets and -rpcwallet=non-existing-wallet returns no balance") | |||||
assert 'balance' not in self.nodes[0].cli( | |||||
'-getinfo').send_cli('-rpcwallet=does-not-exist').keys() | |||||
self.log.info( | |||||
"Test -getinfo after unloading all wallets except a non-default one returns its balance") | |||||
self.nodes[0].unloadwallet(wallets[0]) | |||||
self.nodes[0].unloadwallet(wallets[2]) | |||||
assert_equal(self.nodes[0].listwallets(), [wallets[1]]) | |||||
assert_equal( | |||||
self.nodes[0].cli('-getinfo').send_cli()['balance'], | |||||
amounts[1]) | |||||
self.log.info( | |||||
"Test -getinfo -rpcwallet=remaining-non-default-wallet returns its balance") | |||||
assert_equal(self.nodes[0].cli( | |||||
'-getinfo').send_cli('-rpcwallet={}'.format(wallets[1]))['balance'], amounts[1]) | |||||
self.log.info( | |||||
"Test -getinfo with -rpcwallet=unloaded wallet returns no balance") | |||||
assert 'balance' not in self.nodes[0].cli( | |||||
'-getinfo').send_cli('-rpcwallet={}'.format(wallets[2])).keys() | |||||
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 | |||||
self.nodes[0].generate(1) | |||||
self.stop_node(0) | self.stop_node(0) | ||||
self.log.info("Test -version with node stopped") | self.log.info("Test -version with node stopped") | ||||
cli_response = self.nodes[0].cli("-version").send_cli() | cli_response = self.nodes[0].cli("-version").send_cli() | ||||
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 waits for RPC connection instead of failing") | "Test -rpcwait option waits for RPC connection instead of failing") | ||||
# Start node without RPC connection. | # Start node without RPC connection. | ||||
self.nodes[0].start() | self.nodes[0].start() | ||||
# Verify failure without -rpcwait. | # Verify failure without -rpcwait. | ||||
assert_raises_process_error(1, | assert_raises_process_error(1, | ||||
"Could not connect to the server", | "Could not connect to the server", | ||||
self.nodes[0].cli('getblockcount').echo) | self.nodes[0].cli('getblockcount').echo) | ||||
# Verify success using -rpcwait. | # Verify success using -rpcwait. | ||||
assert_equal( | assert_equal( | ||||
BLOCKS, | BLOCKS + 1, | ||||
self.nodes[0].cli( | self.nodes[0].cli( | ||||
'-rpcwait', | '-rpcwait', | ||||
'getblockcount').send_cli()) | 'getblockcount').send_cli()) | ||||
self.nodes[0].wait_for_rpc_connection() | self.nodes[0].wait_for_rpc_connection() | ||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
TestBitcoinCli().main() | TestBitcoinCli().main() |