2017-07-11 13:02:01 -04:00
#!/usr/bin/env python3
2020-04-16 13:14:08 -04:00
# Copyright (c) 2017-2020 The Bitcoin Core developers
2017-07-11 13:02:01 -04:00
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
""" Test bitcoin-cli """
from test_framework . test_framework import BitcoinTestFramework
2017-08-24 23:31:27 -03:00
from test_framework . util import assert_equal , assert_raises_process_error , get_auth_cookie
2017-07-11 13:02:01 -04:00
2020-04-09 04:14:21 -04:00
# The block reward of coinbaseoutput.nValue (50) BTC/block matures after
# COINBASE_MATURITY (100) blocks. Therefore, after mining 101 blocks we expect
# node 0 to have a balance of (BLOCKS - COINBASE_MATURITY) * 50 BTC/block.
BLOCKS = 101
BALANCE = ( BLOCKS - 100 ) * 50
2017-07-11 13:02:01 -04:00
class TestBitcoinCli ( BitcoinTestFramework ) :
2017-09-01 15:24:30 -03:00
def set_test_params ( self ) :
2017-07-11 13:02:01 -04:00
self . setup_clean_chain = True
self . num_nodes = 1
2019-11-16 22:59:03 -03:00
def skip_test_if_missing_module ( self ) :
self . skip_if_no_cli ( )
2017-07-11 13:02:01 -04:00
def run_test ( self ) :
""" Main test logic """
2020-04-09 04:14:21 -04:00
self . nodes [ 0 ] . generate ( BLOCKS )
2017-07-11 13:02:01 -04:00
2017-07-16 19:29:08 -04:00
self . log . info ( " Compare responses from getblockchaininfo RPC and `bitcoin-cli getblockchaininfo` " )
2017-08-24 23:31:27 -03:00
cli_response = self . nodes [ 0 ] . cli . getblockchaininfo ( )
rpc_response = self . nodes [ 0 ] . getblockchaininfo ( )
assert_equal ( cli_response , rpc_response )
2019-07-31 14:11:32 -04:00
user , password = get_auth_cookie ( self . nodes [ 0 ] . datadir , self . chain )
2017-08-24 23:31:27 -03:00
self . log . info ( " Test -stdinrpcpass option " )
2020-04-17 15:19:48 -04:00
assert_equal ( BLOCKS , self . nodes [ 0 ] . cli ( ' -rpcuser= {} ' . format ( user ) , ' -stdinrpcpass ' , input = password ) . getblockcount ( ) )
assert_raises_process_error ( 1 , ' Incorrect rpcuser or rpcpassword ' , self . nodes [ 0 ] . cli ( ' -rpcuser= {} ' . format ( user ) , ' -stdinrpcpass ' , input = ' foo ' ) . echo )
2017-07-11 13:02:01 -04:00
2017-08-24 23:31:27 -03:00
self . log . info ( " Test -stdin and -stdinrpcpass " )
2020-04-17 15:19:48 -04:00
assert_equal ( [ ' foo ' , ' bar ' ] , self . nodes [ 0 ] . cli ( ' -rpcuser= {} ' . format ( user ) , ' -stdin ' , ' -stdinrpcpass ' , input = password + ' \n foo \n bar ' ) . echo ( ) )
assert_raises_process_error ( 1 , ' Incorrect rpcuser or rpcpassword ' , self . nodes [ 0 ] . cli ( ' -rpcuser= {} ' . format ( user ) , ' -stdin ' , ' -stdinrpcpass ' , input = ' foo ' ) . echo )
2017-07-11 13:02:01 -04:00
2018-03-19 18:26:38 -03:00
self . log . info ( " Test connecting to a non-existing server " )
assert_raises_process_error ( 1 , " Could not connect to the server " , self . nodes [ 0 ] . cli ( ' -rpcport=1 ' ) . echo )
2018-03-19 18:41:52 -03:00
self . log . info ( " Test connecting with non-existing RPC cookie file " )
assert_raises_process_error ( 1 , " Could not locate RPC credentials " , self . nodes [ 0 ] . cli ( ' -rpccookiefile=does-not-exist ' , ' -rpcpassword= ' ) . echo )
2020-04-15 09:05:30 -04:00
self . log . info ( " Test -getinfo with arguments fails " )
2017-11-17 10:11:02 -03:00
assert_raises_process_error ( 1 , " -getinfo takes no arguments " , self . nodes [ 0 ] . cli ( ' -getinfo ' ) . help )
2020-04-15 09:05:30 -04:00
self . log . info ( " Test -getinfo returns expected network and blockchain info " )
2020-04-15 09:24:52 -04:00
if self . is_wallet_compiled ( ) :
self . nodes [ 0 ] . encryptwallet ( password )
2020-04-17 15:19:48 -04:00
cli_get_info = self . nodes [ 0 ] . cli ( ) . send_cli ( ' -getinfo ' )
2017-08-23 15:30:03 -03:00
network_info = self . nodes [ 0 ] . getnetworkinfo ( )
blockchain_info = self . nodes [ 0 ] . getblockchaininfo ( )
assert_equal ( cli_get_info [ ' version ' ] , network_info [ ' version ' ] )
assert_equal ( cli_get_info [ ' blocks ' ] , blockchain_info [ ' blocks ' ] )
2020-04-15 09:24:52 -04:00
assert_equal ( cli_get_info [ ' headers ' ] , blockchain_info [ ' headers ' ] )
2017-08-23 15:30:03 -03:00
assert_equal ( cli_get_info [ ' timeoffset ' ] , network_info [ ' timeoffset ' ] )
assert_equal ( cli_get_info [ ' connections ' ] , network_info [ ' connections ' ] )
assert_equal ( cli_get_info [ ' proxy ' ] , network_info [ ' networks ' ] [ 0 ] [ ' proxy ' ] )
assert_equal ( cli_get_info [ ' difficulty ' ] , blockchain_info [ ' difficulty ' ] )
2019-03-09 05:15:17 -03:00
assert_equal ( cli_get_info [ ' chain ' ] , blockchain_info [ ' chain ' ] )
2020-04-15 09:03:28 -04:00
2018-09-23 12:34:51 -03:00
if self . is_wallet_compiled ( ) :
2020-04-15 09:13:42 -04:00
self . log . info ( " Test -getinfo and bitcoin-cli getwalletinfo return expected wallet info " )
2020-04-09 04:14:21 -04:00
assert_equal ( cli_get_info [ ' balance ' ] , BALANCE )
wallet_info = self . nodes [ 0 ] . getwalletinfo ( )
2018-09-23 12:34:51 -03:00
assert_equal ( cli_get_info [ ' keypoolsize ' ] , wallet_info [ ' keypoolsize ' ] )
2020-04-15 09:24:52 -04:00
assert_equal ( cli_get_info [ ' unlocked_until ' ] , wallet_info [ ' unlocked_until ' ] )
2018-09-23 12:34:51 -03:00
assert_equal ( cli_get_info [ ' paytxfee ' ] , wallet_info [ ' paytxfee ' ] )
assert_equal ( cli_get_info [ ' relayfee ' ] , network_info [ ' relayfee ' ] )
2020-04-15 09:13:42 -04:00
assert_equal ( self . nodes [ 0 ] . cli . getwalletinfo ( ) , wallet_info )
2020-04-09 04:14:21 -04:00
else :
2020-04-15 09:13:42 -04:00
self . log . info ( " *** Wallet not compiled; cli getwalletinfo and -getinfo wallet tests skipped " )
2018-09-23 12:34:51 -03:00
2020-04-15 09:05:30 -04:00
self . log . info ( " Test -version with node stopped " )
2020-04-17 15:19:48 -04:00
self . stop_node ( 0 )
cli_response = self . nodes [ 0 ] . cli ( ) . send_cli ( ' -version ' )
2020-04-15 09:05:30 -04:00
assert " {} RPC client version " . format ( self . config [ ' environment ' ] [ ' PACKAGE_NAME ' ] ) in cli_response
2020-04-17 15:19:48 -04:00
self . log . info ( " Test -rpcwait option successfully waits for RPC connection " )
self . nodes [ 0 ] . start ( ) # start node without RPC connection
self . nodes [ 0 ] . wait_for_cookie_credentials ( ) # ensure cookie file is available to avoid race condition
blocks = self . nodes [ 0 ] . cli ( ' -rpcwait ' ) . send_cli ( ' getblockcount ' )
2020-04-15 09:03:28 -04:00
self . nodes [ 0 ] . wait_for_rpc_connection ( )
2020-04-17 15:19:48 -04:00
assert_equal ( blocks , BLOCKS )
2020-04-15 09:03:28 -04:00
2017-08-23 15:30:03 -03:00
2017-07-11 13:02:01 -04:00
if __name__ == ' __main__ ' :
TestBitcoinCli ( ) . main ( )