2017-08-24 22:01:16 +02:00
#!/usr/bin/env python3
2023-08-16 19:27:31 +02:00
# Copyright (c) 2017-2020 The Bitcoin Core developers
2017-08-24 22:01:16 +02:00
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
2019-09-26 15:50:24 +02:00
""" Test dash-cli """
2023-04-16 21:53:03 +02:00
2020-04-21 18:24:17 +02:00
from decimal import Decimal
2021-05-31 11:26:16 +02:00
from test_framework . blocktools import COINBASE_MATURITY
2017-08-24 22:01:16 +02:00
from test_framework . test_framework import BitcoinTestFramework
2023-04-16 21:53:03 +02:00
from test_framework . util import (
assert_equal ,
2021-06-21 15:50:20 +02:00
assert_greater_than_or_equal ,
2023-04-16 21:53:03 +02:00
assert_raises_process_error ,
assert_raises_rpc_error ,
get_auth_cookie ,
)
2021-06-21 15:50:20 +02:00
import time
2017-08-24 22:01:16 +02:00
2023-04-16 09:18:51 +02:00
# The block reward of coinbaseoutput.nValue (500) DASH/block matures after
# COINBASE_MATURITY (100) blocks. Therefore, after mining 101 blocks we expect
# node 0 to have a balance of (BLOCKS - COINBASE_MATURITY) * 500 DASH/block.
2021-05-31 11:26:16 +02:00
BLOCKS = COINBASE_MATURITY + 1
2023-04-16 09:18:51 +02:00
BALANCE = ( BLOCKS - 100 ) * 500
2023-04-16 21:53:03 +02:00
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) '
WALLET_NOT_LOADED = ' Requested wallet does not exist or is not loaded '
WALLET_NOT_SPECIFIED = ' Wallet file not specified '
2017-08-24 22:01:16 +02:00
class TestBitcoinCli ( BitcoinTestFramework ) :
2017-09-02 00:44:05 +02:00
def set_test_params ( self ) :
2017-08-24 22:01:16 +02:00
self . setup_clean_chain = True
self . num_nodes = 1
2023-04-17 10:28:19 +02:00
if self . is_wallet_compiled ( ) :
self . requires_wallet = True
2017-08-24 22:01:16 +02:00
Merge #17497: test: skip tests when utils haven't been compiled
a67352161c68fea9764cc31aff199f112d8572c6 test: skip tool_wallet test when bitcoin-wallet isn't compiled (fanquake)
e9277baed64e1d4054a102e40b39a9aed7839c2f test: skip wallet_listreceivedby test when the cli isn't compiled (fanquake)
621d398750d9f5ce3e7ec75ccb160b3534dcc436 test: skip bitcoin_cli test when the cli isn't compiled (fanquake)
Pull request description:
Don't try and run the `interface_bitcoin_cli.py` test when `bitcoin-cli` isn't available.
```bash
stdout:
2019-11-17T01:51:41.623000Z TestFramework (INFO): Initializing test directory /var/folders/z2/cn877pxd3czdfh47mfkmbwgm0000gn/T/test_runner_₿_🏃_20191116_205141/interface_bitcoin_cli_0
2019-11-17T01:51:41.890000Z TestFramework (ERROR): Unexpected exception caught during testing
Traceback (most recent call last):
File "/Users/michael/github/bitcoin/test/functional/test_framework/test_framework.py", line 111, in main
self.run_test()
File "/Users/michael/github/bitcoin/test/functional/interface_bitcoin_cli.py", line 18, in run_test
cli_response = self.nodes[0].cli("-version").send_cli()
File "/Users/michael/github/bitcoin/test/functional/test_framework/test_node.py", line 528, in send_cli
process = subprocess.Popen(p_args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
File "/Users/michael/.pyenv/versions/3.5.6/lib/python3.5/subprocess.py", line 676, in __init__
restore_signals, start_new_session)
File "/Users/michael/.pyenv/versions/3.5.6/lib/python3.5/subprocess.py", line 1289, in _execute_child
raise child_exception_type(errno_num, err_msg)
FileNotFoundError: [Errno 2] No such file or directory: '/Users/michael/github/bitcoin/src/bitcoin-cli'
```
Top commit has no ACKs.
Tree-SHA512: de27513a615d9d21271a0948e012c3209351e7374efd19bfa1bb9cda77e8fffe15d99e3424e4dbfa8cf826084f8af1670726f4703bd2b6093e7d37df4bea64f0
2019-11-19 16:11:27 +01:00
def skip_test_if_missing_module ( self ) :
self . skip_if_no_cli ( )
2017-08-24 22:01:16 +02:00
def run_test ( self ) :
""" Main test logic """
2023-04-16 09:18:51 +02:00
self . nodes [ 0 ] . generate ( BLOCKS )
2017-08-24 22:01:16 +02:00
2019-09-26 15:50:24 +02:00
self . log . info ( " Compare responses from getblockchaininfo RPC and `dash-cli getblockchaininfo` " )
2017-09-07 01:43:16 +02:00
cli_response = self . nodes [ 0 ] . cli . getblockchaininfo ( )
rpc_response = self . nodes [ 0 ] . getblockchaininfo ( )
assert_equal ( cli_response , rpc_response )
2023-07-19 00:47:58 +02:00
self . log . info ( " Test named arguments " )
assert_equal ( self . nodes [ 0 ] . cli . echo ( 0 , 1 , arg3 = 3 , arg5 = 5 ) , [ ' 0 ' , ' 1 ' , None , ' 3 ' , None , ' 5 ' ] )
assert_raises_rpc_error ( - 8 , " Parameter arg1 specified twice both as positional and named argument " , self . nodes [ 0 ] . cli . echo , 0 , 1 , arg1 = 1 )
assert_raises_rpc_error ( - 8 , " Parameter arg1 specified twice both as positional and named argument " , self . nodes [ 0 ] . cli . echo , 0 , None , 2 , arg1 = 1 )
2021-01-22 15:58:07 +01:00
user , password = get_auth_cookie ( self . nodes [ 0 ] . datadir , self . chain )
2017-09-07 01:43:16 +02:00
self . log . info ( " Test -stdinrpcpass option " )
2020-04-18 17:03:13 +02: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-08-24 22:01:16 +02:00
2017-09-07 01:43:16 +02:00
self . log . info ( " Test -stdin and -stdinrpcpass " )
2020-04-18 17:03:13 +02: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 )
2018-03-20 09:36:14 +01: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 )
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 )
2017-08-24 22:01:16 +02:00
2023-04-16 09:30:32 +02:00
self . log . info ( " Test -getinfo with arguments fails " )
2017-11-18 12:05:27 +01:00
assert_raises_process_error ( 1 , " -getinfo takes no arguments " , self . nodes [ 0 ] . cli ( ' -getinfo ' ) . help )
2023-04-16 09:30:32 +02:00
self . log . info ( " Test -getinfo returns expected network and blockchain info " )
if self . is_wallet_compiled ( ) :
self . nodes [ 0 ] . encryptwallet ( password )
2020-04-24 14:41:12 +02:00
cli_get_info = self . nodes [ 0 ] . cli ( ' -getinfo ' ) . send_cli ( )
2017-09-28 08:33:12 +02: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 ' ] )
2023-04-16 09:30:32 +02:00
assert_equal ( cli_get_info [ ' headers ' ] , blockchain_info [ ' headers ' ] )
2017-09-28 08:33:12 +02:00
assert_equal ( cli_get_info [ ' timeoffset ' ] , network_info [ ' timeoffset ' ] )
Merge #19405: rpc, cli: add network in/out connections to `getnetworkinfo` and `-getinfo`
581b343d5bf517510ab0236583ca96628751177d Add in/out connections to cli -getinfo (Jon Atack)
d9cc13e88d096c1a171159c01cbb96444f7f8d7f UNIX_EPOCH_TIME fixup in rpc getnettotals (Jon Atack)
1ab49b81cf32b6ef9e312a0a8ac45c68a3262f0d Add in/out connections to rpc getnetworkinfo (Jon Atack)
Pull request description:
This is basic info that is present in the GUI that I've been wishing to have exposed via the RPC and CLI without needing a bash workaround or script. For human users it would also be useful to have it in `-getinfo`.
`bitcoin-cli getnetworkinfo`
```
"connections": 15,
"connections_in": 6,
"connections_out": 9,
```
`bitcoin-cli -getinfo`
```
"connections": {
"in": 6,
"out": 9,
"total": 15
},
```
Update the tests, RPC help, and release notes for the changes. Also fixup the `getnettotals` timemillis help while touching `rpc/net.cpp`.
-----
Reviewers can manually test this PR by [building from source](https://jonatack.github.io/articles/how-to-compile-bitcoin-core-and-run-the-tests), launching bitcoind, and then running `bitcoin-cli -getinfo`, `bitcoin-cli getnetworkinfo`, `bitcoin-cli help getnetworkinfo`, and `bitcoin-cli help getnettotals` (for the UNIX epoch time change).
ACKs for top commit:
eriknylund:
> tACK [581b343](https://github.com/bitcoin/bitcoin/commit/581b343d5bf517510ab0236583ca96628751177d) on master at [a0a422c](https://github.com/bitcoin/bitcoin/commit/a0a422c34cfd6514d0cc445bd784d3ee1a2d1749), ran unit & functional tests and and confirmed changes on an existing datadir ✌️
benthecarman:
tACK `581b343`
willcl-ark:
tACK for 581b343d5bf517510ab0236583ca96628751177d, this time rebased onto master at 862fde88be706adb20a211178253636442c3ae00.
shesek:
tACK `581b343`. This provides what I needed, thanks!
n-thumann:
tACK 581b343 on master at a0a422c, ran unit & functional tests and and confirmed changes on an existing datadir ✌️
Tree-SHA512: 08dd3ac8fefae401bd8253ff3ac027603c528eeccba53cedcb127771316173a7052fce44af8fa33ac98ebc4cf2a2b11cdefd949995d55e9b9a5942b876d00dc5
2020-09-04 13:31:35 +02:00
assert_equal (
cli_get_info [ ' connections ' ] ,
{
' in ' : network_info [ ' connections_in ' ] ,
' out ' : network_info [ ' connections_out ' ] ,
' total ' : network_info [ ' connections ' ] ,
' mn_in ' : network_info [ ' connections_mn_in ' ] ,
' mn_out ' : network_info [ ' connections_mn_out ' ] ,
' mn_total ' : network_info [ ' connections_mn ' ] ,
}
)
2017-09-28 08:33:12 +02:00
assert_equal ( cli_get_info [ ' proxy ' ] , network_info [ ' networks ' ] [ 0 ] [ ' proxy ' ] )
assert_equal ( cli_get_info [ ' difficulty ' ] , blockchain_info [ ' difficulty ' ] )
2019-03-11 15:26:38 +01:00
assert_equal ( cli_get_info [ ' chain ' ] , blockchain_info [ ' chain ' ] )
2023-04-16 09:30:32 +02:00
2018-10-08 06:39:53 +02:00
if self . is_wallet_compiled ( ) :
2023-04-16 09:30:32 +02:00
self . log . info ( " Test -getinfo and dash-cli getwalletinfo return expected wallet info " )
2023-04-16 09:18:51 +02:00
assert_equal ( cli_get_info [ ' balance ' ] , BALANCE )
2023-04-17 10:28:19 +02:00
assert ' balances ' not in cli_get_info . keys ( )
2023-04-16 09:18:51 +02:00
wallet_info = self . nodes [ 0 ] . getwalletinfo ( )
2019-03-11 15:28:41 +01:00
assert_equal ( cli_get_info [ ' coinjoin_balance ' ] , wallet_info [ ' coinjoin_balance ' ] )
2018-10-08 06:39:53 +02:00
assert_equal ( cli_get_info [ ' keypoolsize ' ] , wallet_info [ ' keypoolsize ' ] )
2023-04-16 09:30:32 +02:00
assert_equal ( cli_get_info [ ' unlocked_until ' ] , wallet_info [ ' unlocked_until ' ] )
2018-10-08 06:39:53 +02:00
assert_equal ( cli_get_info [ ' paytxfee ' ] , wallet_info [ ' paytxfee ' ] )
assert_equal ( cli_get_info [ ' relayfee ' ] , network_info [ ' relayfee ' ] )
2023-04-16 09:30:32 +02:00
assert_equal ( self . nodes [ 0 ] . cli . getwalletinfo ( ) , wallet_info )
2020-04-21 18:24:17 +02:00
2023-04-16 21:53:03 +02:00
# Setup to test -getinfo, -generate, and -rpcwallet= with multiple wallets.
2023-04-17 10:28:19 +02:00
wallets = [ self . default_wallet_name , ' Encrypted ' , ' secret ' ]
amounts = [ BALANCE + Decimal ( ' 459.9999955 ' ) , Decimal ( 9 ) , Decimal ( 31 ) ]
2020-04-21 18:24:17 +02:00
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 ] )
2023-04-16 21:53:03 +02:00
rpcwallet2 = ' -rpcwallet= {} ' . format ( wallets [ 1 ] )
rpcwallet3 = ' -rpcwallet= {} ' . format ( wallets [ 2 ] )
2020-04-21 18:24:17 +02:00
w1 . walletpassphrase ( password , self . rpc_timeout )
2023-04-17 10:28:19 +02:00
w2 . encryptwallet ( password )
2020-04-21 18:24:17 +02:00
w1 . sendtoaddress ( w2 . getnewaddress ( ) , amounts [ 1 ] )
w1 . sendtoaddress ( w3 . getnewaddress ( ) , amounts [ 2 ] )
# Mine a block to confirm; adds a block reward (500 DASH) to the default wallet.
self . nodes [ 0 ] . generate ( 1 )
self . log . info ( " Test -getinfo with multiple wallets and -rpcwallet returns specified wallet balance " )
for i in range ( len ( wallets ) ) :
2023-04-17 10:28:19 +02:00
cli_get_info = self . nodes [ 0 ] . cli ( ' -getinfo ' , ' -rpcwallet= {} ' . format ( wallets [ i ] ) ) . send_cli ( )
assert ' balances ' not in cli_get_info . keys ( )
2020-04-21 18:24:17 +02:00
assert_equal ( cli_get_info [ ' balance ' ] , amounts [ i ] )
2023-04-17 10:28:19 +02:00
self . log . info ( " Test -getinfo with multiple wallets and -rpcwallet=non-existing-wallet returns no balances " )
cli_get_info_keys = self . nodes [ 0 ] . cli ( ' -getinfo ' , ' -rpcwallet=does-not-exist ' ) . send_cli ( ) . keys ( )
assert ' balance ' not in cli_get_info_keys
assert ' balances ' not in cli_get_info_keys
2020-04-21 18:24:17 +02:00
2023-04-17 10:28:19 +02:00
self . log . info ( " Test -getinfo with multiple wallets returns all loaded wallet names and balances " )
assert_equal ( set ( self . nodes [ 0 ] . listwallets ( ) ) , set ( wallets ) )
cli_get_info = self . nodes [ 0 ] . cli ( ' -getinfo ' ) . send_cli ( )
assert ' balance ' not in cli_get_info . keys ( )
assert_equal ( cli_get_info [ ' balances ' ] , { k : v for k , v in zip ( wallets , amounts ) } )
# Unload the default wallet and re-verify.
2020-04-21 18:24:17 +02:00
self . nodes [ 0 ] . unloadwallet ( wallets [ 0 ] )
2023-04-17 10:28:19 +02:00
assert wallets [ 0 ] not in self . nodes [ 0 ] . listwallets ( )
cli_get_info = self . nodes [ 0 ] . cli ( ' -getinfo ' ) . send_cli ( )
assert ' balance ' not in cli_get_info . keys ( )
assert_equal ( cli_get_info [ ' balances ' ] , { k : v for k , v in zip ( wallets [ 1 : ] , amounts [ 1 : ] ) } )
self . log . info ( " Test -getinfo after unloading all wallets except a non-default one returns its balance " )
2020-04-21 18:24:17 +02:00
self . nodes [ 0 ] . unloadwallet ( wallets [ 2 ] )
assert_equal ( self . nodes [ 0 ] . listwallets ( ) , [ wallets [ 1 ] ] )
2023-04-17 10:28:19 +02:00
cli_get_info = self . nodes [ 0 ] . cli ( ' -getinfo ' ) . send_cli ( )
assert ' balances ' not in cli_get_info . keys ( )
assert_equal ( cli_get_info [ ' balance ' ] , amounts [ 1 ] )
self . log . info ( " Test -getinfo with -rpcwallet=remaining-non-default-wallet returns only its balance " )
2023-04-16 21:53:03 +02:00
cli_get_info = self . nodes [ 0 ] . cli ( ' -getinfo ' , rpcwallet2 ) . send_cli ( )
2023-04-17 10:28:19 +02:00
assert ' balances ' not in cli_get_info . keys ( )
assert_equal ( cli_get_info [ ' balance ' ] , amounts [ 1 ] )
self . log . info ( " Test -getinfo with -rpcwallet=unloaded wallet returns no balances " )
2021-05-01 13:12:00 +02:00
cli_get_info_keys = self . nodes [ 0 ] . cli ( ' -getinfo ' , rpcwallet3 ) . send_cli ( ) . keys ( )
2023-04-17 10:28:19 +02:00
assert ' balance ' not in cli_get_info_keys
assert ' balances ' not in cli_get_info_keys
2023-04-16 21:53:03 +02:00
# Test bitcoin-cli -generate.
n1 = 3
n2 = 4
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 )
self . log . info ( ' Test -generate -rpcwallet in single-wallet mode ' )
generate = self . nodes [ 0 ] . cli ( rpcwallet2 , ' -generate ' ) . send_cli ( )
assert_equal ( set ( generate . keys ( ) ) , { ' address ' , ' blocks ' } )
assert_equal ( len ( generate [ " blocks " ] ) , 1 )
assert_equal ( self . nodes [ 0 ] . getblockcount ( ) , blocks + 2 + n1 + n2 )
self . log . info ( ' Test -generate -rpcwallet=unloaded wallet raises RPC error ' )
assert_raises_rpc_error ( - 18 , WALLET_NOT_LOADED , self . nodes [ 0 ] . cli ( rpcwallet3 , ' -generate ' ) . echo )
assert_raises_rpc_error ( - 18 , WALLET_NOT_LOADED , self . nodes [ 0 ] . cli ( rpcwallet3 , ' -generate ' , ' foo ' ) . echo )
assert_raises_rpc_error ( - 18 , WALLET_NOT_LOADED , self . nodes [ 0 ] . cli ( rpcwallet3 , ' -generate ' , 0 ) . echo )
assert_raises_rpc_error ( - 18 , WALLET_NOT_LOADED , self . nodes [ 0 ] . cli ( rpcwallet3 , ' -generate ' , 1 , 2 , 3 ) . echo )
# Test bitcoin-cli -generate with -rpcwallet in multiwallet mode.
self . nodes [ 0 ] . loadwallet ( wallets [ 2 ] )
n3 = 4
n4 = 10
blocks = self . nodes [ 0 ] . getblockcount ( )
self . log . info ( ' Test -generate -rpcwallet with no args ' )
generate = self . nodes [ 0 ] . cli ( rpcwallet2 , ' -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 -rpcwallet with bad args ' )
assert_raises_process_error ( 1 , JSON_PARSING_ERROR , self . nodes [ 0 ] . cli ( rpcwallet2 , ' -generate ' , ' foo ' ) . echo )
assert_raises_process_error ( 1 , BLOCKS_VALUE_OF_ZERO , self . nodes [ 0 ] . cli ( rpcwallet2 , ' -generate ' , 0 ) . echo )
assert_raises_process_error ( 1 , TOO_MANY_ARGS , self . nodes [ 0 ] . cli ( rpcwallet2 , ' -generate ' , 1 , 2 , 3 ) . echo )
self . log . info ( ' Test -generate -rpcwallet with nblocks ' )
generate = self . nodes [ 0 ] . cli ( rpcwallet2 , ' -generate ' , n3 ) . send_cli ( )
assert_equal ( set ( generate . keys ( ) ) , { ' address ' , ' blocks ' } )
assert_equal ( len ( generate [ " blocks " ] ) , n3 )
assert_equal ( self . nodes [ 0 ] . getblockcount ( ) , blocks + 1 + n3 )
self . log . info ( ' Test -generate -rpcwallet with nblocks and maxtries ' )
generate = self . nodes [ 0 ] . cli ( rpcwallet2 , ' -generate ' , n4 , 1000000 ) . send_cli ( )
assert_equal ( set ( generate . keys ( ) ) , { ' address ' , ' blocks ' } )
assert_equal ( len ( generate [ " blocks " ] ) , n4 )
assert_equal ( self . nodes [ 0 ] . getblockcount ( ) , blocks + 1 + n3 + n4 )
self . log . info ( ' Test -generate without -rpcwallet in multiwallet mode raises RPC error ' )
assert_raises_rpc_error ( - 19 , WALLET_NOT_SPECIFIED , self . nodes [ 0 ] . cli ( ' -generate ' ) . echo )
assert_raises_rpc_error ( - 19 , WALLET_NOT_SPECIFIED , self . nodes [ 0 ] . cli ( ' -generate ' , ' foo ' ) . echo )
assert_raises_rpc_error ( - 19 , WALLET_NOT_SPECIFIED , self . nodes [ 0 ] . cli ( ' -generate ' , 0 ) . echo )
assert_raises_rpc_error ( - 19 , WALLET_NOT_SPECIFIED , self . nodes [ 0 ] . cli ( ' -generate ' , 1 , 2 , 3 ) . echo )
2023-04-16 09:18:51 +02:00
else :
2023-04-16 09:30:32 +02:00
self . log . info ( " *** Wallet not compiled; cli getwalletinfo and -getinfo wallet tests skipped " )
2023-04-16 21:53:03 +02:00
self . nodes [ 0 ] . generate ( 25 ) # maintain block parity with the wallet_compiled conditional branch
2023-04-16 09:30:32 +02:00
self . log . info ( " Test -version with node stopped " )
2020-04-18 17:03:13 +02:00
self . stop_node ( 0 )
2020-04-24 14:41:12 +02:00
cli_response = self . nodes [ 0 ] . cli ( ' -version ' ) . send_cli ( )
2023-04-16 09:30:32 +02:00
assert " {} RPC client version " . format ( self . config [ ' environment ' ] [ ' PACKAGE_NAME ' ] ) in cli_response
2020-04-18 17:03:13 +02: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 ' )
2023-04-16 09:30:32 +02:00
self . nodes [ 0 ] . wait_for_rpc_connection ( )
2023-04-16 21:53:03 +02:00
assert_equal ( blocks , BLOCKS + 25 )
2018-10-08 06:39:53 +02:00
2021-06-21 15:50:20 +02:00
self . log . info ( " Test -rpcwait option waits at most -rpcwaittimeout seconds for startup " )
self . stop_node ( 0 ) # stop the node so we time out
start_time = time . time ( )
assert_raises_process_error ( 1 , " Could not connect to the server " , self . nodes [ 0 ] . cli ( ' -rpcwait ' , ' -rpcwaittimeout=5 ' ) . echo )
assert_greater_than_or_equal ( time . time ( ) , start_time + 5 )
2017-09-28 08:33:12 +02:00
2017-08-24 22:01:16 +02:00
if __name__ == ' __main__ ' :
TestBitcoinCli ( ) . main ( )